Ce serait un problème si la requête SELECT est sur le côté gauche de la clause de la clause plutôt que sur le côté droit que nous utilisons habituellement.
select * from ABC A where (select ID from XYZ) in (A.ID, A.PID);
3 Réponses :
Vous pouvez gérer cela en utilisant joindre code>
Qui retourne quelque chose de différent, vous ne pouvez pas toujours remplacer un problème avec une jointure
La table ABC a deux colonnes ABC.ID et ABC.PID et les deux vérifient la valeur de XYZ.Id. Donc, il suffit de rejoindre les deux table donnerait la sortie attendue au lieu d'écrire une sous-requête deux fois.
Pas si cela entraîne plusieurs matchs
Il y a une chose appelée rejoindre interne code> pour ce problème. SELECT *
FROM ABC
WHERE
ABC.ID IN (select ID from XYZ)
OR ABC.PID IN (select ID from XYZ)
Ouais je sais sur la jointure intérieure mais je veux savoir ce qui ne va pas avec où la clause
Vous essayez de sélectionner des valeurs à l'aide de la sous-requête sur le côté gauche de la clause WHERE, où la clause nécessite un champ pour appliquer des filtres. Où
Oui et dans votre deuxième requête, vous pouvez voir que j'écris la même sous-requête deux fois. Mes sous-sollicitations sont peu longues et les écrivent deux fois sur la performance.
Exactement pour les raisons de performance que vous devez utiliser une jointure intérieure.
ok donc ma question est :: Sélectionnez * à partir d'abc A Où (sélectionnez ID de XYZ) dans (A.ID, A.PID); Cette approche est-elle fausse?
Une requête avec une condition intégrée ne peut pas toujours être écrite comme une jointure intérieure. La jointure interne change la signification de la requête.
Je ne dis pas que la jointure intérieure peut toujours remplacer à l'état où la clause, j'ai spécifiquement dit "pour ce problème".
Je pense que existe code> fait ce que vous voulez: select a.*
from ABC a
where exists (select 1
from XYZ x
where x.id in (A.ID, A.PID)
);
Votre question n'est pas claire. S'il vous plaît élaborer-le. En outre, les échantillons de données et les résultats attendus aideraient.
En fait, j'ai besoin d'une requête Select * de ABC A où A.Id In (Sélectionnez ID de XYZ) ou A.PID dans (Sélectionnez ID de XYZ), mais je ne veux pas que deux sous-candidats, car cela pourrait ralentir le processus
Voici une question idiote (ou trois :) Avez-vous essayé d'exécuter votre requête? Si vous l'avez fait, avez-vous eu une erreur? Si vous avez eu une erreur, pouvez-vous le poster?
@Abra Cette requête fonctionne. Mais je veux juste savoir si c'est une bonne idée qui est tout
@Syma Cette requête ne fonctionne pas si votre sous-requête retourne plus d'une ligne: dbfiddle.uk/...
Ma sous-requête ne renverra qu'une seule rangée que j'en suis sûr
Ma sous-requête ne reviendra qu'une rangée que j'en suis sûr I> C'est ce que les personnes qui ont écrit des logiciels pour le Ariane 5 Rocket pensait et quand leur hypothèse s'est révélée mal, des centaines de millions de dollars ont monté de fumer! Peut-être devriez-vous envisager la possibilité que votre hypothèse soit fausse.
haha est vrai que :)
Il n'est pas faux d'écrire la requête comme vous l'avez, mais c'est inhabituel. J'irais avec la réponse de Gordon de l'utilisation d'exists à la place - cela présente l'avantage de ne pas erreurs, s'il y ait plus d'une ligne à XYZ.