2010-06-28 46 views
0

這是使用SQL Server 2008多部分IDENTIFER無法綁定,相關子查詢

我基本存儲ID列表中的XML列在一個表中一個人爲的例子: 溫度(BIGINT ID,XML ids)

我想將表本身加入到xml節點。

到目前爲止,我有:

select * from temp x 
join (
    select x.id 
    , ids.id.value('@value', 'bigint') zid 
    from temp t cross apply ids.nodes('/ids/id') as ids(id) 
) z on x.id=z.id 

我得到:多部分組成的標識符「x.id」無法綁定。

這看起來像一個正常的相關子查詢給我。我錯過了什麼?

-----更新:

對於臨時表下面的示例數據:

id ids 
-- --- 
1 <ids><id value="11" /><id value="12" /><id value="13" /></ids> 
2 <ids><id value="21" /><id value="22" /><id value="23" /></ids> 
3 <ids><id value="31" /><id value="32" /><id value="33" /></ids> 

我希望看到下面的結果集:

id zid 
-- --- 
1 11 
1 12 
1 13 
2 21 
2 22 
2 23 
3 31 
3 32 
3 33 
+0

目前尚不清楚您在此嘗試實現的目標。您能否請張貼一些樣本數據和期望的輸出? – Quassnoi 2010-06-28 13:26:57

回答

1

它是派生表而不是相關子查詢。請注意,這也不起作用。

WITH TEMP AS 
(
SELECT 1 AS id 
) 

select x.id 
from temp x 
join (
select x.id,* from temp t 
) z 
on x.id = z.id 

從MSDN derived_table

是從 數據庫中檢索行的子查詢。 derived_table用作輸入到外部查詢的 。

,所以這是一個correlated sub query完全不同的地方

子查詢依賴於外部 查詢自己的價值觀。這意味着 子查詢被重複執行, 對於每個行可能是 由外部查詢選擇一次。

爲了獲得您的預期輸出,您根本不需要JOIN。

WITH TEMP AS 
(
select 1 as id, CAST('<ids><id value="11" /><id value="12" /><id value="13" /></ids>' as xml) as ids UNION ALL 
select 2, '<ids><id value="21" /><id value="22" /><id value="23" /></ids>' UNION ALL 
select 3, '<ids><id value="31" /><id value="32" /><id value="33" /></ids>' 

) 

select 
t.id, 
ids.id.value('@value', 'bigint') zid 
from temp t cross apply ids.nodes('/ids/id') as ids(id) 

如果你確實決定使用一個,那麼despart的答案是正確的。

select x.id, zid from temp x 
join (
    select 
    t.id, 
    ids.id.value('@value', 'bigint') zid 
    from temp t cross apply ids.nodes('/ids/id') as ids(id) 
) z on x.id=z.id 
+0

據我所知,它是一個相關的子查詢,因爲它依賴於它的值的外部查詢。我將表'temp'視爲'x'並在連接中使用它。 – enashnash 2010-06-28 14:02:19

+0

@enashnash如果該語法是有效的,它將是一個相關的子查詢。但事實並非如此。您需要將它看作是首先物化完整的z然後加入到外部查詢中。 (儘管可能會比這更有效)。或者將派生表視爲內聯視圖,如果它有幫助的話。 – 2010-06-28 14:13:29

+0

如果可以在不引用外部查詢的情況下創建整個'z',那麼它將不相關,它只是一個簡單的子查詢,不是?或者我的術語混亂了?或者,如果只是我的語法不正確,它應該是什麼? 我更新了樣本數據和預期輸出的問題。鑑於這些信息,你能否提出一個可以產生預期結果的查詢? – enashnash 2010-06-28 14:16:33

0

你在子查詢中選擇x.id,也許你應該選擇t.id?

+0

謝謝,但沒有,這是打算。 – enashnash 2010-06-28 14:17:12

+0

好吧,所以我打算這樣做,但它是錯誤的:)我已經將答案授予Martin,因爲他向我提供了一個更完整的答案,並提出了一個更好的方法來啓動,但感謝您的幫助。 – enashnash 2010-06-28 14:38:28

相關問題