加入复合键的一部分的MAX值

时间:2012-02-09 21:15:57

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

我正在尝试通过LEFT OUTER比较两个表来比较两个表,并在右表中查找没有匹配的任何结果。问题是我有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的旧行。

3 个答案:

答案 0 :(得分:2)

解决此问题的技术与分组最大模式有关。在这种情况下,您使用它来查找与不同表中的聚合结果的最大值匹配的完整行,而不是相同的表。

但是这个想法是一样的 - 你必须使用派生表或子查询来获得结果。

以下是派生表方法的示例:

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;

有关详细信息,请参阅以下链接:

http://jan.kneschke.de/projects/mysql/groupwise-max/

http://dev.mysql.com/doc/refman/5.5/en/example-maximum-column-group-row.html

答案 1 :(得分:1)

DECLARE @History TABLE(UniqueID INT, TicketNo INT, ItemNo INT);
DECLARE @Working TABLE(UniqueID INT, TicketNo INT, ItemNo INT);

INSERT @History SELECT 15,1270662207,1
      UNION ALL SELECT 15,1184857061,1;

INSERT @Working SELECT 15,1184857061,1;

SELECT h.TicketNo, h.UniqueID
FROM 
(
    SELECT TicketNo, ItemNo, MAX(UniqueID) AS UniqueID
    FROM @History GROUP BY TicketNo, ItemNo
) AS h
LEFT OUTER JOIN 
@Working AS w
    ON h.TicketNo = w.TicketNo
    AND h.ItemNo = w.ItemNo
    AND h.UniqueID = w.UniqueID
WHERE w.TicketNo IS NULL;

结果:

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

答案 2 :(得分:0)

尝试以这种方式使用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