我遇到从表中返回某些记录的问题 - 我不确定我期望的结果是否可以使用SQL。以下是我的问题描述。 下表包含Order和子订单。子订单和父订单通过父订单和订单类型列链接。
我的要求是 - 如果指定了父订单和订单类型所有记录(应返回父级及其子级) 如果指定了一个孩子 - 那么应该返回特定的孩子和父母。
表格和样本记录如下: 请指教或建议。
DROP TABLE [dbo].[TEMP_ORDER]
CREATE TABLE [dbo].[TEMP_ORDER](
[OrderNo] [nvarchar](40) NOT NULL,
[OrderType] [smallint] NOT NULL,
[ParentOrderNo] [nvarchar](40) NULL,
[ParentOrderType] [smallint] NULL
)
INSERT INTO [dbo].[TEMP_ORDER] VALUES ('ORD0001',1,NULL,NULL)
INSERT INTO [dbo].[TEMP_ORDER] VALUES ('ORD0001@001',101,'ORD0001',1)
INSERT INTO [dbo].[TEMP_ORDER] VALUES ('ORD0001@002',101,'ORD0001',1)
+-------------+-----------+---------------+-----------------+
| OrderNo | OrderType | ParentOrderNo | ParentOrderType |
+-------------+-----------+---------------+-----------------+
| ORD0001 | 1 | NULL | NULL |
| ORD0001@001 | 101 | ORD0001 | 1 |
| ORD0001@002 | 101 | ORD0001 | 1 |
| NULL | NULL | NULL | NULL |
+-------------+-----------+---------------+-----------------+
结果将是这样的 - 如果将OrderNo = ORD0001和Order Type = 1传递给查询 - 那么将返回所有3行。
如果将ORD0001 @ 001和101传递给查询 - 那么 将返回ORD0001 @ 001和ORD0001。
这是我的查询
select
TORD.OrderNo as WipOrderNo,
TORD.OrderType as WipOrderType,
TORD.ParentOrderNo as ParentWipOrderNo,
ChildORders.ParentOrderType as ParentWipOrderType
from
TEMP_ORDER TORD
outer apply
( select
ChildOrder.ParentOrderNo,
ChildOrder.ParentOrderType
from
TEMP_ORDER ChildOrder
where
ChildOrder.OrderNo = @ORderNo and
ChildOrder.ORderType = @OrderType
) ChildORders
where ((
(TORD.ParentOrderNo = @ORderNo and
TORD.ParentOrderType = @WipORderType)
or
(TORD.ParentOrderNo = ChildORders.ParentOrderNo and
TORD.ParentOrderType = ChildORders.ParentOrderType)
)
or (TORD.OrderNo = @ORderNo and TORD.OrderType = @OrderType))
答案 0 :(得分:0)
假设订单必须是父订单或子订单,则不需要递归,因此只需查询表两次。首先获取指定的订单,然后在适用的情况下获得父/子订单。
DECLARE @OrderNo [nvarchar](40) = 'ORD0001@001',
@OrderType [smallint] = 101
select
TORD.OrderNo as WipOrderNo,
TORD.OrderType as WipOrderType,
TORD.ParentOrderNo as ParentWipOrderNo,
TORD.ParentOrderType as ParentWipOrderType
into RESULT_ORDER
from
TEMP_ORDER TORD
where TORD.OrderNo = @ORderNo and TORD.OrderType = @OrderType;
insert RESULT_ORDER
select TORD.*
from
TEMP_ORDER TORD
where exists(
select *
from RESULT_ORDER r
where TORD.OrderNo = r.ParentWipOrderNo and TORD.OrderType = r.ParentWipOrderType
)
or exists(
select *
from RESULT_ORDER r
where TORD.ParentOrderNo = r.WipOrderNo and TORD.ParentOrderType = r.WipOrderType
);
select * from RESULT_ORDER;