Sql “理解”;“不存在”;条款
我很难理解SQL语句(SQL Server方言),如下所示: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
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
中第一个比较的correlation子句WHERE
中指定的帐户、产品和类别,其中
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'
);