尝试在嵌套 CTE 的第二部分(WITH SELECT 语句)中使用多个联接时,出现以下错误:
无法绑定多部分标识符“ncpi.NodeID”。
我的示例代码如下:
WITH
ncp_ipbdn AS
(SELECT np.[NodeID],
np.City
FROM [SWO_CP].[dbo].[NodesCustomProperties] np
INNER JOIN (SELECT npipb.NodeID,
nripb.[VALUE]
FROM [SWO_CP].[dbo].[NodesCustomProperties] npipb,
[SWO_CP].[dbo].[NIP_Reference] nripb
INNER JOIN [SWO_CP].[dbo].[NodesData] ndipb ON NodeID = ndipb.NodeID) ipb ON np.NodeID = ipb.NodeID
INNER JOIN (SELECT npipd.NodeID,
nripd.[VALUE]
FROM [SWO_CP].[dbo].[NodesCustomProperties] npipd,
[SWO_CP].[dbo].[NIP_Reference] nripd
INNER JOIN [SWO_CP].[dbo].[NodesData] ndipd ON NodeID = ndipd.NodeID) ipd ON np.NodeID = ipd.NodeID
INNER JOIN (SELECT npipn.NodeID,
nripn.[VALUE]
FROM [SWO_CP].[dbo].[NodesCustomProperties] npipn,
[SWO_CP].[dbo].[NIP_Reference] nripn
INNER JOIN [SWO_CP].[dbo].[NodesData] ndipn ON NodeID = ndipn.NodeID) ipn ON np.NodeID = ipb.NodeID),
ncp_abmtdn AS
(SELECT ncpi.NodeID,
ncpi.City,
m.ObjectSubType AS [Method]
FROM ncp_ipbdn ncpi,
[SWO_CP].[dbo].[NCP_Reference] a,
[SWO_CP].[dbo].[NCP_Reference] d
INNER JOIN [SWO_CP].[dbo].[NodesData] m ON NodeID = m.NodeID
INNER JOIN (SELECT npt.NodeID,
nrt.[VALUE]
FROM ncp_ipbdn npt,
[SWO_CP].[dbo].[NCP_Reference] nrt
INNER JOIN [SWO_CP].[dbo].[NodesData] ndt ON NodeID = ndt.NodeID) t ON ncpi.NodeID = t.NodeID)
SELECT *
FROM ncp_abmtdn;
如果我在第二个 CTE 中仅使用单个联接 - 它可以工作,但是一旦我向第二个 CTE 添加第二个 INNER JOIN ,它就会失败。
使用以下代码生成示例:
CREATE TABLE [dbo].[NCP_Reference2](
[TYPE] [nvarchar](400) NOT NULL,
[REFERENCE] [nvarchar](400) NULL,
[VALUE] [nvarchar](400) NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[NodesCustomProperties2](
[NodeID] [int] NOT NULL,
[City] [nvarchar](50) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[NodesData2](
[NodeID] [nvarchar](max) NULL,
[Status] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
INSERT INTO [dbo].[NCP_Reference2] (TYPE, REFERENCE, VALUE) VALUES
('Test1','TST1','This is a Value1'),
('Test2','TST2','This is a Value2'),
('Test3','TST3','This is a Value3');
INSERT INTO [dbo].[NodesCustomProperties2] (NodeID, City) VALUES
('123','Miami'),
('223','Omaha');
INSERT INTO [dbo].[NodesData2] (NodeID, Status) VALUES
('123','TST1'),
('223','TST2'),
('223','TST3');`
在第一个 CTE 中的第一个 INNER JOIN 中查看此子查询:
SELECT npipb.NodeID,
nripb.[VALUE]
FROM [SWO_CP].[dbo].[NodesCustomProperties] npipb,
[SWO_CP].[dbo].[NIP_Reference] nripb
INNER JOIN [SWO_CP].[dbo].[NodesData] ndipb ON NodeID = ndipb.NodeID
具体来说,这一行:
INNER JOIN [SWO_CP].[dbo].[NodesData] ndipb ON NodeID = ndipb.NodeID
NodeID = ndipb.NodeID
表达式是不明确,因为要使其具有任何意义,必须至少有两个不同的列可以解析为第一个NodeID
。
认真地说:不再有旧式的“TableA,TableB WHERE ...”连接。它们已经过时了超过 30 年! 看在上帝的份上,无论你做什么,都不要混合这两种风格。