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:

akretschmer

Datenbank-Guru
Beiträge
9.028
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...
 

Markus92

Aktiver Benutzer
Beiträge
30
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
 

akretschmer

Datenbank-Guru
Beiträge
9.028
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.
 

Markus92

Aktiver Benutzer
Beiträge
30
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?
 

akretschmer

Datenbank-Guru
Beiträge
9.028
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)
 

Markus92

Aktiver Benutzer
Beiträge
30
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)
 

akretschmer

Datenbank-Guru
Beiträge
9.028
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:
Oben