多部分标识符无法在具有表值函数的左外连接中绑定

Pho*_*nix 5 sql sql-server-2005 table-valued-parameters

我写这段代码

SELECT tblprsn.prsnid, tblprsn.name 
FROM tblprsn LEFT OUTER JOIN 
             (
                SELECT tblrtm.rtmid 
                FROM dbo.getrtmn(tblprsn.prsnid) as getrtmn_1
             ) AS tblgetrtmn 
             ON tblprsn.prsnid = tblgetrtmn.rtmid
Run Code Online (Sandbox Code Playgroud)

dbo.getrtmn是一个表值函数,并有一个名为rtmid的uniqueidentifier字段.prsnid是uniqueidentifier

当我运行此SQL查询时导致错误:

无法绑定多部分标识符"tblprsn.prsnid".

Gor*_*off 5

这是您的查询:

SELECT tblprsn.prsnid, tblprsn.name 
FROM tblprsn LEFT OUTER JOIN 
     (SELECT tblrtm.rtmid 
      FROM dbo.getrtmn(tblprsn.prsnid) as getrtmn_1
     ) AS tblgetrtmn 
     ON tblprsn.prsnid = tblgetrtmn.rtmid
Run Code Online (Sandbox Code Playgroud)

您正在引用子查询中的第一个表.这是不允许的.首先,我不认为子查询是必要的.您只是从第一个表中选择并执行a left outer join以保留所有记录.子查询的唯一影响是乘以行.所以,正如你所写的那样,这个查询应该做同样的事情(重复除外):

SELECT tblprsn.prsnid, tblprsn.name 
FROM tblprsn;
Run Code Online (Sandbox Code Playgroud)

但是,您可以在原始查询中执行所需操作,apply而不是join:

SELECT tblprsn.prsnid, tblprsn.name 
FROM tblprsn cross apply 
     dbo.getrtmn(tblprsn.prsnid) tblgetrtmn 
where tblprsn.prsnid = tblgetrtmn.rtmid
Run Code Online (Sandbox Code Playgroud)