Self outer join Einschränkung

Markus92

Aktiver Benutzer
Beiträge
30
gibt es eine möglichkeit den self left outer join so einzuschränken, dass z.B.
select t1.id1, t2.id1 from tabelle t1 left outer join tabelle t2 on t1.id1=t2.id1
t1.id1 t2.id1
1 2
3

das hier in der spalte t1.id1 der wert 2 nicht mehr auftreten darf und in t1.id2 der wert 1 und 3 nicht mehr auftreten darf.
 
Werbung:
gibt es eine möglichkeit den self left outer join so einzuschränken, dass z.B.
select t1.id1, t2.id1 from tabelle t1 left outer join tabelle t2 on t1.id1=t2.id1
t1.id1 t2.id1
1 2
3

das hier in der spalte t1.id1 der wert 2 nicht mehr auftreten darf und in t1.id2 der wert 1 und 3 nicht mehr auftreten darf.


Kannst Du das genauer erklären?

Also so mit Beispielen oder so ...
In t1.id1 kommt 2 z.B. derzeit nicht vor. Und was in t1.id2 steht wissen wir auch ned. Leider ist /dev/glaskugel grad defekt...
 
Die tabelle sieht so aus:

tabelle
ID Name IDKombi
1 test 1 2
2 test 2
3 test 3 2

select t1.id1, t2.id1 from tabelle t1 left outer join tabelle t2 on t2.id1=t1.idkombi
t1.id1 t2.id1
1 2
2
3 2

So jetzt darf der Wert 2 nicht mehr in der vorderen spalte vorkommen, da er in IDKombi steht
 
Die tabelle sieht so aus:

tabelle
ID Name IDKombi
1 test 1 2
2 test 2
3 test 3 2

select t1.id1, t2.id1 from tabelle t1 left outer join tabelle t2 on t2.id1=t1.idkombi
t1.id1 t2.id1
1 2
2
3 2

So jetzt darf der Wert 2 nicht mehr in der vorderen spalte vorkommen, da er in IDKombi steht


Was soll das sein? Was gehört in welche Spalte? Ist das 'test 1' oder nur 'test' und die 1 gehört in die nächste Spalte? Was für ein Datentyp ist das dann? Warum willst Du ein INT mit einem Teilstring vergleichen? Wozu der JOIN?

Vielleicht suchst Du sowas wie:

Code:
test=*# \d markus92 ;
    Table "public.markus92"
Column  |  Type    | Modifiers
---------+-----------+-----------
id      | integer  |
name    | text      |
idkombi | integer[] |

\d: extra argument ";" ignored
test=*# select *, array_remove(idkombi, id) from markus92 ;
id | name | idkombi | array_remove
----+------+---------+--------------
  1 | test | {1,2}  | {2}
  2 | test | {2}    | {}
  3 | test | {3,2}  | {2}
(3 rows)

Ist jetzt aber PostgreSQL, ob das in MySQL so easy geht weiß ich nicht.
 
Column | Type
---------+------
id | integer | (PK,auto_increment)
name | varchar(50) |
idkombi | integer | (FK)

id | name | idkombi
---+-------+---------+
1 | test 1 | 2 |
2 | test 2 | |
3 | test 3 | 2 |
4 | test 4 | 5 |
5 | test 5 | |
6 | test 6 | |

gut, jetzt mach ich einen select auf die tabelle

select t1.id1, t2.id1 from tabelle t1 left outer join tabelle t2 on t2.id1=t1.idkombi
Ergebnis:
t1.id1| t2.id1
------+------
1 |2
2 |
3 |2
4 |5
5 |
6 |
gewünschtes Ergebnis:
t1.id1| t2.id1
------+------
1 |2
3 |2
4 |5
6 |
Was muss an der Abfrage geändert werden, dass dieses Ergbnis kommt?
 
Column | Type
---------+------
id | integer | (PK,auto_increment)
name | varchar(50) |
idkombi | integer | (FK)

id | name | idkombi
---+-------+---------+
1 | test 1 | 2 |
2 | test 2 | |
3 | test 3 | 2 |
4 | test 4 | 5 |
5 | test 5 | |
6 | test 6 | |

gut, jetzt mach ich einen select auf die tabelle

select t1.id1, t2.id1 from tabelle t1 left outer join tabelle t2 on t2.id1=t1.idkombi
Ergebnis:
t1.id1| t2.id1
------+------
1 |2
2 |
3 |2
4 |5
5 |
6 |
gewünschtes Ergebnis:
t1.id1| t2.id1
------+------
1 |2
3 |2
4 |5
6 |
Was muss an der Abfrage geändert werden, dass dieses Ergbnis kommt?

Ich kann nicht nachvollziehen, was mit t1.id1 = 6 sein soll, Warum soll der im Resultat sein?

Ansonsten:

Code:
test=*# select * from markus92 ;
id |  name  | idkombi
----+--------+---------
  1 | test 1 |      2
  2 | test 2 |
  3 | test 3 |      2
  4 | test 4 |      5
  5 | test 5 |
  6 | test 6 |
(6 rows)

Time: 0,216 ms
test=*# select * from markus92 where idkombi is not null;
id |  name  | idkombi
----+--------+---------
  1 | test 1 |      2
  3 | test 3 |      2
  4 | test 4 |      5
(3 rows)
test=*# select id, idkombi from markus92 where idkombi is not null;
 id | idkombi
----+---------
  1 |  2
  3 |  2
  4 |  5
(3 rows)
 
Habe das Problem jetzt selbst gelöst:
Select t1.id, t2.id from tabelle t1 left outer join tabelle t2 on t1.idkombi=t2.id where t1.id not in (Select Idkombi from tabelle)
 
Habe das Problem jetzt selbst gelöst:
Select t1.id, t2.id from tabelle t1 left outer join tabelle t2 on t1.idkombi=t2.id where t1.id not in (Select Idkombi from tabelle)

Dann ist ja super.

Code:
test=*# select * from markus92 ;
 id |  name  | idkombi
----+--------+---------
  1 | test 1 |  2
  2 | test 2 |
  3 | test 3 |  2
  4 | test 4 |  5
  5 | test 5 |
  6 | test 6 |
(6 rows)

Time: 0,113 ms
test=*# Select t1.id, t2.id from markus92 t1 left outer join markus92 t2 on t1.idkombi=t2.id where t1.id not in (Select Idkombi from markus92);
 id | id
----+----
(0 rows)

Egal.
 
Werbung:
Zurück
Oben