mist
Goto Top

Ich brauche Hilfe bei einer SQL-Abfrage

Guten Morgen,

ich sitze gerade vor einem kl. SQL-Problem und ich hoffe, dass ich hier ein paar Tipps bekomme.

Folgende Situation:

Ich habe div. Artikel mit jeweils einer Stückliste (Beispiel: Artikel "Kugelschreiber", der aus der Stückliste "Feder", "Mine" und "Gehäuse" besteht)
Ich habe 2 SQL-Tabellen: ARTIKEL und STÜCKLISTE

Artikel-Tabelle:
| Artikel_nr  | Bezeichnung |
| Kulli_01    | Kulli ROT   |
| Kulli_02    | Kulli BLAU  |
.
.
.
Stk.-Liste-Tabelle:
| Artikel_nr | Bezeichnung | Bezug      |
| Feder      | Feder       | Kulli ROT  |
| Mine       | Mine        | Kulli ROT  |
| Gehäuse    | Gehäuse     | Kulli BLAU |
.
.
.
Jetzt möchte ich mir alle Artikel (aus Tabelle ARTKEL) anzeigen lassen, die kein „Gehäuse“ in der Stückliste habe.

Aber leider, da ich jetzt kein SQL-Profi bin, habe ich keine Idee, wie ich an die Lösung komme.
Folgendes hatte ich mal versucht, was aber nicht zum Ziel führte.
SELECT y.*
FROM artikel y
WHERE NOT EXISTS
 (
   SELECT *
   FROM stückliste x
   WHERE y.artikel_nr = 'gehäuse'  
 )
Hat jemand eine Idee, mit welchem Befehl ich das SELECT aufbauen kann?

Gruß
Michael

Content-ID: 456448

Url: https://administrator.de/forum/ich-brauche-hilfe-bei-einer-sql-abfrage-456448.html

Ausgedruckt am: 25.12.2024 um 15:12 Uhr

ukulele-7
Lösung ukulele-7 28.05.2019 um 10:51:57 Uhr
Goto Top
SELECT a.* FROM artikel a LEFT JOIN stkliste s ON a.bezeichnung = s.bezug AND s.bezeichnung = 'Gehäuse' WHERE s.Artikel_nr IS NULL  
Gibt aber viele Wege.
MiSt
MiSt 28.05.2019 um 11:01:29 Uhr
Goto Top
Ui,
das sieht ja schon "fertig" aus. Erstmal vielen Dank für den Tipp. Ich werde den gleich mal testen.

Gruß
Michael
MiSt
MiSt 28.05.2019 aktualisiert um 11:22:51 Uhr
Goto Top
Mir ist gerade aufgefallen, dass der Bezug nicht auf "bezeichnung" geht, sondern auf "artikel_nr" geht
| Artikel | Bezeichnung | Bezug      |
| Feder   | Feder       | Kulli_01   |
| Mine    | Mine        | Kulli_01   |
| Gehäuse | Gehäuse     | Kulli_02   |
.
.
.

SELECT a.*
FROM artikel a
LEFT JOIN stückliste ON a.artikel_nr = s.bezug AND s.artikel_nr = 'Gehäuse'  
WHERE s.artikel_nr IS NULL

Das Funktioniert soweit, vielen Dank. Jetzt habe ich gedacht, dass ich im JOIN-Bereich nicht nur das "Gehäuse_01" suchen lassen kann, sondern auch das "Gehäuse_02".
LEFT JOIN stkliste s ON a.artikel_nr = s.bezug AND s.artikel_nr = 'Gehäuse' OR s.artikel_nr = 'Gehäuse2'  

Habe ich da einen gedankenfehler oder ist das grob falsch?

Gruß
Michael
SlainteMhath
Lösung SlainteMhath 28.05.2019 um 11:43:30 Uhr
Goto Top
Moin,

du musst klammern setzen:
...AND (s.artikel_nr = 'Gehäuse' OR s.artikel_nr = 'Gehäuse2')  

lg,
Slainte
MiSt
MiSt 28.05.2019 um 11:54:06 Uhr
Goto Top
Arg, Du hast recht. Danke...
ukulele-7
ukulele-7 28.05.2019 um 13:24:16 Uhr
Goto Top
Alternativ
s.artikel_nr IN ( 'Gehäuse','Gehäuse2' )
oder
s.artikel_nr LIKE 'Gehäuse%'
Besser wäre aber eine Art Gerätetyp oder ID und keine Zeichenkette die unterschiedlich geschrieben werden kann.
MiSt
MiSt 28.05.2019 um 13:49:24 Uhr
Goto Top
Das stimmt. In Wirklichheit sind die Gehäuse leider nicht mit LIKE zu filtern. Ist von den Stammdaten leider nicht so schön. Ich habe habe noch eine Warengruppe für diese Art von Gehäuse. Eventuell gehe ich auch darüber. Dann sollte es passen.

Mal eine Frage zu dem AND (...) im JOIN. Wieso wird das dort eingebaut? Wird da was vorselektiert oder könnte man das auch ins WHERE einbauen?
ukulele-7
Lösung ukulele-7 28.05.2019 um 15:10:01 Uhr
Goto Top
Nein im WHERE macht das keinen Sinn, gutes Beispiel:
https://stackoverflow.com/questions/14861927/left-outer-join-query-not-r ...
Im Prinzip machst du nichts anderes als das, dessen Existenz du eigentlich ausschließen willst, zu joinen und sobald ein Datensatz gejoint wurde, schmeißt du ihn komplett raus. Nur wenn kein Join statt finden kann behälst du den Eintrag.

Das ganze ließe sich auch gut mit WHERE NOT IN () oder WHERE NOT EXISTS () lösen.