mysql - 了解在 SQL 查询中使用大括号和 "OJ"

标签 mysql

我办公室的一名前雇员构建了一个在 SQL 查询中使用大括号的 PHP 脚本。我知道它通常适用于封装数组变量之类的事情,但此查询的字符串中没有任何 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

最佳答案

MySQL 支持 Outer Join 的这种替代语法。
然而,这并不意味着应该使用它。

  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;

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

关于mysql - 了解在 SQL 查询中使用大括号和 "OJ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6767060/

相关文章:

mysql - 数据库设计 - 表关系 - 更喜欢最小关系或 "time saving"关系

插入触发器之前的 mysql 错误代码 1364 : Field does not have a default value and Error Code 1442. 无法更新存储函数/触发器中的表

mysql - 如何在mysql中声明变量并将其值设置为计数结果

mysql - 如何查找客户在两天内是否被联系三次?

mysql - 按 groupby 计数的 sql 查询问题

c# 导致 mysql = System.Collections.Generic.List

mysql - ".save"仅在数据库中插入空值

mysql - Magento SQL 查询

mysql - 用于将数据从 Azure MSSQL 复制到 Azure MySQL 的 Azure 管道复制数据事件

mysql:从一列创建多列