无法绑定多部分标识符 - SubQuery

时间:2013-02-01 23:05:55

标签: sql sql-server-2008 join subquery inner-join

架构:

create table TableA (A1 int)
create table TableB (B1 int, B2 int)
create table TableC (C1 int)

有问题的查询:

SELECT * 
FROM TableA a
INNER JOIN TableB b ON b.B1=a.A1
INNER JOIN (SELECT TOP 1 * 
            FROM TableC c
            WHERE c.C1=b.B1 ORDER BY c.C1) d ON d.C2=b.B2
INNER JOIN OtherTable ON OtherTable.Foo=d.C1

构建此架构并在SQL Server 2008下的SQLFiddle中运行查询会导致:

The multi-part identifier "b.B1" could not be bound.: SELECT * FROM TableA a INNER JOIN TableB b ON b.B1=a.A1 INNER JOIN (SELECT TOP 1 * FROM TableC c WHERE c.C1=b.B1 ORDER BY c.C1) d ON d.C2=b.B2

对子查询使用CROSS APPLY而不是INNER JOIN修复了问题

有什么问题?

编辑:我添加了“TOP 1”,它是真实查询的一部分,它是问题的一个相关部分。

Edit2:有关此问题的更多信息。

2 个答案:

答案 0 :(得分:5)

您无法从另一个已连接子查询内的联接访问别名。您将需要使用以下两个列/表连接子查询:

SELECT * 
FROM TableA a
INNER JOIN TableB b 
  ON b.B1=a.A1
INNER JOIN 
(
  SELECT * 
  FROM TableC c
) d 
  ON d.C2=b.B2
  AND d.C1 = b.B1

或者这可以写成:

SELECT * 
FROM TableA a
INNER JOIN TableB b 
  ON b.B1=a.A1
INNER JOIN TableC c
  ON c.C2=b.B2
  AND c.C1 = b.B1

答案 1 :(得分:3)

你不能从JOIN子句引用到JOIN的另一部分。

改为使用它。

SELECT * 
FROM TableA a
INNER JOIN TableB b
    ON b.B1=a.A1
INNER JOIN TableC c
    ON d.C2=b.B2
      AND c.C1=b.B1

<强> EDITED

SELECT * 
FROM TableA a
INNER JOIN TableB b ON b.B1=a.A1
WHERE b.B2 = (SELECT TOP 1 c.C2 
               FROM TableC c
               WHERE c.C1=b.B1 ORDER BY c.C1)

要在JOIN-s中进一步使用TableC,您可以使用此功能。

SELECT * 
FROM TableA a
    INNER JOIN TableB b
        ON b.B1=a.A1
    INNER JOIN
       (
           SELECT
               ROW_NUMBER() OVER (PARTITION BY C1 ORDER BY C2) RN,
               C2
               --, other columns fromTableC if needed
           FROM TableC
       ) CC
     ON b.B2 = CC.C2
       AND CC.RN = 1