2013-02-01 8 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 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:問題の詳細。

+0

OKです。あなたのサブクエリを見てください。 C1とORDER BY C1でフィルタリングします。意味は何ですか?あなたはC2を注文する必要があります。 –

+0

これは実際のクエリの抽象です –

+0

しかし、あなたは論理を歪ませます。私の更新された答えを見てください。 –

答えて

2

あなたがの別の部分にJOIN句から参照することはできませんJOIN。

これを代わりに使用してください。登録しよう-s内のTableCのさらなる使用のために

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) 

あなたはこれを使用することができます。

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

結合された別のサブクエリ内の結合から別名にアクセスすることはできません。次の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 
+2

'サブクエリ内の別名にアクセスすることはできません。私はそうは思わない。 'SELECT * FROM Table1 T1 WHERE someColumn IN(SELECT someColumn FROM Table2 WHERE T1.Id = Table1_Id)' –

+1

@HamletHakobyan fixed – Taryn

+0

私は私の質問を編集しました。 –