Sql 按组合键一部分的最大值联接

Sql 按组合键一部分的最大值联接,sql,sql-server,sql-server-2005,join,Sql,Sql Server,Sql Server 2005,Join,我试图通过左外连接两个表并在右表中查找不匹配的结果来获得一个比较两个表的查询。问题是我有一个TicketNo、ItemNo和UniqueID的复合键,我只需要比较任何给定TicketNo的UniqueID最高的行 我需要数据,以便我的程序知道是否需要更新工作副本表,以及如果需要,需要更新哪些行 基本上我想要的是: SELECT TicketNo FROM History t1 LEFT OUTER JOIN Working t2 on max(t1.[UniqueID])=t2.[Unique

我试图通过左外连接两个表并在右表中查找不匹配的结果来获得一个比较两个表的查询。问题是我有一个TicketNo、ItemNo和UniqueID的复合键,我只需要比较任何给定TicketNo的UniqueID最高的行

我需要数据,以便我的程序知道是否需要更新工作副本表,以及如果需要,需要更新哪些行

基本上我想要的是:

SELECT TicketNo
FROM History t1
LEFT OUTER JOIN Working t2 on 
max(t1.[UniqueID])=t2.[UniqueID] 
AND t1.[TicketNo]=t2.[TicketNo]
AND t1.[ItemNo]=t2.[ItemNo]
WHERE t2.[TicketNo] IS NULL 
但是我不能在这里使用聚合函数max。我不知道如何使用子查询(或CTE查询失败,但我更喜欢子查询)仅获取给定TicketNo的最大唯一ID。我不能只加入表中最高的唯一ID

我的数据如下所示,假设有两个重复:

TicketNo    UniqueID    ItemNo
15         1270662207   1
15         1184857061   1

在这种情况下,我只希望返回第一行。我不在乎我的工作表中是否有带有
TicketNo 15的旧行。

尝试以以下方式使用GROUP BY和ORDER BY子句:

SELECT TicketNo
FROM History t1
LEFT OUTER JOIN Working t2 on 
t1.[UniqueID]=t2.[UniqueID] 
AND t1.[TicketNo]=t2.[TicketNo]
AND t1.[ItemNo]=t2.[ItemNo]
WHERE t2.[TicketNo] IS NULL
GROUP BY t1.[TicketNo], t1.[ItemNo]
ORDER BY t1.[UniqueID] DESC

解决此问题的技术与groupwise max模式有关。在本例中,您将使用它在不同的表(而不是同一个表)中查找与聚合结果的最大值匹配的完整行

但想法是一样的——您必须使用派生表或子查询来获得结果

下面是派生表方法的一个示例:

SELECT d.TicketNo FROM 
 (SELECT TicketNo, ItemNo, MAX(UniqueID) AS maxid FROM History t1 GROUP BY TicketNo, ItemNo) AS d 
 LEFT JOIN Working t2 ON d.TicketNo=t2.TicketNo AND d.ItemNo=t2.ItemNo AND d.maxid=t2.UniqueID 
WHERE t2.TicketNo IS NULL;
有关更多信息,请参阅以下链接:

结果:

TicketNo    UniqueID
----------- -----------
1270662207  15

如果不聚合UniqueID,分组依据将不起作用。另外,我需要一个仅包含not匹配项的结果集,因此我不能只对结果进行排序,我需要结果不包含非MAX UNIQUEIDS查询中的几个小问题-(1)由于选择列表没有表前缀,因此列不明确(应为
d.TicketNo
)(b)
JOIN
子句中的多部分标识符问题-您将
工作
别名为
t2
,然后您的标准指定
t1
(使用有意义的别名而不是t1、t2、t3等的一个原因是有意义的)。您似乎还缺少一个join子句(
ItemNo
)。嘿,您不必将它与我的数据匹配。不过它很有魅力。
TicketNo    UniqueID
----------- -----------
1270662207  15