2016-07-23 32 views
1

これはMySQL上では簡単なはずですが、SQL Server 2008ではそれが不可能な理由が混乱しています。SQL Server:左結合とサブクエリ

SELECT * FROM Customers AS cust 
LEFT JOIN (SELECT TOP 1 * FROM Vehicles AS v WHERE v.CustNo=cust.CustNo) AS veh ON veh.CustNo=cust.CustNo; 

エラーが

The multi-part identifier "cust.CustNo" could not be bound. 

すべてのアイデアをみんなで?

答えて

0

ここrow_number()を使用して一つのアプローチです:

select * 
from (
    SELECT *, row_number() over (partition by cust.custno order by v.custno) rn 
    FROM Customers cust 
     LEFT JOIN Vehicles v ON v.CustNo=cust.CustNo 
) t 
where rn = 1 
+0

LEFT JOINとOUTER APPLYとの違いを説明してください。 –

+0

@BoboFilipino - このアプローチの鍵は本当に 'row_number'です。それを 'partition by'で使用し、' rn = 1'でフィルタリングすると、 'custno'ごとに最初の' vehicle'レコードだけが選択されます。全ての顧客が車両を持っていない場合にのみ、「外部結合」が必要となる。そうであれば、代わりに標準の '内部結合 'を使うことができます。 – sgeddes

+0

ああ、それは啓発です。これは私の現在のプロジェクトで本当に役立つと思います。あなたの知識を共有し、本当に役に立つことに感謝します。アップして受け入れる。 –

1

これはクエリです:

SELECT * 
FROM Customers cust LEFT JOIN 
    (SELECT TOP 1 * 
     FROM Vehicles v 
     WHERE v.CustNo = cust.CustNo 
    ) veh 
    ON veh.CustNo = cust.CustNo; 

私はサブクエリの相関句を可能にする任意のデータベースを認識していないです。あなたOUTER APPLYを使ってこれを実現することができます

SELECT * 
FROM Customers cust OUTER APPLY 
    (SELECT TOP 1 * 
     FROM Vehicles v 
     WHERE v.CustNo = cust.CustNo 
    ) veh; 
+0

が動作しているようです。ありがとうございました。もっと説明できますか? –

+0

私は説明が必要なのか分かりません。基本的には、元の質問の中で 'JOIN'の代わりに' APPLY'を使ってやりたいことができます。 –

+0

@BoboFilipino。 。 。これらのバージョンは適切なインデックスを持つ 'row_number()'バージョンよりも効率的でなければならないことに注意したい。興味深いもの: –