SQL Server: несколько предложений WHERE NOT EXISTS - PullRequest
0 голосов
/ 18 декабря 2018

У меня около 2600 строк в запросе Load_Charges_IMPORT, которые не вставляются в запрос Load_Charges.

Я пытаюсь убедиться, что повторяющиеся записи первичного ключа не добавляются.Первичный ключ устанавливается в запросе Load_Charges как составной ключ (Описание начисления + Сумма начисления).В запросе Load_Charges_IMPORT не заданы ключи, и эти данные импортируются из документа Excel.

Можете ли вы сказать мне, если что-то не так с моим кодом и почему я получаю ответ 0 row(s) affected, когда я знаю, что в Load_Charges_IMPORT.

INSERT INTO Load_Charges
    SELECT *
    FROM Load_Charges_IMPORT
    WHERE 
        NOT EXISTS (SELECT [Load ID]
                    FROM Load_Charges
                    WHERE Load_Charges_IMPORT.[Load ID] = Load_Charges.[Load ID])
        AND NOT EXISTS (SELECT [Charge Description]
                        FROM Load_Charges
                        WHERE Load_Charges_IMPORT.[Charge Description] = Load_Charges.[Charge Description])
        AND NOT EXISTS (SELECT [Charged Amount] 
                        FROM Load_Charges
                        WHERE Load_Charges_IMPORT.[Charged Amount] = Load_Charges.[Charged Amount]);
есть 2600+ строк

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Еще один способ решения этой проблемы - использовать серию LEFT JOIN s с предложением WHERE, исключающим любые совпадающие записи.

Это более короткий синтаксис и позволяет избежать использования подзапроса.

INSERT INTO Load_Charges
SELECT imp.*
FROM 
    Load_Charges_IMPORT imp
    LEFT JOIN Load_Charges load1 ON load1.[Load ID] = imp.[Load ID]
    LEFT JOIN Load_Charges load2 ON load2.[Charge Description] = imp.[Charge Description]
    LEFT JOIN Load_Charges load3 ON load3.[Charged Amount]= imp.[Charged Amount]
WHERE load1.[Load ID] IS NULL AND load2.[Load ID] IS NULL AND load3.[Load ID] IS NULL
;

Примечание: предполагается, что [Load ID] является ненулевым полем в таблице Load_Charges.Если нет, в предложении WHERE может использоваться любое другое необнуляемое поле.

0 голосов
/ 18 декабря 2018

Ваше предложение EXISTS исключает все строки, в которых любое из условий имеет значение ИСТИНА, а не только строки, в которых все условия имеют значение ИСТИНА.Попробуйте это:

INSERT INTO Load_Charges

SELECT *

FROM Load_Charges_IMPORT

WHERE NOT EXISTS (
    SELECT * 
    FROM Load_Charges 
    WHERE Load_Charges_IMPORT.[Load ID]=Load_Charges.[Load ID]
    AND Load_Charges_IMPORT.[Charge Description]=Load_Charges.[Charge Description]
    AND Load_Charges_IMPORT.[Charged Amount]=Load_Charges.[Charged Amount]);
...