2013-02-01 54 views
10

模式:多部分組成的標識符無法綁定 - 子查詢

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下運行的查詢中SQLFiddle 2008年的業績:

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」,它是真正的查詢的一部分,它是問題的一個相關部分。

編輯2:有關該問題的更多信息。

+0

好的。看看你的子查詢。您按C1篩選,然後按C1排序。什麼意思?我認爲你必須'訂購'C2。 –

+0

這是真正的查詢的抽象 –

+0

但是你扭曲了邏輯。看到我更新的答案。 –

回答

2

你不能從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 
+0

如果在進一步的內部連接中需要「SELECT TOP 1」,該怎麼辦? –

+0

使用「ROW_NUMBER()」是犯罪行爲。 –

+1

'使用「ROW_NUMBER()」是犯罪行爲。「爲什麼? –

3

您無法從另一個連接的子查詢中的連接訪問別名。您將需要使用它連接在兩列/表子查詢如下:

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 
+2

'你不能訪問子查詢中的別名.'我不這麼認爲。 'SELECT * FROM Table1 T1 WHERE someColumn IN(SELECT someColumn FROM Table2 WHERE T1.Id = Table1_Id)' –

+1

@HamletHakobyan fixed – Taryn

+0

我編輯了我的問題。 –

相關問題