Respostas:
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
Q : O que está acontecendo aqui?
R : Conceitualmente, selecionamos todas as linhas table1
e, para cada linha, tentamos encontrar uma linha table2
com o mesmo valor para a name
coluna. Se não houver essa linha, deixamos a table2
parte do resultado em branco para essa linha. Em seguida, restringimos nossa seleção escolhendo apenas as linhas no resultado em que a linha correspondente não existe. Finalmente, ignoramos todos os campos do nosso resultado, exceto a name
coluna (a que temos certeza de que existe table1
).
Embora possa não ser o método mais eficiente possível em todos os casos, ele deve funcionar basicamente em todos os mecanismos de banco de dados que tentam implementar o ANSI 92 SQL
Você pode fazer
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
ou
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table1
WHERE table1.name = table2.name)
Veja esta pergunta para três técnicas para realizar isso
Não tenho pontos de representação suficientes para votar na 2ª resposta. Mas eu tenho que discordar dos comentários na resposta superior. A segunda resposta:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
É MUITO mais eficiente na prática. Não sei por que, mas estou com 800k + de registros e a diferença é tremenda com a vantagem dada à 2ª resposta postada acima. Apenas meus $ 0,02
Isso é pura teoria dos conjuntos que você pode obter com a minus
operação.
select id, name from table1
minus
select id, name from table2
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;
https://www.cloudways.com/blog/how-to-join-two-tables-mysql/
Cuidado com as armadilhas. Se o campo Name
em Table1
conter nulos você está em surpresas. Melhor é:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
Aqui está o que funcionou melhor para mim.
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
Isso foi duas vezes mais rápido que qualquer outro método que tentei.
Você pode usar EXCEPT
no mssql ou MINUS
no oracle, eles são idênticos de acordo com:
Esse trabalho afiado para mim
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
Consulte a consulta:
SELECT * FROM Table1 WHERE
id NOT IN (SELECT
e.id
FROM
Table1 e
INNER JOIN
Table2 s ON e.id = s.id);
Conceitualmente, seria: Buscando os registros correspondentes na subconsulta e, em seguida, na consulta principal, buscando os registros que não estão na subconsulta.
Vou repostar (já que ainda não sou legal o suficiente para comentar) na resposta correta ... caso alguém ache que seja necessário explicar melhor.
SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL
E eu vi a sintaxe do FROM precisando de vírgulas entre os nomes das tabelas no mySQL, mas no sqlLite parecia preferir o espaço.
O ponto principal é que quando você usa nomes de variáveis incorretos, isso deixa perguntas. Minhas variáveis devem fazer mais sentido. E alguém deve explicar por que precisamos de uma vírgula ou não.
Se você deseja selecionar um usuário específico
SELECT tent_nmr FROM Statio_Tentative_Mstr
WHERE tent_npk = '90009'
AND
tent_nmr NOT IN (SELECT permintaan_tent FROM Statio_Permintaan_Mstr)
A tent_npk
é a chave primária de um usuário