2017-02-17 1 views
3

Hier ist meine Situation.How to Anti Beitreten in MSSQL, wenn die Verknüpfung von Daten aus einer dritten Tabelle

PayTable 
+-------+------+--------------+ 
| Craft | Job | sequence  | 
+-------+------+--------------+ 
| 400 | 1 | 1   | 
+-------+------+--------------+ 
| 401 | 2 | 2   | 
+-------+------+--------------+ 
| 5501 | 2 | 3   | 
+-------+------+--------------+ 

Jobs 
+-------+------+------+ 
| Job | CraftTemplate | 
+-------+------+------+ 
| 1 | 1    | 
+-------+------+------+ 
| 2 | 1    | 
+-------+------+------+ 


Pay Template 
+-------+--+ 
| Template | 
+-------+--+ 
| 1  | 
+-------+--+ 

PayCraftTemplate 
+-------+------+---------+ 
| PayTemplate | Craft | 
+-------+------+---------+ 
| 1    | 400 | 
+-------+------+---------+ 
| 1    | 401 | 
+-------+------+---------+ 

Was ich tun müssen, um alle Kunsthandwerk aus der Auszahlungstabelle finden, wo das Fahrzeug nicht in der PayCraftTemplate existiert. Dies scheint ziemlich geradlinig als Anti-Join-Muster zu sein, aber ich kann nicht scheinen, dass die Daten entsprechend zurückkommen.

Die Join-Verbindungen sind:

PayTable INNER JOIN Jobs by Job -> Job 
Jobs LEFT OUTER JOIN Pay Template by CraftTemplate -> Template 
Pay Template LEFT OUTER JOIN by Template -> PayTemplate 

Hier ist meine aktuelle Versuch:

select 
    * 
FROM 
    PayTable 
WHERE NOT EXISTS (
    SELECT 1 
     FROM 
    Jobs 
     LEFT OUTER JOIN PayTemplate 
     ON PayTemplate.Template = Jobs.CraftTemplate 
    LEFT OUTER JOIN PayCraftTemplate 
     ON PayCraftTemplate.Template = PayTemplate.Template 
    WHERE 
     PayTable.Craft = PayCraftTemplate.Craft AND PayTable.Job = Jobs.Job 
) AND PayTable.Job IS NOT NULL AND PayTable.Craft IS NOT NULL 

Dies wird die Daten nicht Rückkehr erwarte ich, würde ich Reihe 3 von Auszahlungstabelle erwarten, nur statt kehre ich bekomme Zeilen 1,2

Antwort

1

Ich vermute, Sie bewegt einige Dinge um die Frage zu posten und im Grunde behoben. Aus der obigen Abfrage, müssen Sie nur PayCraftTemplate.Template zu PayCraftTemplate.PayTemplate

ich zunächst ändern dachte, dies war ein Problem mit left join mit einem where unbeabsichtigt in ein inner join drehen, aber in diesem Fall inner join ist das, was ohnehin benötigt wird, so dass war nicht das Problem.

select * 
from PayTable 
where not exists (
    select 1 
    from Jobs 
    inner join PayTemplate 
     on PayTemplate.Template = Jobs.CraftTemplate 
     and Jobs.Job = PayTable.Job 
    inner join PayCraftTemplate 
     on PayCraftTemplate.PayTemplate = PayTemplate.Template 
    and PayCraftTemplate.Craft = PayTable.Craft 
) 
    and PayTable.Job is not null 
    and PayTable.Craft is not null 

Ergebnisse:

+-------+-----+----------+ 
| Craft | Job | sequence | 
+-------+-----+----------+ 
| 5501 | 2 |  3 | 
+-------+-----+----------+ 
+0

Warum verknüpfen Sie Auszahlungstabelle in der Innen schließt sich stattdessen eine where-Klausel auf der inneren Unter wählen zu tun? –

+0

Das ist übrig von, als ich die WHERE-Klausel in die Joins verschoben habe, weil es eine 'linke Verknüpfung' war. Sie können auf die Wo-Klausel zurückgehen. Ich habe gerade meine Antwort bearbeitet und gezeigt, wie deine Antwort mit dem fixierten Tippfehler funktioniert. – SqlZim

+0

Danke. Das funktioniert. Ich war so nah, lol. –

Verwandte Themen