Подтвердить что ты не робот

T-sql NOT IN с несколькими столбцами

У меня есть база данных Microsoft SQL, где я пытаюсь вставить некоторые данные. У меня есть уникальный ключ в 4 столбцах, и я хочу вставить данные из нескольких таблиц в эту таблицу, проверяя данные, чтобы убедиться, что они не будут нарушать уникальность ключа. Если бы я делал это в одном столбце, я бы сделал NOT IN, например...

INSERT TABLE_A (FLD_1)
    SELECT FLD_1
        FROM TBL_B
        INNER JOIN TBL_C
            ON TBL_B.FLD_1 = TBL_C.FLD_1
    WHERE TBL_B.FLD_1 NOT IN
        (
        SELECT TBL_A.FLD_1 FROM TBL_A
        )

Любые мысли?

4b9b3361

Ответ 1

Используйте NOT EXISTS вместо этого, поскольку вам приходится иметь дело с несколькими столбцами.

http://www.techonthenet.com/sql/exists.php

ИЗМЕНИТЬ:

Неподтверждено, но грубо оно будет следующим:

SELECT FLD_1
FROM TBL_B
INNER JOIN TBL_C  ON TBL_B.FLD_1 = TBL_C.FLD_1
WHERE NOT EXISTS 
    (
    SELECT TBL_A.FLD_1 FROM TBL_A INNER JOIN TBL_B ON TBL_B.FLD1 = TBL_A.FLD1
    )

Для проверки нескольких столбцов это будет примерно следующее:

SELECT FLD_1, FLD_2, FLD_3, FLD_4)
FROM TBL_B
INNER JOIN TBL_C  ON TBL_B.FLD_1 = TBL_C.FLD_1
WHERE NOT EXISTS 
    (
    SELECT TBL_A.FLD_1, TBL_A.FLD_2, TBL_A.FLD_3, TBL_A.FLD_4 
    FROM TBL_A 
    INNER JOIN TBL_B ON TBL_B.FLD1 = TBL_A.FLD1 AND 
                        TBL_B.FLD2 = TBL_A.FLD2 AND 
                        TBL_B.FLD3 = TBL_A.FLD3 AND 
                        TBL_B.FLD4 = TBL_A.FLD4 
    )

Ответ 2

Также может использоваться ключевое слово EXCEPT.

SELECT FLD_1, FLD_2, FLD_3, FLD_4)
FROM TBL_B
INNER JOIN TBL_C  ON TBL_B.FLD_1 = TBL_C.FLD_1

EXCEPT

SELECT TBL_A.FLD_1, TBL_A.FLD_2, TBL_A.FLD_3, TBL_A.FLD_4 
FROM TBL_A 
INNER JOIN TBL_B ON TBL_B.FLD1 = TBL_A.FLD1 AND 
                    TBL_B.FLD2 = TBL_A.FLD2 AND 
                    TBL_B.FLD3 = TBL_A.FLD3 AND 
                    TBL_B.FLD4 = TBL_A.FLD4