Sql server 需要SQL Server查询建议
我在从表返回某些记录时遇到问题-我不确定使用SQL是否可以得到我期望的结果。下面是我的问题描述。 下表包含订单和子订单。子订单和父订单通过“父订单”和“订单类型”列链接 我的要求是-如果指定了父订单和订单类型,则所有记录(应返回父订单及其子订单) 如果指定了一个子级,则应返回特定的子级和父级 下表和样本记录如下所示: 请提出建议或建议Sql server 需要SQL Server查询建议,sql-server,Sql Server,我在从表返回某些记录时遇到问题-我不确定使用SQL是否可以得到我期望的结果。下面是我的问题描述。 下表包含订单和子订单。子订单和父订单通过“父订单”和“订单类型”列链接 我的要求是-如果指定了父订单和订单类型,则所有记录(应返回父订单及其子订单) 如果指定了一个子级,则应返回特定的子级和父级 下表和样本记录如下所示: 请提出建议或建议 DROP TABLE [dbo].[TEMP_ORDER] CREATE TABLE [dbo].[TEMP_ORDER]( [OrderNo] [nvarch
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@001101传递给查询-然后
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))
假设订单必须是父级或子级,则不需要递归,因此只需查询表两次。首先获取指定订单,然后在适用的情况下获取父/子订单
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;
请使用样本数据包括预期结果。