0
votes

Même table interne-rejeter une table sur 2 conditions et les conditions sont parfois fausses

 Entrez la description de l'image ici

Détails:

  1. v et c sont des tables

  2. je veux c pour rejoindre v sur 2 conditions (deux C sont nommés C0 et C1 ). Puisque je dois filtrer v par colonnes de C et C S séparément dans la même requête, je pense que la jonction est nécessaire.

  3. v a beaucoup, au moins un C , et que cx n'existe parfois pas. < / li>

    à cause de 3., en utilisant une jointure intérieure à C0 et C1 provoque parfois un résultat vide, mais je ne veux pas obtenir v < / Code> La zone blanche de '

    schéma: xxx

    requête (1): xxx < p> requête (2): xxx

    où c0.name = "mot" ou c1.name = "mot" : cette clause existe tous les temps.

    où cx.name comme '% wo%' : cette clause dépend de l'heure.


3 commentaires

Ce n'est pas la bonne façon de poser des questions SQL sur le débordement de la pile. Souhaitez-vous s'il vous plaît jeter un oeil sur Ce lien et essayer d'améliorer la qualité de votre question afin qu'il réponde afin que les normes?


Les choses seront plus claires si vous postez le schéma de table V et C


Je suis désolé pour ma mauvaise explication. Je n'ai pas compris ce que je veux faire. Grâce à vos réponses, j'ai pu comprendre cela.


4 Réponses :


1
votes

Eh bien ... vous semblez rechercher un Existe condition avec la sous-requête corrélée: xxx

Ceci renvoie tous les enregistrements dans le tableau v < / Code> Pour lequel au moins un enregistrement existe dans le tableau C qui satisfait à la condition c.c0 = v.c0 ou condition c.c1 = v.c1 .

Dans cette situation, l'avantage de la sous-requête corrélée à l'approche est qu'elle évite de multiplier des enregistrements lorsque plusieurs matchs existent dans le tableau C .

Si vous souhaitez exclure les enregistrements qui répondent à des conditions, mais simplement modifier où il existe sur où il n'existe pas >.


3 commentaires

Un bon point sur existe pour éviter les doublons, mais leur interrogation ambiguïté très mal pour obtenir de l'aide.


! convenir certains de la référence de liaison à MCVE. La plupart des gens fournissent des informations de descente et n'ont pas besoin de la surcharge gonflée sur chaque question. Parfois, les gens jettent cela comme un commentaire si souvent son un peu effrayant, surtout les débutants qui ne peuvent même pas décrire ce qu'ils ne comprennent pas. J'ai répondu à beaucoup d'autres que cela n'a jamais eu le niveau de détail Mvce demande, mais cela prend également la lecture de la question et vous avez été en mesure d'offrir une solution réalisable sans cela :)


@Drapp: Oui, je suis d'accord avec vous que le répondeur doit également faire un effort réel pour comprendre la question, même lorsqu'il ne répond pas aux exigences rigoureuses en quelque sorte sur la balise SQL. J'ai également répondu à beaucoup de telles questions, souvent avec succès. Je suppose que c'est toujours une question d'évaluation à quel point vous êtes sûr que vous comprenez correctement ce qui est demandé à VS demandant des éclaircissements de l'OP.



1
votes

mauvaise demande / détails de la question, sachant un meilleur contexte de ce que vous voulez, même si des champs abrégés et des tables réelles pourraient aider à améliorer à l'avenir. Cependant, cela ressemble à ce que vous voulez est une condition "dans" basée sur l'une des conditions aliasées "C". Sans les voir, vous pouvez le regarder comme ceci (ou simplifié les deux critères en seconde).

select
      v.*
   from
      VTable v
         LEFT JOIN CTable C0
            on ( ( v.SomeField = C0.SomeField )
              OR ( v.SomeOtherField = C0.SomeOtherField ) )
   where
      c0.SomeField IS NOT NULL


0 commentaires

0
votes

Vous n'avez pas besoin de rejoindre la table C deux fois, vous pouvez écrire votre requête comme suit. XXX


0 commentaires

1
votes

Si vous voulez juste des colonnes à partir de V code>, alors existe code> se vient à l'esprit.

Je ferais former cela comme: p>

select v.*
from v
where v.id in (select c.v_id
               from c
               where c.type in (0, 1)
              );


0 commentaires