【问题标题】:outer join in oracle sqloracle sql中的外连接
【发布时间】:2017-03-22 02:24:04
【问题描述】:

我确实搜索了 oracle sql 外连接以查看是否存在快照(就像我认为在 mysql 中你可以执行 where a *= b 我相信,这可以执行外连接)。我发现了一件事看起来很有希望,但没有奏效。我试图找到一个快捷方式,因为我永远记不住外连接语法。我必须一直查看它。以此为例:

SELECT
  l.*,
  r.*
FROM database.login l LEFT OUTER JOIN database.relation r
    ON l.user_id = r.user_id
       AND r.user_id IS NULL

r.user_id 的多个值如预期的那样为空。我尝试了我在某处读到的内容:

SELECT
  l.*,
  r.*
FROM database.login l, database.relation r
WHERE l.user_id = +r.user_id

但没有从 database.relation 中选择与 database.login 不匹配的 user_id 的行。

所以你必须输入整个语法吗?我试图在登录中获取一个条目,而不是相关的。

我想我可以使用如下内容:

u.user_id not in select user_id from database.relation

必要时

【问题讨论】:

  • 第一个查询到底有什么问题?
  • 依我的拙见,您应该花时间学习 ANSI 连接语法。这并不难:select * from some_table <join type> some_other_table <on join condition(s)>。您只需要知道要使用哪种连接类型,这与您的连接条件相符

标签: sql oracle outer-join


【解决方案1】:

你可以这样做:

select l.*, r.*
from database.login l, database.relation r
where l.user_id = r.user_id (+)

用于左外连接和

select l.*, r.*
from database.login l, database.relation r
where l.user_id (+) = r.user_id 

右外连接

【讨论】:

  • 甚至 Oracle 都建议不要再使用(+) 运算符。
  • 然而,它是一种用更短的语法实现外连接的方法。我一直在使用这个,从来没有遇到过问题。用心了,还是可以用的。
  • @Nemanja91 你显然没有尝试过像SELECT * FROM t1, t2, t3 WHERE t1.col1 = t2.col1 (+) AND t2.col2 (+) = t3.col1; 这样的连接,因为这会给你ORA-01417: a table may be outer joined to at most one other tableSELECT * FROM t1 LEFT OUTER JOIN t2 ON (t1.col1 = t2.col1) RIGHT OUTER JOIN t3 ON (t2.col2 = t3.col1); 工作得很好!
  • 有效,但做这种查询没有多大意义
猜你喜欢
  • 2018-05-01
  • 2016-10-02
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多