Щоразу, коли мені потрібно перевірити наявність якогось рядка в таблиці, я прагну завжди писати умову на зразок:
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 *
?
Чи є кутовий випадок, коли він веде себе не так?Хоча те, що я написав, є (AFAIK) стандартним SQL: Чи існує така різниця для різних баз даних / старих версій?
Чи є якась перевага щодо чіткості написання антиз'єднання?
Чи ставляться до цього сучасні планувальники / оптимізатори по-різному відNOT EXISTS
пункту?
EXISTS (SELECT FROM ...)
.