甲骨文选择查询

Oracle selection query

我们有两个 tableTABLE1 和 TABLE2。

TABLE1 有 3 列,即 ROLL、LINE、AMT

 CREATE TABLE TABLE1( ROLL NUMBER(4), LINE NUMBER(2), AMT NUMBER(4,4) );

 INSERT INTO TABLE1 VALUES(101, 1, 50);
 INSERT INTO TABLE1 VALUES(102, 2, 60);

  ROLL     LINE      AMT
 -------------------------
  101        1        50
  102        2        60

TABLE2 有 6 列,即 ROLL、LINE、AMT_PRI_CD、AMT_PRI、AMT_SEC_CD、AMT_SEC.

 CREATE TABLE TABLE2 VALUES(ROLL NUMBER(4), LINE NUMBER(2), AMT_PRI_CD VARCHAR2(3), AMT_PRI NUMBER(4,4), AMT_SEC_CD VARCHAR2(3), AMT_SEC NUMBER(4,4) ); 

 INSERT INTO TABLE2 VALUES(101, 1, ‘ABCD’, 50, ‘BCDE’, 40);
 INSERT INTO TABLE2 VALUES(102, 2, ‘BCDA’, 40, ‘BCED’,  60);

  ROLL    LINE    AMT_PRI_CD    AMT_PRI    AMT_SEC_CD    AMT_SEC
 ---------------------------------------------------------------
  101      1         ABCD         50        BCDE          40
  102      2         BCDA         40        BCED          60

结果table应该是

 ROLL    LINE    AMT_PRI_CD    AMT_PRI    AMT_SEC_CD    AMT_SEC
 ---------------------------------------------------------------
 101      1       ABCD          50        ABCD            50
 102      2       BCED          60        BCED            60

从上面两个table可以看出,ROLL&LINE列是通用的,

如果 TABLE1 中的 AMT 列的值等于 TABLE2 中 AMT_PRI 列的值 select 通过填充 AMT_SEC 和 AMT_SEC_CD 列值相同的 TABLE2 中的所有列作为 AMT_PRI 和 AMT_PRI_CD 列值。

如果 TABLE1 中的 AMT 列的值等于 TABLE2 中的 AMT_SEC 列的值 select 通过填充 AMT_PRI 和 AMT_PRI_CD 列值相同的 TABLE2 中的所有列作为 AMT_SEC 和 AMT_SEC_CD 列值。

我们需要在查询时使用 CASE 吗?

您可以比较 case 表达式中的值和 return 适当的列,例如:

create table table1( 
  roll number(4), line number(2), amt number 
);
create table table2 (
  roll number(4), line number(2), 
  amt_pri_cd varchar2(4), amt_pri number,
  amt_sec_cd varchar2(4), amt_sec number 
); 

insert into table2 values(101, 1, 'ABCD', 50, 'BCDE', 40);
insert into table2 values(102, 2, 'BCDA', 40, 'BCED', 60);

insert into table1 values(101, 1, 50);
insert into table1 values(102, 2, 60);

select roll, line,
       case
         when amt = amt_pri then amt_pri_cd
         when amt = amt_sec then amt_sec_cd
       end amt_pri_cd,
       case
         when amt = amt_pri then amt_pri
         when amt = amt_sec then amt_sec
       end amt_pri,
       case
         when amt = amt_pri then amt_pri_cd
         when amt = amt_sec then amt_sec_cd
       end amt_sec_cd,
       case
         when amt = amt_pri then amt_pri
         when amt = amt_sec then amt_sec
       end amt_sec
from   table1
join   table2
using  ( roll, line );

ROLL    LINE AMT_PRI_CD   AMT_PRI AMT_SEC_CD   AMT_SEC   
 101       1 ABCD              50 ABCD              50 
 102       2 BCED              60 BCED              60