0
votes

Question de devoirs: Y a-t-il un moyen de comparer les contenus dans différentes tables en même temps?

La partie du schéma est la suivante:

  • client (CID, nom, ville) (clé primaire: CID)
  • achat (CID, club, titre, année, quand, Qnty) (clé primaire: CID, club, titre, année, quand)

    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 namea et nomo .

    J'ai déjà répertorié toutes les paires avec différents names et nomo avec le même titre xxx

    au cas où une personne a besoin du fichier de création de table: Créez , le numéro de retour attendu devrait Soyez 283, mais je continue à obtenir 282 car il y a 2 personnes avec le même nom.

    édité:
    Il y aura deux personnes avec le même nom, de sorte que les paires de sortie doivent être distinctes par le CID , pas le nom . Le nombre de mes tuples de sortie réels correspond à la sortie attendue lorsque je Sélectionnez CID , mais cela ne fonctionne pas lorsque je sélectionne des noms. Étant donné que les clients sont identifiés par le CID , pas le nom , 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.

sql

2 commentaires

Mauvaises habitudes à frapper: Utiliser Old- Style jointures - que la liste des tables de style de style a été remplacée par le style ANSI ANSI ANSI Joindre Syntaxe dans l'ANSI - 92 SQL Standard ( Plus de 25 ans 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?


4 Réponses :


0
votes

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;


4 commentaires

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.



0
votes
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.

1 commentaires

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?



1
votes

Apprendre à utiliser correctement, explicite, standard , lisible joindre la syntaxe . Ici, vous avez juste besoin d'un tas de jointures.

Ce sera plus simple avec un CTE: xxx

si cela est pour un titre spécifique , Ajoutez ensuite où cp.title = .


0 commentaires

0
votes

Ajouter le CID S à la liste Sélectionnez la liste de votre requête, puis sélectionnez uniquement les noms: xxx

ou vous pouvez groupe par c1 .Cid, c1.name, c2.Cid, c2.name : xxx

Voir le Démo .
Résultat 283 rangées.


0 commentaires