Je fais des travaux de maintenance sur une application de base de données et j'ai découvert que, joie de joie, même si les valeurs d'une table sont utilisées dans le style des clés étrangères, il n'y a pas de contraintes de clé étrangère sur les tables.
J'essaie d'ajouter des contraintes FK sur ces colonnes, mais je trouve que, parce qu'il y a déjà une charge entière de mauvaises données dans les tableaux d'erreurs précédentes qui ont été naïvement corrigées, je dois trouver les lignes qui ne le font pas correspondre à l'autre table, puis supprimez-les.
J'ai trouvé quelques exemples de ce type de requête sur le Web, mais ils semblent tous fournir des exemples plutôt que des explications, et je ne comprends pas pourquoi ils fonctionnent.
Quelqu'un peut-il m'expliquer comment construire une requête qui renvoie toutes les lignes sans correspondance dans une autre table, et ce qu'il fait, afin que je puisse faire ces requêtes moi-même, plutôt que de venir en cours d'exécution sur SO pour chaque table de ce désordre qui a pas de contraintes FK?
la source
NULL
ID est valide dans votre schéma, vous pourriez avoir de plus gros problèmes, n'est-ce pas? :)SELECT t1.ID, t2.ID
et supprimez la ligne OERE vous aurez une meilleure idée de comment cela fonctionne.J'utiliserais l'
EXISTS
expression car elle est plus puissante, vous pouvez donc choisir plus précisément les lignes que vous souhaitez rejoindre, au cas oùLEFT JOIN
vous devriez prendre tout ce qui est dans la table jointe. Son efficacité est probablement la même qu'en cas deLEFT JOIN
test nul.la source
EXISTS
sa variabilité.WHERE t2.id IS NULL
) Merci.Le tableau 1 comporte une colonne à laquelle vous souhaitez ajouter la contrainte de clé étrangère, mais les valeurs dans le
foreign_key_id_column
ne correspondent pas toutesid
à celles du tableau 2.id
s de table1. Ce seront les lignes que nous voulons supprimer.NOT IN
clause de l'instruction where limite la requête aux seules lignes où la valeur dans leforeign_key_id_column
n'est pas dans la liste des tables 2id
s.SELECT
instruction entre parenthèses obtiendra une liste de tous lesid
s du tableau 2.la source
IN
clause avec une liste de valeurs littérales. Elle ne s'applique pas à l'utilisation d'uneIN
clause avec le résultat d'une sous-requête. Cette réponse acceptée à cette question résout en fait le problème en utilisant une sous-requête. (Une grande liste de valeurs littérales est problématique car elle crée une énorme expression SQL. Une sous-requête fonctionne très bien car, même si la liste résultante est grande, l'expression SQL elle-même est petite.)Où
T2
est la table à laquelle vous ajoutez la contrainte:Et supprimez les résultats.
la source
Soit les 2 tableaux suivants (salaire et employé)
Maintenant, je veux ces enregistrements de la table des employés qui ne sont pas en salaire. Nous pouvons le faire de 3 manières:
la source
De la même question ici MySQL Inner Join Query pour obtenir des enregistrements non présents dans une autre table J'ai réussi à le faire fonctionner
smalltable
est l'endroit où vous avez des enregistrements manquants,bigtable
c'est où vous avez tous les enregistrements. La requête répertorie tous les enregistrements qui n'existent passmalltable
mais existent sur lebigtable
. Vous pouvez remplacerid
par tout autre critère correspondant.la source
Vous pouvez opter pour les vues comme indiqué ci-dessous:
puis travaillez sur la vue pour sélectionner ou mettre à jour:
ce qui donne le résultat comme indiqué dans l'image ci-dessous, c'est-à-dire que pour la colonne non correspondante, null a été rempli.
la source
Je ne sais pas lequel est optimisé (par rapport à @AdaTheDev) mais celui-ci semble être plus rapide lorsque j'utilise (au moins pour moi)
Si vous souhaitez obtenir tout autre attribut spécifique, vous pouvez utiliser:
la source
SELECT * FROM First_table MINUS SELECT * FROM another
la source
Vous pouvez faire quelque chose comme ça
la source
Comment sélectionner des lignes sans entrée correspondante dans les deux tableaux?
la source