2017-02-09 12 views
1

注:この質問は、特にHSQLDBとInformixの問題です。HSQLDB - クエリー - 最初のレコードが存在しない場合は挿入してください。

テーブルにエントリが存在しない場合は新しいエントリを挿入したいが、既存のエントリに基づいて既存のクエリを使用して挿入することができます。

例:

INSERT INTO test(column1) 
(SELECT DISTINCT 3 
FROM test 
WHERE NOT EXISTS (SELECT * FROM test WHERE column1 =3)); 

問題は:ザ条件がサブクエリと組み合わせて使用​​され、少なくとも一つの行サブクエリを返した場合、成立していると考えられるが存在します。 SELECT、INSERT、UPDATE、またはDELETEステートメントでのみ使用できます。

+0

INSERTが正しくありません。まだ存在しないときに挿入したい新しいデータはどこにありますか? – fredt

+0

@fredt:サンプルクエリでは、新しいデータは「3」で、EXISTSサブクエリの選択リストとWHERE句で参照されます。 –

+0

私はあなたの問題が何であるかはっきりしていません。 INSERTステートメントがあなたがしたいと言っていることをなぜ行うのかについてのあなたの「問題です」の段落の概要を説明しています。そのため、どこに不具合があるのか​​分かりません。問題を別の方法で処理する他のDBMSはありますか?適切な主キー制約がある場合、同じキー・データを持つ表にすでに行がある場合、単純なINSERTは挿入に失敗します。あなたがしなければならないことは、エラーを無視することです(特定のエラー条件をすべて無視するのではなく無視します)。あなたが望むなら、ストアドプロシージャを使ってそれを処理することができます。問題を明確にしてください。 –

答えて

2

これは、CREATE TABLEステートメントである:

CREATE TABLE test(column1 int) 

これはHSQLDBのためのINSERT文です。これは、SQL標準構文を使用して、同様のInformixで動作します:

INSERT INTO test(column1) 
    SELECT * FROM (VALUES (3)) 
    WHERE NOT EXISTS (SELECT * FROM test WHERE column1 =3) 

これはこれは、SELECT

の結果である表内の行

SELECT * FROM test 

を表示するSELECT文です

COLUMN1 
------- 
3  

1 row(s) in 0 ms 

InformixはVALUESテーブルコンストラクタをサポートしていないため、OracleのDUALテーブルと同様に、1つの行のみを持つ別のテーブルを作成する必要があります。 SELECT内でこのテーブルを使用します。

INSERT INTO test(column1) 
    SELECT 3 FROM single_row_table 
    WHERE NOT EXISTS (SELECT * FROM test WHERE column1 =3) 
+0

これは機能しません。私が説明したように、当初のテーブルは空であり、その場合、0レコードが挿入されたとして返され、決して動作しません。 – sivaspon

+0

テーブルが空の場合、ステートメントは1行に '3'を挿入します。 – fredt

+0

Nope。私はHSQLDBでも同じことを試みましたが、うまくいきませんでした。 – sivaspon

関連する問題