1

明示的な結合を使用した sql の正しい構文を理解するのに問題があります。たとえば、最初のスニペットでは、2 番目の結合で「ec」が表示され、制限が機能します。しかし、2 番目のスニペットでは「op」を解決できません。

最初のスニペット:

select im.* 
  from gestion_corte gc 
  join evento_corte ec
       on ec.id_corte = gc.id_corte
  join op_corte op
       on op.id_corte = gc.id_corte
       and op.fecha_evento = ec.fecha_evento        
  join img_corte im        
       on op.id_corte = im.id_corte                     
 where ec.fecha_evento > '01092012'  

2 番目のスニペット、「op」は最初の結合で解決できません:

select im.* 
  from gestion_corte gc 
  join evento_corte ec
       on ec.id_corte = gc.id_corte
       and op.fecha_evento = ec.fecha_evento -- This condition has moved
  join op_corte op
       on op.id_corte = gc.id_corte        
  join img_corte im        
       on op.id_corte = im.id_corte                     
 where ec.fecha_evento > '01092012'

その結果、可視性は上から下への処理で解決されますか? 他に考慮すべき重要なことはありますか?

4

3 に答える 3

2

SQL 結合構文では、エイリアスは定義されるまでわかりません。したがって、次のことができます。

from A a join
     B b
     on a.val = b.val join
     C c
     on a.val = c.val

ただし、次のことはできません。

 from A a join
     B b
     on a.val = b.val and
        a.id = c.id join
     C c
     on a.val = c.val

from"c" はステートメントにまだ含まれていないため、SQL エンジンは単に "c" が何であるかを認識していません。

あなたが発見したように、2番目のクエリは条件を移動することで簡単に修正できます。

于 2012-11-16T17:09:16.617 に答える
2

結合は 2 つの仮想テーブル間で行われます。

結合述語は、これら 2 つの仮想テーブルの列のみを参照できます (ただし、各仮想テーブルは複数の実テーブルの列で構成されている場合があります)。

論理結合の順序は句の順序によって決定されるため、有効な使用順序が必ずしもトップダウンであるとは限りません。ONたとえば、次のクエリ ( SQL Fiddle ) では、仮想テーブル(a join b)が仮想テーブルに結合されます。(c join d join e)

SELECT *
FROM   a
       JOIN b
         ON a.id = b.id /*Only a and b in scope here*/
       JOIN c
            JOIN d
              ON c.id = d.id /*Only c and d in scope here*/
            JOIN e
              ON e.id = d.id /*Only c, d, e in scope here*/
         ON d.id = a.id  /*a,b,c,d,e all in scope*/

このクエリ ( SQL Fiddlea ) はスコープ内にないため、エラーが発生します。

SELECT *
FROM   a
       JOIN b
         ON a.id = b.id
       JOIN c
            JOIN d
              ON c.id = d.id
            JOIN e
              ON e.id = a.id -- Can't reference a here
         ON d.id = a.id 
于 2012-11-16T19:52:27.287 に答える
0

2 番目の質問がわかりませんでした。最初の質問に対する回答しかありません。
結合は次のように想像できます。

"result" = select "some columns" from "any source"

"any source" は、テーブルまたはサブクエリ (つまり、別の "結果") または "any source" join "any source" にすることができます:
"any source" = table | "any source" = table | "結果" | "any source" join "any source"

したがって、"結果" が必要な場合は、最初に "any source" を決定し、次に "いくつかの列" を決定する必要があります (ここでは焦点を当てません)。それを決定するために「任意のソース」の定義に行きましょう。テーブルが決定され、「結果」は再帰的に前の前の文につながり、結合構築にはルールがあります-最初に「任意のソース」を左に、次に右に決定します。

したがって、2 番目のスニペットを見てください。gestion_corte join evento_corteop_corteがまだ決まっていないため、この部分は計算されていません

于 2012-11-16T17:17:51.810 に答える