SQL - 如何选择值为A但不是B的记录? (A和B属于不同的行)

时间:2014-07-08 09:22:18

标签: sql postgresql selection multiple-value

假设我有一个如下表:

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

我想得到那些记录的记录,其tag_id值为2,但没有3,在这​​种情况下,我想得到record_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值。

3 个答案:

答案 0 :(得分:3)

您可以在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

答案 1 :(得分:3)

这可以简单地写成

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

答案 2 :(得分:2)

实现此目的的一种方法是使用带有子查询的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)