логика запроса sql — sql server 2008

#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)