假设我有一个如下表:
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值。
答案 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);
答案 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)