Search code examples
sqloracle-databasejoinleft-join

Why does my left join query produce more rows than the number of rows in the left table?


I am doing some task with PLSQL. It is good for several task I am doing but in this case, I don't know what happened with my join Query.

I have these query:


    WITH
        subsi AS (
            SELECT
                mrk2.CUSTOMER_NUMBER ,
                mrk2.CUSTOMER_NAME ,
                mrk2.GROUP_NAME 
            FROM MOJU_REV_KLASIFIKASI mrk2
            WHERE mrk2.GROUP_NAME LIKE '%' || 'Anak perusahaan' || '%'
                OR mrk2.GROUP_NAME LIKE '%' || 'Anak Perusahaan dari Entitas Asosiasi Telkom Group' || '%'
                OR mrk2.GROUP_NAME LIKE '%' || 'Anak Perusahaan' || '%'
        ),
        agentColRef1 AS (
            SELECT 
                mrka.CONTRACT_NUMBER ,
                mrka.BP_NUMBER ,
                mrka.CUSTOMER_NAME ,
                mrka.GROUP_NAME ,
                mrka.UBIS ,
                mrka.REFR ,
                mrka.GL_ACC ,
                mrka.TOT_COST ,
                mak.KL_REF1 AS NAMA_MITRA,
                mak.KL_REF2 AS KL_NUMBER    
            FROM
                MOJU_REV_KK43_ADJ mrka
            LEFT JOIN MOJU_AGENT_KK11 mak ON mrka.CONTRACT_NUMBER = mak.CONTRACT_NUMBER 
            WHERE mrka.tahun = 2022 AND mrka.q = 6 AND mrka.TOT_COST != 0 AND mrka.REFR = '1.1'
            GROUP BY mrka.CONTRACT_NUMBER , mrka.BP_NUMBER , mrka.CUSTOMER_NAME, mrka.GROUP_NAME , mrka.ubis, mrka.refr,
            mrka.GL_ACC , mrka.TOT_COST, mak.KL_REF1 , mak.KL_REF2 
        ),
        agentColRef2 AS (
            SELECT 
                mrka.CONTRACT_NUMBER ,
                mrka.BP_NUMBER ,
                mrka.CUSTOMER_NAME ,
                mrka.GROUP_NAME ,
                mrka.UBIS ,
                mrka.REFR ,
                mrka.GL_ACC ,
                mrka.TOT_COST ,
                mak.KL_REF1 AS NAMA_MITRA,
                mak.KL_REF2 AS KL_NUMBER    
            FROM
                MOJU_REV_KK43_ADJ mrka
            LEFT JOIN MOJU_AGENT_KK12 mak ON mrka.CONTRACT_NUMBER = mak.CONTRACT_NUMBER 
            WHERE mrka.tahun = 2022 AND mrka.q = 6 AND mrka.TOT_COST != 0 AND mrka.REFR = '1.2'
            GROUP BY mrka.CONTRACT_NUMBER , mrka.BP_NUMBER , mrka.CUSTOMER_NAME, mrka.GROUP_NAME , mrka.ubis, mrka.refr,
            mrka.GL_ACC , mrka.TOT_COST, mak.KL_REF1 , mak.KL_REF2 
        ),
        agentColRef3 AS (
            SELECT 
                mrka.CONTRACT_NUMBER ,
                mrka.BP_NUMBER ,
                mrka.CUSTOMER_NAME ,
                mrka.GROUP_NAME ,
                mrka.UBIS ,
                mrka.REFR ,
                mrka.GL_ACC ,
                mrka.TOT_COST ,
                mak.KL_REF1 AS NAMA_MITRA,
                mak.KL_REF2 AS KL_NUMBER    
            FROM
                MOJU_REV_KK43_ADJ mrka
            LEFT JOIN MOJU_AGENT_KK13 mak ON mrka.CONTRACT_NUMBER = mak.CONTRACT_NUMBER 
            WHERE mrka.tahun = 2022 AND mrka.q = 6 AND mrka.TOT_COST != 0 AND mrka.REFR = '1.3'
            GROUP BY mrka.CONTRACT_NUMBER , mrka.BP_NUMBER , mrka.CUSTOMER_NAME, mrka.GROUP_NAME , mrka.ubis, mrka.refr,
            mrka.GL_ACC , mrka.TOT_COST, mak.KL_REF1 , mak.KL_REF2 
        ),
        agentColRefUnion AS (
            SELECT *
            FROM agentColRef1
            UNION
            SELECT *
            FROM agentColRef2
            UNION
            SELECT *
            FROM agentColRef3
        ),
        agentColAlok1 AS ( 
            SELECT 
                ac.CONTRACT_NUMBER AS CONTRACT_NUMBER ,
                ac.BP_NUMBER AS BP_NUMBER ,
                ac.CUSTOMER_NAME AS CUSTOMER_NAME ,
                ac.GROUP_NAME AS GROUP_NAME ,
                ac.ubis,
                ac.REFR ,
                ac.GL_ACC ,
                ac.TOT_COST ,
                ac.NAMA_MITRA,
                ac.KL_NUMBER,
                mabc.GL AS AKUN_BEBAN_1
            FROM 
                agentColRefUnion ac
            LEFT OUTER JOIN MOJU_AGENT_BEBAN_CPE mabc ON ac.KL_NUMBER = mabc.KL
            GROUP BY ac.CONTRACT_NUMBER , ac.BP_NUMBER , ac.CUSTOMER_NAME, ac.GROUP_NAME , ac.ubis, ac.refr,
            ac.GL_ACC , ac.TOT_COST, ac.nama_mitra , ac.kl_number, mabc.GL
        ),
        agentColAlok2 AS ( 
            SELECT 
                ac.CONTRACT_NUMBER,
                ac.BP_NUMBER ,
                ac.CUSTOMER_NAME ,
                ac.GROUP_NAME ,
                ac.ubis,
                ac.REFR ,
                ac.GL_ACC ,
                ac.TOT_COST ,
                ac.NAMA_MITRA,
                ac.KL_NUMBER,
                ac.AKUN_BEBAN_1,
                CASE
                    WHEN (ac.AKUN_BEBAN_1 IS NULL) THEN maba.BEBAN_DNAPSO ELSE to_char(ac.AKUN_BEBAN_1)
                END AS AKUN_BEBAN_2
            FROM 
                agentColAlok1 ac
            LEFT JOIN MOJU_AGENT_BEBAN_AKUN maba ON ac.GL_ACC = maba.GL_REVENUE 
        ),
        agentColTp AS (
            SELECT 
                ac.CONTRACT_NUMBER,
                ac.BP_NUMBER ,
                ac.CUSTOMER_NAME ,
                ac.GROUP_NAME ,
                ac.ubis,
                ac.REFR ,
                ac.GL_ACC ,
                ac.TOT_COST ,
                ac.NAMA_MITRA,
                ac.KL_NUMBER,
                ac.AKUN_BEBAN_1,
                ac.AKUN_BEBAN_2,
                mrl.CUSTOMER_TP 
            FROM 
                agentColAlok2 ac
            LEFT JOIN MOJU_REV_LTP mrl ON ac.NAMA_MITRA = mrl.SUBSIDIARIES 
        )

    SELECT
        COUNT(*)
    FROM agentColAlok2 aca
    WHERE aca.nama_mitra IS NOT NULL AND aca.nama_mitra != 'N/A'
    

When I run my agenColAlok2 to get the counts, it appears to have 911 records, but when I run my agentColTp I got 11090 records. Because it execute the results from agentColAlok2 I expect it should have 911 records also.

I have tried with INNER JOIN instead but still the records is different from what I expected. Also, the results from agentColAlok1 and agentColAlok2 is also not same. I have 833 records on agentColAlok1 and 911 records on agentColAlok2

Why it can be like that? Am I missing some concept about join or with clause? Any of you have an answer or have experienced same issue? Thank you.

The Joined table should get same exact records result


Solution

  • This example should help to explain it: http://sqlfiddle.com/#!18/8d8e5/1

    In the example, I create two tables, a and b, and insert some data into them.

    a:

    Col1 Col2
    1 5
    2 5
    3 5

    b:

    Col3 Col4
    1 9
    1 10
    2 9
    2 10
    3 9
    3 10

    Then I run the query:

    select * from a left join b on a.col1=b.col3

    Which returns:

    col1 col2 col3 col4
    1 5 1 9
    1 5 1 10
    2 5 2 9
    2 5 2 10
    3 5 3 9
    3 5 3 10

    Note there are multiple matches for a.col1 in b.col3, so the count of the result was determined by the size of b rather than a.