2017-06-20 146 views
0

与内部连接的查询:左外连接返回更少的行

Select 
    O.ORDER_KEY, O.ORDER_SOURCE, 
-------, --- 
FROM 
    Table_1, Table_2, Table_3 
where 
    TABLE_1.SK = TABLE_2.SK AND TABLE_2.SK = TABLE_3.SK and many more; 

上述查询将返回各地的10000行。

我想添加另一个表,但同时我不想丢失来自table_2的订单。为了达到这个目的,我使用了left_outer_join:

Select 
    O.ORDER_KEY, NVL(O.ORDER_SOURCE, WROA.ORDER_SOURCE) AS ORDER_SOURCE, 
-------, --- 
FROM 
    Table_1, Table_2, Table_3, Table_4 
where 
    TABLE_1.SK = TABLE_2.SK AND TABLE_2.SK = TABLE_3.SK AND 
    TABLE_2.ORDER = TABLE_4.ORDER(+); 

上面的查询返回200行。

为什么它不返回10000行?我错过了什么?如何在左外连接上添加一个条件来影响多行?

+0

有加入旧语法,但此查询是无稽之谈。什么是TABLE_2_ORDER?没有这样的桌子。什么是'还有更多';?它可以有很多'(+)首先我建议重新适应正确的连接语法。然后发布整个查询进行分析。这是很少说什么 – Kacper

+0

非常确定这是一个正确的加入。包含所有table4_order记录,并且只包含table_2_order中匹配的记录。 – xQbert

+0

“=”被认为是内部连接,最后加上“(+)”是外部连接。对? –

回答

0

这可能是因为你已经定义了where子句。要添加的新表,此表中的列是where子句的一部分?如果是,那么使用该列的内联视图来查看它是否给你正确的结果。

+0

是的,我添加了table_4和这个条件TABLE_2.ORDER = TABLE_4.ORDER(+)是我在where子句的原始查询中添加的唯一条件。我会尝试内联视图。非常感谢。 –

+0

如果内联视图适合你,那么你可以选择ANSI加入xQbert在他的答案中提到的内容,它会给你的查询提供优雅的外观,并且更容易维护。我不认为这样的性能会受到阻碍,但它总是很适合ANSI连接语法。 –

+0

我一定会尝试内联视图。它是一个非常大的查询。需要时间来转换它。:D –

0

这就是我说的ANSI 92 ...

SELECT O.ORDER_KEY, NVL(O.ORDER_SOURCE, WROA.ORDER_SOURCE) AS ORDER_SOURCE, ... 
FROM Table_1 
INNER JOIN Table_2 
    ON TABLE_1.SK = TABLE_2.SK 
INNER JOIN Table_3 
    ON TABLE_2.SK = TABLE_3.SK AND 
LEFT JOIN Table_4 
    ON TABLE_2.ORDER = TABLE_4.ORDER 
WHERE ... 
+0

是的,我明白并会尝试这种方式。非常感谢。 –