我办公室的前任员工构建了一个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
答案 0 :(得分:3)
MySQL支持外部联接的替代语法 但是,这并不意味着应该使用它。
除了:
代码的另一个非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 LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id} WHERE right_tbl.id IS NULL;
您可以在{OJ ...}中使用其他类型的联接,例如INNER JOIN 或正确的外部加入。这有助于与某些人兼容 第三方应用程序,但不是官方的ODBC语法。