Я понимаю, что это старый пост, но я подумал, что важно добавить ясности о , почему можно выбрать один формат вместо другого.
Во-первых, как уже отмечали другие, ядро базы данных предполагает , чтобы игнорировать предложение Select. Каждая версия SQL Server имеет / делает, Oracle делает, MySQL делает и так далее. Во многих, многих лунах разработки баз данных я когда-либо встречал только одну СУБД, которая должным образом не игнорировала предложение Select: Microsoft Access. В частности, более старые версии MS Access (я не могу говорить с текущими версиями).
До моего открытия этой "функции" я использовал Exists( Select *...
. Однако я обнаружил, что MS Access будет проходить через каждый столбец в подзапросе, а затем отбрасывать их (Select 1/0
также не будет работать). Это убедило меня перейти на Select 1
. Если бы даже одна СУБД была глупой, другая могла бы существовать.
Написание Exists( Select 1...
столь же совершенно ясно при передаче намерений (откровенно глупо утверждать, что «слишком близко говорить« если «никакого значения» не существует «для удобства».) И делает шансы СУБД делать что-то глупое с оператором Select практически невозможно. Select Null
будет служить той же цели, но будет просто писать больше символов.
Я переключился на Exists( Select 1
, чтобы убедиться, что СУБД не может быть глупой. Однако это было много месяцев назад, и сегодня я ожидаю, что большинство разработчиков ожидают увидеть Exists( Select *
, который будет работать точно так же.
Тем не менее, я могу предоставить одну вескую причину избегать Exists(Select *
, даже если ваша СУБД оценивает его должным образом. Гораздо проще найти и исправить все случаи использования Select *
, если вам не нужно пропускать каждый случай его использования в предложении Exists.