我写这段代码
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”。
答案 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上的演示