私は自分が働いている多くのことに関する統計を収集して保存する必要があり、特に 1 つのテーブルのプロセスで突然問題が発生しました。これらの統計を取得するためのプロセスの関連部分には、データを一時テーブルにダンプし、そのテーブルから新しいデータをメイン テーブルに挿入するだけの作業が含まれます。だから私はこのようなものを持っています:
CREATE TABLE "TEMP_SCHEMA"."STATS_ORDERS"
(
"ORDER_NO" NUMBER(10,0) NOT NULL ENABLE,
"ORDER_DATE" DATE NOT NULL ENABLE,
"ORDER_TYPE" VARCHAR2(1 BYTE) NOT NULL ENABLE
); /
GRANT SELECT,INSERT,UPDATE,DELETE
ON "TEMP_SCHEMA"."STATS_ORDERS" TO "MY_SCHEMA"; /
CREATE TABLE "MY_SCHEMA"."STATS_ORDERS"
(
"ORDER_NO" NUMBER(10,0) NOT NULL ENABLE,
"ORDER_DATE" DATE NOT NULL ENABLE,
"ORDER_TYPE" VARCHAR2(1 BYTE) NOT NULL ENABLE,
CONSTRAINT "PK_STATS_ORDERS" PRIMARY KEY ("ORDER_NO", "ORDER_TYPE")
); /
データを "TEMP_SCHEMA"."STATS_ORDERS" にダンプした後、次のようなことを試みています。
INSERT INTO MY_SCHEMA.STATS_ORDERS (ORDER_NO,ORDER_DATE,ORDER_TYPE)
SELECT
DISTINCT TMP.ORDER_NO,TMP.ORDER_DATE,TMP.ORDER_TYPE
FROM
(SELECT DISTINCT * FROM TEMP_SCHEMA.STATS_ORDERS) TMP
LEFT JOIN MY_SCHEMA.STATS_ORDERS ORD
ON TMP.ORDER_NO = ORD.ORDER_NO AND TMP.ORDER_TYPE = ORD.ORDER_TYPE
WHERE ORD.ORDER_NO IS NULL AND ORD.ORDER_TYPE IS NULL; /
これを実行すると、次のエラーが表示されます。
SQL Error: ORA-00001: unique constraint (MY_SCHEMA.PK_STATS_ORDERS) violated
00001. 00000 - "unique constraint (%s.%s) violated"
*Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
For Trusted Oracle configured in DBMS MAC mode, you may see
this message if a duplicate entry exists at a different level.
*Action: Either remove the unique restriction or do not insert the key.
次のクエリを実行して、エラーの原因となっている行を見つけました。
SELECT ORDER_NO,ORDER_DATE,ORDER_TYPE
FROM
MY_SCHEMA.STATS_ORDERS O
INNER JOIN (
SELECT DISTINCT TMP.ORDER_NO,TMP.ORDER_DATE,TMP.ORDER_TYPE
FROM (SELECT DISTINCT * FROM TEMP_SCHEMA.STATS_ORDERS) TMP
LEFT JOIN MY_SCHEMA.STATS_ORDERS ORD
ON TMP.ORDER_NO = ORD.ORDER_NO AND TMP.ORDER_TYPE = ORD.ORDER_TYPE
WHERE ORD.ORDER_NO IS NULL AND ORD.ORDER_TYPE IS NULL
) N
ON O.ORDER_NO = N.ORDER_NO AND O.ORDER_TYPE = N.ORDER_TYPE; /
おそらく、これは違反の原因となっている行を返すはずですが、重複する可能性のあるものを明示的に除外しているため、もちろん何も返しません。
私は何を間違っていますか?
編集:私の例では、誤って元の名前を残しました。私の例の名前に変更しました。