Это зависит от базы данных, особенно если сравниваемые столбцы
- проиндексированы или нет
- обнуляемы или нет
...,но обычно, если ваш запрос не использует столбцы из таблицы, к которой вы присоединились - вы должны использовать либо IN
, либо EXISTS
:
SELECT e.id, e.begin_on, e.name
FROM EVENTS e
WHERE EXISTS (SELECT NULL
FROM CONTACTS c
WHERE ( c.contact_id = '1' AND c.user_id = e.user_id )
OR ( c.user_id = '1' AND c.contact_id = e.user_id )
Использование JOIN (INNER или OUTER) может привести к завышению записей, еслидочерняя таблица имеет более одной записи, относящейся к записи родительской таблицы.Это нормально, если вам нужна эта информация, но если нет, то вам нужно использовать GROUP BY
или DISTINCT
, чтобы получить результирующий набор уникальных значений - и это может стоить вам, когда вы просматриваете затраты на запрос.
EXISTS
Хотя предложения EXISTS
выглядят как коррелированные подзапросы, они не выполняются как таковые (RBAR: Row By Agonizing Row).EXISTS
возвращает логическое значение на основе предоставленных критериев и завершается при первом истинном экземпляре - это может сделать его быстрее, чем IN
при работе с дубликатами в дочерней таблице.