【问题标题】:Oracle (+) in sql syntax changesql 语法更改中的 Oracle (+)
【发布时间】:2015-08-03 21:49:14
【问题描述】:

我知道在 oracle (+) 中表示左/右外连接 但是如果它用于列名呢?

例如:

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

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

【问题讨论】:

    标签: sql oracle outer-join


    【解决方案1】:

    一开始,您有 7 个表并且只有 4 个连接,这意味着您要么缺少 2 个连接条件(很可能),要么故意执行至少两个笛卡尔连接(非常不可能)。您几乎肯定需要添加一些额外的连接条件。

    at.acc_type(+) = 'Basic'
    

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

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

    【讨论】:

    • 是一个错字,我添加了缺少的连接。但是我可以在不影响之前的“p.paid_id = a.paid_id(+)”的情况下拆分 (+) 吗?
    • @user3659052 - 我不确定您所说的“拆分 (+)”是什么意思。一个查询可以有多个外连接。如果一个查询有多个外连接并且您想使用旧式的(+) 外连接语法,那么多个表将需要(+) 运算符。请注意,您添加了一个联接,但仍然缺少至少一个联接条件。
    • 对,我理解,但是在这个查询中,每当我在 at.acc_type 上加上 (+) 时,都会出现语法错误。
    • @user3659052 - 你遇到了什么错误?在您的问题中,您似乎说当您在account_type 上进行外部联接时,您得到了 1089 行。您说当您在针对 Oracle 以外的数据库的查询中使用 (+) 运算符时会出错,这非常有意义——在 SQL 99 标准之前,不同的数据库有不同的非标准语法来指定外连接。跨度>
    猜你喜欢
    • 2015-11-26
    • 2023-04-09
    • 2014-01-20
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2015-01-22
    相关资源
    最近更新 更多