PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL Query. Wie mach ich das?


AtTheDriveIn
2010-06-08, 21:27:58
Folgende vereinfachte Aufgabenstellung.


Tabelle EINS
[A;C;X;E]

Tabelle ZWEI
[A;B;F;X]


Ich möchte nun alle Einträge die in EINS aber nicht in ZWEI und alle Einträge die nicht in EINS aber in ZWEI sind, selektieren. In einem Query. Dazu einen Verweis (den Tabellenamen, extra Spalte, whatever) auf die Tabelle aus dem der Eintrag stammt.

Mit den Beispieltabellen sehe das gewünschte Ergebnis folgendermaßen aus:
ERGEBNIS
[C,EINS;E,EINS;B,ZWEI;F,ZWEI]

(Zeilen durch ; getrennt Spalten durch ,)

Gibt es da was? Ich hatte ein Query (zusammengesetzt aus MINUS und UNION), allerdings bin ich am Tabellenverweis gescheitert.

Matrix316
2010-06-08, 21:47:28
vielleicht so


select
a.a as [A-EINS]
,a.b as [B-EINS]
,a.c as [C-EINS]
,a.d as [D-EINS]
,b.a as [A-ZWEI]
,b.b as [A-ZWEI]
,b.f as [A-ZWEI]
,b.x as [A-ZWEI]
from EINS a inner join ZWEI b on a.x = b.x where ...
union
a.a as [A-EINS]
,a.b as [B-EINS]
,a.c as [C-EINS]
,a.d as [D-EINS]
,b.a as [A-ZWEI]
,b.b as [A-ZWEI]
,b.f as [A-ZWEI]
,b.x as [A-ZWEI]
from EINS a inner join ZWEI b on a.x = b.x where ...



Wobei mir nicht ganz klar ist, welche Einträge von eins in zwei sind, wenn die spalten zum Teil unterschiedlich sind. Musst halt die Where Sachen entsprechen anspassen.

Äh, ich glaube "alle Einträge die in EINS aber nicht in ZWEI und alle Einträge die nicht in EINS aber in ZWEI sind" sind doch eh alle, wenn man über x z.B. joint...

Irgendwie wären Tabelleninhalte und Beispiele ganz hilfreich um die richtigen Where Klauseln zu finden.

Gohan
2010-06-08, 22:24:49
Vielleicht mit Distinct?

http://dev.mysql.com/doc/refman/5.1/de/distinct-optimization.html

Marscel
2010-06-08, 22:37:15
Wenn du es halbwegs in derselben Formatierung haben willst (geht nicht mit SQLite):
SELECT @a := '';
SELECT CONCAT('[', @a, ']') str FROM (SELECT @a := CONCAT(@a, tbl, ',' , val, ';') FROM (SELECT 'test2' AS tbl, a.val AS val FROM test2 a WHERE a.val NOT IN (SELECT val FROM test3) UNION
SELECT 'test3' AS tbl, b.val AS val FROM test3 b WHERE b.val NOT IN(SELECT val FROM test2)) AS innerresult) AS result LIMIT 1

Sicherlich nicht hübsch, aber fiel mir gerade nur so ein.

Und wenn nur generell die Ergebnismenge:
SELECT 'test2' AS tbl, a.val AS val FROM test2 a WHERE a.val NOT IN (SELECT val FROM test3) UNION
SELECT 'test3' AS tbl, b.val AS val FROM test3 b WHERE b.val NOT IN(SELECT val FROM test2)

CrazyIvan@Work
2010-06-09, 10:08:00
SELECT Feld, 'EINS' AS Tabelle
FROM EINS
LEFT JOIN ZWEI
ON EINS.Feld = ZWEI.Feld
WHERE ZWEI.Feld IS NULL
UNION
SELECT Feld, 'ZWEI' AS Tabelle
FROM ZWEI
LEFT JOIN EINS
ON ZWEI.Feld = EINS.Feld
WHERE EINS.Feld IS NULL

Je nach verwendeter DB kann die Syntax natürlich leicht abweichen.
Noch einfacher gehts mit nem FULL OUTER JOIN, bei dem man die Treffer in der WHERE-Klausel ausschließt und das 'Tabelle'-Feld über CASE..WHEN macht. Bin ich aber grad zu faul für. Kann ich bei Bedarf zu Hause mal noch dazueditieren.

Gast
2010-06-09, 15:03:29
mein Vorschlag

SELECT v11,'EINS' AS tabelle FROM EINS WHERE v11 NOT IN (SELECT * FROM ZWEI)
UNION
SELECT v21,'ZWEI' AS tabelle FROM ZWEI WHERE v21 NOT IN (SELECT * FROM EINS)
ORDER BY tabelle

v11 - Variable der 1. Tabelle
v21 - Variable der 2. Tabelle

ergibt mit Deinen Daten das Ergebnis in gewünschter Form

CrazyIvan
2010-06-09, 18:58:51
"NOT IN" + Subquery würde ich in jedem Fall vermeiden - vor allem, wenn die Zielplattform MySQL ist. Habe ich aber glaub ich in einem Thread des TE schonmal erwähnt. Mal abgesehen davon dürfte das "SELECT *" im Subquery nicht funktionieren, da die DB ja nicht riechen kann, welche Spalte Du meinst - und wenn doch, bin ich baff ;)