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-Key: 456448

Url: https://administrator.de/contentid/456448

Printed on: April 25, 2024 at 10:04 o'clock

Member: ukulele-7
Solution ukulele-7 May 28, 2019 at 08:51:57 (UTC)
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.
Member: MiSt
MiSt May 28, 2019 at 09:01:29 (UTC)
Goto Top
Ui,
das sieht ja schon "fertig" aus. Erstmal vielen Dank für den Tipp. Ich werde den gleich mal testen.

Gruß
Michael
Member: MiSt
MiSt May 28, 2019 updated at 09:22:51 (UTC)
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
Member: SlainteMhath
Solution SlainteMhath May 28, 2019 at 09:43:30 (UTC)
Goto Top
Moin,

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

lg,
Slainte
Member: MiSt
MiSt May 28, 2019 at 09:54:06 (UTC)
Goto Top
Arg, Du hast recht. Danke...
Member: ukulele-7
ukulele-7 May 28, 2019 at 11:24:16 (UTC)
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.
Member: MiSt
MiSt May 28, 2019 at 11:49:24 (UTC)
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?
Member: ukulele-7
Solution ukulele-7 May 28, 2019 at 13:10:01 (UTC)
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.