2011-07-20 42 views
4

私のオフィスの従業員は、SQLクエリーで中括弧を使用するphpスクリプトを作成しました。私は配列変数のカプセル化のようなものでは正常に動作すると理解していますが、このクエリでは文字列にPHP変数はありません。クエリのFROMセクションに生成されているテーブルが実際に中括弧を必要としていることを明確にすることはできますか?SQLクエリーでの中括弧と "OJ"の使用の理解

SELECT 
    DISTINCT ra.folder_id, 
    pd.id, 
    f.name, 
    pd.descriptor_text 
FROM 
    { 
    OJ permission_descriptors pd 
    LEFT JOIN permission_descriptor_users pdu 
    ON pdu.descriptor_id = pd.id 
    } 
    role_allocations ra, 
    folders f 
WHERE 
    pdu.descriptor_id IS NULL AND 
    pd.id = ra.permission_descriptor_id AND 
    pd.id != 1 
    ra.folder_id = f.id 
ORDER BY 
    ra.folder_id 
+0

グーグル暴く[リンク](http://db.apache.org/derby/docs/10.0/manuals/reference/sqlj235.html)【選択Google検索は "OJ構文" でした。 –

答えて

3

MySQLは、外部結合の代替構文をサポートしています。
しかし、それが使用されるべきではありません。

  1. ある時点で別のRDBMSに切り替える必要がある場合は、RDBMS固有のコードを使用することは問題になる可能性があります。
  2. グーグルでは、2つ以上のジョインでMySQLがこの構文をサポートしていないようです。

脇腹:
コードには、次の結合があります。

これはANSI準拠のバージョン(テストしていない)で簡単に刺しです:

SELECT 
    DISTINCT ra.folder_id, 
    pd.id, 
    f.name, 
    pd.descriptor_text 
FROM 
    permission_descriptors pd 
    LEFT JOIN permission_descriptor_users pdu 
    ON pdu.descriptor_id = pd.id 
    LEFT JOIN role_allocations ra 
    ON pd.id = ra.permission_descriptor_id 
    LEFT JOIN folders f 
    ON ra.folder_id = f.id 

WHERE 
    pdu.descriptor_id IS NULL AND 
    pd.id <> 1 
ORDER BY 
    ra.folder_id; 

その他の注意事項:不平等!=については
は動作しますが、<>が好ましいです。

+0

説明をありがとう! – Scott

+0

なぜ<>が優先されますか?私は個人的に!=他の言語の類似点のために使用します。 – dotancohen

+0

質問ありがとうございます。たぶん「優先」は最高の言葉ではありません。 '<>'演算子は[ANSI準拠](http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt)SQLです。それにもかかわらず、多くのRDBMS [両方を許可する](http://stackoverflow.com/a/723426/42346)。 – bernie

0

"{ok"と "}"を削除すると、SQLは以前のようにODBCで動作します。

escaped_table_reference: 
    table_reference 
    | { OJ table_reference } 

結合構文記述に示さ{OJ ...}構文のみ ODBCとの互換性のために存在します。構文の中括弧は、文字通り書かれた でなければなりません。構文 の説明のどこかで使用されているメタシンタクスではありません。

SELECT left_tbl * FROM {OJ LEFT OUTER JOINをleft_tbl right_tbl ON left_tbl.id = right_tbl.id} right_tbl.idがNULL IS 。

INNER JOIN やRIGHT OUTER JOINなど、{OJ ...}内に他のタイプの結合を使用できます。これは一部の サードパーティアプリケーションとの互換性に役立ちますが、公式のODBC構文ではありません。

Ref