【问题标题】:what is wrong with my sql query (case when exists)我的 sql 查询有什么问题(存在时的情况)
【发布时间】:2019-10-03 06:14:20
【问题描述】:

我试图了解case when exists 表达式的工作原理,有两张表,一张是trOrderHeader,它存储有关任何订单的主要信息。另一个是trOrderLine,它存储有关订单的详细信息,还有一个列IsClosed,表示订单以某种方式关闭(取消或完成)。

所以我的查询低于我正在尝试使用 IsClosed 列获取 OrderLineID(我可以通过连接来完成它很容易,但我正在尝试 case when exists 表达式)但所有 IsClosed 列都返回 1;

SELECT 
    OrderLineId,
    IsClosed = 
        CASE 
        WHEN EXISTS (select * from trOrderHeader  where IsClosed=1)
        THEN    1 
        WHEN EXISTS (select * from trOrderHeader  where IsClosed=0)
        THEN   0
        END
FROM 
    trOrderLine
GROUP BY OrderLineId

如果订单已关闭写入 1,如果订单未关闭写入 0,这不是应该给我吗?

我是不是误解了case when exists 的表达方式?

【问题讨论】:

    标签: sql tsql case-when


    【解决方案1】:

    您需要关联子查询。假设列OrderId可以用来关联表,那么:

    SELECT 
        OrderLineId,
        IsClosed = 
            CASE 
            WHEN EXISTS (select 1 from trOrderHeader h where h.IsClosed = 1 AND h.OrderId = l.OrderId)
            THEN    1 
            WHEN EXISTS (select 1 from trOrderHeader h where IsClosed = 0 AND h.OrderId = l.OrderId)
            THEN   0
            END
    FROM trOrderLine l
    GROUP BY OrderLineId
    

    但是,查询的逻辑可以通过使用JOIN 和聚合函数来计算状态来简化。你可能需要这样的东西:

    SELECT l.OrderLineId, MAX(h.isClosed) IsClosed
    FROM trOrderLine l
    INNER JOIN trOrderHeader h ON h.OrderId = l.OrderId
    GROUP BY l.OrderLineId
    

    【讨论】:

      猜你喜欢
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多