web-dev-qa-db-ja.com

カンマ区切り結合(クロス結合)

このクエリのしくみがわかりません。

1    SELECT       
2        EXTRACTVALUE(definition_xml.COLUMN_VALUE, 'SubtypeFieldInfo/DomainName') AS domain_name
3    FROM        
4        SDE.GDB_ITEMS_VW i 
5        JOIN SDE.GDB_ITEMTYPES it ON
6            i.Type = it.UUID
7            ,TABLE(XMLSEQUENCE(XMLType(Definition).Extract('/DETableInfo/Subtypes/Subtype/FieldInfos/SubtypeFieldInfo'))) definition_xml  

行#7の先頭のコンマは何をしますか?

私の推測では、クエリを書いた人はなんらかのSQLの省略形を使用していました。おそらく、誰かが「初心者向けSQL」でクエリを再フォーマットするのを手伝うことができれば、それが役立つかもしれません。

3
Wilson

コンマは、暗黙の結合演算子、ANSI SQL-89構文です。以下のコンマと同じです。

select ... 
from a , b             -- <-- this comma
where a.aid = b.aid; 

CROSS JOIN*、最新の十分なOracleバージョンを想定。

iitおよびdefinition_xmlは、3つの結合されたテーブルのエイリアスです(2つのテーブルはベーステーブルまたはビューであり、3つ目は派生テーブルのようなもので、Oracleはそれらを呼び出します) 「テーブルコレクション式」)ですが、結合または参照する方法は同じです。

結合を囲む括弧と最後のテーブルは完全にオプションです。クエリがどのように解析されるかを示すために、それらを追加しました。

SELECT       
    EXTRACTVALUE(definition_xml.COLUMN_VALUE, ...) AS domain_name 
FROM        
      (   SDE.GDB_ITEMS_VW i 
        JOIN 
          SDE.GDB_ITEMTYPES it 
        ON
          i.Type = it.UUID
      )
    ,                           -- or: CROSS JOIN 
      (  TABLE(...) definition_xml
      ) 
;

* CROSS JOINとコンマ結合演算子の優先順位は異なりますが、これは特定のクエリでは重要ではありません。ただし、良い方法として、コンマ結合と明示的なJOINを混在させないことをお勧めします。

5
ypercubeᵀᴹ