none
Join von zwei Tabellen, Leere Werte sollen als NULL dargestellt werden RRS feed

  • Frage

  • Hallo Zusammen,

     

    meine SQL Zeiten sind leider ein wenig her und stehe gerade auf dem Schlauch, arum er mir keine NULL Werte anzeigt, sondern einfach Werte einträgt...

     

    Ausgangsituation (ganz einfach)

    Tabelle 1 - Daten:

    KundenNummer     Konto   Valid    company

    A12345                 123        1           11

    A12222                 124        1           11

    A12223                 126        0           11

    Tabelle 2 - Stamm:

    KundenName         Konto           company

    Test1                    123                     11

    Test2                    124                     11

    Test3                    125                     11

    Test4                    126                     11

     

    Ich möchte jetzt einfach beide Tabellen verbinden und er soll mir die dazugehörigen KundenNamen aus Tabelle 2 anzeigen. Die Kunden, die nicht in Tabelle 1 existieren sollen mir "Neu" angezeigt werden....

    Sprich die Ausgabe sollte sein:

    Konto   Kundenname, KundenNummer

    123       Test1              A12345 

    124       Test2              A12222

    125      NEU                 NULL

     

    Mein Script ist dann wie folgt:

    Select b.Konto,IsNull(b.KundenName,'NEU')as KundenName,a.KundenNummer

    from daten as a inner join Stamm as b on a.company=b.company

    where a.Valid=1

     

    was mache ich falsch... Er macht mir alles doppelt und dreifach...

     

    Danke für Hilfe.

    Gruss

    Torsten

    Montag, 15. November 2010 17:04

Antworten

  • Hallo Torsten,

    hier ist meine Lösung:

    use tempdb
    go
    
    create table Daten (KundenNummer varchar(50),Konto int, Valid bit,Company int)
    go
    insert into Daten values
    ('A12345',123,1,11),
    ('A12222',124,1,11),
    ('A12223',126,0,11)
    go
    create table Stamm(KundenName varchar(50),Konto int,Company int)
    go
    insert into Stamm values
    ('Test1',123,11),
    ('Test2',124,11),
    ('Test3',125,11),
    ('Test4',126,11)
    go
    
    select
    	b.Konto,
    	(case when a.KundenNummer is null then 'NEU' else b.KundenName end) KundenName,
    	a.KundenNummer
    from
    	Daten as a right join Stamm as b
    	on a.company=b.company
    	and a.Konto = b.Konto
    where
    	a.Valid=1 or a.Valid is null
    	
    -----------------------------------
    -- result
    --Konto	KundenName	KundenNummer
    --123	Test1	A12345
    --124	Test2	A12222
    --125	NEU	NULL
    

    Gruß Yury
    Montag, 15. November 2010 18:25
  • Hallo Torsten,

    ich glaube, Du sicht LEFT bzw. RIGHT JOIN.

    SELECT t1.Spalte1,
        t1.Spalte2,
        t2.Spalte1,
        t2.Spalte2
    FROM  Tabelle1 t1
          LEFT JOIN
        Tabelle2 t2
          ON t1.Konto = t2.Konto
    
    

    HTH

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Montag, 15. November 2010 18:04
    Moderator

Alle Antworten

  • Hallo Torsten,

    ich glaube, Du sicht LEFT bzw. RIGHT JOIN.

    SELECT t1.Spalte1,
        t1.Spalte2,
        t2.Spalte1,
        t2.Spalte2
    FROM  Tabelle1 t1
          LEFT JOIN
        Tabelle2 t2
          ON t1.Konto = t2.Konto
    
    

    HTH

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Montag, 15. November 2010 18:04
    Moderator
  • Hallo Torsten,

    hier ist meine Lösung:

    use tempdb
    go
    
    create table Daten (KundenNummer varchar(50),Konto int, Valid bit,Company int)
    go
    insert into Daten values
    ('A12345',123,1,11),
    ('A12222',124,1,11),
    ('A12223',126,0,11)
    go
    create table Stamm(KundenName varchar(50),Konto int,Company int)
    go
    insert into Stamm values
    ('Test1',123,11),
    ('Test2',124,11),
    ('Test3',125,11),
    ('Test4',126,11)
    go
    
    select
    	b.Konto,
    	(case when a.KundenNummer is null then 'NEU' else b.KundenName end) KundenName,
    	a.KundenNummer
    from
    	Daten as a right join Stamm as b
    	on a.company=b.company
    	and a.Konto = b.Konto
    where
    	a.Valid=1 or a.Valid is null
    	
    -----------------------------------
    -- result
    --Konto	KundenName	KundenNummer
    --123	Test1	A12345
    --124	Test2	A12222
    --125	NEU	NULL
    

    Gruß Yury
    Montag, 15. November 2010 18:25
  • Hallo Yury,

    Hallo Stefan,

     

    Left Join geht nicht.. da ich ja beide Tabellen Werte benötige und nicht nur die den Teil der linken oder rechten.

    Yury, Deine Idee ist echt Super.. hatte ich auch schon dran gedacht aber ich muss es in einen ProgrammCode packen und dort ist immer schlecht mit temporären Tabellen zu arbeiten. Gibt es Deine keine Lösung mit einer normalen Abfrage,,,,,

    Ich habe auch schon einen full Join versucht.. dort liefert er mir dann aber immer eine NULL-Wert Zeile mit...

     

    Danke und Gruss

    Torsten

     

    Dienstag, 16. November 2010 08:31
  • Hallo Torsten,

    Left Join geht nicht.. da ich ja beide Tabellen Werte benötige und nicht nur die den Teil der linken oder rechten.

    ???

    lies doch mal bitte in der Doku, was LEFT JOIN eigentlich macht. Nämlich genau das, was Du machen willst. Beide Tabellen miteinander verbinden und für die Datensätze, in denen es in der Detailtabelle keine Entprechung gibt, NULL zurückliefern.

    dort ist immer schlecht mit temporären Tabellen zu arbeiten.

    Öhm. Wer arbeitet hier mit temporären Tabellen? Yury hat dir nur ein vollständiges Beispiel mit entsprechendem Tabellenaufbau gepostet und dafür zufällig die tempdb verwendet.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Dienstag, 16. November 2010 10:02
    Moderator