我正在尝试通过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
的旧行。
答案 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