web-dev-qa-db-ja.com

マルチパート識別子をバインドできませんでした-サブクエリ

スキーマ:

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

サブクエリにINNER JOINの代わりにCROSS APPLYを使用すると問題が修正されます

どうしたの?

編集:実際のクエリの一部である「TOP 1」を追加しましたが、これは問題の関連部分です。

Edit2:問題に関する詳細情報。

15
Matthew Azkimov

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

[〜#〜]編集済み[〜#〜]

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
3
Hamlet Hakobyan

別の結合サブクエリ内の結合からエイリアスにアクセスすることはできません。 2つの列/テーブルのサブクエリを結合する次のものを使用する必要があります。

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
7
Taryn