【问题标题】:SQL find all orders but delete cancellations related to upgrade ordersSQL查找所有订单但删除与升级订单相关的取消
【发布时间】:2013-10-17 13:07:00
【问题描述】:

目前确实是个难题,因为这是我尝试在 SQL 中做的事情,但我知道应该用另一种语言(例如 PHP)来做。

基本上我拥有的是一个包含订单号和与政策相关的产品代码的数据库。

对于某些订单有多个阶段,例如取消和升级(例如,当升级时,原来的政策被取消,然后为差价进行升级)

我想做的是运行一个查询,该查询将排除与升级订单相关的所有取消(在产品代码中指定为 UP),但保留与详细信息更改相关的所有取消(指定作为产品代码中的 CD)。

简而言之; 该查询将需要查找所有订单,包括取消订单,然后删除与 UP 具有相同订单号的任何取消订单。

我知道这基本上可以通过查找所有 UP 产品代码和相关订单号的“foreach”来完成,然后删除与该订单号相关的所有取消 - 但我不知道如何实现这一点在 SQL 中,无需临时创建多个表并在之后删除它们。

表结构如下:

| Order Number | Product Code | Transaction Value |
|    1         |    RRCN      |    -30            |
|    1         |    RRUP      |     12            |
|    2         |    SMFP      |     30            |
|    3         |    SMCN      |    -12            |
|    3         |    SMCD      |     12            |
|    4         |    HUCN      |    -30            |

所以我需要查询来显示所有表,但删除与 RRUP 相关的 RRCN。所以查询应该寻找 RRUP,看到它是订单 1,然后找到与订单 1 相关的 RRCN 并将其从结果中删除 - 请注意,结果不是原始表。

有什么想法吗?非常感激! (我正在运行 SQL Server 2008)

【问题讨论】:

  • 请显示表结构,最好带有一些虚拟数据和详细的预期输出、删除等
  • 感谢 T 我,我现在已经添加了这些......只是一些格式问题会尝试正确!

标签: sql sql-server foreach orders


【解决方案1】:

这个查询应该可以完成这项工作:

SELECT * FROM Q19427600
WHERE RIGHT(ProductCode,2) <> 'CN'
OR (RIGHT(ProductCode,2) = 'CN' AND 
    OrderNumber NOT IN (SELECT OrderNumber FROM Q19427600 WHERE RIGHT(ProductCode,2) = 'UP'));

返回结果:

OrderNumber ProductCode TransactionValue
1           RRUP        12
2           SMFP        30
3           SMCN        -12
3           SMCD        12
4           HUCN        -30

【讨论】:

  • 尚未测试,但我很确定逻辑上这是正确的!非常感谢.. 因为我的 ProductCodes 的实际布局是 RRCNLL(所以最后多了两个字母..)我把它改成了 RIGHT(ProductCode,4) = 'UP__' - 这有意义吗?
  • 发现这不起作用..现在更改为 MID(ProductCode,3,2) 并且可以工作!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2016-07-12
  • 1970-01-01
  • 2012-09-16
  • 2011-03-28
  • 1970-01-01
相关资源
最近更新 更多