具有多个连接的嵌套 CTE

问题描述 投票:0回答:1

尝试在嵌套 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');`
sql sql-server t-sql common-table-expression with-statement
1个回答
0
投票

在第一个 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 年! 看在上帝的份上,无论你做什么,都不要混合这两种风格。

© www.soinside.com 2019 - 2024. All rights reserved.