2016-05-31 16 views
0

Join Rückgabewert, aber Wert wird in beiden Tabellen gefunden. Ist meine Syntax schlecht?Links äußerer Join gibt Ergebnisse in beiden Tabellen zurück

select distinct source.[Manufacturer] 
    from Products2.dbo.sourceexport source 
    left join Products2.dbo.uniqueprods u 
    on source.[Manufacturer]=u.mfg 
    where u.mfg is null; 

    select [Manufacturer] from Products2.dbo.sourceexport where [Manufacturer]='XYZ'; 

    select mfg from Products2.dbo.uniqueprods where mfg='XYZ' 

Die select/Join-Anweisung gibt etwa 20 Zeilen, Die erste Reihe ist ‚XYZ‘, obwohl es auch von Format ‚XYZ‘ für einige der Zeilen sein könnte. Wenn ich das Ergebnis (mit/ohne Padding, mit/ohne ltrim(rtrim(u.mfg)) auf alle meine Felder) in die zweite und dritte where-Anweisung kopiere, erhalte ich 15 bzw. 260 Ergebnisse.

Alle Ergebnisse von einem linken äußeren Join sollten 0 Zeilen für die rechte Tabelle zurückgeben, und 260 ist mehr als die 0, die ich erwartet hatte.

Edit: Mir wurde in früheren Fragen gesagt, dass ich zu ausführlich bin. Anscheinend hier bin ich nicht ausführlich genug. Vielen Dank. Ich möchte eine linke äußere Verbindung. Bedeutung, ich möchte die Hersteller in source, die nicht in u vorhanden sind. Wir könnten alle Felder aller Zeilen zurückgeben, wenn dies Ihnen hilft, die Frage besser zu beantworten, und dann könnte ich einen zweiten Schritt erstellen, um einen bestimmten Hersteller aus diesen Ergebnissen auszuwählen.

Ich habe ein paar Millionen Datensätze, die Informationen enthalten, die mein Klient als empfindlich betrachtet. Es wäre nicht angemessen, auf die Industrie des Herstellers dieser Widgets anzuspielen. Es ist auch für niemanden besonders interessant, außer für meinen Klienten.

I Tabelle habe source mit Werten (a, b, c, d, f, h, j, l), und Tabelle u mit Werten (a, c, e, g, g, i, k, l) . Ich möchte Werte zurückgeben (b, d, f, h, j). Ich bekomme Rückgabewerte, die ein aber nicht c in ihnen haben. Ich weiß nicht, ob es alle enthält (b, d, f, h, j), weil ich nicht sicher bin, dass meine Aussage funktioniert.

Um die Frage anders zu stellen: Wie kann ich einen linken äußeren Join schreiben, wo keine der Ergebnisse der Anweisung in der richtigen Tabelle sind?

Edit2: Aus den folgenden Aussagen scheint die Syntax nicht schlecht zu sein. Die Änderung meiner ersten Bearbeitungsfrage ist ungültig. Zurück zur ursprünglichen Frageanweisung, warum gibt mein linker äußerer Join Werte zurück, die in beiden Tabellen gefunden werden?

Abgesehen von nicht sichtbaren Zeichen (die durch ltrim (rtim()), richtig?) Und dem Feldtyp gelöst werden sollten, welche anderen Faktoren könnten zu einer Fehlfunktion der Verbindung führen?

+3

Beispieltabellendaten, aktuelles Ergebnis und erwartetes Ergebnis hinzufügen! – jarlh

+0

Obwohl Ihre Frage nicht sehr klar war, wollen Sie auch Zeilen, die in sourceexport vorhanden sind, aber nicht in uniqueproducts? Außerdem haben Sie eine eindeutige Klausel in Ihrer Join-Abfrage, aber nicht in Ihrer zweiten und dritten where-Anweisung. Das könnte eine andere Anzahl von Zeilen ergeben. Rest als @jarlh erwähnt, bitte fügen Sie weitere Informationen hinzu. –

+0

@AkankshaSingh Danke. Dies ist meine erste SQL-Frage. VBA zum Beispiel verlangt, dass es viel weniger Informationen gibt, und ich schrieb so, wie ich es für dieses Publikum gewohnt war. Und ja, es gibt eine eindeutige Klausel. Zeilenzählungen sind irrelevant, aber für eine Sache: Der einzige Grund, warum ich Zeilenzählungen einbezogen habe, war, weil alle Ergebnisse der ersten Anweisung, so dachte ich, für die dritte Anweisung 0 Zeilen zurückgeben sollten. Alles außer 0 ist unerwünscht.Ich hätte wahrscheinlich nur sagen sollen, dass die Zeilenanzahl nicht null ist. – CWilson

Antwort

1

Ich vermute, Ihre 2. und 3. SQL-Anweisungen sind nicht das, was Sie denken, sie sind und Sie müssen Ihre erste Abfrage mit einer In-Klausel umbrechen. declare @ t1 als Tabelle (Hersteller varchar (1)) declare @ t2 als Tabelle (mfg varchar (1))

insert into @t1 values ('a'),('b'),('c'),('d'),('f'),('h'),('j'),('l') 
insert into @t2 values ('a'),('c'),('c'),('g'),('g'),('i'),('k'),('l') 
/*query 1*/ 
    select * 
    from @t1 
    where manufacturer in(
    select distinct source.[Manufacturer] 
     from @t1 source 
     left join @t2 u 
     on source.[Manufacturer]=u.mfg 
     where u.mfg is null 
    ) 
/*Query 2*/  
    select * 
    from @t2 
    where mfg in(
    select distinct source.[Manufacturer] 
     from @t1 source 
     left join @t2 u 
     on source.[Manufacturer]=u.mfg 
     where u.mfg is null 
    ) 

Abfrage 1 kehrt nun alle Werte von @ t1 und Abfrage 2 gibt keine Werte.

+0

Danke, ich vermute, dass meine 2. und 3. Anfragen nur Debugging-Anweisungen sind und in der Produktion absolut nichts nützen.Ich nehme an, dass diese Anweisungen nur erstellt wurden, um zu beweisen, dass die erste Anweisung nicht wie erwartet funktionierte, weil Beweis wichtig ist in einem Forum wie diesem. Ich erwarte, dass diese Anweisungen gelöscht werden, sobald ich den linken äußeren Join richtig arbeiten lasse. – CWilson

+0

Und danke, dass Sie es geschrieben haben. Wie ich sicher bin, dass Sie erwartet haben, funktioniert query1 korrekt für die obigen Daten Und es gibt das Problem v Werte in meinen Live-Daten. Offensichtlich muss der Fehler in meinen Daten und nicht in meiner Aussage liegen. – CWilson