【问题标题】:Joining/exist query of tables Oracle表Oracle的加入/存在查询
【发布时间】:2021-06-10 10:23:10
【问题描述】:

我有 2 个表 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

我们需要从 table2 中选择状态为 01、02、03 的行,从 table1 中选择状态为 01,02 和 如果 table1 的状态为 01、02 的行在 table2 中存在,那么我们不应该在结果表中输入重复的行

结果中应该有唯一的行。

我尝试使用这个查询,但是这个查询对于这个问题是错误的

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')
);

这是正确的查询吗?

【问题讨论】:

  • 为什么那个查询(以及康纳回答中的那个)是“错误的”?这是一个家庭作业问题吗?如果是这样,您可以使用哪些查询的实际限制是什么? (此外,如果您使用UNION 而不是UNION ALL,则可以避免显式的DISTINCT 步骤,因为UNION 输出两个查询的不同结果集。)

标签: oracle oracle-sqldeveloper


【解决方案1】:

也许是这样的?

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

【讨论】:

  • ....是的,这可能是查询,但除了您发布的查询之外,还有其他方法可以编写查询
  • 除了你的查询和我的查询之外,还有没有其他查询可以解决这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多