【问题标题】:SQL - Find Master Records That Do NOT share a value with Detail RecordsSQL - 查找不与详细记录共享值的主记录
【发布时间】:2021-11-29 22:28:49
【问题描述】:

可能有人问过这个问题,但我不知道在摘要中如何表达,所以我可能错过了。

我的情况:

我有一份主记录(简体):

   ServiceOrder
     ID         - String (15)
     Status     - String (1)

每个Master都有详细记录

SODetail
 ID           - String (15)
 LineNbr      - int 
 Status       - String (CP)

SODetail 和 Master 加入 ON 列 ID

当值为“C”时,Master 中的状态为关闭

当有“CP”的值时,SODetail中的状态是关闭的

我需要一个 SQL 命令来查找所有主记录,其值不是“C”,但其所有 SODetail 记录的状态为“CP”

换句话说,当某些服务订单的所有详细记录都设置为关闭时,它没有设置为关闭。我需要找到它们,以便我们修复它们。

我知道有一个命令可以给我这个,但不知何故它让我不知道。

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

这里的诀窍是向后工作。

第一个任务是确定哪些 ID 的所有状态都是 CP

SELECT  ID
FROM    SODetail
GROUP BY ID
HAVING  COUNT(*) = SUM(CASE WHEN Status = 'CP' THEN 1 ELSE 0 END)

以上是仅以“CP”作为其状态的 ID 列表。它通过计算明细记录的数量,并计算以“CP”为状态的明细记录的数量,并返回这些计数相同的 ID。

拥有上面的相关 ID,您可以轻松地将其加入您的主记录并按主记录的状态进行过滤。

SELECT  SO.ID
FROM    ServiceOrder AS SO
        INNER JOIN 
            (SELECT   ID
              FROM    SODetail
              GROUP BY ID
              HAVING  COUNT(*) = SUM(CASE WHEN Status = 'CP' THEN 1 ELSE 0 END)
            ) AS SOD ON SO.ID = SOD.ID
WHERE   SO.Status <> 'C'

编辑:更多解释和一些澄清

【讨论】:

  • 谢谢!这正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2012-07-02
  • 2011-03-03
  • 2021-05-09
  • 1970-01-01
相关资源
最近更新 更多