SQL NOT EXISTS
Hallo zusammen,
ich habe folgende Anforderung, die ich auch schon gelöst hab.
Leider jedoch mit sehr langer Zugriffszeit.
Eventuell kann mir einer einen Tip geben wie es performanter gelöst werden kann.
Ich muss Daten aus einer Tabelle anzeigen, die in zwei anderen Tabellen nicht enthalten sind.
wie ich es gelöst habe:
SELECT data
FROM t1
WHERE
(NOT EXISTS
(SELECT data
FROM t2
WHERE (data COLLATE SQL_Latin1_General_CP1_CI_AS = t1.data)))
AND (NOT EXISTS
(SELECT data
FROM t3
WHERE (data COLLATE SQL_Latin1_General_CP1_CI_AS = t1.data)))
Ergebnis ist dann alle Daten aus t1 die weder in t2 noch in t3 vorhanden sind.
Danke schon vorab für die Unterstützung
ich habe folgende Anforderung, die ich auch schon gelöst hab.
Leider jedoch mit sehr langer Zugriffszeit.
Eventuell kann mir einer einen Tip geben wie es performanter gelöst werden kann.
Ich muss Daten aus einer Tabelle anzeigen, die in zwei anderen Tabellen nicht enthalten sind.
wie ich es gelöst habe:
SELECT data
FROM t1
WHERE
(NOT EXISTS
(SELECT data
FROM t2
WHERE (data COLLATE SQL_Latin1_General_CP1_CI_AS = t1.data)))
AND (NOT EXISTS
(SELECT data
FROM t3
WHERE (data COLLATE SQL_Latin1_General_CP1_CI_AS = t1.data)))
Ergebnis ist dann alle Daten aus t1 die weder in t2 noch in t3 vorhanden sind.
Danke schon vorab für die Unterstützung
Please also mark the comments that contributed to the solution of the article
Content-Key: 526236
Url: https://administrator.de/contentid/526236
Printed on: April 19, 2024 at 14:04 o'clock
7 Comments
Latest comment
Moin,
sollte das nicht auch mit LEFT JOINS gehen?
Etwa so:
Bei deinem SELECT / NOT EXIST wälzt er für jede Zeile aus t1 t2 und t3 von neuem durch... das kann nicht schnell sein. Sind wenigstens entsprechende Indizis in den Tabellen gesetzt?
lg,
Slainte
sollte das nicht auch mit LEFT JOINS gehen?
Etwa so:
SELECT data
FROM t1
LEFT JOIN t2 ON t1.data = t2.data
LEFT JOIN t3 ON t1.data = t3.data
WHERE t2.data = NULL and t3.data = NULL
Bei deinem SELECT / NOT EXIST wälzt er für jede Zeile aus t1 t2 und t3 von neuem durch... das kann nicht schnell sein. Sind wenigstens entsprechende Indizis in den Tabellen gesetzt?
lg,
Slainte
test=# create table t1 as select * from generate_series(1,9) s;
SELECT 9
test=*# create table t2 as select * from generate_series(5,7) s;
SELECT 3
test=*# create table t3 as select * from generate_series(1,3) s;
SELECT 3
test=*# select * from t1 except (select * from t2 union all select * from t3);
s
---
9
4
8
(3 rows)
test=*#
Zitat von @il-wega1:
Danke für die Antwort,
diese Variante hab ich auch erfolgreich getestet.
Hat aber in etwa dieselbe Performance wie die NOT EXISTS Strategie, mit dem Nachteil das keine zusätzlichen Daten mit abgefragt werden können.
Danke für die Antwort,
diese Variante hab ich auch erfolgreich getestet.
Hat aber in etwa dieselbe Performance wie die NOT EXISTS Strategie, mit dem Nachteil das keine zusätzlichen Daten mit abgefragt werden können.
der MS SQL Server optimiert das in outer joins, ich meine ab Version SQL 2000 oder 2005. Braucht halt so oder so genug Arbeitsspeicher um den outer join im Arbeitsspeicher halten zu können.
Für andere Serverprodukte muß man das austesten, was der Server X oder Y am effektivsten abarbeitet.