【问题标题】:Join 2 tables with where and MAX用 where 和 MAX 加入 2 个表
【发布时间】:2017-03-23 03:26:27
【问题描述】:

我有 2 张桌子;

表序号

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

餐桌交付

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))。当有可用的团队数据时,我可以让表格正确显示。

我的查询是这样的

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

感谢您的指导和支持。

这是需要的:

[

【问题讨论】:

  • 能否请您提及有一些记录的表格。
  • TableSN.SerialNR 应该始终可见,只要 TableSN.Version = @Version 为真 - 因为 TableSN 是您的第一个表,而其他表是左连接的 - 据我所知跨度>
  • 实际上使用“LEFT”加入它需要所有 TableDelivery 数据可见。使用“RIGHT”连接,它会正确显示,但如果 TableDelivery 中没有 SerialNR 的数据,它会忽略。 “RIGHT”加入是我需要的,但我还需要在 TableDelivery 中没有团队信息的加入。
  • 鉴于我在下面的回答,请检查一次@makelei

标签: sql sql-server join sql-server-2005 max


【解决方案1】:

试试这个:

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)

【讨论】:

  • 谢谢!这就是我要找的。完美运行。
【解决方案2】:

您需要在 sql 中包含 null 条件,如下所示:

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)

【讨论】:

  • 这会导致序列号的所有交付将被列出。我只需要每个序列号一次和最后一次交货信息。我错过了什么吗?
【解决方案3】:
  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

【讨论】:

  • 谢谢。我正在使用 MSSQL,并且使用此代码,它给出:“不支持 Declare SQL 构造或语句。”
  • 以上代码只和MSSQL有关,多执行一次,请问您使用的是哪个版本的SQL Server?
  • 我编辑了我的答案,请检查,您在使用 SQL 版本 2005 时遇到了该错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多