2016-10-25 161 views
0

有没有办法检查输出中是否有循环?避免循环输出

实施例:

CREATE TABLE packages 
(
request varchar(10), 
depend varchar(10) 
); 

INSERT INTO packages 
(request, depend) 
VALUES 
('R001', 'R990'), 
('R001', 'R992'), 
('R002', 'R991'), 
('R002', 'R990'), 
('R990', 'R001'), 
('R010', 'R001'), 
('R215', 'R001'), 
('R990', 'R887'), 
('R990', 'R886'); 

SELECT 
    request, 
    depend 
FROM 
(
    SELECT request, depend FROM packages WHERE request = 'R001' 
    UNION ALL 
    SELECT request, depend FROM packages WHERE depend IN ('R001') 
) as Report 

http://rextester.com/XLP60912

的最终结果是:

 request  depend 
1 R001  R990 
2 R001  R992 
3 R990  R001 
4 R010  R001 
5 R215  R001 

线3是从第1行周期,因此第3行不应该在的结果。

预期的结果:

 request  depend 
1 R001  R990 
2 R001  R992 
3 R010  R001 
4 R215  R001 

感谢。

+0

可以 –

+0

你必须使用[递归查询(HTTPS添加预期的结果://technet.microsoft.com/en-us/library/ms186243(v = sql.105).aspx) –

+0

您是否只考虑大小为1的循环?或者可以是更大的周期? –

回答

0

如果你只是在寻找交换对(如在你的例子),那么这将工作:

select p.request, p.depend 
from packages p 
where p.request < p.depend or 
     not exists (select 1 
        from packages p2 
        where p2.request = p.depend and p2.depend = p.request 
       ); 
+0

嗨戈登。谢谢。我试过了,但我需要在查询中传递一个值,所以我正在寻找'R001'。试图改变:'where request ='R001'和(p.request Khrys

+0

加'WHERE p.request ='r001'或p.depend ='r001'' –

+0

谢谢,胡安。试过,但这是带来了没有'R001'的线。见:http://rextester.com/FSSQ41498 – Khrys

0
SELECT 
request, 
depend 
FROM 
Packages 
Where depend not in(select distinct    request from packages) 
+0

谢谢karan。试过这个,但我需要在查询中传递一个像'R001'这样的值。 – Khrys

+0

所以你会给出请求的值并依赖和消除匹配 –