В SQL, как я могу выполнить операцию «вычитания»? - PullRequest
4 голосов
/ 01 февраля 2011

Предположим, у меня есть две таблицы, у каждой из которых есть идентификаторы пользователей.Я хочу выполнить операцию, которая вернула бы все пользовательские IDS в таблице 1, которых нет в таблице 2. Я знаю, что должен быть какой-то простой способ сделать это - кто-нибудь может предложить некоторую помощь?

Ответы [ 7 ]

6 голосов
/ 01 февраля 2011

Это медленно, но вы обычно можете сделать это с помощью чего-то вроде «не в». (В различных системах RDBMS есть и другие функции, позволяющие сделать это лучше. Например, в Oracle есть предложение «Существует», которое можно использовать для этого.

Но вы могли бы сказать:

select id from table1 where id not in (select id from table2)
5 голосов
/ 01 февраля 2011

Есть несколько способов сделать это.Вот один подход с использованием NOT EXISTS:

SELECT userid
FROM table1
WHERE NOT EXISTS
(
    SELECT *
    FROM table2
    WHERE table1.userid = table2.userid
)

А вот другой подход с использованием объединения:

SELECT table1.userid
FROM table1
LEFT JOIN table2
ON table1.userid = table2.userid
WHERE table2.userid IS NULL

Самый быстрый подход зависит от базы данных.

1 голос
/ 01 февраля 2011

Если это SQL Server:

SELECT id FROM table1
EXCEPT 
SELECT id FROM table2

Oracle:

SELECT id FROM table1
MINUS
SELECT id FROM table2

Остальное: не уверен ....

1 голос
/ 01 февраля 2011
SELECT user_id FROM table1 LEFT JOIN table2 ON table1.user_id = table2.user_id WHERE table2.user_id IS NULL;
1 голос
/ 01 февраля 2011

Одним из способов является использование ИСКЛЮЧИТЬ , если ваш диалект TSQL поддерживает это.Это эквивалентно выполнению левого соединения и нулевого теста

0 голосов
/ 01 февраля 2011
select ID from table1
where ID not in (select ID from table2)
0 голосов
/ 01 февраля 2011

Попробуйте это:

SELECT id FROM table1 WHERE id NOT IN
(
    SELECT id FROM table2
)
...