Sql server 2008 r2 如何在查询中进行逻辑排除?

Sql server 2008 r2 如何在查询中进行逻辑排除?,sql-server-2008-r2,Sql Server 2008 R2,我在ERP数据库中有3个表,保存所有交货数据(表文档为每个交货通知单保存一行,documentpos保存交货通知单上的所有位置,documentserialnumber保存交货项目的所有序列号)。 我想显示所有项目及其序列号已交付给客户,但至今仍驻留在那里。 但是,上面显示的以下查询的输出显示,一个已交付的项目稍后返回(红色标记)。退货交货单的文件编号为527419(深红色标记),并参考黄色列出的交货单319821(绿色)。 正确的列表将仅显示仍在客户网站上但未返回项目的项目(见下文)。 如何更

我在ERP数据库中有3个表,保存所有交货数据(表文档为每个交货通知单保存一行,
documentpos
保存交货通知单上的所有位置,
documentserialnumber
保存交货项目的所有序列号)。 我想显示所有项目及其序列号已交付给客户,但至今仍驻留在那里。 但是,上面显示的以下查询的输出显示,一个已交付的项目稍后返回(红色标记)。退货交货单的文件编号为527419(深红色标记),并参考黄色列出的交货单319821(绿色)。 正确的列表将仅显示仍在客户网站上但未返回项目的项目(见下文)。 如何更改查询以从输出中排除返回的项目?

图中的上表显示了我的查询输出,下表显示了它应该是什么样子

select a.BelID, c.ReferenzBelID, a.itemnumber, a.itemname, c.deliverynotenumber,c.documenttype, c.documentmark, b.serialnumber
from dbo.documentpos a 
inner join dbo.documentserialnumbers b on a.BelPosID = b.BelPosID 
inner join dbo.documents c on a.BelID = c.BelID 
inner join sysdba.customers d on d.account = c.A0Name1
where  d.AccountID = 'customername' and c.documenttype like '%delivery%'  
order by a.BelID

您可以排除任何“退货”送货单引用的职位,如以下(已编辑)


是否只有一种方法可以排除行,即documenttype=“退货通知单”。欢迎使用stackoverflow。请花一分钟的时间,特别是。请阅读文章的前三段,并相应地阅读你的问题。我试过了,Dmitry,但添加这一行会消除所有BelID=319821的行。但仅应排除序列号为“xxxG900025”的送货单。找到一种排除具有多个序列号的行的方法不是更好吗?我试图创建一个临时表,然后添加一个查询,只显示那些只有一个序列号的行。但我无法在一个查询中找到正确的语法。添加代码后没有任何更改-结果与未添加的结果相同。对不起,我输入了一个错误。。。请再试一次,它现在应该可以工作了。现在,您的代码消除了带有退货通知单的行-完成了一半。但相应的已交付项目仍在列表中。我宁愿只显示只有一个序列号的行。所有具有多个序列号的行都包含已返回且不在客户站点上的项目。是的,干得好!我只添加了另一个连接以指向Serialnumber,而不是项目编号,只是为了避免错误地不同项目具有相同项目编号的情况:
select a.BelID, c.ReferenzBelID, a.itemnumber, a.itemname, c.deliverynotenumber,c.documenttype, c.documentmark, b.serialnumber
from dbo.documentpos a 
inner join dbo.documentserialnumbers b on a.BelPosID = b.BelPosID 
inner join dbo.documents c on a.BelID = c.BelID 
inner join sysdba.customers d on d.account = c.A0Name1
where  d.AccountID = 'customername' and c.documenttype like '%delivery%'
and not exists (select 1 
                from dbo.documents cc
                where cc.documenttype like '%delivery%' 
                and c.ReferenzBelID=cc.BelID
                and c.documentmark='VLR')
and not exists (select 1
                from dbo.documents ccc
                join dbo.documentpos aa on aa.BelID = ccc.BelID 
                where ccc.ReferenzBelID=c.BelID
                and ccc.documentmark='VLR'
                and a.itemnumber=aa.itemnumber)
order by a.BelID