Использование INNER JOIN
:
SELECT DISTINCT a.*
FROM table_a a
INNER JOIN table_b b
ON a.id = b.idevent AND b.date > CURRENT_DATE
Буквально пару замечаний о других методах ргороз ed:
Использование EXISTS
возможно предпочтительнее IN
, но Postgres может относиться к ним как к эквиваленту в любом случае. Я знаю в SQL Server, который случается иногда - единственная другая проблема будет, если b.date имеет значение NULLABLE, что может вызвать неожиданное поведение при использовании IN
.
Использование вашего условия в состоянии ON
вместо предложения WHERE
лучше, потому что это поможет движку знать, чтобы исключить строки, прежде чем возвращать их для запуска фильтра WHERE
.
Я использую DISTINCT
здесь, потому что в противном случае, этот запрос будет возвращать ту же строку из table_a
каждый раз, когда там был матч в table_b
с date
больше, чем сегодня. Другим вариантом будет использование GROUP BY
вместо этого, если вы хотите выполнить некоторую совокупную отчетность, такую как GROUP BY a.id, a.event, a.name
. Однако, поскольку вы не делаете никаких сводных отчетов (например, количество событий в определенный день или что-то еще), DISTINCT
должен выполнить работу более четко и быстро.
Используйте ['JOIN'] (http://www.postgresql.org/docs/current/static/tutorial-join.html) – kero
, если я использую joi n i будет получать строку в таблице, повторяющуюся, для которой строка таблицы b –
@lambaoalfaex вы можете обновить свой вопрос, чтобы добавить запрос JOIN, который вы пытались, и тот, который не работает? – Maximus2012