我有一个如下表:
Annotation (
document,
term,
category
)
其中document
和term
是一些 ID,而category
是一个整数。
这对夫妇document
-term
不是唯一的,即我可以将同一对夫妇放在不同的类别中。
document_id_1, term_id_1, category_1
document_id_1, term_id_1, category_2
document_id_1, term_id_1, category_3
我想设计一个查询,使其只返回这对夫妇document
-term
对于他们来说,只有一行与category = 1
.
例如,在前面的示例中,一对document_id_1
-term_id_1
未返回,因为还存在其他两行,具有不同的值category
。
你能给我一些关于如何做到这一点的提示吗?
如果我理解正确,实现此目的的一种方法是将这些行放在 where
category = 1
,然后检查是否不存在非 category1 行:(感谢 DavideChicco.it 表明这过于复杂)。
你应该能够使用类似这样的东西:
请参阅带有演示的 SQL Fiddle。
这将过滤
category =1
but 所在的行,然后检查以确保document
和term
在表中只有一个不同的行。如果这是 PostgreSQL 8.4+,您还可以尝试以下操作:
counted
Common Table Expression 返回为 的每个分区提供行计数的行(document, term)
。主查询只需要以某一行属于特定类别且对应的行数为1为条件进行过滤。另请注意,如果您的设计允许 的重复条目
(document, term, category)
,则需要替换COUNT(*)
为COUNT(DISTINCT category)
。(相应地,这可能会导致输出中的每一行不止一行(document, term)
。)