【问题标题】:Select values in SQL that have a colum value in one row and not a specific other column value in another选择 SQL 中的值,这些值在一行中具有列值,而在另一行中没有特定的其他列值
【发布时间】:2015-11-21 03:44:18
【问题描述】:

从下表中,我想返回包含主题 3 但没有主题 4 的所有书籍的集合。

id  book    topic
10  1000    3
11  1000    4
12  1001    2
13  1001    3
14  1002    4
15  1003    3

正确的表格应该是:

book    
1001
1003

我用这个做了一个 SQL Fiddle 来测试 here

到目前为止,我尝试了以下,但它返回100010011003(因为我没有比较两行,也不知道该怎么做):

SELECT DISTINCT a.id
FROM TOPICS a, TOPICS b
WHERE a.id = b.id
AND a.topic = 3 

AND NOT EXISTS (

SELECT DISTINCT c.id
FROM TOPICS c
WHERE a.id = c.id
AND b.topic = 4

)

【问题讨论】:

    标签: mysql sql sql-server select


    【解决方案1】:

    你快到了。 not exists 条件绝对是正确的想法,您只需要应用其中的另一个来检查主题 3 的存在:

    SELECT DISTINCT a.book
    FROM   topics a
    WHERE  EXISTS (SELECT *
                   FROM   topics b
                   WHERE  a.book = b.book AND b.topic = 3) AND
          NOT EXISTS (SELECT *
                      FROM   topics b
                      WHERE  a.book = b.book AND b.topic = 4)
    

    【讨论】:

    • @jpw arg,确实如此。没注意那里。固定的。感谢您的关注!
    【解决方案2】:

    由于您使用的是 SQL Server(至少在小提琴中),您可以使用 exceptset 运算符:

    SELECT DISTINCT book FROM TOPICS WHERE topic = 3 
    EXCEPT
    SELECT DISTINCT book FROM TOPICS WHERE topic = 4
    

    这将返回 1001 和 1003。

    【讨论】:

      【解决方案3】:

      使用不存在:

      SELECT a.book
      FROM TOPICS a
      WHERE a.topic = 3 
         AND NOT EXISTS
         (SELECT 1
          FROM TOPICS b
          WHERE a.book = b.book
          AND b.topic = 4)
      

      【讨论】:

        猜你喜欢
        • 2013-01-02
        • 1970-01-01
        • 2020-12-01
        • 2012-05-25
        • 1970-01-01
        • 1970-01-01
        • 2017-02-14
        • 2019-07-02
        • 1970-01-01
        相关资源
        最近更新 更多