Eu tenho duas tabelas, uma tem uma chave primária e outra como uma chave estrangeira.
Quero extrair dados da tabela primária, apenas se a tabela secundária não tiver uma entrada contendo sua chave. Uma espécie de oposto de uma junção interna simples, que retorna apenas as linhas que se unem por essa chave.
B.Key IS NULL
mas ainda somos comparáveisA.Key = B.Key
?SELECT * FROM primarytable P WHERE NOT EXISTS (SELECT * FROM secondarytable S WHERE P.PKCol = S.FKCol)
Geralmente ,
(NOT) EXISTS
é uma escolha melhor(NOT) IN
ou(LEFT) JOIN
fonte
LEFT JOIN
superaNOT EXIST
use uma junção à esquerda "não existe":
SELECT p.* FROM primary_table p LEFT JOIN second s ON p.ID = s.ID WHERE s.ID IS NULL
fonte
Outra solução é:
SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)
fonte
SELECT P.* FROM primary_table P LEFT JOIN secondary_table S on P.id = S.p_id WHERE S.p_id IS NULL
fonte
P.key = S.key
e dissermoswhere S.key IS NULL
, isso também não torna P.key nulo?Se você quiser selecionar as colunas da Primeira Tabela "que também estão presentes na Segunda Tabela, neste caso você também pode usar
EXCEPT
. Neste caso, os nomes das colunas também podem ser diferentes, mas o tipo de dados deve ser o mesmo.Exemplo:
select ID, FName from FirstTable EXCEPT select ID, SName from SecondTable
fonte
Isso foi útil para usar no COGNOS porque a criação de uma instrução SQL "Not in" no Cognos era permitida, mas demorava muito para ser executada. Eu havia codificado manualmente a tabela A para unir à tabela B no Cognos como A.key "não em" B.key, mas a consulta estava demorando muito / não retornava resultados após 5 minutos.
Para qualquer pessoa que esteja procurando uma solução "NOT IN" no Cognos, aqui está o que eu fiz. Crie uma consulta que une as tabelas A e B com um LEFT JOIN no Cognos selecionando o tipo de link: a tabela A.Key tem valores "0 a N" na tabela B e, em seguida, adicionou um Filtro (correspondem às cláusulas Where) para: tabela B .Key é NULL.
Correu rápido e como um encanto.
fonte