@Zunga

Postgres — не корректно работает SQL запрос(EXIST)?

Все привет прошу помощи:
Есть две таблицы sys_accounts(клиенты) и sys_activities(задачи по клиентам).

Есть такой работающий запрос (По сути его задача возвращать клиентов у которых с момента закрытия последней задачи прошло более 60ти дней):
SELECT DISTINCT ON (activ.account_guid) (SELECT name FROM sys_accounts WHERE guid=activ.account_guid),
(SELECT extract(day from now() - activ.datefinish) FROM sys_accounts WHERE guid=activ.account_guid), activ.datefinish FROM sys_activities activ 
		INNER JOIN sys_accounts account ON account.guid = activ.account_guid
		WHERE activ.datefinish IS NOT NULL AND activ.dc_status_guid='df11a68c-20d3-46e2-840f-2e4548aacf1b' 
		AND  extract(day from now() - activ.datefinish)>=60 
		AND (account.dc_stage_guid!='83e0d2dd-926e-4764-9d04-8996ce2d1178'  AND account.dc_stage_guid!='fc8e8746-cc71-4d52-b6a4-9186e3da653b')
		ORDER BY activ.account_guid,activ.datefinish DESC

Он нормально работает и возвращает - то что нужно, т.е список клиентов у которых с момента закрытия последней задачи прошло более 60ти дней

Однако если написать такую конструкцию:
SELECT name from sys_accounts account where 

    exists(
		SELECT DISTINCT ON (activ.account_guid) activ.account_guid, activ.datefinish FROM sys_activities activ 
		INNER JOIN sys_accounts account ON account.guid = activ.account_guid
		WHERE activ.datefinish IS NOT NULL AND activ.dc_status_guid='df11a68c-20d3-46e2-840f-2e4548aacf1b' 
		AND  extract(day from now() - activ.datefinish)>=60
		AND (account.dc_stage_guid!='83e0d2dd-926e-4764-9d04-8996ce2d1178'  AND account.dc_stage_guid!='fc8e8746-cc71-4d52-b6a4-9186e3da653b')
		ORDER BY activ.account_guid,activ.datefinish DESC
	)


То запрос начинает возвращать небольшое кол-во компаний у которых с момента закрытия последней задачи прошло менее 60ти дней. Я если честно не понимаю почему так происходит
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
Мне ещё со времён темы на sql.ru не хочется узнавать что это вы такое соорудили и зачем так сложно.

Очень плохая мысль пытаться использовать одинаковые идентификаторы много раз. У вас либо весь запрос работает по принципу if exists subquery then взять все строки таблицы else пустое множество либо как-то переплетены между собой условия неочевидным образом из-за совпадения идентификаторов.
Использовать exists как one-time filter в целом попробовать можно - но обычно exists по не коррелированному запросу есть ошибка.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы