7
votes

Même sous-requête utilisée plusieurs fois dans une seule requête

Je gère une requête contenant Même forte> Sous-requête utilisée plusieurs fois dans un où code> clause.

J'ai une table ayant des champs de remorquage Client_id code>, acheteur_id code>. p>

La sous-requête renvoie la liste des dates à exclure du résultat. P>

C'est comme ça que j'utilise C'est. 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 ...)


2 commentaires

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 S sur clause ressemblerait.


4 Réponses :


1
votes

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


10 commentaires

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 et acheteur_id 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 est plus que la sous-requête . De plus, le nombre d'enregistrements dans mon DB est différent. rejoindre 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 )


@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 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?



0
votes

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;


0 commentaires

0
votes

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.


0 commentaires

3
votes

Vous pouvez écrire ceci en utilisant n'existe pas : xxx


1 commentaires

Je reçois Error Correlant champ Exception dans une requête similaire.