了解在SQL查询中使用花括号和“OJ”

时间:2011-07-20 19:00:03

标签: mysql

我办公室的前任员工构建了一个php脚本,该脚本在SQL查询中使用花括号。我知道它通常适用于封装数组变量之类的东西,但是这个查询在字符串中没有任何PHP变量。有人可以澄清在查询的FROM部分中生成的表实际上需要花括号,以及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

2 个答案:

答案 0 :(得分:3)

MySQL支持外部联接的替代语法 但是,这并不意味着应该使用它。

  1. 如果在某些时候需要切换到另一个RDBMS,那么拥有特定于RDBMS的代码可能会有问题。
  2. 谷歌搜索,似乎MySQL不支持超过2个连接的这种语法。
  3. 除了:
    代码的另一个非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;
    

    其他说明:
    对于不等式!=将起作用,但<>是首选。

答案 1 :(得分:0)

你可以删除&#34; {ok&#34;和&#34;}&#34; 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   或正确的外部加入。这有助于与某些人兼容   第三方应用程序,但不是官方的ODBC语法。

Ref