Sql “理解”;“不存在”;条款

Sql “理解”;“不存在”;条款,sql,sql-server,Sql,Sql Server,我很难理解SQL语句(SQL Server方言),如下所示: select id, book, '11W', -- acnt type '000', -- prod code '0' -- acnt category from XYZ_TABLE x where NOT EXISTS (select 1 from XYZ_TABLE where [acnt type] = '11w' and [prod code] = '000' and [acnt categor

我很难理解SQL语句(SQL Server方言),如下所示:

select 
  id, 
  book, 
  '11W', -- acnt type
  '000', -- prod code
  '0'   -- acnt category
from XYZ_TABLE x
where NOT EXISTS (select 1 from XYZ_TABLE where [acnt type] = '11w' and [prod code] = '000' and [acnt category] = '0' and id = x.id and book = x.book)
我在这个论坛上查看了
NOT EXISTS
Select 1…
的语义,并有了一些想法,但我在这里仍在努力理解上面试图实现的目标,最令人费解的是,所有比较中只涉及一个表

顺便说一句,我没有运行SQL语句的权限,因此所有操作都是猜测操作。

提供了非常容易理解的解释:

“不存在”与“存在”相反。NOT中的WHERE子句 如果子查询未返回任何行,则满足EXISTS。这个 以下示例查找DimCustomer表中 LastName和BirthDate与列表中的任何条目都不匹配 潜在买家表。SQL

这是您的查询(我已将限定列名添加到所有列):

子查询是一个相关子查询。我马上就谈
存在
不存在
如果子查询返回任何行,则返回“true”。这些运算符不关心行的内容,
1
易于键入

这是干什么的?以下是概念性描述。它正在遍历XYZ_表中的所有行

对于每一行,子查询将查找具有以下特征的匹配行:

  • 与外部查询中的行相同的
    id
    book
    值。这是我移动到
    WHERE
    中第一个比较的correlation子句
  • 中指定的帐户、产品和类别,其中
当没有匹配项时,外部查询中的行对于结果集是“接受”的,因此它是输出的。也就是说,
id
/
book
结果集中没有匹配三列的对

这有用吗?对这样的查询通常是插入缺少的行的
insert
语句的一部分,其中缺少id/book和其他三列的组合


这是正确的吗?可能不会。根据此处的逻辑,
XYZ_表
可以清楚地包含
id
/
book
的副本。结果集也可能有重复项。这通常是不可取的。

您可以在上运行SQL语句。很难知道如何回答您的问题,
不存在
的确切意思是,子查询中的记录不存在。子查询中的记录将与主查询中的列匹配(或不匹配)——在本例中为
x.
。你的例子本身没有意义,这可能就是你感到困惑的原因。但是一个快速的谷歌会发现你的数百个例子。如果你不明白这个查询是为了达到什么目的而写的,那就问问写它的人。然后询问那个人不为每个表定义别名,也不为每个列引用使用别名的坏习惯。谢谢。但是您的SQL涉及两个不同的表:DimCustomer和ProspectiveBuyer,当涉及两个表时,逻辑很容易理解。我最初的SQL只涉及一个表,这使得逻辑有点复杂。
SELECT a.LastName, a.BirthDate  
FROM DimCustomer AS a  
WHERE NOT EXISTS  
(SELECT *   
    FROM dbo.ProspectiveBuyer AS b  
    WHERE (a.LastName = b.LastName) AND (a.BirthDate = b.BirthDate)) ;  
select x.id, x.book, '11W' as acnt_type '000' as prod_code, '0' acnt_category
from XYZ_TABLE x
where not exists (select 1
                  from XYZ_TABLE x2
                  where x2.id = x.id and x2.book = x.book and
                        x2.[acnt type] = '11w' and
                        x2.[prod code] = '000' and
                        x2.[acnt category] = '0'
                 );