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

时间:2013-06-01 06:23:49

标签: 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

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

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

  

无法绑定多部分标识符“tblprsn.prsnid”。

2 个答案:

答案 0 :(得分: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

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

SELECT tblprsn.prsnid, tblprsn.name 
FROM tblprsn;

但是,您可以使用apply而不是join在原始查询中执行您想要的操作:

SELECT tblprsn.prsnid, tblprsn.name 
FROM tblprsn cross apply 
     dbo.getrtmn(tblprsn.prsnid) tblgetrtmn 
where tblprsn.prsnid = tblgetrtmn.rtmid

答案 1 :(得分:1)

而不是LEFT OUTER JOIN使用OUTER APPLY和相关的子查询。 OUTER APPLY子句返回左侧表中的所有行,无论它们是否返回表-cured-function中的任何行,因此类似于LEFT OUTER JOIN

SELECT t.prsnid, t.name, getrtmn_1.*
FROM tblprsn t OUTER APPLY (
                            SELECT rtmid 
                            FROM dbo.getrtmn(t.prsnid) AS tblgetrtmn
                            WHERE t.prsnid = tblgetrtmn.rtmid  
                            ) as getrtmn_1

SQLFiddle上的演示