【问题标题】:Oracle selection queryOracle 选择查询
【发布时间】:2021-09-27 02:16:50
【问题描述】:

我们有两个表 TABLE1 和 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

结果表应该是

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

从上面两张表中,我们可以看出ROLL & LINE列是常见的,

如果 TABLE1 中 AMT 列的值等于 TABLE2 中 AMT_PRI 列的值,则通过填充与 AMT_PRI 和 AMT_PRI_CD 列值相同的 AMT_SEC 和 AMT_SEC_CD 列值来选择 TABLE2 中的所有列。

如果 TABLE1 中 AMT 列的值等于 TABLE2 中 AMT_SEC 列的值,则通过填充与 AMT_SEC 和 AMT_SEC_CD 列值相同的 AMT_PRI 和 AMT_PRI_CD 列值来选择 TABLE2 中的所有列。

我们需要使用 CASE WHEN 查询吗?

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    您可以比较 case 表达式中的值并返回相应的列,例如:

    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 
    

    【讨论】:

    • 有没有可能使用 WHERE EXISTS 语句查询来解决这个问题?
    • 为什么要使用exists
    猜你喜欢
    • 2011-03-09
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 2020-09-15
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多