SQL Abfrage
- Dieses Thema hat 4 Antworten und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 15 Jahre, 4 Monaten von
Anonym.
-
AuthorPosts
-
24. April 2008 um 14:34 Uhr #2849
AnonymInaktivHallo, bin ganz neu hier.
Habe ein sql problem :
3 DB2 Tabelle:
1. Tabelle Kunden beinhaltet:
ID und Kundennummer
z.B.
ID Â Â Kdnr:
1 Â Â Â 100
2 Â Â Â 200
3 Â Â Â 300
4    4002. Tabelle Verknüpfung beinahltet:
ID und Buchnr.
z.B.
ID Â Â Â Buchnr
1 Â Â Â 123
1 Â Â Â 456
2 Â Â Â 211
3 Â Â Â 633
3 Â Â Â 712
4 Â Â Â 5673. Tabelle Buch beinhaltet:
Buchnr und Buchname
z.B.
Buchnr   Buchname
123 Â Â Â Â hahaha
211 Â Â Â Â bababa
456 Â Â Â Â dadada
567 Â Â Â Â neeenee
633 Â Â Â Â tatata
712 Â Â Â Â sososoAbfrage : Kundennummer , die mehr als ein Buch haben.
Anzeigen: Kundennummer und BuchnameDie Abfrage habe ich so probiert, aber funktioniert nicht:
select K.kdnr, B.buchname
from kundentab K, Â Buchtab B, Verbindungstab V
where  B.Buchnr = V.Buchnr
and K.ID in
(select T.ID
from
(select V.ID, count(*)
 from Verbindungstab V
group by V.ID
having count(*) > 1)
T)*** T ist meine Tempoäre Tabelle.
Kann Jemand mir weiterhelfen??
28. April 2008 um 5:46 Uhr #3215
AnonymInaktivMoin, moin,
Dir fehlt mal mindestens die Verknüpfung von kundentab zum Join von Buchtab und Verbindungstab, also "and k.id = v.id"
Im Moment bildest du ein kartesische Produkt zw. allen Verknüpfungen mit allen Kunden, die mehr als 1 Buch haben.
hth
Kay
28. April 2008 um 10:38 Uhr #3459
AnonymInaktivHallo!
Dein Problem kann so gelöst werden:
SELECT K.ID, B.BUCHNAME
FROM DB2B.KUNDENTAB K
INNER JOIN DB2B.VERBINDUNGSTAB V
ON K.ID = V.ID
INNER JOIN DB2B.BUCHTAB B
ON B.BUCHNR = V.BUCHNR
WHERE EXISTS
(SELECT VT.ID, COUNT(*)
FROM DB2B.VERBINDUNGSTAB VT
WHERE VT.ID = V.ID
GROUP BY VT.ID
HAVING COUNT(*) > 1
)Ergebnis:
———+———+———+—
ID BUCHNAME
———+———+———+—
1. HAHAHA
1. DADADA
3. TATATA
3. SOSOSO
29. April 2008 um 6:26 Uhr #3610
AnonymInaktivWenn nur die KundenID benötigt wird, dann ist der Join auf die Kundentabelle unnötig. Nimm einfach V.ID statt K.ID
SELECT V.ID, B.BUCHNAME Â Â
FROM Â Â
DB2B.VERBINDUNGSTAB V
INNER JOIN Â
DB2B.BUCHTAB B Â Â
ON B.BUCHNR = V.BUCHNR Â
WHERE Â EXISTS Â
(SELECT * Â Â
FROM DB2B.VERBINDUNGSTAB VT Â Â
WHERE VT.ID = V.ID Â
GROUP BY VT.ID
HAVING COUNT(*) > 1
)Alternativ ist auch diese Lösung möglich
SELECT V.ID, B.BUCHNAME Â Â
FROM Â Â
DB2B.VERBINDUNGSTAB V
INNER JOIN Â
DB2B.BUCHTAB B Â Â
ON B.BUCHNR = V.BUCHNR Â Â
WHERE V.ID IN
(
SELECT V2.ID
FROM DB2B.VERBINDUNGSTAB V2
GROUP BY ID
HAVING COUNT(*)> 1 )weitere Alternative:
SELECT V.ID, B.BUCHNAME
FROM
DB2B.VERBINDUNGSTAB V
INNER JOIN
DB2B.BUCHTAB B
ON B.BUCHNR = V.BUCHNR
WHERE 2 >=
(SELECT COUNT(*)
FROM DB2B.VERBINDUNGSTAB VT
WHERE VT.ID = V.ID )am besten mal alle drei ausprobieren / explainen und das mit der besten Performance auswählen
7. Mai 2008 um 11:04 Uhr #3723
AnonymInaktivHallo,
Danke für eure  Hilfe.
werde ausprobieren 😀
Gruß
eierbrei
-
AuthorPosts
You must be logged in to reply to this topic.