Это, вероятно, делает то, что вы хотите:
SELECT c.*
FROM campaign c JOIN
event e
ON c.id_campaign = e.id_campaign JOIN
dataset_event de
ON de.id_event = e.id_event
WHERE de.id_dataset = xxx
LIMIT 100;
Для производительности вам нужны индексы:
dataset_event(id_dataset, id_event)
event(id_event, id_campaign)
campaign(id_campaign)
Возможно, у вас уже есть некоторые или все из них.
Вышеприведенное может вернуть дубликаты. Очевидно, вы можете использовать select distinct
или distinct on
, но это может быть довольно дорого. Вместо этого, exists
может быть лучшим решением:
SELECT c.*
FROM campaign c
WHERE EXISTS (SELECT 1
FROM event e JOIN
dataset_event de
ON de.id_event = e.id_event
WHERE c.id_campaign = e.id_campaign AND
de.id_dataset = xxx
)
LIMIT 100;
Для этого вам нужны индексы:
event(id_campaign, id_event)
dataset_event(id_event, id_dataset)