2016-05-04 3 views
1

Таблица 1 - DBT_C_INT_ACCRJOIN таблица запроса дает странные результаты

select INT_ACC.BRCH_CODE, INT_ACC.PROD_CODE, INT_ACC.REF_ID from DBT_C_INT_ACCR INT_ACC where BRCH_CODE = 784 and PROD_CODE = 'GF' and REF_ID = 'GFE1200077'; 

BRCH_CODE PROD_CODE REF_ID 
784    GF  GFE1200077 
784    GF  GFE1200077 
784    GF  GFE1200077 
784    GF  GFE1200077 

Таблица 2 - dbt_c_rate_refresh

select INT_ACC.BRCH_CODE, INT_ACC.PROD_CODE, INT_ACC.REF_ID from dbt_c_rate_refresh INT_ACC where BRCH_CODE = 784 and PROD_CODE = 'GF' and REF_ID = 'GFE1200077'; 


BRCH_CODE PROD_CODE REF_ID 
784   GF   GFE1200077 
784   GF   GFE1200077 
784   GF   GFE1200077 
784   GF   GFE1200077 
784   GF   GFE1200077 
784   GF   GFE1200077 
784   GF   GFE1200077 

Теперь, когда попытался с ниже Join, он дает 28 строк вместо 4 ряда. Любые объяснения PLS?

select INT_ACC.ref_id, RATE_REFRESH.ref_id from DBT_C_INT_ACCR INT_ACC left OUTER JOIN dbt_c_rate_refresh RATE_REFRESH ON (INT_ACC.BRCH_CODE = RATE_REFRESH.BRCH_CODE and INT_ACC.PROD_CODE = RATE_REFRESH.PROD_CODE and INT_ACC.REF_ID = RATE_REFRESH.REF_ID) 
where INT_ACC.BRCH_CODE = '784' and INT_ACC.PROD_CODE = 'GF' and INT_ACC.REF_ID = 'GFE1200077'; 

REF_ID  REF_ID_1 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
GFE1200077 GFE1200077 
+0

Это дает то же самое. результатов для любого типа соединения. –

+0

В какой RDMS вы используете ... mysql or oracle? Он дает несколько строк в вашем соединении, поскольку вы присоединяетесь к отношениям многих и многих. – mituw16

+0

Oracle one ...... –

ответ

2

Потому что вы не присоединяющиеся на что-то уникальное, вы фактически делаете декартово присоединиться (ака перекрестное соединение) между строками, которые имеют дубликат присоединиться значения состояния в обеих таблицах.

Чтобы продемонстрировать, я подражал свои таблицы и добавил уникальный идентификатор rn, так что вы можете увидеть, что происходит, когда вы делаете присоединиться:

with dbt_c_int_accr as (select 784 brch_code, 'GF' prod_code, 'GFE1200077' ref_id, 1 rn from dual union all 
         select 784 brch_code, 'GF' prod_code, 'GFE1200077' ref_id, 2 rn from dual union all 
         select 784 brch_code, 'GF' prod_code, 'GFE1200077' ref_id, 3 rn from dual union all 
         select 784 brch_code, 'GF' prod_code, 'GFE1200077' ref_id, 4 rn from dual), 
dbt_c_rate_refresh as (select 784 brch_code, 'GF' prod_code, 'GFE1200077' ref_id, 1 rn from dual union all 
         select 784 brch_code, 'GF' prod_code, 'GFE1200077' ref_id, 2 rn from dual union all 
         select 784 brch_code, 'GF' prod_code, 'GFE1200077' ref_id, 3 rn from dual union all 
         select 784 brch_code, 'GF' prod_code, 'GFE1200077' ref_id, 4 rn from dual union all 
         select 784 brch_code, 'GF' prod_code, 'GFE1200077' ref_id, 5 rn from dual union all 
         select 784 brch_code, 'GF' prod_code, 'GFE1200077' ref_id, 6 rn from dual union all 
         select 784 brch_code, 'GF' prod_code, 'GFE1200077' ref_id, 7 rn from dual) 
-- end of mimicking your tables with data in. You wouldn't need the above subqueries, as you have the tables themselves. 
-- See the SQL below: 
select int_acc.ref_id, 
     rate_refresh.ref_id, 
     int_acc.rn, 
     rate_refresh.rn 
from dbt_c_int_accr int_acc 
     left outer join dbt_c_rate_refresh rate_refresh on (int_acc.brch_code = rate_refresh.brch_code 
                  and int_acc.prod_code = rate_refresh.prod_code 
                  and int_acc.ref_id = rate_refresh.ref_id) 
where int_acc.brch_code = '784' 
and int_acc.prod_code = 'GF' 
and int_acc.ref_id = 'GFE1200077' 
order by int_acc.rn, 
     rate_refresh.rn; 


REF_ID  REF_ID_1   RN  RN_1 
---------- ---------- ---------- ---------- 
GFE1200077 GFE1200077   1   1 
GFE1200077 GFE1200077   1   2 
GFE1200077 GFE1200077   1   3 
GFE1200077 GFE1200077   1   4 
GFE1200077 GFE1200077   1   5 
GFE1200077 GFE1200077   1   6 
GFE1200077 GFE1200077   1   7 
GFE1200077 GFE1200077   2   1 
GFE1200077 GFE1200077   2   2 
GFE1200077 GFE1200077   2   3 
GFE1200077 GFE1200077   2   4 
GFE1200077 GFE1200077   2   5 
GFE1200077 GFE1200077   2   6 
GFE1200077 GFE1200077   2   7 
GFE1200077 GFE1200077   3   1 
GFE1200077 GFE1200077   3   2 
GFE1200077 GFE1200077   3   3 
GFE1200077 GFE1200077   3   4 
GFE1200077 GFE1200077   3   5 
GFE1200077 GFE1200077   3   6 
GFE1200077 GFE1200077   3   7 
GFE1200077 GFE1200077   4   1 
GFE1200077 GFE1200077   4   2 
GFE1200077 GFE1200077   4   3 
GFE1200077 GFE1200077   4   4 
GFE1200077 GFE1200077   4   5 
GFE1200077 GFE1200077   4   6 
GFE1200077 GFE1200077   4   7 

Надеюсь, вы можете увидеть, что строка с rn = 1 из dbt_c_int_accr матчей для каждой отдельной строки в dbt_c_rate_refresh.

Это потому, что brch_code, prod_code и ref_id колонна для rn = 1 в dbt_c_int_accr спичек в одних и те же столбцы в другой таблице для всех 7 рядов - в соответствии с вашим условием соединения. То же самое относится к другим 3 строкам в dbt_c_int_accr.

Вы получаете 28 строк, потому что 4 * 7 = 28.

Это не странно, результат; это точно то, что вы просили с этим конкретным условием соединения. Если вы были после разных результатов, то вам придется соответствующим образом изменить ваше соединение.

+0

Спасибо ... не могли бы вы также посоветовать, как получить 4 ожидаемых строки в этом случае? –

+0

@SnehalMasne Это зависит от многого. Какова логика получения 4 выходных строк? Возможно, вам вообще не нужно присоединиться? – Boneist

+0

Общая логика левого внешнего соединения - получение всех строк левой таблицы и общих рядов правой. То же самое произошло бы в приведенном выше примере, если бы не было дубликатов. Поскольку есть дубликаты, я получаю декартовский результат. Как мне это преодолеть? –

Смежные вопросы