Joining/exist 表 Oracle 查询
Joining/exist query of tables Oracle
我有 2 个 tables TABLE1,列名为 ROLLNO 和 STATUS & TABLE2,列名为 ROLL 和 STATUS。
CREATE TABLE TABLE1 ( ROLLNO VARCHAR2(10) NOT NULL, STATUS VARCHAR2(2));
INSERT INTO TABLE1 VALUES ('1234567890', '01');
INSERT INTO TABLE1 VALUES ('1234567891', '02');
INSERT INTO TABLE1 VALUES ('1234567895', '01');
INSERT INTO TABLE1 VALUES ('1234567896', '02');
INSERT INTO TABLE1 VALUES ('1234567897', '00');
------------------------------------------------------------------------
CREATE TABLE TABLE2 ( ROLLNO VARCHAR2(10) NOT NULL, STATUS VARCHAR2(2));
INSERT INTO TABLE2 VALUES ('1234567890', '01');
INSERT INTO TABLE2 VALUES ('1234567891', '02');
INSERT INTO TABLE2 VALUES ('1234567892', '01');
INSERT INTO TABLE2 VALUES ('1234567893', '02');
INSERT INTO TABLE2 VALUES ('1234567894', '03');
INSERT INTO TABLE2 VALUES ('1234567898', '04');
---------------------------------------------------------------------------
我只想得到如下所示的输出:
ROLLNO STATUS
-----------------------
1234567890 01
1234567891 02
1234567892 01
1234567893 02
1234567894 03
1234567895 01
1234567896 02
我们需要 select 来自 table2 的状态为 01、02、03 的行和来自 table1 的状态为 01,02 的行和
如果 table1 的状态为 01、02 的行出现在 table2 中,那么我们不应该在结果 table
中输入重复的行
结果中应该有唯一的行。
我试过使用这个查询,但是这个查询对于这个问题是错误的
SELECT DISTINCT * FROM
(
SELECT T2.ROLLNO, T2.STATUS FROM TABLE2 T2
WHERE T2.STATUS IN ('01','02','03')
UNION ALL
SELECT T1.ROLLNO, T1.STATUS FROM TABLE1 T1
WHERE T1.STATUS IN ('01','02')
);
这是正确的查询吗?
也许是这样的?
SQL> select *
2 from (
3 select
4 x.*,
5 row_number() over ( partition by rollno order by tab, status ) as x
6 from (
7 select t.*, 'T1' tab from table1 t
8 where status in ('01','02','03')
9 union all
10 select t.*, 'T2' tab from table2 t
11 where status in ('01','02','03')
12 ) x
13 )
14 where x = 1;
ROLLNO ST TA X
---------- -- -- ------------------------------
1234567890 01 T1 1
1234567891 02 T1 1
1234567892 01 T2 1
1234567893 02 T2 1
1234567894 03 T2 1
1234567895 01 T1 1
1234567896 02 T1 1
我有 2 个 tables TABLE1,列名为 ROLLNO 和 STATUS & TABLE2,列名为 ROLL 和 STATUS。
CREATE TABLE TABLE1 ( ROLLNO VARCHAR2(10) NOT NULL, STATUS VARCHAR2(2));
INSERT INTO TABLE1 VALUES ('1234567890', '01');
INSERT INTO TABLE1 VALUES ('1234567891', '02');
INSERT INTO TABLE1 VALUES ('1234567895', '01');
INSERT INTO TABLE1 VALUES ('1234567896', '02');
INSERT INTO TABLE1 VALUES ('1234567897', '00');
------------------------------------------------------------------------
CREATE TABLE TABLE2 ( ROLLNO VARCHAR2(10) NOT NULL, STATUS VARCHAR2(2));
INSERT INTO TABLE2 VALUES ('1234567890', '01');
INSERT INTO TABLE2 VALUES ('1234567891', '02');
INSERT INTO TABLE2 VALUES ('1234567892', '01');
INSERT INTO TABLE2 VALUES ('1234567893', '02');
INSERT INTO TABLE2 VALUES ('1234567894', '03');
INSERT INTO TABLE2 VALUES ('1234567898', '04');
---------------------------------------------------------------------------
我只想得到如下所示的输出:
ROLLNO STATUS
-----------------------
1234567890 01
1234567891 02
1234567892 01
1234567893 02
1234567894 03
1234567895 01
1234567896 02
我们需要 select 来自 table2 的状态为 01、02、03 的行和来自 table1 的状态为 01,02 的行和 如果 table1 的状态为 01、02 的行出现在 table2 中,那么我们不应该在结果 table
中输入重复的行结果中应该有唯一的行。
我试过使用这个查询,但是这个查询对于这个问题是错误的
SELECT DISTINCT * FROM
(
SELECT T2.ROLLNO, T2.STATUS FROM TABLE2 T2
WHERE T2.STATUS IN ('01','02','03')
UNION ALL
SELECT T1.ROLLNO, T1.STATUS FROM TABLE1 T1
WHERE T1.STATUS IN ('01','02')
);
这是正确的查询吗?
也许是这样的?
SQL> select *
2 from (
3 select
4 x.*,
5 row_number() over ( partition by rollno order by tab, status ) as x
6 from (
7 select t.*, 'T1' tab from table1 t
8 where status in ('01','02','03')
9 union all
10 select t.*, 'T2' tab from table2 t
11 where status in ('01','02','03')
12 ) x
13 )
14 where x = 1;
ROLLNO ST TA X
---------- -- -- ------------------------------
1234567890 01 T1 1
1234567891 02 T1 1
1234567892 01 T2 1
1234567893 02 T2 1
1234567894 03 T2 1
1234567895 01 T1 1
1234567896 02 T1 1