sql 中的 Oracle (+) 语法更改

Oracle (+) in sql syntax change

我知道在 oracle (+) 中表示为 left/right outter join 但是如果它用在列名上呢?

例如:

SELECT count(DISTINCT emp_id)   FROM
employee e, salary s, name n, 
department d, paid p, account a, 
account_type at
WHERE
e.emp_id = n.emp_id AND
n.sal_id = s.sal_id AND
e.dep_id = d.dep_id AND
a.acc_id = at.acc_id AND
e.acc_type = at.acc_type AND
p.paid_id = a.paid_id(+) AND
at.acc_type(+) = 'Basic';

行数:1089

如果我删除 account_type

上的 (+)
SELECT count(DISTINCT emp_id)   FROM
employee e, salary s, name n, 
department d, paid p, account a, 
account_type at
WHERE
e.emp_id = n.emp_id AND
n.sal_id = s.sal_id AND
e.dep_id = d.dep_id AND
a.acc_id = at.acc_id AND
e.acc_type = at.acc_type AND
p.paid_id = a.paid_id(+) AND
at.acc_type = 'Basic';

行数:189

at.acc_type(+) = 'Basic'; <- This throws error if I run it on other sql other than oracle

这是否意味着左外连接与整个table? 如果我不使用 oracle,那么它会抛出错误,因为不允许 account_type 旁边的第二个查询中的 (+)。我应该如何修改语法以使第一个查询和第二个查询 return 结果相同?

开始时,您有 7 个 table 且只有 4 个连接,这意味着您要么缺少 2 个连接条件(可能),要么有意进行至少两个笛卡尔连接(不太可能) .您几乎肯定需要添加一些额外的连接条件。

at.acc_type(+) = 'Basic'

只是指定您在 at table 上执行外部联接。最有可能的是,缺少的连接条件之一是从 account table 到 account_type table 的连接。如果您要外部连接到 account_type table,account_type 上的任何谓词也需要成为外部连接条件的一部分,包括 acc_type 上的这个谓词。

如果您熟悉 SQL 99 外连接语法(这里会更清楚),如果您希望谓词成为外连接的 on 条件的一部分,您需要在旧式语法中使用 (+) 运算符。