La partie du schéma est la suivante:
Je veux énumérer des paires de clients distinctes qui ont effectué un achat d'un livre (titre) en commun. Pour chaque paire de tels clients, montrez d'abord celui avec le plus grand CID. Dans la table de réponse, signalez uniquement les noms des clients. Les noms des colonnes de sortie sont J'ai déjà répertorié toutes les paires avec différents names et nomo avec le même titre p> au cas où une personne a besoin du fichier de création de table: édité: namea code> et nomo code>. P>
Il y aura deux personnes avec le même nom, de sorte que les paires de sortie doivent être distinctes par le CID code>, pas le nom code>. Le nombre de mes tuples de sortie réels correspond à la sortie attendue lorsque je Sélectionnez CID CODE>, mais cela ne fonctionne pas lorsque je sélectionne des noms. Étant donné que les clients sont identifiés par le CID code>, pas le nom code>, certains clients ayant le même nom seront filtrés si nous des noms distincts. Et c'est le problème que je travaille en ce moment. P> p>
4 Réponses :
Je suppose que vous pouvez d'abord rejoindre la table d'achat avec la table du client, puis peut rejoindre les deux tables dérivées -
SELECT c1.name as namea, c2.name as nameb
From (SELECT cid, name, title, year
FROM customer C
JOIN purchase P ON C.cid = P.cid) C1
JOIN (SELECT cid, name, title, year
FROM customer C
JOIN purchase P ON C.cid = P.cid) C2
WHERE C1.cid > C2.cid
AND C1.title = C2.title
AND c1.year = C2.year
ORDER BY C1.name, C2.name;
Il serait préférable d'utiliser un CTE puis une jointure auto-auto sur le CTE. De plus, l'OP souhaite que le nom doit dépendre de la CID, de sorte que vous avez besoin d'avoir C1.CID> C2.CID plutôt que! =
Pendant que j'attendais une réponse, j'ai trouvé un moyen de faire cela. Cependant, j'ai un nouveau problème que j'ai réellement besoin de paires distinctes et que nos deux Code ont ce problème qu'il ne produit pas de paires distinctes. Je ne peux pas simplement ajouter un mot-clé "distinct" juste après la sélection car les clients se distinguent par la CID, et non le nom. Si j'ajoute simplement simplement le mot clé distinct, la sortie réelle sera inférieure à la sortie attendue, car certaines personnes ont le même nom dans la base de données.
La meilleure approche possible consiste à partager les données de l'échantillon et le résultat attendu.
Eh bien, je gère le DB2 sur le serveur de mon université, je ne peux donc pas vraiment partager la base de données. Et il n'y a pas de résultat attendu exact. Mon professeur ne nous dit que combien de tuples devraient revenir. Quoi qu'il en soit, merci pour votre aide.
WITH Customer (cid, name) AS ( VALUES (1, 'N1') , (2, 'N2') , (3, 'N3') ) , Purchase (cid, club, title) AS ( VALUES (1, '1', 'T1') , (2, '2', 'T1') , (2, '3', 'T2') , (3, '4', 'T2') ) FROM ( SELECT distinct p1.cid cid1, p2.cid cid2 FROM Purchase p1 JOIN Purchase p2 on p2.title = p1.title and p2.cid > p1.cid ) p JOIN Customer c1 on c1.cid = p.cid1 JOIN Customer c2 on c2.cid = p.cid2; You may run it as is and edit base data to check the result. I omitted a number of your non-significant fields for simplicity. If the result is not expected, then edit your question with your sample data in the same form as above (edit the VALUES part of the query) and provide the result desired.
Merci pour la réponse. Votre code est très similaire (presque le même) que le mien. Mais il y a un problème. Les clients sont en réalité identifiés par leur CID, pas leur nom. Donc, si vous venez de mettre un mot-clé distinct après la sélection, certains clients avec le même nom seront filtrés. Y a-t-il un moyen de distinct C1.CID, C2.CID tout en étant en réalité imprimé C1.Name et C2.Name?
Apprendre à utiliser correctement, explicite, standard fort>, lisible Ce sera plus simple avec un CTE: p> si cela est pour un titre spécifique em>, Ajoutez ensuite joindre la syntaxe code>. Ici, vous avez juste besoin d'un tas de jointures. où cp.title =
Ajouter le ou vous pouvez Voir le Démo . CID CODE> S à la liste Sélectionnez la liste de votre requête, puis sélectionnez uniquement les noms: groupe par c1 .Cid, c1.name, c2.Cid, c2.name code>: p>
Résultat 283 rangées. P> P>
Mauvaises habitudes à frapper: Utiliser Old- Style jointures - que la liste des tables de style de style a été remplacée par le style i> ANSI i> ANSI i> ANSI I> Joindre code> Syntaxe dans l'ANSI - 92 B> SQL Standard ( Plus de 25 ans B> Il y a) et son utilisation est découragée
Pourquoi avez-vous besoin de comparer l'année? Le titre n'est-il pas assez?