Tenho uma tabela como a seguinte:
Annotation (
document,
term,
category
)
Onde document
e term
são algum ID, while category
é um número inteiro.
O casal document
- term
não é único, ou seja, poderia ter o mesmo casal com uma categoria diferente.
document_id_1, term_id_1, category_1
document_id_1, term_id_1, category_2
document_id_1, term_id_1, category_3
Gostaria de projetar uma consulta de forma que retorne apenas o casal document
- term
para quem existe apenas uma linha com category = 1
.
Ex. no exemplo anterior o casal document_id_1
- term_id_1
não é retornado porque existem também outras duas linhas, com valores diferentes de category
.
Você pode me dar algumas dicas de como fazer isso?
Se eu entendi corretamente, uma maneira de conseguir isso é obter essas linhas where
category = 1
, então verifique a inexistência de linhas não-category1:(Obrigado a DavideChicco.it por mostrar que isso era muito complicado).
Você deve ser capaz de usar algo semelhante a isto:
Consulte SQL Fiddle com demonstração .
Isso irá filtrar as linhas onde o
category =1
mas então verifica se odocument
eterm
tem apenas uma linha distinta na tabela.Se este for o PostgreSQL 8.4+, você também pode tentar o seguinte:
A
counted
Common Table Expression retorna linhas fornecidas com contagens de linhas por cada partição de(document, term)
. A consulta principal só precisa filtrar na condição de que uma linha pertença a uma categoria específica e que a contagem de linhas correspondente seja 1.Observe também que, se o seu design permitir entradas duplicadas de
(document, term, category)
, você precisará substituirCOUNT(*)
porCOUNT(DISTINCT category)
. (Isso pode resultar em mais de uma linha por(document, term)
na saída.)