2016-10-25 200 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

所以你會給出請求的值並依賴和消除匹配 –