2012-02-09 17 views
1

我试图得到一个查询来比较两个表的左外部加入两个并找到任何结果,没有在右表匹配。问题是我有一个TicketNo,ItemNo和UniqueID的组合键,我只需要比较任何给定TicketNo具有最高UniqueID的行。加入组合键的一部分的MAX值

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

基本上我想是这样的:

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 

但我不能在这里使用的聚合函数最大值。我不知道如何使用子查询(或者CTE失败,但我更愿意使用子查询)仅获取给定TicketNo的最大唯一ID 。我不仅可以加入表中最高的uniqueID。

我的数据是这样的,假设一式两份:

TicketNo UniqueID ItemNo 
15   1270662207 1 
15   1184857061 1 

在这种情况下,我只希望第一行返回。我不在乎我的工作表是否有TicketNo 15的旧行。以这种方式使用GROUP BY和ORDER BY子句

回答

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 
+0

嘿,你不必将它与我的数据相匹配。尽管如此,书呆子还是很有魅力。 – 2012-02-09 21:56:59

0

尝试:

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 
+1

如果没有聚合UniqueID,Group by不起作用。另外我需要一个只有不匹配的结果集,所以我不能只对结果排序,我需要结果不包含非最大UniqueIDs – 2012-02-09 21:27:35

2

解决这个的技术涉及到GroupWise最大的模式。在这种情况下,您正在使用它来查找与不同表中的聚合结果的最大值匹配的完整行,而不是相同的表。

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

这里的派生表方法的一个例子:

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

+0

您的查询中的一些小问题 - (1)自SELECT列表以来模糊的列没有表前缀(应该是'd.TicketNo')(b)'JOIN'子句中的多部分标识符问题 - 您将'Working'别名为't2',那么您的标准将指定't1'(使用有意义的一个原因别名,而不是t1,t2,t3等是有意义的)。你似乎也错过了一个连接子句('ItemNo')。 – 2012-02-09 21:44:32

+0

小调整。固定。 – 2012-02-09 22:06:12

相关问题