您可以使用having
條款來獲取在重複條目列表:
SELECT abc.entry
FROM table abc JOIN
table1 def
ON abc.entry = def.entry
WHERE def.created >= 'some_date' AND def.position = 1
group by abc.entry
having count(*) > 1
要獲得行的名單,我將使用窗口功能:
select t.*
from (SELECT abc.*, count(*) over (partition by entry) as cnt
FROM table abc JOIN
table1 def
ON abc.entry = def.entry
WHERE def.created >= 'some_date' AND def.position = 1
) t
where cnt > 1;
編輯:
我看到過的術語的混亂。 DISTINCT
在SQL中有非常特殊的含義。而且,DISTINCT ON
在Postgres中有一個相當不同的含義。我認爲你必須用子查詢來做到這一點:
select abc.*
from table abc left outer join
(SELECT DISTINCT ON (abc.entry) abc.* FROM table abc
JOIN table1 def ON abc.entry = def.entry
WHERE def.created >= 'some_date' AND def.position = 1
) f
on abc.id = f.id
where f.id is NULL
雖然是一個謹慎的詞。您正在使用distinct on
而沒有order by
子句。數據中返回的特定行是不確定的。您應該在這裏添加order by
到您的原始數據和子查詢。
select abc.*
from table abc left outer join
(SELECT abc.entry, max(abc.id) as maxid
FROM table abc
JOIN table1 def ON abc.entry = def.entry
WHERE def.created >= 'some_date' AND def.position = 1
group by abc.entry
) f
on abc.id = f.maxid
where f.maxid is NULL
對不起,這些都不讓我在那裏。第一個查詢返回一個條目列表,我已經從我的初始查詢中獲得。如果更正第二個查詢以在第2行上使用「abc.entry」,它將返回發生重複項的所有行的列表。我真正需要的是補充。如果我有集{{1,A},{1,B},{2,A},{2,B},{3,A},{4,A},...}初始查詢,我可能會得到{{1,A},{2,B},{3,A},{4,A}。如果我可以找到{{1,B},{2,A}}的ID,那麼這些記錄就是我想要刪除的記錄。我不能把它們混在一起。 –
@DarinPeterson。 。 。 'abc'中有'id'列嗎? –
是的,def有一個id列,abc有一個id列以及def.id的外鍵。 「entry」是我在初始查詢中定義的關鍵。 –