Sql 识别我的错误有困难吗

Sql 识别我的错误有困难吗,sql,select,Sql,Select,已创建且不可修改的表是Book和Author 书籍(标题、价格、年鉴) 作者(名称、标题、职位) 斜体是关键 作者中的Btitle是一个引用书籍(标题)的外键 我的SQL查询: select distinct AName from Author where position in (2,3) AND position<>1 group by AName 选择不同的名称 来自作者 其中位置在(2,3)和位置1 阿纳姆集团 当我运行这个程序时,我得到了所有在位

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

书籍(标题、价格、年鉴)

作者(名称、标题、职位)

斜体是关键 作者中的Btitle是一个引用书籍(标题)的外键

我的SQL查询:

   select distinct AName
   from Author
   where position in (2,3) AND position<>1
   group by AName
选择不同的名称
来自作者
其中位置在(2,3)和位置1
阿纳姆集团
当我运行这个程序时,我得到了所有在位置2或3有一本书的作者。这正是我想要的,但我只是想让那些在所有这些书中排名2或3的作者。 基本上返回所有书籍中排名第二或第三的作者。

尝试以下方法:

select AName from Author where position=2 OR position=3 group by AName;

也许像这样的方法会奏效:

select distinct AName
from @Author
where position in (2,3) 
except 
select distinct AName
from @Author
where position not in (2,3) 
它生成一组处于位置2和位置3的作者,然后删除另一个位置的作者。

尝试添加

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

或者类似的东西……

不完全清楚是否应该选择两本书合著、一本排第二、另一本排第三的人。允许它更简单;如果需要更严格的条件,可以优化查询

回答此问题的一种方法是,关键的观察结果是,您对作者感兴趣,他们所写的书的数量等于他们被列为第二或第三作者的书的数量

进行一些TDQD测试驱动的查询设计

每个作者写的书的数量 每个作者作为第二作者或第三作者所写的书的数量 在计数相同的地方将这两个连接起来

另一种看问题的方式是“在位置2或3上写过一本书的作者组减去在位置2或3上写过一本书的作者组”。有关此信息,请参阅编写标准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

我希望这对您有用。

此模式需要修复。应该是这样的:
Book(Book\u id,Title,Price,Yearreleased,position,author\u id)
author(author\u id,AName)
,其中
Book\u id
author\u id
是自动递增的主键。
中的
作者id
作者
的外键。不要使用
标题
作为主键,因为可能有不同的书籍具有相同的标题。这本书不应该有作者id列吗?我希望btitle不是指“书名”。您需要重新考虑您的模型我目前正在使用一个用于此实践的设置模式。而btitle确实指的是书名。我只是想知道我如何才能只显示所有书籍的位置为2或3的作者,因为你的
position1
条件是多余的;它不排除那些在第1位(或第4、5位,…)也写过书的人。
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
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