Ich habe zwei Tabellen A und B. Ich möchte alle Datensätze von A zurückgeben und nur von B übereinstimmen. Ich kann dafür den linken Join verwenden. Nach dem Beitritt möchte ich jedoch Datensätze zurückgeben, die auf einem Flag in derselben Tabelle basieren.

Table A:

| Col1 | Col2 |
|------|------|
| 123  |  12  |
| 456  |  34  |
| 789  |  56  |

Table B:

| Col1 | Col2 | Col3 | Col4 | Col5 |
|------|------|------|------|------|
| 123  |  12  | NULL |  I   |  1   |
| 456  |  34  | NULL |  E   |  1   |
| 111  |  98  | NULL |  I   |  1   |
| 222  |  99  | NULL |  E   |  1   |
| 123  |  12  |  AB  | NULL |  2   |
| 456  |  34  |  CD  | NULL |  2   |
| 123  |  12  |  EF  | NULL |  2   |
| 111  |  98  |  GH  | NULL |  2   |
| 222  |  99  |  IJ  | NULL |  2   |

Nachdem Sie A und B verlassen haben, sieht das Ergebnis folgendermaßen aus:

| Col1 | Col2 | Col3 | Col4 | Col5 |
|------|------|------|------|------|
| 123  |  12  | NULL |  I   |  1   |
| 456  |  34  | NULL |  E   |  1   |
| 123  |  12  |  AB  | NULL |  2   |
| 456  |  34  |  CD  | NULL |  2   |
| 123  |  12  |  EF  | NULL |  2   |
| 789  |  56  | NULL | NULL | NULL |

Die Werte 1 und 2 in Col5 geben an, ob Col4 oder Col3 ausgefüllt werden soll. 1 für Col4 und 2 für Col3.

Ich möchte alle Datensätze für 'I' (mit Ausnahme des Datensatzes mit 'I') in Col4 zurückgeben, die folgendermaßen aussehen:

| Col1 | Col2 | Col3 |   Col4 | Col5 |
|------|------|------|--------|------|
|  123 |   12 |   AB | (null) |    2 |
|  123 |   12 |   EF | (null) |    2 |

Ich möchte auch Datensätze für 'E' (wieder ohne den Datensatz mit 'E') in Spalte 4 zurückgeben, aber für alle Werte außer einem in Spalte 3. In diesem Fall CD. Welches würde so aussehen:

| Col1 | Col2 | Col3 |   Col4 | Col5 |
|------|------|------|--------|------|
|  456 |   34 |   AB | (null) |    2 |
|  456 |   34 |   EF | (null) |    2 |
|  456 |   34 |   GH | (null) |    2 |
|  456 |   34 |   IJ | (null) |    2 |

Kann jemand vorschlagen, wie man damit in SQL umgeht?

1
django-unchained 18 Jän. 2019 im 19:02

3 Antworten

Beste Antwort

Ok, ich glaube, die folgenden beiden Abfragen erzielen die gewünschten Ergebnisse. Sie können den gesamten Beispielcode über die folgende SQL Fiddle anzeigen.

Existenzregel :

select A.*
     , B.Col3
     , B.Col4
     , B.Col5
  from TableA A
  JOIN TableB B
    on A.Col1 = B.Col1
   and A.Col2 = B.Col2
   and B.Col5 = 2
 where exists (select 1 from TableB C
                where C.col1 = B.col1 and C.col2 = B.col2
                  and c.col4 = 'I' AND C.col5 = 1)

Ergebnisse :

| Col1 | Col2 | Col3 |   Col4 | Col5 |
|------|------|------|--------|------|
|  123 |   12 |   AB | (null) |    2 |
|  123 |   12 |   EF | (null) |    2 |

Ausschlussregel :

select A.*
     , B.Col3
     , B.Col4
     , B.Col5
  from TableA A
 CROSS JOIN TableB B
 where b.col5 = 2
   and exists (select 1 from TableB C
                where C.col1 = a.col1 and C.col2 = a.col2
                  and c.col4 = 'E' AND C.col5 = 1)
   and b.col3 not in (select col3 from TableB b
                       where b.col1 = a.col1 and b.col2 = a.col2 and b.col5 = 2)

Ergebnisse :

| Col1 | Col2 | Col3 |   Col4 | Col5 |
|------|------|------|--------|------|
|  456 |   34 |   AB | (null) |    2 |
|  456 |   34 |   EF | (null) |    2 |
|  456 |   34 |   GH | (null) |    2 |
|  456 |   34 |   IJ | (null) |    2 |
1
Sentinel 18 Jän. 2019 im 23:24

Ergebnis für I: -

;with cte1 As(select a.col1,a.col2 from A a left join B b on a.col1 =b.col2 and a.col2=b.col2 where b.col4 = 'I'),cte2 As(select b.col3,b.col4,b.col5 from from A a left join B b on a.col1 =b.col2 and a.col2=b.col2 where b.col4 <> 'I')

Ergebnis für E: -

select a.col1,a.col2,b.col3,b.col4,b.col5 from cte1 a cross join cte2 b 
;with cte1 As(select a.col1,a.col2 from A a left join B b on a.col1 =b.col2 and a.col2=b.col2 where b.col4 = 'E'),cte2 As(select b.col3,b.col4,b.col5 from from A a left join B b on a.col1 =b.col2 and a.col2=b.col2 where b.col4 <> 'E')
select a.col1,a.col2,b.col3,b.col4,b.col5 from cte1 a cross join cte2 b 
0
a_horse_with_no_name 18 Jän. 2019 im 20:22
select c.col1, c.col2 

from 
(select a.col1, a.col2, b.col3 from  a inner join table b on a.id = b.id
where "condition" ) c

where c.col1 = "condition"

Dies ist das Skript. Die Erklärung lautet:

Innerhalb der () habe ich die erste Auswahl geschrieben. Dort treffen Sie die Auswahl mit Ihren Joins und Ihren Bedingungen. Am Ende der Auswahl habe ich "c" geschrieben, den Namen der Tabelle, die aus der Unterauswahl generiert wurde. Anschließend wählen Sie einige Werte aus der generierten Tabelle aus und filtern sie mit einem Punkt, der sich auf die Ergebnisse auswirkt, die von der mit der Unterauswahl erstellten Tabelle generiert wurden

EDIT: Ich habe die Namen Ihrer Frage verwendet, um es einfacher zu machen

-1
Bob Dubke 18 Jän. 2019 im 16:23