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

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

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

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

4

2 回答 2

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

您正在引用子查询中的第一个表。这是不允许的。首先,我不认为子查询是必要的。您只是从第一个表中选择并执行 aleft 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
于 2013-06-01T06:41:20.780 回答
1

而不是 LEFT OUTER JOIN 使用带有相关子查询的 OUTER APPLY。OUTER APPLY 子句返回左侧表上的所有行,无论它们是否返回表值函数中的任何行,因此类似于 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上的演示

于 2013-06-01T07:26:18.310 回答