По крайней мере, одна из повторяющихся записей имеет «х».Postgres sql EXISTS или INNER JOIN - PullRequest
0 голосов
/ 10 октября 2018

У меня есть следующий запрос postgres, который находит дубликаты записей в базе данных, но я надеюсь добавить еще одно условие, чтобы я мог сказать, что, по крайней мере, одна из дублированных записей имеет значения v.varfield_type_code = 's' Иv.field_content ~ 'Студенческие карточки Greendale%' (из таблицы sierra_view.varfield v ON p.record_id = v.record_id).

Я попытался выполнить INNER JOIN и изучаю EXISTS.У кого-нибудь есть понимание?Спасибо.

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

1 Ответ

0 голосов
/ 10 октября 2018

Вы можете поместить эти условия в раздел 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, если, конечно, вы не хотите искать буквальный символ %.

...