如何插入使用子查询连接两个表的记录

时间:2015-06-17 10:16:45

标签: sql oracle sql-insert

你好我试图插入一些连接两个表的记录和一个子查询。我会很感激help.thanks

查询

insert into rtn_det select * from tmp_rtn_det
where rtn_no in(select a.rtn_no from rtn_det a,rtn_mas b
where a.rtn_no=b.rtn_no
and a.sc_cd=b.sc_cd
and fl_mvh = '2'
and rtn_dt between '01-MAY-15' and '31-MAY-15'
and b.sc_cd='05')
and sc_cd='05'

表格:

SQL> desc rtn_mas
 Name                            Null?    Type
 ------------------------------- -------- ----
 RTN_NO                          NOT NULL VARCHAR2(6)
 SC_CD                           NOT NULL VARCHAR2(2)
 RTN_DT                                   DATE
 RSN_NO                                   VARCHAR2(1)
 BILL_NO                                  VARCHAR2(6)
 FP_ID                                    VARCHAR2(4)
 SALE_CD                         NOT NULL VARCHAR2(2)
 RTN_GR                          NOT NULL NUMBER(9,2)
 RTN_NET                         NOT NULL NUMBER(9,2)
 FL_MVH                                   VARCHAR2(1)
 USER_CD                                  VARCHAR2(2)
 W_DT                                     DATE
 CANCL                                    VARCHAR2(1)
 R_VAT                                    NUMBER(9,2)



SQL> 
SQL> 
SQL> desc rtn_det
 Name                            Null?    Type
 ------------------------------- -------- ----
 RTN_NO                          NOT NULL VARCHAR2(6)
 SC_CD                           NOT NULL VARCHAR2(2)
 TYP_CD                          NOT NULL VARCHAR2(2)
 CAT_CD                          NOT NULL VARCHAR2(2)
 PRD_CD                          NOT NULL VARCHAR2(4)
 RTN_QTY                         NOT NULL NUMBER(7,2)
 RTN_GR                          NOT NULL NUMBER(9,2)
 RTN_NET                         NOT NULL NUMBER(9,2)
 RVAT_AMT                                 NUMBER(8,2)

RTN_MAS和RTN_DET是我试图加入的两个表,我也使用了一个子查询。请告诉我我做错了什么。

来自两个表的一些数据:

 select * from rtn_det
  2  where rownum < 10
  3  /

RTN_NO SC TY CA PRD_   RTN_QTY    RTN_GR   RTN_NET  RVAT_AMT**
------ -- -- -- ---- --------- --------- --------- ---------
19026  02 09 01 1009         3       291    283.53
19027  02 09 05 1008        10       348     342.1
18347  02 09 08 1038         1        33     32.72
18347  02 09 08 1050         1        65     64.44'





   SQL> select * from rtn_mas
      2  where rownum<10
      3  /

RTN_NO SC RTN_DT    R BILL_N FP_I SA    RTN_GR   RTN_NET F US W_DT      C     R_VAT
------ -- --------- - ------ ---- -- --------- --------- - -- --------- - ---------
158699 10 27-JAN-13 7 863843 2DX6 WM    430.48    419.47 1 62 26-JAN-13        62.5
158700 10 27-JAN-13 7 863843 5498 WM    752.44    732.69 1 62 26-JAN-13          94
158702 10 27-JAN-13 7 868675 2Q91 RC    317.88    315.18 1 62 26-JAN-13       46.26
158703 10 27-JAN-13 7 867416 2Q91 WO   1356.58    1324.2 1 62 26-JAN-13      196.96
158704 10 27-JAN-13 7 867416 5847 WO      1427   1402.62 1 62 26-JAN-13         208
158706 10 27-JAN-13 7 869481 2Q91 WO    808.48    794.28 1 62 26-JAN-13      102.24

的问候, 伊夫泰哈

1 个答案:

答案 0 :(得分:0)

首先,内部查询是否返回任何行?

select a.rtn_no 
from rtn_det a,rtn_mas b
where a.rtn_no=b.rtn_no
and a.sc_cd=b.sc_cd
and fl_mvh = '2'
and rtn_dt between '01-MAY-15' and '31-MAY-15'
and b.sc_cd='05'

此外,通常最好先按日期过滤数据,至少在SQL中过滤。将where子句放在第一位允许使用日期索引,这通常会大量减少行。

没有数据很难说,但也许这个查询可以取代内部查询?

SELECT DISTINCT a.rtn_no 
FROM rtn_det a
INNER JOIN rtn_mas b
ON a.rtn_no=b.rtn_no AND a.sc_cd=b.sc_cd
WHERE rtn_dt BETWEEN '01-MAY-15' AND '31-MAY-15'
AND fl_mvh = '2'
AND b.sc_cd='05'