У меня есть две таблицы
Таблица A:
ID
1
2
3
4
Таблица B:
ID
1
2
3
У меня есть два запроса:
Я использую SQL Server 2000.
Вы можете использовать НЕ В
:
SELECT A.* FROM A WHERE ID NOT IN(SELECT ID FROM B)
Однако пока я предпочитаю НЕ СУЩЕСТВУЕТ
:
SELECT A.* FROM A WHERE NOT EXISTS(SELECT 1 FROM B WHERE B.ID=A.ID)
Есть и другие варианты, это статья очень хорошо объясняет все преимущества и недостатки:
Должен ли я использовать NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT или NOT EXISTS?
Это выберет 4 в вашем случае
SELECT ID FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)
Это удалит их
DELETE FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)
SELECT ID
FROM A
WHERE NOT EXISTS( SELECT 1
FROM B
WHERE B.ID = A.ID
)
SELECT ID
FROM A
WHERE ID NOT IN (
SELECT ID
FROM B);
SELECT ID
FROM A a
WHERE NOT EXISTS (
SELECT 1
FROM B b
WHERE b.ID = a.ID)
SELECT a.ID
FROM A a
LEFT OUTER JOIN B b
ON a.ID = b.ID
WHERE b.ID IS NULL
DELETE
FROM A
WHERE ID NOT IN (
SELECT ID
FROM B)
select ID from A where ID not in (select ID from B);
или
select ID from A except select ID from B;
Ваш второй вопрос:
delete from A where ID not in (select ID from B);
Для вашего первого вопроса есть по крайней мере, три общих метода на выбор:
SQL выглядит следующим образом:
SELECT * FROM TableA WHERE NOT EXISTS (
SELECT NULL
FROM TableB
WHERE TableB.ID = TableA.ID
)
SELECT * FROM TableA WHERE ID NOT IN (
SELECT ID FROM TableB
)
SELECT TableA.* FROM TableA
LEFT JOIN TableB
ON TableA.ID = TableB.ID
WHERE TableB.ID IS NULL
В зависимости от того, какую базу данных вы используете, производительность каждого может варьироваться . Для SQL Server (столбцы, не допускающие значения NULL): предикаты
NOT EXISTS и NOT IN - лучший способ поиска отсутствующих значений, если оба рассматриваемых столбца НЕ НУЛЕНЫ.