【发布时间】:2012-12-27 10:49:18
【问题描述】:
假设我有 5 个表,如下:
CREATE TABLE T1 (
FIRST_NAME VARCHAR2(100),
LAST_NAME VARCHAR2(100),
CITY NUMERIC,
SALARY NUMERIC);
CREATE TABLE T2 (
CITY NUMERIC,
DISTRICT NUMERIC);
CREATE TABLE T3 (
DISTRICT NUMERIC,
DOMAIN NUMERIC);
CREATE TABLE T4 (
DOMAIN NUMERIC,
DETAILS_BOOK NUMERIC);
CREATE TABLE T5 (
DETAILS_BOOK NUMERIC,
FIRST_NAME VARCHAR2(100),
LAST_NAME VARCHAR2(100),
EMAIL VARCHAR2(100));
INSERT INTO T1 VALUES ('john', 'doe',1001,1000);
INSERT INTO T1 VALUES ('jack', 'jill',1001,2000);
INSERT INTO T1 VALUES ('jeff', 'bush',1001,1500);
INSERT INTO T2 VALUES (1001,1);
INSERT INTO T3 VALUES (1,543);
INSERT INTO T4 VALUES (543,22);
INSERT INTO T5 VALUES (22,'john', 'doe','john@22.com');
INSERT INTO T5 VALUES (44,'john', 'doe','john@44.com');
INSERT INTO T5 VALUES (22,'jeff', 'bush','jeff@22.com');
INSERT INTO T5 VALUES (44,'jeff', 'bush','jeff@44.com');
现在,我想要来自 t1 的所有记录,包括他们的工资和电子邮件,对应于表 t2、t3 和 t4,因此结果应该是:
FIRST_NAME | LAST_NAME | SALARY | EMAIL
--------------------------------------------------
john | doe | 1000 | john@22.com
jeff | bush | 1500 | jeff@22.com
jack | jill | 2000 | (NULL)
到目前为止我得到的是:
SELECT T1.FIRST_NAME, T1.LAST_NAME,T1.SALARY,T5.EMAIL
FROM T1,T2,T3,T4,T5
WHERE T1.FIRST_NAME = T5.FIRST_NAME (+)
and T1.LAST_NAME = T5.LAST_NAME(+)
AND T1.CITY = T2.CITY
AND T2.DISTRICT = T3.DISTRICT
AND T3.DOMAIN = T4.DOMAIN
AND T4.DETAILS_BOOK = T5.DETAILS_BOOK
只返回前两行。
【问题讨论】:
-
请采用 Mahmoud Gamal 的解决方案。但是,如果您真的非常想使用旧语法,您当然不会添加更多
(+)。在您的情况下,您需要在 WHERE 子句的每一行都有一个。 -
@Codo 使用旧语法真的可以吗?我收到一个错误:一个表最多可以外部连接到另一个表,when tried to do so.
-
是的,你是对的。我刚刚意识到表 T5 连接到 T1 和 T4,即你有多列外连接。使用旧语法是不可能的。您必须使用较新的 ANSI 语法才能使您的查询正常工作。
标签: sql oracle outer-join