Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 给出奇怪结果的联接表查询_Sql_Oracle_Select_Join - Fatal编程技术网

Sql 给出奇怪结果的联接表查询

Sql 给出奇怪结果的联接表查询,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

表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             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个其他列,它们具有不同的值。有这样的业务案例需要处理上述连接表然后处理其他列的场景。无论如何,非常感谢您的澄清:)