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

Inhalt aus zwei Tabellen als Keuztabelle zusammenfassen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Gimi27, 16 März 2020.

  1. Gimi27

    Gimi27 Benutzer

    Hallo zusammen,

    Code:
    select T1.Konto,
        T2.Proj
    from @tmp1 T1,
    @tmp2 T2
    tmp1 ist eine Menge von Kontonummern (besteht nur aus einem Feld <Konto>) und tmp2 ist eine Menge von Projektnummern (besteht ebenfalls nur aus einem Feld <Proj>). Der Select erzeugt eine Kreuztabelle mit allen möglichen Kombinationen von Konto- und Projektnummer. Soweit so gut, dies ist auch gewollt.

    Jetzt habe ich aber festgestellt, wenn z.B. die Menge Projektnummern "leer" ist, dann wird als Ergebnis auch eine leere Menge ausgewiesen und nicht die Menge aller Kontonummern nur jeweils mit leerem Feldinhalt für Projektnummer. Ich verstehe zwar, dass dies logisch so sein muss, aber wie löse ich das Problem?

    Vielen Dank
    Michael
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# create table g1(i int);
    CREATE TABLE
    test=*# create table g2(i int);
    CREATE TABLE
    test=*#
    test=*#
    test=*# select * from g1 cross join g2;
     i | i
    ---+---
    (0 rows)
    
    test=*# copy g1 from stdin;
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself, or an EOF signal.
    >> 1
    >> 2
    >> 3
    >> \.
    COPY 3
    test=*# select * from g1 cross join g2;
     i | i
    ---+---
    (0 rows)
    
    test=*# select * from g1 left join g2 on true;
     i | i
    ---+---
     1 | 
     2 | 
     3 | 
    (3 rows)
    
    test=*# copy g2 from stdin;
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself, or an EOF signal.
    >> 3
    >> 4
    >> \.
    COPY 2
    test=*# select * from g1 left join g2 on true;
     i | i
    ---+---
     1 | 3
     1 | 4
     2 | 3
     2 | 4
     3 | 3
     3 | 4
    (6 rows)
    
    test=*#
    
    hilft das weiter?
     
    Walter gefällt das.
  3. Gimi27

    Gimi27 Benutzer

    Hallo Akretschmer,

    ich bin mir nicht sicher, ob es weiterhilft. Zunächst noch vorab, die Stelle stammt aus einer Stored Procedure und die beiden Tabellen sind temporäre Tabellen. Ich weiß nicht, ob dies vielleicht wichtig ist.

    Mit folgendem Code habe ich versucht deine Lösung nachzustellen:
    Code:
    declare @tmpT1 Table (i int)
    declare @tmpT2 Table (i Int)
    
    insert into @tmpT1 (i)
    values (1),(2),(3)
    
    
    select * from @tmpT1 left join @tmpT2 on true
    
    
    Beim Ausführen bekomme ich aber die Fehlermeldung: "In der Nähe von 'true' wurde ein nicht boolescher Ausdruck in einem Kontext angegeben, in dem eine Bedingung erwartet wird."

    Mit cross join bekomme ich eine leere Menge, wie erwartet.

    Grüsse
    Michael
     
  4. akretschmer

    akretschmer Datenbank-Guru

    ersetze mal true durch (1=1), hilft das?
     
  5. Gimi27

    Gimi27 Benutzer

    Das war es halb. Ist @tmp1 leer, dann funktioniert ein left Join auch nicht. Ich komme wohl nicht darum herum vorher noch abfragen, ob und wenn ja welche Tabelle leer ist. Habe ich mir eigentlich schon gedacht. Ich hatte nur gehofft, dass es irgendeine super einfache Lösung mit einem Befehl gibt, den ich noch nicht kenne.

    Trotzdem vielen Dank
     
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