如何在一个字段中查找具有不同值的记录

时间:2016-09-10 19:30:36

标签: sql postgresql

我的表名为entities,其列为id, type, status, fingerprint, uuidhttp://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

但也许更好的存在?

2 个答案:

答案 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)

另一种可能的方法,假设draftpublished是唯一类型,并且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上编入索引。