2014-12-04 110 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條件限制的結果組。