从创建重复记录中选择时创建表

时间:2019-08-17 04:26:54

标签: sql oracle create-table

我试图创建一个表作为从另一个表中选择重复创建的表。这意味着我的SQL语句将向我返回大约1100万行,而我的新表将向我返回1500万行。

我也没有尝试使用创建表,而是尝试创建表表并将其插入到select ...

我能够找出一些重复的记录,但不知道为什么,因为在我的select语句中,这些记录仅出现一次。

创建表语句:

Create Consolidated_Table as 
select b.* 
from transaction_Table b,
     table_reference c 
where (   ref_1 in (c.field_1, c.field_2, c.field_3) 
       or ref_2 in (c.field_1, c.field_2, c.field_3)
      )

我的select语句和新表中的记录数应该相符。

3 个答案:

答案 0 :(得分:1)

这是因为where子句未充分限制行数。

这是一个基于Scott的empdept表的示例,这些表当然不包含数百万行,但是-它们所包含的内容足以显示可能发生的情况。

DEPT表包含4行,代表您的transaction_table。这意味着您希望结果也包含4行,对吧?

SQL> select * from dept;

DEPTNO DNAME          LOC

    10 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON

好;现在,您的查询已应用于Scott的表:

SQL> select d.*
  2  from emp e,
  3       dept d
  4  where e.job in ('CLERK', 'MANAGER')
  5     or e.deptno in (10, 20);

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        10 ACCOUNTING     NEW YORK
        10 ACCOUNTING     NEW YORK
        10 ACCOUNTING     NEW YORK
        10 ACCOUNTING     NEW YORK
        10 ACCOUNTING     NEW YORK
        10 ACCOUNTING     NEW YORK
        10 ACCOUNTING     NEW YORK
        10 ACCOUNTING     NEW YORK
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        20 RESEARCH       DALLAS
        20 RESEARCH       DALLAS
        20 RESEARCH       DALLAS
        20 RESEARCH       DALLAS
        20 RESEARCH       DALLAS
        20 RESEARCH       DALLAS
        20 RESEARCH       DALLAS
        20 RESEARCH       DALLAS
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        40 OPERATIONS     BOSTON
        40 OPERATIONS     BOSTON
        40 OPERATIONS     BOSTON
        40 OPERATIONS     BOSTON
        40 OPERATIONS     BOSTON
        40 OPERATIONS     BOSTON
        40 OPERATIONS     BOSTON
        40 OPERATIONS     BOSTON
        40 OPERATIONS     BOSTON

40 rows selected.

SQL>

看来您必须考虑一下。 也许 distinct对其进行了修复;我不知道,但是你可以尝试。

SQL> select distinct d.*
  2  from emp e,
  3       dept d
  4  where e.job in ('CLERK', 'MANAGER')
  5     or e.deptno in (10, 20);

    DEPTNO DNAME          LOC
---------- -------------- -------------
        20 RESEARCH       DALLAS
        40 OPERATIONS     BOSTON
        10 ACCOUNTING     NEW YORK
        30 SALES          CHICAGO

SQL>

答案 1 :(得分:0)

我认为您的查询逻辑应该像这样...

INSERT INTO NewTable
(
    rollNo,NAME,marks
)
SELECT  t1.rollNo,
        t1.NAME,
        t1.marks
FROM OldTable t1
WHERE NOT EXISTS
(
    SELECT rollNo FROM NewTable t2
    WHERE t2.rollNo=t1.rollNo
)   

答案 2 :(得分:0)

我建议您将SQL重写为:

SELECT tt.*
  FROM TRANSACTION_TABLE tt
  WHERE tt.REF_1 IN (SELECT FIELD_1 FROM TABLE_REFERENCE UNION ALL
                     SELECT FIELD_2 FROM TABLE_REFERENCE UNION ALL
                     SELECT FIELD_3 FROM TABLE_REFERENCE) OR
        tt.REF_2 IN (SELECT FIELD_1 FROM TABLE_REFERENCE UNION ALL
                     SELECT FIELD_2 FROM TABLE_REFERENCE UNION ALL
                     SELECT FIELD_3 FROM TABLE_REFERENCE)

两个查询之间的区别在于您的查询正在联接TRANSACTION_TABLETABLE_REFERENCE,并且在联接条件上有多个匹配项时将创建多行。不论显示在TABLE_REFERENCE中有多少匹配项,上面显示的查询仅使您从TRANSACTION_TABLE返回一行。

请注意,此查询突出显示了在原始查询中可能不明显的问题。它们都将为您返回TRANSACTION_TABLE中所有行,其中REF_1REF_2字段中的值出现在FIELD_1FIELD_2或{{ 1}}在TABLE_REFERENCE表中的 any 行中。如果那是您想要的,那很好-但是,如果不是,它可能会解释为什么您得到的结果与预期的结果不符。