Всякий раз, когда мне нужно проверить наличие какой-либо строки в таблице, я всегда пишу условие вроде:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT * -- This is what I normally write
FROM another_table
WHERE another_table.b = a_table.b
)
Некоторые другие люди пишут это так:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT 1 --- This nice '1' is what I have seen other people use
FROM another_table
WHERE another_table.b = a_table.b
)
Когда условие NOT EXISTS
вместо EXISTS
: В некоторых случаях я мог бы написать его с дополнительным LEFT JOIN
и дополнительным условием (иногда называемым антисоединением ):
SELECT a, b, c
FROM a_table
LEFT JOIN another_table ON another_table.b = a_table.b
WHERE another_table.primary_key IS NULL
Я стараюсь избегать этого, потому что я думаю, что смысл менее ясен, особенно когда то, что у вас primary_key
не так очевидно, или когда ваш первичный ключ или ваше условие соединения состоит из нескольких столбцов (и вы можете легко забыть один из столбцов). Однако иногда вы поддерживаете код, написанный кем-то другим ... и он просто есть.
Есть ли разница (кроме стиля) для использования
SELECT 1
вместоSELECT *
?
Есть ли угловой случай, когда он не ведет себя так же?Хотя то, что я написал, является стандартным SQL (AFAIK): есть ли такая разница для разных баз данных / более старых версий?
Есть ли какое-то преимущество в простоте написания противодействия?
Современные планировщики / оптимизаторы рассматривают это иначе, чемNOT EXISTS
пункт?
EXISTS (SELECT FROM ...)
.