#sql #sql-server
#sql #sql-сервер
Вопрос:
есть ли способ улучшить этот запрос..
INSERT INTO mastertable
VALUES (SELECT *
FROM staging_tbl s
WHERE s.pac NOT IN (SELECT pac
FROM mastertable)
AND s.store NOT IN (SELECT store
FROM mastertable))
Не уверен, что это сработает с самого начала.. В принципе..требуется выбирать записи из Staging_Tbl только в том случае, если такая же комбинация PAC-STORE в настоящее время не существует.. Если PAC существует, но для другого хранилища .. да, мы должны выбрать и наоборот.
Например: Должна ли MasterTable быть такой, как показано ниже,
PAC1 STORE1
PAC1 STORE2
PAC2 STORE1
PAC2 STORE2
Я должен вставлять, только если в промежуточной таблице есть запись типа PAC1 STORE3..
а НЕ PAC1 STORE2
Ответ №1:
Есть ли у вас индексы для этих столбцов..это внесет изменения
вы также можете использовать NOT EXISTS (НЕ СУЩЕСТВУЕТ)
INSERT INTO MASTERTABLE
SELECT * FROM Staging_Tbl S
WHERE NOT EXISTS ( SELECT 1 FROM MasterTable M
WHERE S.STORE = M.STORE
AND S.PAC = M.PAC)
Или ЛЕВОЕ СОЕДИНЕНИЕ
INSERT INTO MASTERTABLE
SELECT S.* FROM Staging_Tbl S
LEFT OUTER JOIN MasterTable M
ON S.STORE = M.STORE
AND S.PAC = M.PAC
WHERE M.PAC IS NULL
AND M.STORE IS NULL
Кроме того, обязательно протестируйте производительность с помощью этого
INSERT INTO MASTERTABLE
SELECT * FROM Staging_Tbl
EXCEPT
SELECT * FROM MASTERTABLE
Мне самому нравится, что лучшего НЕ СУЩЕСТВУЕТ
Смотрите также Выберите все строки из одной таблицы, которые не существуют в другой таблице, чтобы использовать ВНЕШНИЕ APPLY и EXCEPT для выполнения того же самого
Комментарии:
1. Версия с ЛЕВЫМ соединением нуждается в некотором исправлении. Вы хотите выбрать
S.*
вместо*
.2. Андрей, он говорит
only if same PAC-STORE combination do not currently exist.
3. Моя вина, вы правы. Я просто сравнил решения с запросом операционной системы. Сначала следовало более внимательно ознакомиться с деталями. Извините.
Ответ №2:
INSERT MASTERTABLE
SELECT * FROM Staging_Tbl S
WHERE NOT EXISTS
(SELECT 1 FROM MASTERTABLE M
WHERE M.PAC = S.PAC AND M.STORE = S.STORE)