2014-12-04 108 views
4

我正在做一个左外连接,并且只返回匹配行,就像它是内连接一样。Oracle,LEFT OUTER JOIN不从左表中返回所有行,而是像INNER JOIN一样行为

为了简化数据,我的第一个表(ROW_SEG),或左表看起来是这样的:

ASN | DEPT NO 
----------------------- 
85 | 836 
86 | null   
87 | null 

我的第二个表(RF_MERCHANT_ORG)具有DEPT_NAME,而我想,当一些其他的东西我有一个部门号码。

DEPT NO | DEPT_NAME 
----------------------- 
836  | some dept name 1 
837  | some dept name 2 
838  | some dept name 3 

在这种情况下,我的加入后,我只得到1行,对于ASN 85有一个部门号。

...omitting a bunch of SQL for simplicity 

, ROW_SEG AS (
    SELECT * 
    FROM VE_SI_EC_OI 
    WHERE ROW_NUM BETWEEN 1 AND 1000 -- screen pagination, hardcoding values 
) 

-- ROW_SEG has a count of 1000 now 

, RFS_JOIN AS (
    SELECT ROW_SEG.* 
    ,MO.BYR_NO 
    ,MO.BYR_NAME 
    ,MO.DEPT_NAME 
    FROM ROW_SEG 
    LEFT OUTER JOIN RF_MERCHANT_ORG MO 
    ON ROW_SEG.DEPT_NO = MO.DEPT_NO  
    WHERE MO.ORG_NO = 100 
) 
SELECT * FROM RFS_JOIN; -- returns less than 1000 

我只收回行数等于行号的行数。因此,在我上面的小数据示例中,我只得到ASN 85的1行,但我希望所有的行都填充了BYR_NO,BYR_NAME和DEPT_NAME行,我有DEPT_NO,如果没有,则为空/空列。

+3

哪个表是'ORG_NO'? – Allan 2014-12-04 19:47:15

+0

Allan的评论是一个很好的例子,为什么在查询中正确使用_all_列的别名很重要。 – 2014-12-04 19:49:00

+0

rf_merchant_org – SomeRandomDeveloper 2014-12-04 19:49:02

回答

6

如果ORG_NO在RF_MERCHANT_ORG表内(一直使用别名会帮助那里),那么就像一个内部连接一样行事就会是正在使用的SQL的正确结果。

的加入应该是这样的,使其像一个合适的左连接:

LEFT OUTER JOIN RF_MERCHANT_ORG MO ON ROW_SEG.DEPT_NO = MO.DEPT_NO AND MO.ORG_NO = 100 
4

如果ORG_NO是RF_MERCHANGE_ORG,那么这很可能是原因... WHERE条件限制的结果组。