我一直在網上搜索 SQL 相關問題的答案。我希望任何人都可以幫助我。
表格1
| 物品 |
|---|
| ABC4 |
表 2
| 上一項 | 新物品 |
|---|---|
| ABC1 | ABC2 |
| ABC1 | ABC3 |
| ABC2 | ABC3 |
| ABC3 | ABC4 |
我想將表1(專案)加入表2(新專案)并獲取所有以前的專案(從ABC4回到ABC1。資料中可以組合。有時一個專案只能從4回溯到1,有時直接。理論上這可能會無限大。所以我正在尋找一種如何在連接中進行回圈的情況。
我現在的查詢是:
SELECT
T1.Item,
T3.Previous-Item
FROM Table1 T1 (NOLOCK)
LEFT JOIN Table2 T2 (NOLOCK) ON T1.Item = T2.Previous-Item
LEFT LOOP JOIN Table2 T3(NOLOCK) ON T2.Item = T3.Previous-Item
更新:
預期的結果是:
| 物品 | 上一項 |
|---|---|
| ABC4 | ABC3 |
| ABC4 | ABC2 |
| ABC4 | ABC1 |
uj5u.com熱心網友回復:
一個遞回CTE可以做你的LOOP JOIN計劃:
CREATE TABLE Table1 ( item varchar(20) )
CREATE TABLE Table2 ( previous_item varchar(20), new_item varchar(20) )
INSERT INTO Table1 (item)
values ('ABC4')
INSERT INTO Table2 (previous_item, new_item)
values ('ABC1', 'ABC2'),
('ABC1', 'ABC3'),
('ABC2', 'ABC3'),
('ABC3', 'ABC4')
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
WITH resursive_cte as (
select item, item as previous_item, cast(null as varchar(20)) as new_item
from Table1 -- Anchor (initial records)
union all
select recursive_cte.item, Table2.previous_item, Table2.new_item
from resursive_cte -- Recursive records
inner join Table2 on Table2.new_item = recursive_cte.previous_item
)
select distinct item, previous_item
from resursive_cte
where new_item is not null
你可以看到它在這里作業:db<>fiddle
PS:我已經包含了一個SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;命令,正如 Larnu 所推薦的那樣,所以如果你想獲得臟讀,你不需要在每個表上手動使用 NOLOCK 提示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/350609.html
標籤:sql sql-server
