2016-11-09 4 views
2

Ich habe 2 Tabellen;Verbinden Sie 2 Tabellen mit wo und MAX

TableSN

snID SerialNR Unit Version 
1 123  A  A1 
2 456  A  A2 

TableDelivery

dID SerialNR Team 
1 456  US 
2 456  GE 
3 456  FI 

Ergebnis

snID SerialNR Unit Version Team 
1  123  A  A1 
2  456  A  A2  FI 

Ich brauche Tabelle auf TableSN and SerialNR Basis zu bekommen, die Auflistung, wo Version gegeben. In der gleichen Tabelle muss ich die zuletzt eingegebene für Team-Spalte anzeigen. Ich kann die Tabelle korrekt anzeigen lassen, wenn Teamdaten verfügbar sind.

Meine Frage ist, wie diese

SELECT TableSN.snID, TableSN.SerialNR, TableSN.Unit, TableSN.Version, TableDelivery.Team 
FROM TableSN 
    LEFT OUTER JOIN TableDelivery ON TableDelivery. SerialNR = TableSN. SerialNR 
    LEFT OUTER JOIN ( 
     SELECT SerialNR, MAX(dID) AS snRank 
     FROM TableDelivery AS TableDelivery _1 
     GROUP BY SerialNR 
    ) AS NewTeam ON TableDelivery. SerialNR = NewTeam. SerialNR AND TableDelivery.dID = NewTeam.snRank 
WHERE (TableSN.Version = @Version) 

Wie erhalte ich SerialNR sichtbar, wo es keine Mannschaft zur Verfügung stehen?

Vielen Dank für Beratung und Unterstützung.

Dies ist, was gebraucht wird:

[enter image description here]

+0

können Sie bitte Tabellen mit einigen Datensätzen erwähnen. – mansi

+0

TableSN.SerialNR sollte immer sichtbar sein, solange TableSN.Version = @Version true ist - da TableSN Ihre erste Tabelle ist und die anderen LEFT damit verbunden sind - soweit ich das sehen kann – Cato

+0

Eigentlich mit "LEFT" join es dauert ALLE TableDelivery-Daten sichtbar. Mit "RIGHT" join wird es korrekt angezeigt, aber es wird weggelassen, wenn in TableDelivery keine Daten für SerialNR vorhanden sind. "RIGHT" Join ist der, den ich brauche, aber ich muss auch diejenigen haben, die keine Team-Informationen in TableDelivery haben. – makelei

Antwort

0

Versuchen:

SELECT TableSN.snID, TableSN.SerialNR, TableSN.Unit, TableSN.Version, TableDelivery.Team 
FROM TableSN 
LEFT JOIN TableDelivery ON TableDelivery.SerialNR = TableSN. SerialNR AND 
          TableDelivery.dID = (SELECT MAX(dID) 
               FROM TableDelivery AS t   
               WHERE t.SerialNR = TableSN. SerialNR) 
WHERE (TableSN.Version = @Version) 
+1

Vielen Dank! Das war, was ich suchte. Funktioniert perfekt. – makelei

0
DECLARE @Version VARCHAR(5) 
SET @Version = 'A1' 

    SELECT Ts.snID,ts.SerialNR,ts.Unit,ts.Version,TD.Team FROM @TableSN ts left join @TableDelivery td ON ts.SerialNR = td.SerialNR 
    WHERE ts.Version = @Version 

    UNION 

    SELECT Ts.snID,ts.SerialNR,ts.Unit,ts.Version,TD.Team FROM @TableDelivery TD left join @TableSN TS ON TD.SerialNR = ts.SerialNR 
    WHERE dID = (SELECT MAX(dID) FROM @TableDelivery) 

    **output** 

    snID SerialNR Unit Version Team 
    1  123   A  A1 NULL 
    2  456   A  A2 FI 
+0

Danke. Ich benutze MSSQL und mit diesem Code gibt es: "Das Declare SQL Konstrukt oder Anweisung wird nicht unterstützt." – makelei

+0

Der obige Code bezieht sich nur auf MSSQL. Versuchen Sie, noch einmal auszuführen. Darf ich wissen, welche Version von SQL Server Sie verwenden? – User

+0

Ich habe meine Antwort bearbeitet, bitte überprüfen Sie, dass Sie diesen Fehler erhalten, da Sie SQL Version 2005 verwenden – User

0

Sie müssen in Ihren SQL als Show null Zustand umfassen unter: Diese

SELECT TableSN.snID, TableSN.SerialNR, TableSN.Unit, TableSN.Version, TableDelivery.Team 
FROM TableSN 
LEFT OUTER JOIN TableDelivery ON TableDelivery. SerialNR = TableSN. SerialNR 
LEFT OUTER JOIN (SELECT SerialNR, MAX(dID) AS snRank 
        FROM TableDelivery AS TableDelivery _1 
        GROUP BY SerialNR) AS NewTeam ON (TableDelivery. SerialNR = NewTeam. SerialNR 
        OR (TableDelivery. SerialNR IS NULL AND NewTeam. SerialNR IS NULL)) 
        AND TableDelivery.dID = NewTeam.snRank 
WHERE (TableSN.Version = @Version) 
+0

Dies führt dazu, dass ALLE Lieferungen für die Seriennummer aufgelistet werden. Ich brauche jede Seriennummer NUR einmal und letzte Lieferinformationen. Fehle ich etwas? – makelei