Eu tenho uma tabela chamada Tags
:
TagId | Nome |
---|---|
1 | abc |
2 | abc |
1 | def |
2 | def |
1 | ret |
Como posso obter registros distintos que estão associados apenas a Tagid = 1
, mas também não deveriam ter tagid = 2
? Portanto, se um registro estiver associado a 2 tagIds, ele não deve ser retornado.
Espero poder explicar minha pergunta. Agradeço desde já.
Resultados esperados:
TagId | Nome |
---|---|
1 | ret |
O que eu tentei:
SELECT
*
FROM
(SELECT
ROW_NUMBER() OVER (PARTITION BY TagId ORDER BY Name) RN
FROM
Tags) t
WHERE
t.tagId = 1
A solução mais simples parece ser usar,
NOT EXISTS
por exemploSolução simples:
Eu sugiro esta abordagem
violino
Este é um ótimo caso de uso para
NOT IN
!Frequentemente, devemos evitar,
NOT IN
pois pode produzir resultados inesperados quando há colunas anuláveis envolvidas. Quanto mais tabelas e colunas estiverem envolvidas na consulta, maior o risco de obter um resultado indesejado.A vantagem no seu caso de uso aqui é que apenas uma única tabela está envolvida e a coluna de nome não é anulável (presumo isso porque não faria sentido torná-la anulável). Isso torna o risco mencionado extremamente baixo e
NOT IN
bastante interessante aqui.Se você preferir evitar geralmente
NOT IN
ou se eu estiver errado e a coluna de nome for anulável ou se você estender a consulta envolvendo colunas anuláveis, useNOT EXISTS
como mostrado nesta resposta