我对 SQL 非常陌生。我想知道当我使用“IF EXISTS”或“IF NOT EXISTS”时会发生什么。 例如:以下两个语句有什么区别:
语句 1:(存在)
IF EXISTS( SELECT ORDER_ID FROM DBO.ORDER_DETAILS WHERE ORDER_ID = 11032 )
BEGIN
DELETE FROM DBO.ORDER_DETAILS WHERE ORDER_ID = 11032
END
语句 2:(不存在)
IF NOT EXISTS( SELECT ORDER_ID FROM DBO.ORDER_DETAILS WHERE ORDER_ID = 11032 )
BEGIN
DELETE FROM DBO.ORDER_DETAILS WHERE ORDER_ID = 11032
END
IF EXISTS
或 IF NOT EXISTS
将返回什么?
这两者哪个更好?
何时使用 IF EXISTS
以及何时使用 IF NOT EXISTS
最佳答案
这里有 4 个示例,说明何时使用 IF EXISTS 以及何时使用 IF NOT EXISTS:
A) 从多个表中删除相关记录:
IF EXISTS (SELECT TOP(1) 1 FROM Table1 WHERE ORDER_ID = 11032) BEGIN
DELETE FROM Table1 WHERE ORDER_ID = 11032
DELETE FROM Table2 WHERE ORDER_ID = 11032
-- possibly more statements following here ...
END
B) 更新多个表中的记录(如果存在):
IF EXISTS (SELECT TOP(1) 1 FROM Table1 WHERE ORDER_ID = 11032) BEGIN
UPDATE Table1 SET Field1='X' WHERE ORDER_ID = 11032
UPDATE Table2 SET Field2='Y' WHERE ORDER_ID = 11032
-- possibly more statements following here ...
END
C) 在多个表中插入记录(如果不存在):
IF NOT EXISTS (SELECT TOP(1) 1 FROM Table1 WHERE ORDER_ID = 11032) BEGIN
INSERT INTO Table1(Field1, Field2, ORDER_ID) VALUES ('A', 'B', 11032)
INSERT INTO Table2(Field3, Field4, ORDER_ID) VALUES ('X', 'Y', 11032)
-- possibly more statements following here ...
END
D)更新插入(=插入或更新)记录,取决于是否存在:
IF EXISTS (SELECT TOP(1) 1 FROM Table1 WHERE ORDER_ID = 11032) BEGIN
UPDATE Table1 SET Field1='X' WHERE ORDER_ID = 11032
-- possibly more statements following here ...
END
ELSE BEGIN
INSERT INTO Table1(Field1, Field2, ORDER_ID) VALUES ('X', 'B', 11032)
-- possibly more statements following here ...
END
除了上面的语句(情况D),您还可以使用新的MERGE statement ,但我觉得使用起来有点复杂。
注释:
- 如果只有一个表受到影响,则在上面的任何示例中都不会使用 EXIST,但更新插入示例 D) 中除外。
- SELECT TOP (1) 1 FROM ... 更高效,因为它在找到第一个匹配项后中止,然后仅返回数字 1(这比选择 NVARCHAR(max) 字段更高效)
- 您可以看到,仅在示例 C) 中您被迫使用
IF NOT EXISTS(...)
,所有其他示例都使用IF EXISTS(...)
哪个更有效率。
关于sql - SQL中 "IF EXISTS"和 "IF NOT EXISTS"之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4429741/