首页 > 解决方案 > 使用相关筛选筛选 SQL Server 数据

问题描述

我创建了一个名为的表[Damaged Item],其中包含损坏的项目,它看起来像这样:

|  Item   |  Style    |  Date    |
+---------+-----------+----------+
|  A1     |    A      | 12/04/20 |
|         |    B      | 03/12/19 |

我有另一张桌子维护着[Purchased Items].

[已购买物品] 满足以下条件的物品会掉落。

  1. 如果项目包含在损坏项目表中并且损坏项目日期的日期大于当前日期。

  2. 如果 Damded Item 中的 item 字段为 NULL 或 '',那么我必须检查 Style 列。如果购买的物品的样式等于损坏的样式,那么如果损坏的物品日期大于当前日期,我也会删除这些值。

请注意,如果损坏的物品表中有物品,则购买的物品将与损坏的物品一起检查并检查日期,如果损坏的物品日期大于当前日期,我将丢弃该物品,否则如果没有物品,但只有Style 然后我检查 Style with Purchased Items' Style 并检查日期条件并删除记录。如果损坏的项目包含上述数据,那么我正在检查项目以及样式。

我像这样放了一个左连接。

[PurchasedItem] X 
LEFT JOIN [DamagedItem] D ON (X.ITNO = D.ITNO)
LEFT JOIN [DamagedItem] E ON (X.Style = E.Style)

此查询 ( X.ITNO = D.ITNO) 正在删除项目,但从第二次连接开始,它再次获取已删除的项目 (as D.ITNO AS NULL)。

有人可以帮我做到这一点吗?

标签: sqlsql-serverfiltering

解决方案


如果要过滤掉损坏的物品,可以使用not exists

selet pi.*
from PurchasedItem pi
where not exists (select 1
                  from DamagedItem di
                  where di.ITNO = pi.ITNO and di.date > getdate()
                 ) and
      not exists (select 1
                  from DamagedItem di
                  where di.ITNO is null and
                        di.style = pi.style and
                        di.date > getdate()
                 );

日期算术看起来很奇怪(未来的损害?),但这就是你所要求的。


推荐阅读