2017-02-09 1 views
1

Hinweis: Diese Frage gilt speziell für HSQLDB und Informix.HSQLDB - Abfrage - ersten Datensatz einfügen, wenn nicht vorhanden

Ich möchte einen neuen Eintrag einfügen, wenn nicht in der Tabelle vorhanden ist, und ich weiß, dass wir die vorhandene Abfrage verwenden können basierend auf vorhandenen Eintrag einfügen.

Eg:

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

Problem: Die EXISTIERT Zustand mit einer Unterabfrage in Kombination verwendet wird, und gilt als erfüllt werden, wenn die Unteranfrage mindestens eine Zeile. Dann können wir nur in einer SELECT-, INSERT-, UPDATE- oder DELETE-Anweisung verwenden.

+0

Ihr INSERT sieht falsch aus. Wo sind die neuen Daten, die Sie einfügen möchten, wenn sie noch nicht existieren? – fredt

+0

@fredt: In der Beispielabfrage sind die neuen Daten '3', die in der SELECT-Liste und in der WHERE-Klausel der EXISTS-Unterabfrage referenziert werden. –

+0

Ich bin nicht klar, was Ihr Problem ist. Ihr 'Problem ist' Absatz umreißt, warum die INSERT-Anweisung das tut, was Sie sagen, was Sie tun wollen, damit ich nicht verstehe, wo ein Schluckauf ist. Gibt es ein anderes DBMS, das das Problem irgendwie anders behandelt? Wenn Sie über geeignete Primärschlüsseleinschränkungen verfügen, kann ein einfacher INSERT nicht eingefügt werden, wenn in der Tabelle bereits eine Zeile mit denselben Schlüsseldaten vorhanden ist. Sie müssen nur den Fehler ignorieren (Sie ignorieren eine bestimmte Fehlerbedingung, nicht alle). Sie könnten eine gespeicherte Prozedur verwenden, um das zu handhaben, wenn Sie dies wünschen. Bitte klären Sie Ihr Problem. –

Antwort

2

Dies ist die CREATE TABLE-Anweisung:

CREATE TABLE test(column1 int) 

Dies ist die INSERT-Anweisung für HSQLDB. Es nutzt die Standard-Syntax SQL und soll auch mit Informix arbeiten:

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

Dies ist die SELECT-Anweisung, die Zeilen in der Tabelle zeigen

SELECT * FROM test 

Dies ist das Ergebnis der SELECT-

COLUMN1 
------- 
3  

1 row(s) in 0 ms 

Da Informix den Tabellenkonstruktor VALUES nicht unterstützt, müssen Sie eine separate Tabelle mit nur einer Zeile erstellen, ähnlich der Oracle-Tabelle DUAL. Sie verwenden diese Tabelle dann in SELECT.

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

Es funktioniert nicht. Wie ich beschrieben habe, ist die Tabelle initial leer und in diesem Fall gibt sie 0 Datensätze als eingefügt zurück und funktioniert nie. – sivaspon

+0

Die Anweisung fügt eine Zeile mit '3' ein, wenn die Tabelle leer ist. – fredt

+0

Nein. Ich habe das gleiche mit HSQLDB versucht und es funktioniert nicht. – sivaspon

Verwandte Themen