2011-07-20 136 views
4

我辦公室的前一位員工構建了一個在SQL查詢中使用大括號的php腳本。我知道它通常適用於封裝數組變量之類的東西,但是這個查詢在字符串中沒有任何PHP變量。有人可以澄清在查詢的FROM部分中生成的表是否實際上需要大括號,以及OJ代表什麼?瞭解在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)。該谷歌搜索是 「OJ語法」 。 –

回答

3

MySQL支持外連接的這種替代語法。
但這並不意味着它應該被使用。

  1. 如果在某些時候需要切換到另一個RDBMS,那麼具有RDBMS特定的代碼可能會有問題。
  2. 谷歌搜索,似乎MySQL不支持超過2個連接的這種語法。

旁白:
代碼的另一個非ANSI兼容問題是後續連接。

這是在符合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

感謝您的問題。也許'首選'不是最好的詞。 SQL操作符是[ANSI](http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt)。儘管如此,許多RDBMS [同時允許](http://stackoverflow.com/a/723426/42346)。 – bernie

0

您可以刪除「{ok」和「}」,SQL將像以前一樣工作,只是不在ODBC中。

escaped_table_reference: 
    table_reference 
    | { OJ table_reference } 

在聯接語法描述中示出的{OJ ...}語法只 用於與ODBC兼容存在。字面上的花括號應該是 ;它們不是在句法 描述中其他地方使用的metasyntax。

SELECT left_tbl * FROM {OJ left_tbl LE​​FT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id} WHERE right_tbl.id IS NULL。

您可以在{OJ ...}內使用其他類型的連接,例如INNER JOIN 或RIGHT OUTER JOIN。這有助於兼容某些第三方應用程序,但不是官方的ODBC語法。

Ref