繁体   English   中英

我的 sql 查询有什么问题(存在时的情况)

[英]what is wrong with my sql query (case when exists)

我试图了解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

您需要关联子查询。 假设列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和聚合 function 来计算状态来简化。 像这样的东西可能是你需要的:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM