1

已经创建且不可修改的表是 Book 和 Author。

书(书名、价格、已发行)

作者(AName, btitle,position )

斜体是键,Author 中的 Btitle 是引用 Book(Title) 的外键。

我的 SQL 查询:

   select distinct AName
   from Author
   where position in (2,3) AND position<>1
   group by AName

当我运行它时,我会得到所有在位置 2 或 3 中拥有一本书的作者。这就是我想要的,但我只是试图让那些在所有书籍中都有位置 2 或 3 的作者。基本上返回所有书籍中排名第二或第三的每个作者。

4

5 回答 5

1

也许这样的事情会起作用:

select distinct AName
from @Author
where position in (2,3) 
except 
select distinct AName
from @Author
where position not in (2,3) 

它创建一组处于位置 2 和 3 的作者,然后删​​除处于另一个位置的作者。

于 2013-10-25T00:55:47.030 回答
1

尝试编写标准 SQL:

SELECT AName FROM (
   SELECT 
      AName, 
      COUNT(*) AS count_all,
      (SELECT COUNT(*) FROM Author AS aa WHERE aa.AName = a.AName AND position=2) AS count_2,
      (SELECT COUNT(*) FROM Author AS aa WHERE aa.AName = a.AName AND position=3) AS count_3,
   FROM Author AS a
   GROUP BY AName
) AS t
WHERE count_all = count_2
OR count_all = count_3

我希望这对你有用。

于 2013-10-25T01:20:42.730 回答
1

目前尚不清楚是否应该选择与人合写两本书并在另一本书中排名第二和第三的人。允许它更简单;如果您需要更严格的条件,您可以细化查询。

回答此查询的一种方法是关键观察到,您对他们所写的书籍数量等于他们列为第二或第三作者的书籍数量感兴趣的作者。

尝试一些 TDQD — 测试驱动的查询设计

每个作者写的书数

SELECT Aname, COUNT(*) AS BookCount
  FROM Author
 GROUP BY AName

每位作者作为第二或第三作者撰写的书籍数量

SELECT Aname, COUNT(*) AS NonLeadAuthorCount
  FROM Author
 WHERE Position IN (2, 3)
 GROUP BY Aname

加入计数相同的两个

SELECT X.Aname
  FROM (SELECT Aname, COUNT(*) AS BookCount
          FROM Author
         GROUP BY AName
       ) AS X
  JOIN (SELECT Aname, COUNT(*) AS NonLeadAuthorCount
          FROM Author
         WHERE Position IN (2, 3)
         GROUP BY Aname
       ) AS Y
    ON X.BookCount = Y.NonLeadAuthorCount

另一种查看方式是“在位置 2 或 3 中写过书的作者集合减去在位置不是 2 或 3 中写过书的作者集合”。为此,请参阅jpw答案

于 2013-10-25T01:00:01.760 回答
0

尝试这个:

select AName from Author where position=2 OR position=3 group by AName;
于 2013-10-25T00:55:28.613 回答
0

尝试添加

and AName not in (select AName from Author where position != 2 and position != 3

或类似的东西...

于 2013-10-25T00:56:11.397 回答