2016-12-01 2 views
-1

There:
i)は2つのテーブルa) "incidents_all"と "incidents"とシーケンス "incident_ids"です。
ii)table、インシデントには、table、incidents_allよりも主キー制約として余分な列IDがあります。
iii)「incidents_all」には重複レコードが含まれています。

目的:テーブルに一意のインシデントレコードを挿入するには、テーブルから「インシデント」を、インシデント番号と共にインシデント番号を挿入します。OracleのINSERT INTO ... SELECT ... FROM ...を使用してレコードを重複排除する方法

次のように私は、ユニークなレコードを挿入しようとしています


A)を使用して、必要なユニークされている列に一意のインデックスを作成します。

b)でユニークなレコードを「事件」の表を移入「ids」から「incidents_all」のレコードとともにシーケンス番号を選択します。

INSERT INTO "incidents" 
(
"id", 
"sl_no", 
"host_name" 
"down_since", 
"category", 
"fault_code" 
) 
SELECT 
"incident_ids".NEXTVAL AS "id", 
"incidents_all"."sl_no" AS "sl_no", 
"incidents_all"."host_name" AS "host_name", 
"incidents_all"."down_since" AS "down_since", 
"incidents_all"."category" AS "category", 
"incidents_all"."fault_code" AS "fault_code" 
FROM "incidents_all", "incident_ids"; 

ただし、「シーケンスは許可されていません!」という例外が表示されます。

シーケンス番号とともに固有のレコードを挿入する際に私を案内してください!

+0

"ids"の塊は入っていません –

+0

"incidents_all"テーブルではどの列が繰り返されますか? –

+1

小文字のテーブル名と列を使用する特別な理由はありますか? –

答えて

0

はこれを試してみてください。

INSERT INTO "incidents" 
(
"id", 
"sl_no", 
"host_name" 
"down_since", 
"category", 
"fault_code" 
) 
SELECT 
"ids".NEXTVAL AS "id", 
"incidents_all"."sl_no" AS "sl_no", 
"incidents_all"."host_name" AS "host_name", 
"incidents_all"."down_since" AS "down_since", 
"incidents_all"."category" AS "category", 
"incidents_all"."fault_code" AS "fault_code" 
FROM "incidents_all"; 

FROM句に列を含める必要はありません。

+0

これはエラーを解決しても、OPが必要とするもの、つまりテーブルから重複を削除するものではありません。 – Aleksej

0

は、このいずれかを試してみてください。

INSERT INTO "incidents" 
(
"id", 
"sl_no", 
"host_name" 
"down_since", 
"category", 
"fault_code" 
) 
SELECT 
incident_ids.NEXTVAL AS "id", -- ->!!!! 
"incidents_all"."sl_no" AS "sl_no", 
"incidents_all"."host_name" AS "host_name", 
"incidents_all"."down_since" AS "down_since", 
"incidents_all"."category" AS "category", 
"incidents_all"."fault_code" AS "fault_code" 
FROM "incidents_all"; 

あなたがシーケンスの次の値をしたいなら、あなたはsequence_name.nextvalを使用する必要があります。

幸運。

0

列がa, bで、重複しない値を挿入する同じ構造の別の列があるとします。

はあなたがその列の処理方法を決定する必要があり、次の

insert into duplicateTable(id, a, b, c) values (1, 100, 50, 1000); 
insert into duplicateTable(id, a, b, c) values (2, 100, 50, 2000); 
insert into duplicateTable(id, a, b, c) values (3, 100, 99, 9000); 
insert into duplicateTable(id, a, b, c) values (4, 999, 50, 7777); 
insert into duplicateTable(id, a, b, c) values (5, 999, 99, 0); 

のようなデータを想定すると、第二のテーブルのID

create sequence id_seq start with 1; 

のためのシーケンスを使用したいと

create table duplicateTable(id number, a number, b number, c number); 
create table uniqueTable (id number primary key, a number, b number, c number); 
あなたのユニークなキーに属していません。たとえば、あなたが a, b上のキーに基づいて重複を回避したいとあなたが与えられた夫婦 (a, b)ため cの最大値を取得したいことを、あなたが使用できることを想定:

insert into uniqueTable (id, a, b, c) 
select id_seq.nextVal, a, b, c 
from (
     select a, b, max(c) as c 
     from duplicateTable 
     group by a, b 
    ) 

SQL> select * from uniqueTable; 

     ID   A   B   C 
---------- ---------- ---------- ---------- 
     1  999   99   0 
     2  100   50  2000 
     3  100   99  9000 
     4  999   50  7777 
+0

説明のために、「インシデント」テーブルには、主キー制約として "table" "incidents_all" – AVA

+0

@AVAこれはこの場合にうまくいくはずです。それを表示するように編集 – Aleksej

0

は、http://www.dba-oracle.com/t_packages_dbms_errlog.htmとの答えを参照Bhavesh Ghodasara、

a)は、エラー・ロギング表を作成します。

CREATE TABLE err$_log_table 
    (
    ora_err_number$ NUMBER, 
    ora_err_mesg$ VARCHAR2(2000), 
    ora_err_rowid$ rowid, 
    ora_err_optyp$ VARCHAR2(2), 
    ora_err_tag$ VARCHAR2(2000) 
); 

b)の "incidents_all" からのレコードで "事件" テーブルの移入とid」からシーケンス番号を選択しますS ":テーブルにユニークなレコードを追加

INSERT INTO "incidents" 
(
"id", 
"sl_no", 
"host_name" 
"down_since", 
"category", 
"fault_code" 
) 
SELECT 
"incident_ids".NEXTVAL AS "id", 
"incidents_all"."sl_no" AS "sl_no", 
"incidents_all"."host_name" AS "host_name", 
"incidents_all"."down_since" AS "down_since", 
"incidents_all"."category" AS "category", 
"incidents_all"."fault_code" AS "fault_code" 
FROM "incidents_all" 
LOG ERRORS INTO err$_log_table ('duplicate') REJECT LIMIT UNLIMITED; 

『事件』と表にエラーを記録し、ERR $ _log_table重複レコードが発生するたびに。

関連する問題