2

假设我有一个如下表:

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 值。

4

3 回答 3

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小提琴

于 2014-07-08T09:57:21.333 回答
3

这可以简单地写成

SELECT record_id FROM table_A WHERE tag_id = 2
EXCEPT
SELECT record_id FROM table_A WHERE tag_id = 3;
于 2014-07-08T10:22:49.773 回答
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)
于 2014-07-08T09:32:37.530 回答