В стандартном SQL есть без скобок в DISTINCT colA
. DISTINCT
не является функцией.
SELECT DISTINCT colA
FROM mytable
WHERE colA NOT IN (SELECT DISTINCT colB FROM mytable);
Также добавлено DISTINCT
в суб-выбор. Если у вас много дубликатов, это может ускорить запрос.
CTE может быть быстрее, в зависимости от вашей СУБД. Я дополнительно демонстрирую LEFT JOIN
как альтернативу для исключения значений в valB
и альтернативный способ получения различных значений с помощью GROUP BY
:
WITH x AS (SELECT colB FROM mytable GROUP BY colB)
SELECT m.colA
FROM mytable m
LEFT JOIN x ON x.colB = m.colA
WHERE x.colB IS NULL
GROUP BY m.colA;
Или, упрощенный далее, и с простым подзапросом (вероятно, самый быстрый):
SELECT DISTINCT m.colA
FROM mytable m
LEFT JOIN mytable x ON x.colB = m.colA
WHERE x.colB IS NULL;
Существует в основном 4 метода для исключения строк с ключами, присутствующими в другой (или той же) таблице:
Решающим фактором для скорости будет indexes . Вам нужно иметь индексы на colA
и colB
, чтобы этот запрос был быстрым.