【问题标题】:SQL - How to select records with value A but not B? (A and B belongs to different rows)SQL - 如何选择值为 A 但不是 B 的记录? (A和B属于不同的行)
【发布时间】:2014-07-08 09:22:18
【问题描述】:

假设我有一个如下表:

row_id  record_id   tag_id
1       1           2
2       1           3
3       2           2
4       2           4
5       3           2
6       3           3

我想获取那些他们有记录的记录 ID 值为 2 但没有 3,在这种情况下,我想获取记录 ID 2。我只能想到一个带有 3 个选择的 SQL 语句,但它看起来很笨重.有没有更简单、更快的方法来实现这一目标?谢谢。

编辑:

我得到的 SQL:

SELECT record_id
FROM table_A 
WHERE record_id NOT IN (SELECT record_id 
                         FROM table_A 
                         WHERE record_id IN (SELECT record_id 
                                              FROM table_A 
                                              WHERE tag_id = 2) 
                         AND tag_id =3) 
AND record_id IN (SELECT record_id FROM table_A WHERE tag_id = 2) GROUP BY record_id

并且每个record_id 可能有1 到任意数量的tag_id 值。

【问题讨论】:

  • 请向我们展示您的代码,以便我们帮助您改进它。
  • ...GROUP BY record_id HAVING SUM (tag_id=3)=0
  • 欢迎来到 Stack Overflow。请阅读Stack Overflow: How to askJon Skeet's Question Checklist,了解如何提出一个好的问题,从而产生好的有用的答案。

标签: sql postgresql selection multiple-value


【解决方案1】:

这可以简单地写成

SELECT record_id FROM table_A WHERE tag_id = 2
EXCEPT
SELECT record_id FROM table_A WHERE tag_id = 3;

【讨论】:

    【解决方案2】:

    您可以在 postgresql 的查询中使用 bool_or() 函数:

    select record_id from table1 group by record_id
    having bool_or(tag_id = 2) and not bool_or(tag_id = 3);
    

    SQL Fiddle

    【讨论】:

    • 可以在没有子查询的情况下使用having bool_or(tag_id = 2) and not bool_or(tag_id = 3) 完成。顺便说一句,tag_2 is truetag_2 相同。 tag_3 is falsenot tag_3 相同
    • 感谢您的评论伊戈尔。
    【解决方案3】:

    实现此目的的一种方法是使用带有子查询的IN 运算符:

    SELECT *
    FROM   my_table
    WHERE  tag_id = 2 AND record_id NOT IN (SELECT record_id
                                            FROM   my_table
                                            WHERE  tag_id = 3)
    

    EXISTS 运算符也可以实现类似的解决方案:

    SELECT *
    FROM   my_table a
    WHERE  tag_id = 2 AND NOT EXISTS (SELECT record_id
                                      FROM   my_table b
                                      WHERE  tag_id = 3 AND
                                             a.record_id = b.record_id)
    

    【讨论】:

      猜你喜欢
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多