Pergunta

Eu acho que estou indo no caminho certo com este ... Por favor, urso comigo como meu SQL não é o maior

Eu estou tentando consultar um banco de dados para selecionar tudo de uma tabela onde certas células não existem em outro. Que muito não faz muito sentido, mas eu estou esperando que este pedaço de código irá

SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

Então, basicamente, eu tenho uma tabela com uma lista de empregados e seus detalhes. Em seguida, outra mesa com alguns outros detalhes, incluindo o seu nome. Onde há nome não está na tabela de eotm_dyn, ou seja, não há nenhuma entrada para eles, eu gostaria de ver exatamente quem eles são, ou em outras palavras, ver exatamente o que está faltando.

O acima consulta retorna nada, mas eu sei que há nomes 20ish faltando para que eu obviamente não tenha obtido direito.

alguém pode ajudar?

Foi útil?

Solução

Você não se juntou a tabela em sua consulta.

A sua consulta original sempre retornará nada menos que não há registros de todo em eotm_dyn, caso em que ele irá retornar tudo.

Assumindo estas tabelas devem ser unidas em employeeID, use o seguinte:

SELECT  *
FROM    employees e
WHERE   NOT EXISTS
        (
        SELECT  null 
        FROM    eotm_dyn d
        WHERE   d.employeeID = e.id
        )

Você pode juntar essas tabelas com uma palavra-chave LEFT JOIN e filtrar o NULL de, mas isso provavelmente vai ser menos eficiente do que usar NOT EXISTS.

Outras dicas

SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn)

ou

SELECT * FROM employees WHERE NOT EXISTS (SELECT * FROM eotm_dyn WHERE eotm_dyn.name = employees.name)

ou

SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL

Você pode fazer um LEFT JOIN e assert a coluna associada é NULL.

Exemplo:

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL
SELECT * from employees
WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

Nunca retorna quaisquer registros a menos eotm_dyn está vazio. Você precisa de algum tipo de critérios em SELECT name FROM eotm_dyn como

SELECT * from employees
WHERE NOT EXISTS (
    SELECT name FROM eotm_dyn WHERE eotm_dyn.employeeid = employees.employeeid
)

assumindo que as duas tabelas estão ligadas por uma relação de chave estrangeira. Neste ponto, você pode usar uma variedade de outras opções, incluindo um LEFT JOIN. O otimizador irá normalmente lidar com eles o mesmo na maioria dos casos, no entanto.

Você também pode ter um olhar para esta questão relacionado. Esse usuário relatou que a utilização da junção proporcionou melhor desempenho do que usando uma consulta sub.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top