求一条SQL语句

liushiying18 2017-03-17 10:27:33
表A

OrdersID Discharge
201703-0001 NULL
201703-0002 NULL
201703-0003 NULL
201703-0004 201703-0001
201703-0005 201703-0002
201703-0006 201703-0001
201703-0007 201703-0002


想根据OrdersID=‘201703-0001’条件得到下面结果
201703-0001
201703-0004
201703-0006

OrdersID=‘201703-0004’
201703-0001
201703-0004
201703-0006

OrdersID=‘201703-0006’
201703-0001
201703-0004
201703-0006




...全文
460 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2017-03-17
  • 打赏
  • 举报
回复
引用 4 楼 liushiying18 的回复:
这样不行啊OrdersID]='201703-0001'可以,但是当OrdersID]=N'201703-0004'时候查询结果不对
双向递归,这样用 看看效果是否正确 e.g.
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
declare @T table([OrdersID] nvarchar(31),[Discharge] nvarchar(31))
Insert @T
select N'201703-0001',null union all
select N'201703-0002',null union all
select N'201703-0003',null union all
select N'201703-0004',N'201703-0001' union all
select N'201703-0005',N'201703-0002' union all
select N'201703-0006',N'201703-0001' union all
select N'201703-0007',N'201703-0002'
;WITH Cte
AS
(
Select *,Type=0 from @T AS t WHERE EXISTS(SELECT 1 FROM @T WHERE  [OrdersID]=N'201703-0004' AND ([Discharge]=t.[Discharge] OR [OrdersID]=t.[OrdersID]))
UNION ALL
SELECT a.*,Type=1 FROM @T AS a INNER JOIN Cte AS c ON c.[OrdersID]=a.[Discharge] AND c.Type IN(0,1)
UNION ALL
SELECT a.*,Type=2 FROM @T AS a INNER JOIN Cte AS c ON a.[OrdersID]=c.[Discharge] AND c.Type IN(0,2)
)
SELECT DISTINCT Cte.OrdersID FROM Cte ORDER BY 1
/*
OrdersID
201703-0001
201703-0004
201703-0006
*/
顾西昂 2017-03-17
  • 打赏
  • 举报
回复

select distinct a.ordersid from A full outer join A b on A.ordersID=b.discharge and A.ordersID=b.Discharge where a.ordersid=@id or d.ordersid=@id
liushiying18 2017-03-17
  • 打赏
  • 举报
回复
引用 2 楼 roy_88 的回复:
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
declare @T table([OrdersID] nvarchar(31),[Discharge] nvarchar(31))
Insert @T
select N'201703-0001',null union all
select N'201703-0002',null union all
select N'201703-0003',null union all
select N'201703-0004',N'201703-0001' union all
select N'201703-0005',N'201703-0002' union all
select N'201703-0006',N'201703-0001' union all
select N'201703-0007',N'201703-0002'

;WITH Cte
AS
(
Select * from @T WHERE [OrdersID]=N'201703-0001'
UNION ALL
SELECT a.* FROM @T AS a INNER JOIN Cte AS c ON c.[OrdersID]=a.[Discharge]
)
SELECT Cte.OrdersID FROM Cte
/*
OrdersID
201703-0001
201703-0004
201703-0006
*/
这样不行啊OrdersID]='201703-0001'可以,但是当OrdersID]=N'201703-0004'时候查询结果不对
liushiying18 2017-03-17
  • 打赏
  • 举报
回复

SELECT OrdersID FROM Tb_Orders WHERE OrdersID=(SELECT isnull(Discharge,OrdersID) FROM Tb_Orders WHERE OrdersID='201703-0001' )
UNION
SELECT OrdersID FROM Tb_Orders WHERE Discharge=(SELECT isnull(Discharge,OrdersID) FROM Tb_Orders WHERE OrdersID='201703-0001' )
我是这些写的
中国风 2017-03-17
  • 打赏
  • 举报
回复
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
declare @T table([OrdersID] nvarchar(31),[Discharge] nvarchar(31))
Insert @T
select N'201703-0001',null union all
select N'201703-0002',null union all
select N'201703-0003',null union all
select N'201703-0004',N'201703-0001' union all
select N'201703-0005',N'201703-0002' union all
select N'201703-0006',N'201703-0001' union all
select N'201703-0007',N'201703-0002'

;WITH Cte
AS
(
Select * from @T WHERE [OrdersID]=N'201703-0001'
UNION ALL
SELECT a.* FROM @T AS a INNER JOIN Cte AS c ON c.[OrdersID]=a.[Discharge]
)
SELECT Cte.OrdersID FROM Cte
/*
OrdersID
201703-0001
201703-0004
201703-0006
*/
卖水果的net 2017-03-17
  • 打赏
  • 举报
回复
这是什么规则?
唐诗三百首 2017-03-17
  • 打赏
  • 举报
回复

create table 表A(OrdersID varchar(20),Discharge varchar(20))

insert into 表A(OrdersID,Discharge)
 select '201703-0001', null union all
 select '201703-0002', null union all
 select '201703-0003', null union all
 select '201703-0004', '201703-0001' union all
 select '201703-0005', '201703-0002' union all
 select '201703-0006', '201703-0001' union all
 select '201703-0007', '201703-0002'


create proc getOrdersIDList
(@OrdersID varchar(20))
as
begin
 with t as
 (select OrdersID,Discharge,lv=0 from 表A where OrdersID=@OrdersID
  union all
  select b.OrdersID,b.Discharge,a.lv+1
   from t a
   inner join 表A b on a.Discharge=b.OrdersID
   where a.lv>=0
  union all
  select b.OrdersID,b.Discharge,a.lv-1
   from t a
   inner join 表A b on a.OrdersID=b.Discharge
   where a.lv<=0
 )
 select OrdersID from t
 union
 select a.OrdersID
  from 表A a
  inner join t b on a.Discharge=b.Discharge
  where b.lv=0
end


-- 测试1
exec getOrdersIDList '201703-0001'

/*
OrdersID
--------------------
201703-0001
201703-0004
201703-0006

(3 row(s) affected)
*/


-- 测试2
exec getOrdersIDList '201703-0004'

/*
OrdersID
--------------------
201703-0001
201703-0004
201703-0006

(3 row(s) affected)
*/


-- 测试3
exec getOrdersIDList '201703-0006'

/*
OrdersID
--------------------
201703-0001
201703-0004
201703-0006

(3 row(s) affected)
*/

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧