我的表名为entities
,其列为id, type, status, fingerprint, uuid
。 http://sqlfiddle.com/#!15/8d9b3/2
每个实体都可以同时拥有已发布版本和草稿版本(它们具有相同的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')
我需要有草稿版本。
谢谢!
更新
此查询有效
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
但也许更好的存在?
答案 0 :(得分:1)
试试这个:
select * from entities e1, entities e2 where e1.id = e2.id and e1.uuid =e2.uuid and e1.fingerprint <> e2.fingerprint
答案 1 :(得分:0)
另一种可能的方法,假设draft
和published
是唯一类型,并且uuid不会有多个:
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
上编入索引。