Выбор только тех строк, которые связаны со строкой в ​​какой-то другой конкретной таблице - PullRequest
0 голосов
/ 21 августа 2011
table1:
columns: id, name

table2:
columns: id, name

assoc_table1_table2:
columns: id_table1, id_table2

Мне нужно выбрать все строки из table1, где хотя бы одна строка в table2 связана с этой строкой.

Какой эффективный способ сделать это? Или, вернее, как-то?

Я думаю о:

SELECT DISTINCT t.id, t.name
FROM table1 t
JOIN assoc_table1_table2 a ON t.id=a.id_table1;

или

SELECT id, name
FROM table1 t WHERE EXISTS (
    SELECT *
    FROM assoc_table1_table2 a
    WHERE t.id=a.id_table1
);

Любые идеи о том, что из вышеперечисленного, как правило, быстрее?

(очевидные индексы на месте)

1 Ответ

1 голос
/ 21 августа 2011

Ни.

Я бы рекомендовал использовать «ГДЕ СУЩЕСТВУЕТ», поскольку это даст оптимизатору больше свободы.

Использование "WHERE COUNT (*)" или DISTINCT приведет к необходимости полного сканирования таблицы.

Вам нужно знать, существует ли хотя бы 1 строка, например, в таблице с миллиардами строк. «ГДЕ СУЩЕСТВУЕТ» может быть удовлетворено, как только БД найдет первый ряд. На базах данных с разумными оптимизаторами вы должны найти, что это работает хорошо.

...