【问题标题】:SQL: What is 'WHERE NOT EXISTS' actually checking?SQL:实际检查的“WHERE NOT EXISTS”是什么?
【发布时间】:2017-03-01 03:18:52
【问题描述】:

东一个SQLINSERT INTO ... SELECT FROM ... WHERE NOT EXISTS

该子句实际检查的是什么?我希望将 col1 的结果从一个表插入到另一个表的“col1”中,它还没有在那个表中(即 col1 是主键)

INSERT INTO <table> (<col1>)
SELECT DISTINCT N.<col1>
FROM N
WHERE NOT EXISTS (
    SELECT 1
    FROM <table> C
    WHERE
        N.<col1> = C.<col1> 
)

在我看来,NOT EXISTS 子句中的 SELECT 语句将返回一行(或多于一行),并且 NOT EXISTS 将查找 0 行或多于零行。

对吗?

【问题讨论】:

  • 它不查找 0 行。它查找任何行。如果存在任何行,则 EXISTS 评估为真。同样,如果不存在任何行,则 NOT EXISTS 评估为真。

标签: sql-server not-exists


【解决方案1】:

Where not exists 是不言自明的,只会在目标表中不存在 if 值的地方插入行。

然而,这是一个相当混乱的语法,当我需要做任何类似的操作时,我会尝试使用MERGE

【讨论】:

    【解决方案2】:

    此外,Not Exist 子句可用于根据您在支持查询中定义的内容,在 WHERE 子句中选择或更新 EXCLUDE 记录。

    在您的情况下,MERGE 更好,但在某些情况下,例如下面的示例,它也很有用:

    If Not Exists ( Select 1 From dbo.Activities Where ActivityId = 107 AND Activity = 'Facility Updated' )
      Begin
        Insert Into Activities (ActivityId, Activity, CreateDt_GMT, CreatedBy, TimeZoneOffsetMins, ActionTypeId, IsTracked, IgnoreChildren, ProcessExtraInfomation, IgnoreNotChangedData, ApplicationID)
        Values(107, 'Blah', GetDate(), 'SYSTEM', -300, 3, 1, 0, 1, 1, 1 )
      End
    

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 2019-03-01
      相关资源
      最近更新 更多