【问题标题】:Having problems identifying my mistake在识别我的错误时遇到问题
【发布时间】:2013-10-25 00:20:50
【问题描述】:

已经创建且不可修改的表是 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 的作者。 基本上返回所有书籍中排名第 2 或第 3 位的所有作者。

【问题讨论】:

  • 此架构需要修复。应该类似于:Book(book_id, Title, Price, Yearreleased, position, author_id)Author(author_id, AName),其中 book_idauthor_id 是自增主键。 Book 中的 author_idAuthor 的外键。不要使用Title作为主键,因为可以有不同的书同名。
  • 书本不应该有 author_id 列吗?我希望 btitle 并不意味着“书名”。您需要重新考虑您的模型
  • 我目前正在为这种做法使用一套模式。 btitle 确实指的是书名。我只是想知道如何只显示所有书籍的位置为 2 或 3 的那些人
  • 顺便说一句,您的position&lt;&gt;1 条件是多余的。

标签: sql select


【解决方案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 的作者,然后删​​除处于另一个位置的作者。

【讨论】:

    【解决方案2】:

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

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

    尝试一些 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 的书的作者集”。为此,请参阅jpwanswer

    【讨论】:

      【解决方案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
      

      我希望这对你有用。

      【讨论】:

        【解决方案4】:

        试试这个:

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

        【讨论】:

        • 这列出了在第 2 或第 3 位写过书的作者;它不排除在位置 1(或位置 4、5、...)也写过书的人。
        【解决方案5】:

        尝试添加

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

        或者类似的...

        【讨论】:

          猜你喜欢
          • 2011-03-04
          • 1970-01-01
          • 2020-04-27
          • 1970-01-01
          • 1970-01-01
          • 2021-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多