1
votes

SQL Select - où la sous-requête a plusieurs lignes

J'essaie de créer une sélection simple qui demande le champ enfant et renvoie les résultats pour le champ parent. Dans la plupart de nos situations, un seul parent est répertorié, mais lorsque plusieurs, j'obtiens l'erreur «La sous-requête à une seule ligne renvoie plus d'une ligne» dont je ne suis pas sûr de savoir comment travailler.

Select Date, location, MiscData, ChildField, ParentField
from Maintable t1
where childfield = (select t2.parentfield from maintable t2 where t2.childfield = @('prompt', childfield))

Comme je l'ai mentionné pour une grande majorité de nos données, il n'y aura qu'un seul champ parent, mais lorsqu'il y en a plus d'un, il y a une erreur. J'ai commencé à trébucher sur mes propres pieds pour ainsi dire et peut-être à penser à cela complètement de la mauvaise manière et pourrais utiliser quelques pointeurs ou au moins un coup de pouce dans la bonne direction.

Juste pour un peu plus de clarification sur mon code; le champ parent était autrefois contenu dans le champ enfant et ce sont les résultats que j'essaie d'obtenir. Et quand le champ parent était un champ enfant, il n'aurait pas de champ parent.

J'ai créé l'ensemble d'échantillons ci-dessous pour essayer de donner une idée de certains des éléments que je traite. Avec cet ensemble, on peut visualiser comment plusieurs parents peuvent maquiller un enfant, c'est pourquoi nous pouvons avoir plusieurs lignes. "et non, ce n'est pas pour une barre - juste un ensemble d'échantillons"

Exemple d'ensemble de données:

 entrez la description de l'image ici


7 commentaires

Alors, quel est le résultat souhaité lorsqu'il y a plus d'une ligne parent? Tout retourner?


Veuillez fournir des exemples de données et les résultats souhaités.


@ErwinBrandstetter - ce serait idéal pour tout voir et je pourrais commander par date


@GordonLinoff - J'ai ajouté un ensemble d'échantillons à l'enquête, jetez un œil


Donc, si la table contient les huit lignes que vous affichez et que vous demandez «cup1», la requête affichera les quatre dernières lignes (celles avec Cildfield = «Johnny Walker»). Oui?


Les balises sont incorrectes. Quel SGBD utilisez-vous? Oracle est un autre SGBD que PostgreSQL. Et le langage de programmation de base de données d'Oracle PL / SQL n'a rien à voir avec cela.


@ThorstenKettner merci pour cela, vous aviez raison sur mes balises. Il s'agit d'une base de données Oracle 12c. Aussi oui si demander cup1 j'obtiendrais ceux avec le champ d'enfant Johnny Walker


4 Réponses :


0
votes

essayez ceci

Select Date, location, MiscData, ChildField, ParentField
    from Maintable t1
    where childfield in (select t2.parentfield from maintable t2 where t2.childfield = @('prompt', t1.childfield))


1 commentaires

J'ai essayé de ne pas faire d'erreur, mais cela n'a pas non plus donné de résultats



0
votes

La raison principale de ce problème est que votre sous-requête renvoie plusieurs ensembles de résultats

Il existe différentes solutions pour cela, voyons ci-dessous la solution une par une.

1 TOP 1 dans la sous-requête h1 >
 Select Date, location, MiscData, ChildField, ParentField
    from Maintable t1
    INNER JOIN maintable t2 ON t2.parentfield = t1.childfield 
    where t2.childfield = @('prompt', childfield))

2 Jointure interne au lieu d'une sous-requête

Select Date, location, MiscData, ChildField, ParentField
from Maintable t1
where childfield = (select TOP(1) t2.parentfield from maintable t2 where t2.childfield = @('prompt', childfield))

J'espère que la solution ci-dessus pourra vous aider.

p >


0 commentaires

0
votes

Votre explication est un peu difficile à comprendre, mais en regardant vos données, il semble que certaines de vos lignes ont été remplacées par d'autres.

select
  t1.date,
  coalesce(t2.location, t1.location) as location
from maintable t1
left join maintable t2 on t2.childfield = t1.parentfield and t2.date = t1.date
where t1.childfield = 'abc'
order by t1.date;

Si vous recherchez "abc" , tu veux ...

  • la première ligne ('A-old'), car elle est toujours abc et n'a pas été remplacée.
  • la troisième ligne ('B-new'), qui remplace la deuxième (parentfield-> childfield, même date)
  • la sixième ligne ('D-new'), qui remplace la cinquième (parentfield-> childfield, même date)
+------------+----------+
|    date    | location |
+------------+----------+
| 2020-05-01 | A-old    |
| 2020-05-02 | B-new    |
| 2020-05-04 | D-new    |
+------------+----------+

Si tel est le cas, je recommanderais une auto-jointure externe:

+------------+----------+------------+-------------+
|    date    | location | childfield | parantfield |
+------------+----------+------------+-------------+
| 2020-05-01 | A-old    | abc        |             |
| 2020-05-02 | B-old    | abc        | def         |
| 2020-05-02 | B-new    | def        |             |
| 2020-05-03 | C-old    | def        |             |
| 2020-05-04 | D-old    | abc        | ghi         |
| 2020-05-04 | D-new    | ghi        |             |
+------------+----------+------------+-------------+


0 commentaires

0
votes

J'ai passé en revue certaines des suggestions fournies et le meilleur sur lequel j'ai pu travailler a été de Rajat.

Select Date, location, MiscData, ChildField, ParentField
    from Maintable t1
    INNER JOIN maintable t2 ON t2.parentfield = t1.childfield 
    where t2.childfield = @('prompt', childfield))

Je n'ai reçu aucune donnée qui, selon moi, était due au tristement célèbre caractère «espace» qui a tout jeté hors de propos.


0 commentaires