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"
4 Réponses :
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))
J'ai essayé de ne pas faire d'erreur, mais cela n'a pas non plus donné de résultats
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.
Select Date, location, MiscData, ChildField, ParentField from Maintable t1 INNER JOIN maintable t2 ON t2.parentfield = t1.childfield where t2.childfield = @('prompt', childfield))
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 >
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 ...
+------------+----------+ | 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 | | +------------+----------+------------+-------------+
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.
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