SQL Kompilziere Abfrage

Murphy9904

Lt. Junior Grade
Registriert
Mai 2007
Beiträge
344
Hoi,

ich hab ne kleine Frage zu einer Abfrage.

und zwar haben ich 2 tabellen
mit einer "n - n" beziehung
(also im endeffekt dann 3)

Von tabelle1 möchte ich alle einträge haben die einen ganz bestimmten eintrag aus tabelle2 haben aber keine weiteren

meine anfänge waren

----

select ad.DeviceID , COUNT(*)
from Device as d
join Article_Device as ad on ad.DeviceID = d.DeviceID
where ad.ArticleID = 1234 and count(*) = 1
group by ad.DeviceID

---


Article --> Tabelle1
Article_Device --> Zwischentabelle
Device --> Tabelle2 (brauch ich ja eig nicht zwingend)

---

Das Rot markierte ist im Prinzip das was ich machen will, aber so funktioniert das natürlich nicht

weil das count macht dann keinen sinn mehr wenn ich auf articleID runterfiltere

Ich hoffe ich hab es verständlich geschrieben und jemand kann mir Helfen


Danke schonmal
 
Ich glaube, was du brauchst ist HAVING... siehe Beispiel:


Code:
select ad.DeviceID , COUNT(*) 
from Device as d
join Article_Device as ad on ad.DeviceID = d.DeviceID
where ad.ArticleID = 1234 
group by ad.DeviceID
having count(*) = 1

Wenn du jetzt das Where weglässt bekommst du alle DeviceIds die nur einmal vorkommen. Ist zumindest, was ich verstanden habe....:)
 
Zuletzt bearbeitet:
Das ist cool Danke :)
bringt mich aufjendenfall ein stück weiter. nur die prüfung ob dieser eine Artikel die ID 1234 hat funktioniert nicht.

Jetzt will ich noch sehen ob diese ArticleIDs die nur einmal vorkommen = 1234 sind
kann ich das auch mit dem having irgendwie machen?
 
Das wäre doch dann genau mein Beispielstatement, oder??
Mit dem bekommst du für ArticleId = 1234 nur dann ein Ergebnis, wenn es nur einen Eintrag gibt. Lässt du das WHERE weg, bekommst du alle ArticleIDs die nur einmal existieren.

Oder ich hab noch nicht verstanden was dein Ziel ist.... :freak:
 
nicht ganz
mit dem where bekomme ich alle bei denen die artikelID diese ist.
dadurch das das das dann natürlich immer eine ist ist der count überall 1

Ich glaube verstanden hast du es schon

Alle ArticleIDs bei denen es nur einen eintrag gibt und dieser eintrag 1234 ist.
 
Ah... es dämmert.... :) Dann würde ich das Schachteln....

Code:
SELECT ad.device_id
  FROM article_device ad
     INNER JOIN (
        SELECT ad.deviceId
          FROM article_device ad
       WHERE ad.articleId = 1234) tmp
     ON tmp.deviceId = ad.deviceId
GROUP BY ad.deviceId
HAVING COUNT(*) = 1


Im Sub-Select holst du dir erstmal alle Devices für die es einen Eintrag mit Article 1234 gibt. Und außen verwendest du dann diese DeviceIds um zu schauen wieviele Einträge pro Device da sind. Wenn das genau einer ist, muss es der mit 1234 sein.
 
Zurück
Oben