2016-09-10 10 views
0

entitiesという名前のテーブルがあります。カラムはid, type, status, fingerprint, uuidです。 http://sqlfiddle.com/#!15/8d9b3/21フィールドに異なる値のレコードを見つける方法

各エンティティは、公開バージョンとドラフト版の両方を持つことができます(同じUUIDを持ちます)。 公開バージョンと使用されているドラフトバージョンのフィンガープリント(属性のmd5)の間の変更を追跡します。

変更されたすべてのドラフトエンティティ(例:同じタイプとuuidを持ちますが、フィンガープリントが異なるエンティティ)を見つける方法を教えてください。

案を表し、これらの記録については、

と一つの製品の公開バージョン

#id #type  #status  #fprint #uuid 
(3, 'Product', 'draft',  'aaaa', '2e92f72a-c55f-42df-ba7f-afcb131cc6ff'), 
(4, 'Product', 'published', 'aaab', '2e92f72a-c55f-42df-ba7f-afcb131cc6ff') 

私は、結果としてドラフト版を持っている必要があります。

ありがとうございます!

UPDATE

このクエリは、

select draft.* 
from entities draft 
    join entities published on published.type = draft.type 
     and published.uuid = draft.uuid and published.status = 'published' 
where draft.status = 'draft' and draft.fingerprint != published.fingerprint 

作品しかし、おそらくより良い1が存在しますか?

答えて

1

このお試しください:

WITH multi_fingerprints AS (
    SELECT uuid 
    FROM entities 
    GROUP BY uuid 
    HAVING COUNT(DISTINCT fingerprint) > 1 
) 
SELECT e.* 
    FROM entities e 
    JOIN multi_fingerprints m ON (e.uuid = m.uuid AND e.status = 'draft') 

はおそらくuuidにインデックスを作成する必要があります。draftpublishedは唯一のタイプであり、UUIDのために複数存在しないだろうと仮定すると、

select * from entities e1, entities e2 where e1.id = e2.id and e1.uuid =e2.uuid and e1.fingerprint <> e2.fingerprint 
+0

必要な情報をよりよく説明するために説明が更新されました。ごめんなさい。 –

0

別の可能なアプローチを同じように。

関連する問題