Member 13507201 Ответов: 1

Вставка с использованием "не существует" в SQL server


Всем Привет,

Я сталкиваюсь с проблемой, когда пытаюсь вставить значения во временную таблицу, используя not exists.

Ниже приведена фиктивная таблица, которую я создал:

CREATE TABLE TEST_DEL(ID INT, NAME VARCHAR(10))


фиктивные вставки:

INSERT INTO TEST_DEL VALUES(1, 'A')
INSERT INTO TEST_DEL VALUES(2, 'B')
INSERT INTO TEST_DEL VALUES(2, 'C')
INSERT INTO TEST_DEL VALUES(3, 'D')
INSERT INTO TEST_DEL VALUES(4, 'E')


создание временных таблиц структуры, чтобы получить одну запись для каждого 'идентификатор' значение из Test_DEL стол:

SELECT * INTO #TEMP FROM TEST_DEL WHERE 1=0


я подготовил следующий запрос, чтобы вставить одну запись во временную таблицу для каждого идентификатора из Test_DEL:

INSERT INTO #TEMP (ID, NAME)
SELECT  a.ID, a.NAME FROM TEST_DEL A 
WHERE NOT EXISTS(SELECT 1 FROM #TEMP B WHERE B.ID = A.ID


здесь мое ожидание с этим запросом состоит в том, чтобы проверить каждую запись со значением id перед вставкой во временную таблицу, если она еще не существует, то вставить, и если какая-либо запись существует со значением ID во временной таблице, пропустить эту запись из вставки.

Я должен получить 4 записи в #temp bu я получаю все 5 записей.

может ли кто-нибудь, пожалуйста, подсказать, что не так в запросе, который я написал?

Заранее спасибо.

Что я уже пробовал:

Попробовал вышеописанный оператор insert с "not exists", но он не работает.

pt1401

Почему вы думаете, что должны получить только 4 записи?
Выберите * INTO #TEMP из TEST_DEL, где 1=0 ничего не вставляет, он просто создает пустую временную таблицу с правильной схемой.

1 Ответов

Рейтинг:
1

pt1401

Ах да, есть два экземпляра ID=2.

Причина, по которой вы получаете все 5, заключается в том, что ID=2 не существует в временной таблице перед оператором insert (и помните, что у вас есть только один оператор insert, а не 4 или 5 отдельных).

Попробуйте запустить SELECT самостоятельно:-

SELECT  a.Id, a.NAME FROM TEST_DEL A 
WHERE NOT EXISTS(SELECT 1 FROM #TEMP B WHERE B.Id = A.Id)

Id          NAME
----------- ----------
1           A
2           B
2           C
3           D
4           E

(5 row(s) affected)


Вы можете думать о вставке как о двухступенчатой операции:-
1. Выберите все строки в TEST_DEL, которые не существуют во временной таблице.
2. вставьте эти строки в временную таблицу.