5

別のテーブルから新しいテーブルにデータを一括挿入する際に問題が発生しました。ターゲットは次のように見えました。

CREATE TABLE TEST_T (
      T_GUID RAW(16) DEFAULT SYS_GUID() NOT NULL,
      T_VAL1 NUMBER(10) NOT NULL,
      T_VAL2 VARCHAR2(10) NOT NULL,
      PRIMARY KEY (T_GUID)
)

データを入力するつもりだったステートメントの簡略化されたバージョン:

INSERT INTO TEST_T (T_VAL1, T_VAL2)
SELECT DISTINCT
     CAST(SUBSTR(zip_code, 1,1) AS NUMBER) as  t_val1,
     zip_code as t_val2
FROM OTHER_TABLE_T
WHERE ...
ORDER BY t_val1

私は値を提供していないので、新しい行ごとT_GUIDに関数によって提供されるものを取得すると想定していました。SYS_GUIDしかし、何かがうまくいかず、主キーの一意性制約違反が発生します。

を削除するDISTINCTと、ステートメントは成功しますが、多くの重複エントリが取得されます。もちろん、 my で明示的にSYS_GUID()呼び出しを提供すると、SELECTまったく同じ結果になります。

ここで、単に別のものを自分のSELECT周りに配置すると、問題なく動作し、制約違反がなく、個別の行が挿入されることがわかりました。

INSERT INTO ...
SELECT x.* FROM (
    SELECT DISTINCT ...
) x

では、重複する GUID はどこから来るのでしょうか? 行の完全なセットに問題がない場合、なぜ個別に行を削除すると問題が発生するのでしょうか? SYS_GUID は呼び出しごとに一意の識別子を作成するため、明確なケースでは、句全体に対して 1 回だけ呼び出され、周囲のラッピングによって解決されるとしか想像できませんでしたSELECT。その場合の実行の違いを誰かが説明してくれれば、とてもうれしいです。

4

2 に答える 2

0

CAST を to_number() に置き換え、guid を追加します。最初に選択をテストしてから、挿入します...:

SELECT DISTINCT
    sys_guid() guid 
    To_Number(SUBSTR(zip_code, 1,1)) as  t_val1,
    zip_code as t_val2
 FROM OTHER_TABLE_T
/

個別の GUID の例:

SELECT sys_guid() gid, deptno
  FROM
 (
 SELECT distinct deptno FROM scott.emp
 )
ORDER BY deptno
/

GID                                 DEPTNO
-------------------------------------------
DC9B9132492C1A45E04011AC3EEB463A    10
DC9B9132492B1A45E04011AC3EEB463A    20
DC9B9132492A1A45E04011AC3EEB463A    30
于 2013-05-13T14:47:45.147 に答える