sql - SQL中 "IF EXISTS"和 "IF NOT EXISTS"之间的区别?

标签 sql sql-server

我对 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 EXISTSIF 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/

相关文章:

SQL GROUP BY 子查询

sql - 连接字符串

mysql - 获取每个人每天的最短日期时间的记录

mysql - sql查询在2个表之间执行划分并将结果插入第三个表

sql-server - SQL Server 2008安装错误消息: Unable to open windows installer file

sql - 如何在 SQL Server 上对提交进行分页

sql-server - 存储过程返回一行、记录集或输出参数?

sql - 使用分组依据计算表中多个字段的唯一组合,仅返回汇总行

sql - Oracle SQL 创建或替换带/不带列名的 View

asp.net - 如何处理连接到多个 SQL Server 数据库的 Web 应用程序?