Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Self outer join Einschränkung

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Markus92, 8 November 2013.

  1. Markus92

    Markus92 Aktiver Benutzer

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

    akretschmer Datenbank-Guru


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

    Markus92 Aktiver Benutzer

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

    akretschmer Datenbank-Guru


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

    Markus92 Aktiver Benutzer

    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?
     
  6. akretschmer

    akretschmer Datenbank-Guru

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

    Markus92 Aktiver Benutzer

    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)
     
  8. akretschmer

    akretschmer Datenbank-Guru

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

    Markus92 Aktiver Benutzer

    Mit mssql-server und access getestet und es funktioniert...
     
  10. akretschmer

    akretschmer Datenbank-Guru

Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden