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
条件的一部分,您需要在旧式语法中使用 (+)
运算符。
我知道在 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
条件的一部分,您需要在旧式语法中使用 (+)
运算符。