我正在嘗試使用以下查詢解決父子關系的 SQL查詢:
with [CTE] as (
select [ParentId]
, [NodeId]
from [TheTable] c where c.[ParentId] = 1
union all
select [ParentId]
, [NodeId]
from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId]
)
select * from [CTE]
錯誤:
無法系結多部分識別符號“p.[NodeId]”
使用 UNION、INTERSECT 或 EXCEPT 運算子組合的所有查詢必須在其目標串列中具有相同數量的運算式。
不知道下一步該怎么做。
我希望它能夠回傳父類別的所有級別的子項。
例如,對于 nodeId = 1,它應該回傳 3、4、5、6。
uj5u.com熱心網友回復:
問題來自兩個表中出現的多個具有相同名稱的列。
您的表格和 CTE 都包含[ParentId]and [NodeId]。所以當這個陳述句被執行時:
select [ParentId], [NodeId] from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId]
from包含[CTE]and[TheTable]和 SQL 無法決議它應該從SELECT哪個表中提取這些列。提供的鏈接(復制和粘貼,鏈接本身指向 stackoverflow.com)在 中使用 *SELECT來提供所有列,而不用擔心它們來自哪個表。
切換到SELECT *樣式,或通過表別名正確訪問表,即:
select c.[ParentId], c.[NodeId] from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId]
添加/洗掉您想要的特定 table.column UNION。
@Larnu 也正確指出,JOIN這里不是最佳的。
嘗試:
select [ParentId], [NodeId] from [CTE] p INNER JOIN [TheTable] c ON c.[ParentId] = p.[NodeId]
我編輯這個是因為與@Delta32000 的討論,最好明確地說INNER JOIN,而不是JOIN即使它們在 T-SQL 中功能相同。感謝您的澄清!
uj5u.com熱心網友回復:
兩者都有,[ParentId]所以當你寫的時候[NodeId][CTE][TheTable]
select [ParentId]
, [NodeId]
from [CTE] p, [TheTable] c where c.[ParentId] = p.[NodeId]
SQL Server 不知道代表什么(p[ParentId]或[NodeId]c)
你最好寫
WITH CTE AS (
SELECT
TheTable.ParentId,
TheTable.NodeId
FROM TheTable WHERE TheTable.ParentId = 1
UNION ALL
SELECT
TheTable.ParentId,
CTE.NodeId
FROM CTE
INNER JOIN TheTable ON TheTable.ParentId = CTE.NodeId
)
SELECT * FROM CTE
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/524330.html
標籤:sqlsql服务器
下一篇:如何解決將資料型別varchar轉換為bigint時出錯。查詢是從Table1中選擇ID,其中'0123456789'like'%' ID '%
