2016-11-09 68 views
2

我有2个表;加入2表与哪里和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 

结果

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

我需要基于表格来获得TableSN and SerialNR,其中上市版本中给出。在同一张表中,我需要显示最近为Team-column输入的data (= MAX(dID))。当有Team-data可用时,我能够正确显示表格。

我的查询是这样的

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) 

如何获得SerialNR看到那里有没有可用的团队?

感谢您的指导和支持。

这是需要什么:

[enter image description here]

+0

可以请你提一些有记录的表。 – mansi

+0

TableSN.SerialNR应该始终可见,只要TableSN.Version = @Version为真 - 因为TableSN是您的第一个表,其他的都是LEFT加入到它 - 就我看到的那样 – Cato

+0

实际上,使用“LEFT”连接它需要所有TableDelivery数据都可见。使用“RIGHT”加入后,它将正确显示,但如果TableDelivery中没有Seri​​alNR的数据,则它将被忽略。 “RIGHT”加入是我需要的,但我需要也有那些在TableDelivery中没有团队信息的人。 – makelei

回答

0

试试这个:

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

谢谢!这就是我一直在寻找的东西。完美的作品。 – 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

谢谢。我正在使用MSSQL和这段代码,它给出了:“不支持Declare SQL构造或语句。” – makelei

+0

以上代码仅与MSSQL有关,请尝试再执行一次,我可否知道您使用的是哪个版本的SQL Server? – User

+0

我编辑了我的答案,请检查,您正在使用SQL版本2005获得该错误 – User

0

你需要在你的SQL,如下所示空条件:

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

这导致所有交付序列号将被列出。我只需要每个序列号一次和最后一次交付信息。我错过了什么吗? – makelei