2012-02-09 16 views
1

LEFT OUTERで2つのテーブルを比較するクエリを取得しようとしています.2つのテーブルをジョインして、正しいテーブルに一致しない結果を見つけようとしています。問題は、TicketNo、ItemNo、UniqueIDの複合キーがあり、特定のTicketNoに対して最も高いUniqueIDを持つ行のみを比較する必要があることです。複合キーの1つの部分の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 

しかし、私はここに集約関数maxを使用することはできません。特定のTicketNoの最大ユニークID だけを取得するには、どのようにサブクエリを使用できるか(またはCTEに失敗しましたが、サブクエリを使用することはできません)わかりません。私はテーブル内の最も高いuniqueIDに参加するだけではできません。私は最初行を返すようにしたい。この場合、

TicketNo UniqueID ItemNo 
15   1270662207 1 
15   1184857061 1 

私のデータは、2つの複製を想定し、このようになります。私の作業テーブルにTicketNo 15の古い行があるかどうかは気にしません。

答えて

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

heh、あなたは自分のデータと一致させる必要はありませんでした。 WOrksは魅力が好きです。 –

0

は、このようにGROUP BY句BYおよびORDERを使用してみてください:

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

グループ化するとグループ化されずにユニークIDは機能しません。プラス私は一致するだけの結果セットが必要なので、私は結果を並べ替えることはできません、私は非MAX UniqueIDsを含まないように結果が必要です –

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')の1つを欠いているようです。 –

+0

マイナーな微調整。一定。 –

関連する問題