至少有一个重复记录具有"x"。Postgres sql EXISTS 或 INNER JOIN



我有下面的postgres查询,可以在数据库中查找重复的记录,但我希望添加另一个条件,以便我可以说至少一个重复的记录的值为v.varfield_type_code = 's' AND v.field_content ~ 'Greendale Student Cards%'(来自一个名为 sierra_view.varfield v ON p.record_id = v.record_id 的表(。

我尝试了内部连接并正在研究存在。有人有见识吗?谢谢。

SELECT 
p.birth_date_gmt, 'p' || rm2.record_num || 'a' AS "patron",
n.last_name || ' ' || n.first_name || ' ' || n.middle_name as name,
count(*) as cnt
FROM 
sierra_view.patron_record p
JOIN sierra_view.patron_record_fullname n ON p.record_id = 
n.patron_record_id
JOIN sierra_view.record_metadata rm2 on p.record_id = rm2.id
/* JOIN sierra_view.varfield v on p.record_id =v.record_id */
WHERE p.birth_date_gmt BETWEEN '01-01-2001' AND '12-31-2017'
GROUP BY 1,2, 3
HAVING COUNT(1) > 1
ORDER BY 2,1

您可以将这些条件放在HAVING部分中:

JOIN sierra_view.varfield v on p.record_id = v.record_id
WHERE ...
GROUP BY ...
HAVING COUNT(*) > 1 AND COUNT(CASE WHEN v.varfield_type_code = 's' AND v.field_content ~ 'Greendale student cards%' THEN 1 END) > 0

所以:

  • COUNT(*) > 1= 仅包含重复记录(您已经这样做了(
  • COUNT(CASE WHEN v.varfield_type_code = 's' AND v.field_content ~ 'Greendale student cards%' THEN 1 END) > 0= 根据这两个条件对分组记录进行计数;如果记录匹配,则获得 1,否则为 NULL(隐式(,并且不计算 NULL。因此,如果至少有一个分组记录符合条件,则整个"组"将包含在结果中;否则,它们将不包括在内。

还值得仔细检查~ 'Greendale student cards%'是否正确;~用于正则表达式检查,而%LIKE的通配符,除非您确实想搜索文字%字符。

最新更新