mysql 理解SQL查询中大括号和“OJ”的使用

z4bn682m  于 5个月前  发布在  Mysql
关注(0)|答案(2)|浏览(49)

我办公室以前的一个员工构建了一个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

字符串

pes8fvy9

pes8fvy91#

MySQL支持外部连接的这种替代语法。
但这并不意味着它应该被使用。
1.如果在某些时候您需要切换到另一个RDBMS,那么使用特定于RDBMS的代码可能会有问题。
1.在谷歌上搜索一下,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;

字符串
其他说明:
For inequality != will work, but <> is preferred.

xam8gpfp

xam8gpfp2#

您可以删除“{ oj”和“}”,SQL将像以前一样工作,只是不在ODBC中。

escaped_table_reference:  
    table_reference  
  | { OJ table_reference }

字符串
连接语法说明中显示的{ OJ...}语法仅用于与ODBC兼容。语法中的花括号应按字面意思编写;它们不是语法说明中其他地方使用的元括号。
第一个月
可以在{ OJ...}中使用其他类型的联接,如INNER JOIN或RIGHT OUTER JOIN。这有助于与某些第三方应用程序兼容,但不是正式的ODBC语法。
Ref
“OJ”是Outer Join的缩写。

相关问题