[GELÖST] SQL für verknüpfte Tabellen?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

[GELÖST] SQL für verknüpfte Tabellen?

Beitrag von Soner »

Hallo,
ich habe drei Tabellen, die ich hier vereinfacht darstelle:

Code: Alles auswählen

 
bestrechnungen-Tabelle (Bestellungen/Rechnungen)
Recnr   - integer(id)
Tagtrnr   - integer
 
bestelllungen-TAbelle (Bestellte Produkte)
Besnr   - integer(id)
Recnr   - Verknüpfung mit bestrechnungen
Prodnr   - Integer(Produktnr)
 
prodeiglink-Tabelle (Produkteigenschaften, Ein Produkt kann mehrere Eigeschaften haben)
Pvnr   - integer (id)
Pvpenr   - integer (auswahl)
Pvprodnr- Integer(Produktnr)
 

Es gibt noch ein Produkttabelle und einige andere aber das brauchen wir hier nicht.

Aus dieser Db Selektiere ich Anzahl alle bestellten Produkte mit dem SQL-Befehl:
(Bedingung: Tagtrnr=58110

Code: Alles auswählen

 
SELECT bt.Prodnr, sum(bt.Menge) AS Menge FROM bestrechnungen br, bestelllungen bt
WHERE (br.Tagtrnr=58110) AND (bt.Recnr=br.Recnr)
GROUP BY bt.Prodnr
 

Das funktioniert wunderbar.

Aber jetzt wenn ich Bestellungen mit Tagtrnr=58110 und Pvpenr<>131 (Produkteigenschaft) auswähle mit:

Code: Alles auswählen

 
SELECT bt.Prodnr, sum(bt.Menge) AS Menge FROM bestrechnungen br, bestelllungen bt, prodeiglink pl
WHERE (br.Tagtrnr=58110) AND (bt.Recnr=br.Recnr)
AND (pl.Pvpenr<>131) AND (pl.Pvprodnr=bt.Prodnr)
GROUP BY bt.Prodnr
 

Dann werden einige Produkte mehrfach gezahlt, weil Produkte gleichzeitig viele verschiedene Eigenschaften haben können. "Select distinct ..." funktioniert, wegen der Funktion sum nicht. Ohne Sum funktioniert es.

Edit:
Nehmen wir an ein Produkt hat die Eigenschaft 1 und 2. Das soll dann einmal gezählt werden. Produkte mit der Eigenschaft 131 werden übersprungen.

Also ich suche einen SQL-Befehl mit dem ich Produkte zählen soll die nicht die Eigenschaft 131 hat (pl.Pvpenr<>131). Kennt jemand Lösung für das Problem?
Zuletzt geändert von Soner am Mi 19. Okt 2016, 18:39, insgesamt 1-mal geändert.

Eb
Lazarusforum e. V.
Beiträge: 238
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: SQL für verknüpfte Tabellen?

Beitrag von Eb »

Ich weiss nicht, welche Datenbank du einsetzt, aber bei MySQL kann man statt einer Tabelle im From-Abschnitt auch ein Select angeben.

das würde dann so aussehen: (evtl auch ohne das 'as')

Code: Alles auswählen

SELECT bt.Prodnr, sum(bt.Menge) AS Menge 
FROM bestrechnungen br
, bestelllungen bt
, (SELECT DISTINCT Pvprodnr FROM prodeiglink WHERE Pvprodnr <> 131) AS pl
WHERE (br.Tagtrnr=58110) AND (bt.Recnr=br.Recnr)
AND (pl.Pvprodnr=bt.Prodnr)
GROUP BY bt.Prodnr


Eb

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: SQL für verknüpfte Tabellen?

Beitrag von Soner »

Ich habe es mit Subselect gelöst.
Ich hatte wieder vor lauter Bäume den Wald nicht gesehen. :oops:

@Eb:
Danke, ich habe auch Sub-Select verwendet, den hier:

Code: Alles auswählen

 
SELECT bt.Prodnr, sum(bt.Menge) AS Menge FROM bestrechnungen br, bestelllungen bt
WHERE (br.Tagtrnr=58110) AND (bt.Recnr=br.Recnr)
AND (
(SELECT DISTINCT pv.Pvprodnr FROM prodeiglink pv WHERE (pv.Pvpenr=131) AND (pv.Pvprodnr=bt.Prodnr)) IS NULL
)
GROUP BY bt.Prodnr
 

Antworten