需要SQL Server查询建议

时间:2018-04-24 00:22:55

标签: sql-server

我遇到从表中返回某些记录的问题 - 我不确定我期望的结果是否可以使用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))

1 个答案:

答案 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;