Sql server 需要SQL Server查询建议

Sql server 需要SQL Server查询建议,sql-server,Sql Server,我在从表返回某些记录时遇到问题-我不确定使用SQL是否可以得到我期望的结果。下面是我的问题描述。 下表包含订单和子订单。子订单和父订单通过“父订单”和“订单类型”列链接 我的要求是-如果指定了父订单和订单类型,则所有记录(应返回父订单及其子订单) 如果指定了一个子级,则应返回特定的子级和父级 下表和样本记录如下所示: 请提出建议或建议 DROP TABLE [dbo].[TEMP_ORDER] CREATE TABLE [dbo].[TEMP_ORDER]( [OrderNo] [nvarch

我在从表返回某些记录时遇到问题-我不确定使用SQL是否可以得到我期望的结果。下面是我的问题描述。 下表包含订单和子订单。子订单和父订单通过“父订单”和“订单类型”列链接

我的要求是-如果指定了父订单和订单类型,则所有记录(应返回父订单及其子订单) 如果指定了一个子级,则应返回特定的子级和父级

下表和样本记录如下所示: 请提出建议或建议

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;

请使用样本数据包括预期结果。