Sql 给出奇怪结果的联接表查询
表1-DBT_C_INT_ACCRSql 给出奇怪结果的联接表查询,sql,oracle,select,join,Sql,Oracle,Select,Join,表1-DBT_C_INT_ACCR 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
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\U c\U速率\U刷新
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
现在,当尝试使用下面的连接时,它会给出28行,而不是4行。有什么解释吗
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
因为您没有在某个唯一的表上进行连接,所以您实际上是在两个表中具有重复连接条件值的行之间进行笛卡尔连接(也称为交叉连接) 为了演示,我模拟了您的表,并添加了一个唯一标识符
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
希望您能看到dbt\u c\u int\u accr中rn=1
的行与dbt\u c\u rate\u refresh中的每一行匹配
这是因为dbt\u c\u int\u accr
中rn=1
的brch\u code
、prod\u code
和ref\u id
列与另一个表中所有7行的相同列相匹配,这取决于您的连接条件。这同样适用于dbt\u c\u int\u accr
中的其他3行
因为4*7=28,所以得到28行
这不是一个奇怪的结果;这正是你对特定连接条件的要求。如果您需要不同的结果,那么您必须相应地修改您的联接。它为任何类型的联接提供相同数量的结果。.您使用的是哪种RDM。。。mysql还是oracle?当您在多对多关系上进行连接时,它会在连接中提供多行。您的表中有7+4个完全相等的行,因此连接只执行笛卡尔(7*4)操作。你为什么期望4个?谢谢你。。。您是否也可以建议如何在上述情况下获得4个预期行?@SnehalMasne,视情况而定。获取4个输出行背后的逻辑是什么?也许您根本不需要联接?左外联接的一般逻辑—获取左表的所有行和右表的公共行。如果没有重复,上述示例中也会发生同样的情况。既然存在重复项,我得到的是笛卡尔的结果-我如何克服它?你为什么要首先尝试外部联接?你真正想解决的问题是什么?这是一个家庭作业问题,还是您真的有包含这些数据的生产表?连接行的目的是什么?加入表后,表中还有其他列需要显示吗?上面显示的只是一组必需的列。存在100个其他列,它们具有不同的值。有这样的业务案例需要处理上述连接表然后处理其他列的场景。无论如何,非常感谢您的澄清:)