0
votes

Requête SQL (auto-join nécessaire?)

J'ai une table avec plusieurs champs et deux champs I.D, un champ est appelé régulier_id et deuxième s'appelle Spécial.

Chaque ligne peut avoir une valeur sous régularis_id et spécial_id, s'il existe une valeur sous SPECOVIE_ID, elle existe ensuite ailleurs dans la table sous forme de régulier.

Je veux construire une requête qui dit -

Donnez-moi toutes les lignes où le champ Special_id est NULL, mais la valeur dans le champ Région_id n'existe nulle part ailleurs (dans une autre ligne / enregistrement) dans ce tableau sous le champ spécial.


3 commentaires

Partager des données d'échantillonnage et une sortie


Semble simple, qu'est-ce que tu as jusqu'à présent?


Jusqu'à présent, je pense à essayer un auto rejoindre? Mais pas sûr - je ne sais pas comment partager des données d'échantillonnage ou une sortie ici? Les échantillons de données seraient simplement une ligne avec plusieurs champs et les deux champs concernés sont les deux champs I.D.


3 Réponses :


1
votes

REMARQUE: UNTESTÉ.

select A.*
from table A
where A.special_id is null
and not exists (select 1 from table B where B.special_id = A.regular_id)


5 commentaires

Je pense que vous avez un identifiant spécial et des rôles d'identification régulière ont échangé ici.


Paraphrasant une partie de la question originale ... le champ régulier_id n'existe pas dans le domaine spécial


désolé échangé dans le b.speciial_id = a.regular_id? Devrait-il être l'inverse ou c'est ce qu'il devrait être basé sur la question?


Comme je l'ai écrit dans ma réponse - non testée, car vous n'avez pas fourni de données d'exemple et que je n'ai pas non plus la table EMP que @John Martin mentionné dans sa réponse.


La requête est correcte. (Ou la description dans la demande est fausse.)



1
votes

Sous-requête ou exister peut faire.

Ceci est très similaire à la célèbre table Scott.emp dans Oracle. P>

select m.*
from scott.EMP m
where m.mgr IS NULL
and m.empno not in (select mgr from scott.EMP where mgr is not null)


3 commentaires

Ceci est une solution incorrecte. Voir mon exemple et consultez l'exemple de données / résultat.


pas dans se comporte étrange avec les nulls. Une fois une nulle dans la liste, l'expression n'est pas vraie. Donc, soit utiliser n'existe pas et faire la sous-requête corrélée ou restez avec pas dans mais excluez les nulls dans votre sous-requête: où Mgr n'est pas null .


Merci Thorsten Kettner, j'ai oublié la nulle dans la liste



1
votes

une jointure auto est la bonne façon d'aller. xxx

Remarque: remplacez le nom de votre nom de votre table.

Exemple de données: xxx

résultat: xxx


3 commentaires

Je préfère beaucoup pas dans et n'existe pas sur votre solution, car ils sélectionnent des lignes de la table où n'existe pas certaines autres lignes. Ils choisissent donc à partir de la table unique que vous souhaitez avoir des données pour et de mettre des critères (la recherche) dans le clause où il appartient à mon avis. Votre solution, cependant, n'est pas rare. C'est ce qu'on appelle un Anti Join et est souvent utilisé sur les jeunes SGBD qui ont toujours des problèmes de performance avec dans et existent clauses. Une astuce que je n'utiliserais que lorsque forcé à. Quoi qu'il en soit, c'est mon point de vue et d'autres peuvent le voir différemment.


Quoi qu'il en soit, votre réponse montre Chris90 comment montrer des échantillons de données et des résultats attendus. Cela devrait l'aider avec ses prochaines demandes. Mon upvote pour cela. (Et la requête est correcte, aussi bien sûr.)


Merci pour les commentaires @thorstenkettner