甲骨文选择查询
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
我们有两个 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