diff --git a/sqlglot/expressions.py b/sqlglot/expressions.py index b70a521ced..f8459a173f 100644 --- a/sqlglot/expressions.py +++ b/sqlglot/expressions.py @@ -8317,6 +8317,9 @@ def merge( if returning: merge = merge.returning(returning, dialect=dialect, copy=False, **opts) + if isinstance(using_clause := merge.args.get("using"), Alias): + using_clause.replace(alias_(using_clause.this, using_clause.args["alias"], table=True)) + return merge diff --git a/tests/dialects/test_oracle.py b/tests/dialects/test_oracle.py index bcbe8e523e..fc1002ce0b 100644 --- a/tests/dialects/test_oracle.py +++ b/tests/dialects/test_oracle.py @@ -777,3 +777,17 @@ def test_utc_time(self): self.validate_identity("UTC_TIME(6)").assert_is(exp.UtcTime) self.validate_identity("UTC_TIMESTAMP()").assert_is(exp.UtcTimestamp) self.validate_identity("UTC_TIMESTAMP(6)").assert_is(exp.UtcTimestamp) + + def test_merge_builder_alias(self): + merge_stmt = exp.merge( + "WHEN MATCHED THEN UPDATE SET my_table.col1 = source_table.col1", + "WHEN NOT MATCHED THEN INSERT (my_table.id, my_table.col1) VALUES (source_table.id, source_table.col1)", + into="my_table", + using="(SELECT * FROM something) source_table", + on="my_table.id = source_table.id", + dialect="oracle", + ) + self.assertEqual( + merge_stmt.sql("oracle"), + "MERGE INTO my_table USING (SELECT * FROM something) source_table ON my_table.id = source_table.id WHEN MATCHED THEN UPDATE SET my_table.col1 = source_table.col1 WHEN NOT MATCHED THEN INSERT (my_table.id, my_table.col1) VALUES (source_table.id, source_table.col1)", + )