Estou fazendo algum trabalho de manutenção em um aplicativo de banco de dados e descobri que, alegria de alegria, mesmo que os valores de uma tabela estejam sendo usados no estilo de chaves estrangeiras, não há restrições de chave estrangeira nas tabelas.
Estou tentando adicionar restrições FK nessas colunas, mas estou descobrindo isso, porque já existe uma carga inteira de dados inválidos nas tabelas de erros anteriores que foram ingenuamente corrigidos, preciso encontrar as linhas que não corresponda à outra tabela e exclua-as.
Encontrei alguns exemplos desse tipo de consulta na Web, mas todos parecem fornecer exemplos e não explicações, e não entendo por que eles funcionam.
Alguém pode me explicar como construir uma consulta que retorna todas as linhas sem partidas em outra tabela, e o que está fazendo, para que eu possa fazer essas consultas mim mesmo, em vez de vir correndo para SO para cada tabela nesta bagunça que tem sem restrições de FK?
fonte
NULL
ID válido no seu esquema, você pode ter problemas maiores, não concorda? :)SELECT t1.ID, t2.ID
e remover a linha WHERE, terá uma idéia melhor de como isso funciona.Eu usaria a
EXISTS
expressão, uma vez que é mais poderosa, ou seja, você pode escolher com mais precisão as linhas nas quais gostaria de ingressar, casoLEFT JOIN
precise pegar tudo o que está na tabela unida. Sua eficiência é provavelmente a mesma do casoLEFT JOIN
com teste nulo.fonte
EXISTS
é a sua variabilidade.WHERE t2.id IS NULL
) Obrigado.A Tabela 1 possui uma coluna à qual você deseja adicionar a restrição de chave estrangeira, mas
foreign_key_id_column
nem todos os valores correspondem àid
tabela 2.id
s da tabela1. Essas serão as linhas que queremos excluir.NOT IN
cláusula na instrução where limita a consulta apenas às linhas em que o valor noforeign_key_id_column
não está na lista da tabela 2id
s.SELECT
declaração entre parênteses obterá uma lista de todos osid
s que estão na tabela 2.fonte
IN
cláusula com uma lista de valores literais. Não se aplica ao uso de umaIN
cláusula com o resultado de uma subconsulta. A resposta aceita para essa pergunta realmente resolve o problema usando uma subconsulta. (A grande lista de valores literais é problemática porque cria uma enorme expressão SQL A sub-consulta funciona bem porque, mesmo que a lista resultante é grande, a expressão SQL em si é pequena..)Onde
T2
está a tabela à qual você está adicionando a restrição:E exclua os resultados.
fonte
Vamos ter as 2 tabelas a seguir (salário e empregado)
Agora eu quero esses registros da tabela de funcionários que não estão no salário. Podemos fazer isso de três maneiras:
fonte
Da pergunta semelhante aqui MySQL Inner Junte-consulta para obter registros não presentes em outros Tabela eu tenho essa para o trabalho
smalltable
é onde você tem registros ausentes,bigtable
é onde você tem todos os registros. A consulta lista todos os registros que não existem,smalltable
mas existem nobigtable
. Você pode substituirid
por qualquer outro critério correspondente.fonte
Você pode optar por Visualizações, como mostrado abaixo:
e trabalhe na visualização para selecionar ou atualizar:
que produz o resultado como mostrado na figura abaixo, ou seja, para a coluna não correspondente, o nulo foi preenchido.
fonte
Não sei qual é otimizado (comparado a @AdaTheDev), mas este parece ser mais rápido quando eu uso (pelo menos para mim)
Se você deseja obter outro atributo específico, pode usar:
fonte
SELECT * FROM First_table MINUS SELECT * FROM outra
fonte
Você pode fazer algo assim
fonte
Como selecionar linhas sem entrada correspondente na tabela Both?
fonte