我的 sql 查询有什么问题(存在时的情况)
what is wrong with my sql query (case when exists)
我试图了解 case when exists
表达式的工作原理,有两个表,一个是 trOrderHeader
,它存储有关任何订单的主要信息。另一个是 trOrderLine
,它存储有关订单的详细信息,并且有一列 IsClosed
指示订单以某种方式关闭(取消或完成)。
所以我的查询在下面,我试图用 IsClosed 列获取 OrderLineID(我可以通过连接来做到这一点很容易,但我正在尝试 case when exists
表达式)但是所有 IsClosed 列 returns 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
和聚合函数来计算状态来简化。您可能需要这样的东西:
SELECT l.OrderLineId, MAX(h.isClosed) IsClosed
FROM trOrderLine l
INNER JOIN trOrderHeader h ON h.OrderId = l.OrderId
GROUP BY l.OrderLineId
我试图了解 case when exists
表达式的工作原理,有两个表,一个是 trOrderHeader
,它存储有关任何订单的主要信息。另一个是 trOrderLine
,它存储有关订单的详细信息,并且有一列 IsClosed
指示订单以某种方式关闭(取消或完成)。
所以我的查询在下面,我试图用 IsClosed 列获取 OrderLineID(我可以通过连接来做到这一点很容易,但我正在尝试 case when exists
表达式)但是所有 IsClosed 列 returns 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
和聚合函数来计算状态来简化。您可能需要这样的东西:
SELECT l.OrderLineId, MAX(h.isClosed) IsClosed
FROM trOrderLine l
INNER JOIN trOrderHeader h ON h.OrderId = l.OrderId
GROUP BY l.OrderLineId