diff --git a/packages/sqltree/src/dumpSqlCommand.ts b/packages/sqltree/src/dumpSqlCommand.ts
index e8286bafb..b3b9373a4 100644
--- a/packages/sqltree/src/dumpSqlCommand.ts
+++ b/packages/sqltree/src/dumpSqlCommand.ts
@@ -1,7 +1,7 @@
import type { SqlDumper } from 'dbgate-types';
import { Command, Select, Update, Delete, Insert } from './types';
import { dumpSqlExpression } from './dumpSqlExpression';
-import { dumpSqlFromDefinition, dumpSqlSourceRef } from './dumpSqlSource';
+import { dumpSqlFromDefinition, dumpSqlSourceDef, dumpSqlSourceRef } from './dumpSqlSource';
import { dumpSqlCondition } from './dumpSqlCondition';
export function dumpSqlSelect(dmp: SqlDumper, cmd: Select) {
@@ -115,7 +115,10 @@ export function dumpSqlInsert(dmp: SqlDumper, cmd: Insert) {
cmd.fields.map(x => x.targetColumn)
);
dmp.putCollection(',', cmd.fields, x => dumpSqlExpression(dmp, x));
- if (dmp.dialect.requireFromDual) {
+ if (cmd.whereNotExistsSource) {
+ dmp.put(' ^from ');
+ dumpSqlSourceDef(dmp, cmd.whereNotExistsSource);
+ } else if (dmp.dialect.requireFromDual) {
dmp.put(' ^from ^dual ');
}
dmp.put(' ^where ^not ^exists (^select * ^from %f ^where ', cmd.targetTable);
diff --git a/packages/sqltree/src/types.ts b/packages/sqltree/src/types.ts
index bce0e61d3..493745059 100644
--- a/packages/sqltree/src/types.ts
+++ b/packages/sqltree/src/types.ts
@@ -44,6 +44,7 @@ export interface Insert {
fields: UpdateField[];
targetTable: NamedObjectInfo;
insertWhereNotExistsCondition?: Condition;
+ whereNotExistsSource?: Source;
}
export interface AllowIdentityInsert {
diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte
index 6dfc28d17..3ea5c6037 100644
--- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte
+++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte
@@ -1,6 +1,7 @@