【问题标题】:Oracle SQL outer join query puzzleOracle SQL 外连接查询谜题
【发布时间】:2012-08-31 02:23:57
【问题描述】:
select
  whatever
from
  bank_accs b1,
  bank_accs b2,
  table3 t3
where
  t3.bank_acc_id = t1.bank_acc_id and
  b2.bank_acc_number = b1.bank_acc_number and
  b2.currency_code(+) = t3.buy_currency and
  trunc(sysdate) between nvl(b2.start_date, trunc(sysdate)) and nvl(b2.end_date, trunc(sysdate));

我的问题在于 b2 上的日期(实际情况)检查。现在,我需要为每个 t3xb1 返回一行(当然,t3 = ~10 个加入的表),即使 b2 中只有无效记录(按日期)。我如何正确地外部加入这个位? 不能使用 ANSI 连接,必须在单个平面查询中使用。 谢谢。

【问题讨论】:

  • 为什么不能使用显式连接?您仍然可以在一个查询中完成。没有理由永远不能使用它们。事实上,你永远不应该使用隐式连接,因为它已经过时了 20 年。
  • 使用显式 ansi JOINs 的查询仍然是“单个平面查询

标签: sql oracle date join


【解决方案1】:

可以编写带有不等式的旧式外连接,但很容易出错。我建议您使用内联视图,并且外部连接将清晰明确:

SELECT whatever
  FROM bank_accs b1,
       table3 t3,
       (SELECT b2.*
          FROM bank_accs b2
         WHERE trunc(sysdate) BETWEEN nvl(b2.start_date, trunc(sysdate)) 
                                  AND nvl(b2.end_date, trunc(sysdate))
       ) b2
 WHERE t3.bank_acc_id = t1.bank_acc_id
   AND b2.bank_acc_number = b1.bank_acc_number
   AND b2.currency_code(+) = t3.buy_currency;

【讨论】:

  • 改成使用显式JOIN语法会更好
  • 不鼓励使用作为 SQL 反模式的隐式连接
  • @a_horse_with_no_name 用户明确要求:“不能使用 ANSI 连接,必须在单个平面查询中使用。”
  • @FlorinGhita:这个要求没有意义。使用 ANSI 联接的查询仍然是“单个查询”。
  • @HLGEM 据我所知,OP 的 Oracle 版本可能不支持 ANSI 连接 (8i)。这也可能是工具解析器的问题(如某些版本的 Oracle 报告)。无论如何,使用旧式连接并不理想,但如果您别无选择,我的回答提供了一个简单的提示,让 SQL 真正可读。
【解决方案2】:

如果我理解你,只需将外部符号(+)添加到 b2 的所有列:

select
  whatever
from
  bank_accs b1,
  bank_accs b2,
  table3 t3
where
  t3.bank_acc_id = t1.bank_acc_id and
  b2.bank_acc_number = b1.bank_acc_number and
  b2.currency_code(+) = t3.buy_currency and
  trunc(sysdate) between nvl(b2.start_date(+), trunc(sysdate)) and nvl(b2.end_date(+), trunc(sysdate));

【讨论】:

  • 不鼓励使用作为 SQL 反模式的隐式连接
  • 用户明确要求它:“不能使用 ANSI 连接,必须在单个平面查询中使用。”。可能是家庭作业,也可能是该项目的公司规则。
  • @FlorinGhita 我赌的是作业,因为根据公司规定,恕我直言,这没有任何意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 2016-07-18
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多