3

列 (ベータ、デルタ、ガンマ) を持つテーブル B にリンクされている列 (アルファ、ベータ) を持つテーブル A があるとします。最初のクエリがクロス結合に変換される理由を説明できません。(A.Alpha、A.Beta、および B.Delta は一意のキーです。B.Beta は A.Beta を参照します)。

次のように選択すると:

SELECT A.Alpha, B_Alias.Gamma FROM A 
LEFT JOIN B as B_Alias ON B_Alias.Delta = (
  SELECT TOP 1 B_Alias.Delta FROM B 
  WHERE B.Beta = B_Alias.Beta
  ORDER BY B.Gamma desc)
where A.Alpha = 1

結果は多くの行になり、A.Alpha は常に選択された単一の行と等しくなり、B_Alias.Gamma にはすべてのガンマが含まれます。を取り出すA.Alpha = 1と、完全交差結合になります。クエリの作成者による試みは、A に関連付けられている最新の B 列 (存在する場合) を取得することでした。次を使用して動作するように修正しました。上記がそのように機能する理由を誰かが説明できるかどうか疑問に思っていました。

-- This is the correct query
SELECT A.Alpha, B_Alias.Gamma FROM A 
-- Actually join the A and B tables
LEFT JOIN B on B.Beta = A.Beta and B.Delta = (
  -- Only get the Most Recent B for any given A
  SELECT TOP 1 B.Delta FROM B 
  WHERE B.Beta = A.Beta
  ORDER BY B.Gamma desc)
where A.Alpha = 1
4

1 に答える 1

6

最上位のクエリには、に関連するON句に条件がありません。あなたがしているのは、その行の先頭が順番になっているすべての行を取得し、その結果セットをからの各行に結合することです。との間の直接的な関係を指定していないため、基本的に(一意の場合に等しい)のサブセットを取得し、それを相互結合します。ABBDeltaGammaBetaABBBetaAAB

もう少し詳しく説明しますが、テーブルを取得して、テーブルがない他のテーブルに結合すると、TableA.SomeColumn = TableB.SomeColumn基本的に、TableB制限可能な完全な結果セットを取得し、その完全な結果セットをすべての行に結合します。のTableA行に結合された結果セットを制限する方法がないためTableAです。それがお役に立てば幸いです。

于 2012-04-09T16:07:59.070 に答える