Laden...

Rekursion in Tabelle

Erstellt von Gremgiz vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.560 Views
G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 11 Jahren
Rekursion in Tabelle

Hallo zusammen,

verwendetes Datenbanksystem: <MS-SQL 2008>

Eine Tabelle sieht in etwa so aus

CustomerID Name Area

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

F
115 Beiträge seit 2012
vor 11 Jahren

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

G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 11 Jahren

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

F
115 Beiträge seit 2012
vor 11 Jahren

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

114 Beiträge seit 2009
vor 11 Jahren

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:

  1. Alle eindeutigen Kunden-IDs ermitteln
  2. Alle Permutationen aus Kunden-ID und Area (alle möglichen Kombinationen)
  3. Davon die Abziehen die tatsächlich vorkommen und das Ergebnis wiederum von der Gesamtanzahl-Kunden-IDs abzeihen

EDIT: Evtl. unterstützt MSSQL kein MINUS, dann gibt es evtl. EXCEPT

Es bleiben die Tupel übrig, die alle Areas haben!

G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 11 Jahren

Hallo,

vielen herzlichen Dank für die Antwort. Das hat super geklappt. In der Tat kenn TSQL kein MINUS aber EXCEPT

Gruß
gremgiz

G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 11 Jahren

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

114 Beiträge seit 2009
vor 11 Jahren

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 ...

G
Gremgiz Themenstarter:in
106 Beiträge seit 2006
vor 11 Jahren

Hallo,

Könnte klappen

Gruß
gremgiz