Я думаю, что эффективность зависит от вашей платформы.
В Oracle SELECT * и SELECT 1 в предложении EXISTS генерируют идентичные планы объяснения с одинаковыми затратами памяти. Нет никакой разницы. Однако другие платформы могут отличаться.
В порядке личных предпочтений я использую
SELECT *
Поскольку ВЫБОР определенного поля может ввести читателя в заблуждение, что я забочусь об этом конкретном поле, а также позволяет мне скопировать / вставить этот подзапрос и запустить его без изменений, чтобы посмотреть на вывод.
Тем не менее, предложение EXISTS в операторе SQL немного напоминает запах кода, IMO. Бывают моменты, когда они являются лучшим и наиболее понятным способом получить то, что вы хотите, но их почти всегда можно выразить как объединение, что оптимизирует ядро базы данных.
SELECT *
FROM SOME_TABLE ST
WHERE EXISTS(
SELECT 1
FROM SOME_OTHER_TABLE SOT
WHERE SOT.KEY_VALUE1 = ST.KEY_VALUE1
AND SOT.KEY_VALUE2 = ST.KEY_VALUE2
)
Логически идентичен:
SELECT *
FROM
SOME_TABLE ST
INNER JOIN
SOME_OTHER_TABLE SOT
ON ST.KEY_VALUE1 = SOT.KEY_VALUE1
AND ST.KEY_VALUE2 = SOT.KEY_VALUE2