Hallo zusammen,
verwendetes Datenbanksystem: <MS-SQL 2008>
Eine Tabelle sieht in etwa so aus
1 A Company
1 A SEM
2 B null
3 C Material
4 D SEM
Ich möchte nun alle CustomerID bekommen, die in Area Company UND SEM haben. Das Ergebnis soll also 1 sein. Wie bkeomme ich das mit einer SQL Abfrage hin?
Vielen Dank
gremgiz
SelfJoin
SELECT T1.CustomerID
FROM Tabelle T1
JOIN Tabelle T2
ON T1.CustomerID = T2.CustomerID
WHERE T1.Area = 'Company'
AND T2.Area = 'SEM'
Gruß
f_igy
Hallo,
danke für die Antwort. Leider ist dies nur die halbe Wahrheit. Die Area kann durchaus noch mehr umfassen. MIt dem Self JOIN komme ich leider nicht weiter. Daher die Frage nach der Rekursion. Es soll also nach beliebigen Kombinationen gesucht werden
Gruß
gremgiz
Hi,
rekursives SQL ist nicht im ANSI Standard, daher gibt es da Zahlreiche Varianten. Die für MS-SQL 2008 kenne ich leider nicht, ist aber hier beschrieben:
http://msdn.microsoft.com/de-de/library/ms186243(v=sql.105).aspx
Offenbar wird da auch ein SelfJoin über eine Art Window Konstruktion gemacht (ist in DB2 recht ähnlich). Wichtig ist m.E. den Level zu begrenzen, da es sonst bei Schleifenbeziehungen zu einer Endlosrekursion kommen kann. Das Ganze ist anfangs immer schwer zu verstehen, also viel Glück!
Evtl. lohnt es auch das Ergebnis der "Area"-Kette in einem String zu verketten, den man dann mit RegEx auf die gewünschten Eigenschaften durchsuchen kann.
Gruß
f_igy
Ich glaube du kannst das ohne Rekursion lösen.
SELECT DISTINCT CustomerID
FROM Tabelle
MINUS
SELECT CustomerID
FROM
(SELECT t1.CustomerID AS CustomerID, t2.Area AS Area
FROM Tabelle t1, (SELECT DISTINCT Area FROM Tabelle) AS t2
MINUS
SELECT t1.CustomerID, t1.Area
FROM Tabelle t1)
Erklärung:
EDIT: Evtl. unterstützt MSSQL kein MINUS, dann gibt es evtl. EXCEPT
Es bleiben die Tupel übrig, die alle Areas haben!
Hallo,
vielen herzlichen Dank für die Antwort. Das hat super geklappt. In der Tat kenn TSQL kein MINUS aber EXCEPT
Gruß
gremgiz
Hallo,
Zusatzfrage: Geht das auch mit dem LIKE Operator? Wenn ich einen exakten Wert suche bekomme ich das gewünschte Ergebnis aber leider nicht wenn ich mit LIKE arbeite
Danke
gremgiz
Zusatzfrage: Geht das auch mit dem LIKE Operator? Wenn ich einen exakten Wert suche bekomme ich das gewünschte Ergebnis aber leider nicht wenn ich mit LIKE arbeite
Ich bin nicht sicher auf was du hinaus willst. Wenn du keine feste List von Areas hast (SELECT DISTINCT Area ...) dann kannst du nicht mehr so vorgehen. Dann würde die Vergleichsmenge unendlich groß werden.
EDIT:
Vielleicht eine Richtung in die es doch gehen könnte. Du könntest deine Eintrage natürlich irgendwie normalisieren. D.h. wenn du Area auswählst nimmst du nicht direkt die Spalte sondern eine Fallunterschiedung.
... SELECT DISTINCT ...
... CASE ( WHEN Area LIKE "Comp%" THEN "Company" ELSE Area ...