【发布时间】:2017-08-03 13:19:21
【问题描述】:
- 我有一个客户主表
CUSTOMER_MASTER,它有一个主键CUSTOMER_ID。 - 还有两个客户子表
CUSTOMER_DETAILS_1和CUSTOMER_DETAILS_2每个表都有自己的主键和外键CUSTOMER_ID。 - 并非主表
CUSTOMER_MASTER中的所有记录在上述两个子表中都有对应的记录。
我需要构建一个 select 语句,它基于键 CUSTOMER_ID 连接三个表 CUSTOMER_MASTER、CUSTOMER_DETAILS_1 和 CUSTOMER_DETAILS_2。但问题是CUSTOMER_MASTER 中子表中没有相应记录的记录即使使用外连接也不会出现在输出中。请参阅以下查询:
SELECT *
FROM CUSTOMER_MASTER MAS, CUSTOMER_DETAILS_1 SUB1, CUSTOMER_DETAILS_2 SUB2
WHERE SUB1.CUSTOMER_ID = MAS.CUSTOMER_ID(+)
AND SUB2.CUSTOMER_ID = MAS.CUSTOMER_ID(+)
-- Other conditions for CUSTOMER_DETAILS_1 and CUSTOMER_DETAILS_2 are there.
我的目标是选择所有客户,如下所示:
数据库是 Oracle 11g
【问题讨论】:
-
如果您使用 Oracle 专有的、旧的、不推荐的、不推荐的连接表示法,您应该正确使用它。要像您正在做的那样获得外连接,(+)应该在“缺失”行的一侧(要记住它,将(+)视为表示在该表中添加了假行,在一侧+)。
-
我也在另一边添加了(+),我得到了相同的结果。@mathguy
-
从不使用隐式连接开始。
-
好的,我想我知道发生了什么。如果您必须使用旧的 Oracle 语法...您可能有类似
... and sub1.start_date > sysdate - 100的条件。在这种情况下,您也必须将 (+) 附加到左侧!即使它不是连接条件。每次提及明细表都必须在末尾附加 (+)。 -
@mathguy 好吧...每次提及您希望将其视为加入/打开条件与 where 条件。但最好只使用现代语法。