Dein Problem bestand darin, dass du in der 2. Abfrage auch die Artikel bekommst, die im ersten schon vorkommen.
SQL-Code:
SELECT Art.Nr
,Art.Bez
,Sp.Id
,Sp.Vp
FROM Art INNER JOIN Sp ON Art.Id = Sp.ID_Art
WHERE Id_Kunde = :i_ID_Kunde And Vp <> 0
UNION
SELECT Art.Nr
,Art.Bez
,ArtPG.ID
,ArtPG.PG
FROM Art INNER JOIN ArtPG ON Art.ID = ArtPG.ID_Art
WHERE Art.ID Not In (SELECT subSP.ID_Art
FROM Sp subSP
WHERE subSP.ID_Kunde = :i_ID_Kunde)
Zitat von
Hansa:
...Ist aber auch nicht schön und auch wohl lahm. ...
Wenn du die Kunden ID als Parameter übergibst und einen Index auf ID_Art legst, dürfte das da oben ziemlich flink sein.
Beim ersten Ausführen normal schnell, danach kann der Server auf Werte aus dem Cache zurückgreifen (dank der Verwendung des Parameters) -> viel schneller (abhängig von Größe & Typ vom Arbeitsspeicher des Servers).
Der Index auf Art_ID soll im "NOT IN..."-sub select aus einem Table scan in einen Index scan machen -> nochmal schneller.