У меня есть две таблицы в базе данных Postgres:
table_1
Name Address Height Weight Date_Collected
X. y z. p. 8/7/2024
G. H. I J. 8/8/2024
Q W. E. R. 8/9/2024
table_2
Name Income Tax Date_Collected
X. y z. 8/8/2024
A B C. 8/8/2024
Попытка сравнить строки между двумя таблицами и получить имена, которые появляются только в table_1, а не в table_2. Я также пытаюсь отфильтровать их по дате сбора MAX.
Вот что у меня есть, но я получаю синтаксическую ошибку:
SELECT count(DISTINCT "Name")
FROM table_1
WHERE table_1.Height NOT LIKE ANY CONCAT('%', {'I', 'E'} '%')
WHERE NOT EXISTS (
SELECT DISTINCT UPPER("Name") FROM table_2
WHERE MAX(table_2."Date Collected")
AND table_2."Income" = 'y'
AND UPPER(table_2."Name") LIKE CONCAT('%', UPPER(table_1."Name"), '%')
)
агрегатные функции не разрешены в «ГДЕ»
Поэтому я изменил его на:
SELECT count(DISTINCT "Name")
FROM table_1
WHERE table_1.Height NOT LIKE ANY CONCAT('%', {'I', 'E'} '%')
WHERE NOT EXISTS (
SELECT DISTINCT UPPER("Name") FROM table_2
WHERE table_2."Income" = 'y'
AND UPPER(table_2."Name") LIKE CONCAT('%', UPPER(table_1."Name"), '%')
AND HAVING MAX(table_2."Date Collected")
)
Это дает мне синтаксическую ошибку. Удаление AND перед HAVING дает мне:
аргумент HAVING должен быть логическим, а не типом даты
Я предполагаю, что после использования должно быть какое-то условие. Если мне нужно использовать HAVING, каким должно быть условие, если я хочу получить максимальную дату? Могу ли я получить максимальную дату, не используя HAVING?


Вы можете получить максимальную дату, собранную из таблицы 2, а затем использовать предложение NOT EXISTS, чтобы отфильтровать имена, которые появляются в таблице 2.
Вот измененный запрос -
SELECT DISTINCT "Name"
FROM table_1
WHERE table_1.Height NOT LIKE ANY (CONCAT('%', ARRAY['I', 'E']) || '%')
AND NOT EXISTS (
SELECT 1
FROM table_2
WHERE table_2."Name" = table_1."Name"
AND table_2."Date_Collected" = (
SELECT MAX("Date_Collected")
FROM table_2
WHERE "Name" = table_1."Name"
)
)
Это сработало без последней строки. Спасибо за помощь.
@winterlyrock: Height NOT LIKE ANY (CONCAT('%', ARRAY['I', 'E']) || '%') — это синтаксическая ерунда. Последнее сравнение с максимальным "Date_Collected" с тем же именем не приносит никакой пользы в выражении подзапроса EXISTS. Этот запрос не может «работать», каким бы ни был вопрос.
Сначала вам следует навести порядок в этой путанице идентификаторов в смешанном регистре в кавычках и без кавычек. Затем предоставьте четкое определение таблицы (оператор
CREATE TABLE), примеры значений в виде оператораINSERT, версию Postgres и четкий вопрос.