2016-05-04 11 views
1

Tabelle 1 geben - DBT_C_INT_ACCRJOIN Tabellenabfrage seltsame Ergebnisse

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 

Tabelle 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 

Jetzt, wenn sie mit unten versucht Join, es 28 Zeilen gibt statt 4 Reihen. Jede Erklärung 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

Es gibt dieselbe Nr. der Ergebnisse für jede Art von Join .. –

+0

Welche RDMS verwenden Sie ... mysql oder Oracle? Es gibt mehrere Zeilen in Ihrem Join, wenn Sie sich einer Beziehung von "Viele zu Viele" anschließen. – mituw16

+0

Oracle one ...... –

Antwort

2

Weil Sie nicht auf etwas Einzigartigen Beitritt sind, werden Sie effektiv tun ein kartesische verbinden (auch bekannt als Cross-Join) zwischen den Zeilen, die haben doppelte Zustandswerte in beiden Tabellen verbinden.

Um zu demonstrieren, ich habe Ihre Tabellen und hat eine eindeutige Kennung nachgeahmt rn, so dass Sie sehen können, was passiert, wenn Sie das tun beitreten:

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 

Hoffentlich können Sie sehen, dass die Zeile mit rn = 1 von dbt_c_int_accr Streichhölzer zu jeder einzelnen Zeile in dbt_c_rate_refresh.

Das ist, weil die brch_code, prod_code und ref_id Spalten für rn = 1 in dbt_c_int_accr Übereinstimmungen mit den gleichen Spalten in der anderen Tabelle für alle 7 Reihen - wie pro Ihre Join-Bedingung. Gleiches gilt für die anderen 3 Zeilen in dbt_c_int_accr.

Sie erhalten 28 Zeilen, weil 4 * 7 = 28

Das ist nicht ein seltsames Ergebnis ist; Es ist genau, was Sie mit dieser bestimmten Join-Bedingung gefragt haben. Wenn Sie nach anderen Ergebnissen suchen, müssen Sie Ihren Beitritt entsprechend anpassen.

+0

Danke ... könnten Sie auch beraten, wie Sie 4 erwartete Zeilen im obigen Fall bekommen? –

+0

@SnehalMasne Das hängt davon ab. Was ist die Logik hinter 4 Ausgangszeilen? Vielleicht brauchst du überhaupt keinen Beitritt? – Boneist

+0

Die allgemeine Logik der linken Outer Join - alle Zeilen der linken Tabelle und gemeinsame Zeilen der rechten erhalten. Das gleiche wäre im obigen Beispiel passiert, wenn es keine Duplikate gegeben hätte. Da es Duplikate gibt, bekomme ich kartesisches Ergebnis - Wie überwinde ich das? –

Verwandte Themen