Je gère une requête contenant Même forte> Sous-requête utilisée plusieurs fois dans un J'ai une table ayant des champs de remorquage La sous-requête renvoie la liste des dates à exclure du résultat. P> C'est comme ça que j'utilise C'est. P> où code> clause.
Client_id code>,
acheteur_id code>. p>
SELECT
id, client_id, buyer_id
FROM relation
WHERE
client_id NOT IN (SELECT <some_id> FROM <some_table> WHERE ...)
AND buyer_id NOT IN (SELECT <some_ids> FROM <some_table> WHERE ...)
4 Réponses :
Queries du formulaire:
SELECT id, client_id, buyer_id FROM relation LEFT JOIN <some_table> ON <some_id> IN (client_id, buyer_id) WHERE <some_id> IS NULL
Une solution avec une jointure pourrait ne pas renvoyer le même résultat qu'une solution avec une sous-requête.
Exactement que ce que je ressens. Il ne renvoie pas la même rangée, plutôt plus de rangées. Aussi prendre du temps supplémentaire aussi. Ma requête d'origine est en cours d'exécution en 41 secondes et quand je l'ai utilisé dans la jointure, il a fallu 61 secondes.
@Talhaahmedkhan Pouvez-vous fournir un SQL-FIDDLE avec certaines données? Je pense que cette requête est équivalente à ce que vous avez (si client_id code> et
acheteur_id code> ne sont pas nullables.)
@YPERCUBE, Fondamentalement, j'ai simplifié ma requête un long chemin à manifestation pour vous montrer que vous venez du problème, j'ai 3 jointures intérieures et 4 à gauche et grand lieu où la clause de ma requête originale. Je vais essayer de ne mettre que la requête mentionnée sur le violon si cela vous convient bien.
Cela ne me dérange pas que si le problème est l'efficacité, je ne pense pas que vous éviterez de poster la requête complète.
@YPERCUBE, voici la mini version du problème. sqlfiddle.com/#!2/5f9f3/6
@Talhaahmedkhan: Dans votre Sqlfiddle, les deux requêtes renvoient le même nombre d'enregistrements.
Mais le temps pris par de rejoindre la table code> est plus que la sous-requête
code>. De plus, le nombre d'enregistrements dans mon DB est différent.
rejoindre code> donne 500 autres enregistrements que l'original.
Je demande à nouveau. Y a-t-il des nuls dans les 3 colonnes utilisées dans les jointures? (Au fait, ma requête retourne également le même nombre de lignes: SQL-FIDDLE-3 A >)
@Talhaahmedkhan: Cela peut être vrai, mais le point de la SQLFiddle était de reproduire le problème sous une forme plus gérable - jusqu'à présent, tout ce que vous avez réalisé est de démontrer la validité apparente i> de cette réponse. Peut-être que si vous postez la requête complète (pas nécessairement avec des données correspondantes dans SQLFIDDLE), il pourrait être possible de déterminer la cause?
Votre requête pourrait être transformée comme suit:
SELECT id, client_id, buyer_id FROM relation LEFT JOIN some_table ) AS subquery ON ( subquery.some_id IN (client_id, buyer_id) AND <condition that was in your subquery>) WHERE subquery.some_id IS NULL;
Il serait utile d'essayer de mettre les valeurs extraites dans une table de base de données distincte, de sorte que des valeurs de résultat similaires ou différentes peuvent maintenant être décidées lorsque vous avez déjà vos résultats dans une table séparée. En attente d'entendre de votre procédure ... bonne chance pls. P>
Vous pouvez écrire ceci en utilisant n'existe pas code>:
Je reçois Error Correlant champ code> Exception dans une requête similaire.
Avez-vous essayé de remplacer cette sous-requête avec une jointure?
@bluefeet, j'ai simplifié cette question un long chemin juste pour vous donner le vrai problème. De plus, je suis incapable de comprendre comment
rejoindre code> S
sur code> clause ressemblerait.