问题 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
        )

有什么想法吗?


7874
2017-08-04 15:20


起源



答案:


使用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 
    )

15
2017-08-04 15:26



那么在开头使用IF NOT EXISTS,或在WHERE子句中使用WHERE NOT EXISTS?你能提供语法吗?非常感谢。 - Kyle
奇迹般有效。 - Kyle


答案:


使用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 
    )

15
2017-08-04 15:26



那么在开头使用IF NOT EXISTS,或在WHERE子句中使用WHERE NOT EXISTS?你能提供语法吗?非常感谢。 - Kyle
奇迹般有效。 - Kyle


也可以使用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 

0
2017-12-19 23:16