同一個問句,16 種 SQL 方言的可執行答案。當你把 BIRD 從 SQLite 搬到 Oracle、Teradata、Druid,模型的「已解決」會有多少倒退回「沒解決」?答案是:一大半。
現有的 text-to-SQL benchmark 幾乎全部跑在 SQLite 上。但真實世界的資料庫是 PostgreSQL、Oracle、Hive、Teradata、ClickHouse⋯⋯每一種的語法、內建函式、型別系統與執行語意都不一樣。於是一個很基本的問題從來沒被正面量測過:模型能不能把同一個意圖,在不同資料庫系統上都寫對?
經過數十年的標準化努力,SQL 生態依然高度分裂。各家引擎雖然都採用類 SQL 介面,但在語法、內建函式與最佳化行為上差異巨大——語意等價的查詢常常需要方言專屬的寫法,SQL 的可攜性一直是真實資料系統裡的老問題。
與此同時,LLM 把資料互動從「以 SQL 為中心」推向「以自然語言為中心」。使用者直接用自然語言表達查詢意圖,不再需要手寫方言專屬的 SQL。這帶來一個誘人的可能性:自然語言成為跨異質資料庫系統的統一介面(unified interface)。在 data agent 與自動化分析的時代,一個使用者請求可能同時涉及查詢、整合、操作多個不同的資料庫後端,而不是只面對單一系統。
問題在於,目前的 text-to-SQL 評估仍然以 SQLite 為主:
一個在某方言可執行且語意正確的查詢,換到另一個系統可能直接失敗、行為改變,或需要大幅改寫——原因包含執行語意、函式庫、排序行為、隱式型別轉換、聚合規則與方言專屬語法的差異。結果是:目前的 benchmark 設定可能高估了 text-to-SQL 系統的穩健性與普適性,同時忽略了它們對方言變異的敏感度。
UniQL 的核心設計:對齊(alignment)。UniQL 建立在 BIRD development set 之上,把 1,534 個自然語言問題對齊到 16 種 SQL 方言的可執行 SQL 標註,共 24,544 筆方言專屬 SQL。所有方言共享同一組自然語言意圖、對齊的 schema 與底層資料庫內容——這正是把「方言泛化能力」從「任務難度/schema 差異」中隔離出來的關鍵。
人工驗證、跨 16 種方言對齊同一組自然語言意圖的 SQL 實現。這是第一個能做「受控」跨方言比較的 text-to-SQL benchmark。
整合工具翻譯、LLM 翻譯、基於執行回饋的自我反思、迭代式翻譯規則演化,以及人工驗證。
開放權重與閉源 LLM 全面評測,證明現有模型距離 dialect-universal 還很遠——最強的模型平均也只解掉約一半。
另一條相關的研究線是 SQL 方言翻譯:SQLGlot、JOOQ、SQLines 這類規則式系統依賴人工維護的方言映射;MALLET(Ngom & Kraska, 2024)、RISE(Xie et al., 2026)、CrackSQL(Zhou et al., 2025)則導入 LLM、執行回饋或方言專屬規則。PARROT(Zhou et al., 2026)進一步評估跨系統的 SQL-to-SQL 翻譯。
這些工作與 UniQL 互補而非重疊:它們關注的是 SQL → SQL 的可攜性;UniQL 評估的是模型能否在對齊的跨方言條件下,直接從自然語言生成可執行的方言專屬 SQL。
| Benchmark | #Q | #SQL | #Dialect | Aligned SQL |
|---|---|---|---|---|
| WikiSQL | 80,654 | 77,840 | 1 | – |
| BIRD | 12,751 | 12,751 | 1 | – |
| Spider 1.0 | 10,181 | 5,693 | 1 | – |
| Spider 2.0-lite | 547 | 547 | 6 | ✗ |
| UniQL(本文) | 1,534 | 24,544 | 16 | ✓ |
注意 UniQL 刻意不追求問題數量:它的問題數比 BIRD 少一個數量級,但把每一題展開成 16 個方言實現。這個 trade-off 就是整篇論文的設計主張——要量測方言泛化,必須犧牲題數換取對齊性。
建構高品質的跨方言 benchmark 遠不只是翻譯 SQL 字串。翻譯後的查詢必須在目標資料庫系統上真的能跑,而且必須保留原始自然語言問題的意圖。UniQL 的做法是:一層自動化管線攔下多數案例,攔不下的全部丟給人工。
跨方言的可執行評估需要真的把 SQL 跑在實際的資料庫系統上,所以第一步是把原始 BIRD 資料庫遷移到每個目標系統。
雖然遷移的目標是盡可能保留原始 schema 與值,但一對一的精確遷移在異質 DBMS 之間並不總是可能:不同系統在型別名稱、識別字規則、大小寫敏感性、命名空間組織、保留字與支援的 constraint 上都有差異。例如有些系統透過 schema 或 user 組織資料,而不是獨立的 database namespace;有些系統對表名/欄位名有不同慣例。因此作者在遷移時做了輕量的 schema 與資料正規化:型別映射、識別字正規化、命名空間調整,以及必要的格式轉換。
給定 NL 問題 x、來源 SQLite 查詢 q_s、來源資料庫 D_s、遷移後的目標資料庫 D_t,目標是構造出在方言 τ_t 下可在 D_t 執行、且保留 q_s 語意的查詢 q_t。
翻譯出的查詢接著送進執行式驗證(execution-based verification)。令 E(q, D) 表示查詢 q 在資料庫 D 上的執行結果,只有當翻譯結果在目標資料庫上成功執行、且結果與來源執行結果等價時,才會被自動接受:
這裡有一個容易被忽略的設計決策。先前的單方言 benchmark 通常把查詢輸出轉成無序集合再比對。在跨方言建構的情境下,這會引入 false positive——排序資訊與重複筆數被丟掉了。UniQL 的自動驗證因此在查詢具有顯式排序語意時保留順序,並在無序比較中保留重複敏感的輸出。這是刻意偏向 precision 而非 recall 的保守接受準則:寧可誤拒,也不要誤收。被拒的案例全部往下一關送。
當規則式翻譯無法被自動接受時,改由 LLM 翻譯器接手,其條件包含來源 SQL、目標 schema S_t、方言資訊與當前規則集 R:
若生成的查詢仍未通過等價驗證,模型進入有界的自我反思迴圈。在第 k 輪,回饋物件 F_k 包含前一次的目標 SQL、執行錯誤與結果不匹配資訊:
這個過程重複到查詢被自動接受,或達到最大輪數為止。實作上 LLM 翻譯器用的是 GPT-5-mini,每個失敗案例最多允許 3 輪執行回饋反思,之後就路由到後續建構階段。
這是整條管線最有意思的一環:自動翻譯的失敗不被當成孤立的 query-level 錯誤處理,而是被收集成 failure log,抽象成可重用的方言轉換規則。
對每個目標方言,令 L_fail 為執行導引 refinement 後仍失敗的翻譯集合。這些失敗連同當前規則集 R^n 與方言文件 D_doc 一起被分析,產出更新後的規則集:
精煉後的規則集接著被納入後續的翻譯嘗試。這個回饋迴圈讓管線能漸進地處理重複出現的方言專屬失敗——函式改寫、型別轉換、日期時間操作、聚合行為、系統專屬語法約束等。作者用 Gemini-2.5-Pro 作為 rule summarizer,跑 3 輪規則演化。
管線因此結合了三種東西:確定性翻譯的效率、LLM 改寫的彈性,以及累積方言知識的可重用性。
經過自動翻譯、自我反思與規則精煉之後,剩下的案例送人工。人工驗證是最終的品質關卡,處理那些無法被自動執行驗證可靠接受的例子:真正的翻譯失敗、不受支援的方言構造,以及來源與目標執行結果因方言相依行為或原始 SQL 語意欠指定而不同的案例。
舉例來說:當查詢沒有完整指定 tie-breaking 時,不同系統可能回傳不同的 row order;重複敏感的輸出則需要超越單純集合比較的語意判斷。
標註流程:每個失敗案例由兩位標註者獨立審查,檢查可執行性與相對於原始 NL 問題和目標資料庫的語意一致性。若候選 SQL 無效、有歧義或語意不等價,標註者將其改寫為可執行的方言專屬查詢。分歧透過討論解決,最終標註只在達成共識後才產出。
整體而言,UniQL 的建構遵循「嚴格自動接受 + human-in-the-loop 驗證」策略:自動階段高效解決絕大多數翻譯,人工驗證處理需要語意判斷的長尾。這個流程為 15 個目標方言產出完整的可執行 SQL 覆蓋,加上原始 SQLite 標註,形成 16 方言的 benchmark。
1,534
來自 BIRD development set,涵蓋 11 個資料庫。
24,544
= 1,534 × 16,每題在每個方言都有可執行標註。
16
SQLite 為來源,其餘 15 種由管線建構。
925 / 464 / 145
Simple / Moderate / Challenging(沿用 BIRD 原始標籤)。
涵蓋的 16 種方言為:SQLite, ClickHouse, Doris, Drill, Druid, DuckDB, Hive, MySQL, Oracle, PostgreSQL, Presto, Spark, StarRocks, Teradata, Trino, T-SQL。由於所有方言共享同一組 NL 問題、對齊的 schema 與資料庫內容,UniQL 能在不把方言變異與任務/schema/領域變異混淆的情況下,做受控的方言泛化評估。
這張圖是整篇論文最有說服力的方法論論證。建構難度在方言之間差異極大:MySQL 有 1,472/1,534(96%)由 SQLGlot 直接解決,而 Teradata 只有 828(54%),需要 388 次 LLM 翻譯、218 次反思、39 次規則精煉與 61 次人工標註。Drill 更極端——LLM 翻譯 0 次,但規則演化階段吃掉 148 筆。這說明可靠的跨方言 benchmark 建構無法被化約成一次性的 SQL 翻譯,因為不同資料庫系統在語法、函式、型別處理與執行行為上暴露的長尾不相容性完全不同。
| Dialect | Tool | LLM | Reflection | Rule Refinement | Human |
|---|---|---|---|---|---|
| ClickHouse | 1300 | 142 | 63 | 12 | 17 |
| Doris | 1424 | 39 | 48 | 10 | 13 |
| Drill | 1344 | 0 | 2 | 148 | 40 |
| Druid | 1145 | 304 | 17 | 44 | 24 |
| DuckDB | 1369 | 52 | 31 | 10 | 72 |
| Hive | 959 | 195 | 151 | 100 | 129 |
| MySQL | 1472 | 20 | 26 | 6 | 10 |
| Oracle | 1166 | 157 | 164 | 22 | 25 |
| PostgreSQL | 1282 | 151 | 57 | 24 | 20 |
| Presto | 1299 | 184 | 17 | 14 | 20 |
| Spark | 1344 | 68 | 76 | 10 | 36 |
| SQLite | – | – | – | – | – |
| StarRocks | 1319 | 122 | 63 | 12 | 18 |
| T-SQL | 1368 | 106 | 35 | 11 | 14 |
| Teradata | 828 | 388 | 218 | 39 | 61 |
| Trino | 1377 | 83 | 51 | 6 | 17 |
SQLite 為來源方言,不經過建構管線。BIRD 難度切分在所有方言上都是 925 / 464 / 145。
UniQL 用 execution accuracy (EX) 作為主要指標,而且建構期的自動驗證與評估期的模型評測用的是同一套執行協定。但這個 EX 不是 BIRD 的 EX。
給定預測 SQL q̂、gold SQL q*、資料庫 B,先在同一個資料庫上執行兩者:
與把查詢輸出轉成無序集合的 BIRD 式 EX 不同,UniQL 的指標在需要時保留順序與重複度。對於具有顯式排序語意的查詢(例如含 ORDER BY),比較的是有序 list:
這防止「回傳正確的 row 但順序錯誤」的預測被誤判為正確。
對於無序查詢,結果順序被忽略,但重複度仍然保留。不是轉成 set,而是用 multiset 式比對:R̂ 的每一列都必須在 R* 中被匹配並移除,只有當所有列都精確匹配、且沒有剩餘未匹配的列時才算正確:
這避免了把「重複列數量不同」的輸出視為等價。
同一個協定,兩個階段,兩種角色。建構期:EX 是保守的接受準則——它可能拒絕某些語意上合理、但因方言相依的資料庫行為而執行結果不同的翻譯。這是刻意的:自動接受偏好 precision 而非 recall,不確定的案例路由到人工。評估期:同一個協定變成更嚴格的正確性判準,因為預測 SQL 與 gold SQL 是在同一個目標資料庫系統上執行,排序與重複度的差異應該被保留而非忽略。
讀數字時請記得這件事。UniQL 的 EX 比 BIRD 的 set-based EX 嚴格,所以本文的 SQLite 分數不能直接和你在 BIRD leaderboard 上看到的數字對照。論文自己也點出這一點:這個協定「比先前 benchmark 使用的 set-based EX 更嚴格」。
所有模型都在 inference-only 設定下評估:沒有任務專屬的 SFT、沒有 RL、沒有 few-shot 範例挑選、沒有方言專屬適配。每個測試實例給模型目標 SQL 方言、資料庫 schema 與自然語言問題,要求生成一條指定方言的可執行 SQL。所有模型共用同一個 prompt template。
| Model | ClickHouse | Doris | Drill | Druid | DuckDB | Hive | MySQL | Oracle | PostgreSQL | Presto | Spark | SQLite | StarRocks | T-SQL | Teradata | Trino | Avg. |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Closed-Source LLMs | |||||||||||||||||
| GPT-3.5-Turbo | 35.14 | 38.33 | 29.20 | 22.75 | 37.09 | 36.18 | 40.81 | 49.35 | 36.44 | 36.31 | 39.37 | 41.13 | 39.18 | 37.74 | 23.86 | 35.85 | 36.17 |
| GPT-5-mini | 51.56 | 49.80 | 48.83 | 37.74 | 52.74 | 54.04 | 54.30 | 60.56 | 51.37 | 50.98 | 52.93 | 52.48 | 51.89 | 53.85 | 35.85 | 49.02 | 50.50 |
| GPT-5.1-codex | 52.61 | 49.93 | 48.11 | 38.20 | 52.93 | 55.48 | 54.89 | 49.67 | 52.35 | 52.41 | 53.65 | 53.78 | 52.41 | 54.63 | 35.07 | 50.72 | 50.43 |
| Gemini-2.5-Pro | 53.98 | 51.76 | 50.85 | 37.42 | 56.19 | 59.32 | 57.82 | 34.29 | 53.59 | 57.89 | 56.65 | 59.78 | 54.43 | 55.61 | 38.40 | 55.61 | 52.10 |
| Claude-4.5-Sonnet | 56.84 | 52.74 | 52.28 | 39.90 | 55.28 | 59.58 | 58.54 | 63.75 | 54.95 | 58.08 | 56.13 | 59.84 | 56.06 | 56.26 | 37.74 | 56.06 | 54.63 |
| Open-Source LLMs | |||||||||||||||||
| Qwen3-1.7B | 33.90 | 35.07 | 27.57 | 18.71 | 35.27 | 36.70 | 35.85 | 43.48 | 32.92 | 32.46 | 35.27 | 35.40 | 36.31 | 32.66 | 22.43 | 34.16 | 33.01 |
| Qwen3-4B | 43.02 | 44.52 | 41.72 | 26.53 | 44.26 | 46.74 | 46.61 | 44.92 | 42.70 | 41.72 | 43.94 | 46.94 | 45.50 | 46.41 | 29.60 | 41.46 | 42.29 |
| Qwen3-8B | 46.54 | 46.15 | 44.13 | 31.29 | 47.00 | 44.85 | 50.20 | 51.11 | 46.35 | 32.99 | 47.46 | 49.09 | 47.46 | 48.57 | 29.34 | 44.20 | 44.17 |
| Qwen3-32B | 49.74 | 47.20 | 46.54 | 33.83 | 49.93 | 51.96 | 52.02 | 53.06 | 48.50 | 47.78 | 49.22 | 53.39 | 50.52 | 51.69 | 32.27 | 46.61 | 47.77 |
| Llama-3-8B-Inst | 20.80 | 23.99 | 18.45 | 16.56 | 22.29 | 22.23 | 22.03 | 31.23 | 22.43 | 22.23 | 23.34 | 23.60 | 24.12 | 21.12 | 15.45 | 22.75 | 22.04 |
| Llama-3-70B-Inst | 40.16 | 40.09 | 37.74 | 26.92 | 41.72 | 42.63 | 43.74 | 51.56 | 40.16 | 38.01 | 42.89 | 42.24 | 42.57 | 40.61 | 26.47 | 39.05 | 39.78 |
| DeepSeek-Coder-16B | 32.46 | 31.10 | 32.07 | 21.38 | 32.72 | 34.88 | 36.57 | 45.44 | 31.88 | 31.55 | 34.42 | 35.01 | 34.88 | 31.68 | 19.95 | 32.53 | 32.41 |
| DeepSeek-v4-flash | 48.04 | 46.94 | 46.28 | 34.22 | 49.02 | 52.80 | 52.54 | 57.50 | 48.50 | 49.02 | 51.56 | 53.46 | 50.20 | 51.43 | 30.90 | 47.59 | 48.12 |
| Avg. | 43.45 | 42.89 | 40.29 | 29.65 | 44.34 | 45.95 | 46.61 | 48.92 | 43.24 | 42.42 | 45.14 | 46.63 | 45.04 | 44.79 | 29.03 | 42.74 | – |
前沿 API 模型取得最強的整體結果,Claude-4.5-Sonnet 在多數方言上領先。但最佳平均 EX 也只有 54.63%,代表 UniQL 對先進 LLM 仍暴露出實質的剩餘限制。開源模型中 DeepSeek-v4-flash(48.12)與 Qwen3-32B(47.77)平均最強,但仍有相當大的改進空間。
Claude-4.5-Sonnet 在 SQLite 上 59.84%,在 Oracle 上 63.75%,但在 Teradata 上只有 37.74%。因為 UniQL 把同一組意圖對齊到各方言,這種差距可以被直接觀察到——而單方言 benchmark 會完全錯過這類 model–dialect 交互作用。
Qwen3 系列展現清楚的 scaling 趨勢:平均 EX 從 Qwen3-1.7B 的 33.01 上升到 Qwen3-4B 的 42.29、Qwen3-8B 的 44.17、Qwen3-32B 的 47.77。Llama 家族也有類似趨勢(Llama-3-70B-Inst 22.04 → 39.78,大幅超越 8B)。
但作者強調:scaling 主要提升的是整體能力,而不是消除方言層級的變異。Druid、Presto、Teradata 這些困難方言,對更大的模型依然困難。
Table 2 最後一列顯示方言之間的巨大差異。Oracle 拿到最高的平均 EX(48.92),其後是 SQLite、MySQL、Hive、Spark、StarRocks;而 Teradata(29.03)與 Druid(29.65)最難。
但這個排序不應該被單純解讀為「方言內在複雜度」的排名。作者自己給了一個很好的反例:Oracle 在建構管線裡並不容易從 SQLite 翻譯過去(1,534 題中有 157 次 LLM 翻譯 + 164 次反思),但模型在它上面表現依然很強——很可能是因為 Oracle SQL 有大量公開文件、範例與訓練曝光。反過來說,Teradata 與 Druid 在預訓練語料裡的代表性可能較低,且涉及更多系統專屬函式、型別處理、時間操作與執行行為。
因此 UniQL 揭露的不只是方言之間的語法差異,還有當前 LLM 在不同資料庫生態系上不均勻的熟悉度與穩健性。
作者用兩種 partition 進一步分析:BIRD 原始難度標籤,以及 UniQL 引入的建構來源(construction source)。這兩種切分能區分模型失敗的原因,是「原始 text-to-SQL 問題本身複雜」,還是「目標 SQL 實現落在較難的跨方言建構路徑上」。
在幾乎所有模型上,準確率都隨難度單調下降。
論文 Figure 3 另外給出全部 13 個模型在 simple 檔的 macro-average 準確率,可作為整體強弱的參考序:
| Model | Simple | Moderate | Challenging |
|---|---|---|---|
| Claude-4.5-Sonnet | 60.8 | 46.7 | 40.3 |
| Gemini-2.5-Pro | 58.2 | – | – |
| GPT-5.1-codex | 56.8 | – | – |
| GPT-5-mini | 56.7 | – | – |
| DeepSeek-v4-flash | 55.3 | – | – |
| Qwen3-32B | 54.8 | 39.2 | 30.2 |
| Qwen3-8B | 51.8 | – | – |
| Qwen3-4B | 50.5 | – | – |
| Llama-3-70B-Inst | 47.9 | – | – |
| GPT-3.5-Turbo | 45.9 | – | – |
| Qwen3-1.7B | 41.4 | – | – |
| DeepSeek-Coder-16B | 40.4 | – | – |
| Llama-3-8B-Inst | 28.2 | – | – |
「–」表示論文只在 Figure 3 的柱狀圖中呈現、正文未列出精確數值,此處不做推測。
這個趨勢說明 UniQL 保留了原始 text-to-SQL 任務的語意難度結構:跨方言生成不只是產出方言專屬語法的問題,同時也需要解決越來越複雜的查詢語意。
更有診斷價值的是第二種切分:參考 SQL 標註是在建構管線的哪一階段取得的。趨勢非常清楚——規則式工具直接解掉的例子明顯較容易;需要 LLM 翻譯、自我反思、規則演化或人工驗證的例子則普遍更難。
| Model | Tool | LLM | Reflection | EvoRule | Human |
|---|---|---|---|---|---|
| GPT-3.5-Turbo | 41.2 | 19.0 | 8.2 | 5.4 | 12.3 |
| GPT-5-mini | 54.7 | 38.3 | 26.3 | 12.4 | 29.3 |
| GPT-5.1-codex | 54.7 | 37.4 | 25.4 | 11.7 | 29.0 |
| Gemini-2.5-Pro | 56.4 | 40.3 | 28.6 | 12.4 | 23.6 |
| Claude-4.5-Sonnet | 59.1 | 44.1 | 30.7 | 14.6 | 27.7 |
| Qwen3-1.7B | 37.4 | 16.3 | 6.8 | 4.5 | 11.6 |
| Qwen3-4B | 47.0 | 25.6 | 10.9 | 8.0 | 18.9 |
| Qwen3-8B | 48.8 | 27.2 | 14.9 | 8.7 | 18.9 |
| Qwen3-32B | 52.1 | 36.2 | 19.6 | 10.0 | 20.2 |
| Llama-3-8B-Inst | 25.2 | 8.1 | 8.3 | 2.2 | 6.3 |
| Llama-3-70B-Inst | 44.7 | 21.3 | 7.9 | 6.2 | 17.6 |
| DeepSeek-Coder-16B | 36.5 | 14.8 | 11.6 | 5.4 | 11.9 |
| DeepSeek-v4-flash | 52.9 | 32.6 | 18.4 | 11.0 | 20.8 |
EvoRule 子集是整個 benchmark 最硬的部分。Claude-4.5-Sonnet 在 Tool 子集拿 59.1%,到 EvoRule 子集只剩 14.6%——掉了 44.5 個百分點。這些正是連建構管線都需要「累積方言規則知識」才能翻譯出來的長尾案例。
但 Human 子集不是最低的——這是刻意要讀懂的一點。人工驗證在 UniQL 裡不是純粹的難度標籤。有些例子進入人工階段,是因為自動驗證無法在資料庫專屬執行行為下安全地認定等價性(例如欠指定的排序、重複敏感的輸出、目標引擎差異),即使底層語意意圖是清楚的。因此建構來源切分應該被解讀為長尾與驗證複雜度的指標,而非嚴格的難度尺規。
主結果是在每個方言內部聚合問題算出來的。但因為 UniQL 是對齊的,我們可以問一個嚴格得多的問題:對同一個意圖,模型能答對幾種方言實現?
對每個問題,計算答對的方言數(0 到 16),作者稱之為 cross-dialect consistency。並額外報告 SQLite→15:在 SQLite 上答對的問題中,有多少百分比在其餘 15 個方言上也都保持正確。
| Model | Mean(/16) | All-16 (%) | SQLite→15 (%) |
|---|---|---|---|
| Closed-Source LLMs | |||
| GPT-3.5-Turbo | 5.79 | 9.13 | 22.19 |
| GPT-5-mini | 8.08 | 17.99 | 34.29 |
| GPT-5.1-codex | 8.07 | 14.34 | 26.67 |
| Gemini-2.5-Pro | 8.34 | 9.19 | 15.38 |
| Claude-4.5-Sonnet | 8.74 | 20.14 | 33.66 |
| Open-Source LLMs | |||
| Qwen3-1.7B | 5.28 | 5.80 | 16.39 |
| Qwen3-4B | 6.77 | 8.80 | 18.75 |
| Qwen3-8B | 7.17 | 12.06 | 24.57 |
| Qwen3-32B | 7.64 | 14.41 | 26.98 |
| Llama-3-8B-Inst | 3.53 | 2.54 | 10.77 |
| Llama-3-70B-Inst | 6.37 | 14.08 | 33.33 |
| DeepSeek-Coder-16B | 5.00 | 4.63 | 13.22 |
| DeepSeek-v4-flash | 7.70 | 13.89 | 25.98 |
高平均 EX 不等於跨方言正確。Claude-4.5-Sonnet 每題平均答對 8.74 個方言實現,但只有 20.14% 的問題在全部 16 個方言上都答對。Gemini-2.5-Pro 的 mean 高達 8.34,All-16 卻只有 9.19%。這代表大量問題只被「部分解決」:模型能在某些資料庫系統上正確生成 SQL,卻在另一些系統上無法表達同一個意圖。
SQLite 正確性不是跨方言穩健性的可靠代理。在 SQLite 答對的題目中,Claude-4.5-Sonnet 只有 33.66%、GPT-5-mini 只有 34.29% 在其餘所有方言上仍然正確。Gemini-2.5-Pro 更只有 15.38%——儘管它的平均表現很強。解決一個意圖的 SQLite 實現,完全不保證同一個意圖能在其他 SQL 方言上被正確實現。
這兩個視角合起來,強化了主要觀察:單方言評估是不足的。平均 EX 衡量的是「聚合過方言之後的表現」,而 All-16 一致性問的是「模型能否在所有方言實現上都保持正確」。兩者之間的巨大落差顯示,當前模型距離成為 dialect-universal 的自然語言資料庫介面還很遠。
一個值得注意的細節:Gemini-2.5-Pro 的 mean(8.34)排第二,但 All-16(9.19%)與 SQLite→15(15.38%)都墊底於閉源模型。對照 Table 2 可以看到原因——它在 Oracle 上只有 34.29%,明顯低於自己在其他方言的水準。一個方言的系統性失敗,就足以把 All-16 一致性砍掉一大截。這正是對齊式 benchmark 才能揭露的失敗模式。
作者對主實驗中表現最好的 Claude-4.5-Sonnet 做了 post-hoc 錯誤分析,把每個失敗預測歸入五個粗分類。分析基於儲存的模型預測、執行錯誤、執行結果與人工校準。
方言專屬語法無效、不支援的函式或運算子、引號與轉型問題、資料庫引擎專屬的執行錯誤。
錯誤的表或欄位參照、錯誤的 join、別名錯誤、從不恰當的關聯中選取屬性。
錯誤的字面值、缺少或多餘的謂詞、NULL 敏感條件、邊界情況、改變 cardinality 的過濾、tie-breaking 差異。
可執行或接近可執行、但結構上語意不完整或錯誤的查詢:聚合、排名、分組、巢狀、排序範圍或必要輸出欄位有誤。
不屬於上述群組的罕見失敗。
556–955
Oracle 失敗最少(556),Teradata 最多(955)。
| Dialect | Fail | Syntax/func. | Schema/ref. | Value/filter | SQL logic | Other |
|---|---|---|---|---|---|---|
| ClickHouse | 662 | 4.53 | 27.19 | 46.98 | 21.15 | 0.15 |
| Doris | 725 | 12.83 | 24.14 | 42.62 | 20.28 | 0.14 |
| Drill | 732 | 13.80 | 22.13 | 16.26 | 47.81 | 0.00 |
| Druid | 922 | 56.40 | 12.15 | 22.45 | 8.68 | 0.33 |
| DuckDB | 686 | 7.87 | 30.32 | 41.69 | 19.97 | 0.15 |
| Hive | 620 | 0.81 | 29.03 | 47.10 | 23.06 | 0.00 |
| MySQL | 636 | 4.87 | 28.77 | 45.13 | 20.91 | 0.31 |
| Oracle | 556 | 9.89 | 43.88 | 33.45 | 12.05 | 0.72 |
| PostgreSQL | 691 | 2.03 | 37.77 | 38.93 | 21.13 | 0.14 |
| Presto | 643 | 2.64 | 28.15 | 48.99 | 19.91 | 0.31 |
| Spark | 673 | 1.78 | 29.27 | 46.81 | 22.14 | 0.00 |
| SQLite | 616 | 0.65 | 28.57 | 45.62 | 24.68 | 0.49 |
| StarRocks | 674 | 6.97 | 25.82 | 45.70 | 21.51 | 0.00 |
| T-SQL | 671 | 8.49 | 25.93 | 44.71 | 20.72 | 0.15 |
| Teradata | 955 | 57.38 | 10.37 | 21.36 | 10.89 | 0.00 |
| Trino | 674 | 2.52 | 30.71 | 47.92 | 18.84 | 0.00 |
Presto、Trino、Hive、ClickHouse、Spark、SQLite、MySQL 的最大類別都是 value/filter(42–49%)。模型常常產出看起來合理的 SQL 骨架,卻無法精確對齊謂詞、值、join 或輸出屬性。
分別高達 56.40% 與 57.38%。這兩個系統的失敗更強烈地綁定在方言專屬函式、型別處理、planner 約束與執行行為上。
SQL logic 佔 47.81%,是另一種獨特模式:失敗更多來自語意不完整或結構錯誤的查詢構造,而不是表層語法。
這正是 UniQL 的動機所在:跨方言 text-to-SQL 穩健性無法從 SQLite-only 評估或單一聚合準確率推論出來,因為不同資料庫系統暴露的是質性上不同的失敗模式。一個在 SQLite 上主要犯 value/filter 錯誤的模型,換到 Teradata 上可能有一半以上的失敗是根本跑不起來。
論文 Table 5 給了四個主要錯誤類別的代表案例(SQL 有縮短以利閱讀,但保留關鍵失敗模式):
問題要求列出續讀學校中 5–17 歲學生免費餐率最低的三所。預測直接觸發 Druid planner error: HTTP 400, INVALID_INPUT——查詢無法被 plan。Gold SQL 使用顯式轉型並以 CASE 處理除法與 NULL 敏感值。預測還有次要的字面值不匹配,但主標籤依方言專屬執行失敗判定。
預測從錯誤的關聯選取 funding type,且遺漏了對 frpm 的必要參照;另有次要的聚合條件不匹配(gold 用 CAST(SUM(...)/COUNT(...)) > 400 搭配 HAVING)。
預測遵循了正確的高階聚合模式,但改變了 NULL 敏感的過濾:它移除了 enrollment 或 city 為 NULL 的列,而 gold 查詢把 NULL enrollment 視為 0(NVL)並用 city 層級的 tie-breaking——這會改變回傳的 top-5 城市。
預測只回傳 charter number,同時遺漏了 writing score 與 ranking 計算(gold 使用 RANK() OVER (ORDER BY AvgScrWrite DESC)),導致答案形狀不完整。
注意第 3、4 個例子分別發生在 Oracle 和 SQLite 上。這說明即使在模型最熟悉的方言上,失敗也不是「不會寫 SQL」,而是 NULL 語意、tie-breaking、視窗函式這類需要精確對齊 gold 語意的細節——而 UniQL 保序、保重複度的嚴格 EX 協定,正是為了把這些細節暴露出來。
論文 Appendix B 給出建構與評估用的三個 prompt template。{dialect}、{db_details}、{question}、{evidence}、{schema}、{error_logs} 等 placeholder 會以對應的資料庫、查詢與執行回饋資訊實例化。
所有 13 個模型共用這個 template,只有 {dialect}、{db_details}、{question} 會變,指令格式跨模型完全不變。這是「公平比較」的基礎。
Task Overview:
You are a data science expert. Below, you are provided with
a database schema and a natural language question. Your
task is to understand the schema and generate a valid SQL
query to answer the question.
Database system:
{dialect}
Database Schema:
{db_details}
This schema describes the database's structure, including
tables, columns, primary keys, foreign keys, and any
relevant relationships or constraints.
Question:
{question}
Evidence:
{evidence}
Instructions:
- Make sure you only output the information that is asked
in the question. If the question asks for a specific column,
make sure to only include that column in the SELECT clause,
nothing more.
- The generated query should return all of the information
asked in the question without any missing or extra
information.
- Before generating the final SQL query, please think
through the steps of how to write the query.
Output Format:
In your answer, please enclose the generated SQL query in a
code block:
```sql
-- Your SQL query
```
Take a deep breath and think step by step to find the
correct SQL query.
值得注意的是這個 prompt 有多「樸素」。沒有 schema linking、沒有 few-shot 範例、沒有方言專屬提示、沒有 self-correction 迴圈——只有一行 Database system: {dialect} 告訴模型目標方言是什麼。這是刻意的:作者要量的是 foundation model 開箱即用(out-of-the-box)的跨方言能力,而不是某個 pipeline 的能力。所以本文的數字應該被讀成下界,不是 SOTA。
對應公式 (3)。注意 {specific_rules} 就是規則演化(公式 5)累積出來的方言規則集 R,這是把迭代學到的知識注回翻譯的接口。
You are an expert SQL translator. Your task is to convert a
{source_dialect} query into an executable {target_dialect}
query.
Target {target_dialect} Schema (Reference for Exact
Table/Column Names and Types):
{schema}
Source {source_dialect} SQL:
{source_sql}
General Translation Rules:
Schema Fidelity: The provided Schema is the ABSOLUTE TRUTH.
Do not invent columns or tables.
Logic Preservation: Preserve the logic of the source SQL
(filters, joins, ordering) as much as possible, adapting
syntax to the target dialect.
Data Types: Be careful with Date/Time and String/Number
comparisons.
Specific Dialect Rules (Iteratively Refined):
{specific_rules}
Output Format:
In your answer, please enclose the translated SQL query in
a code block:
```sql
-- Your SQL query
```
對應公式 (5),用 Gemini-2.5-Pro 執行、跑 3 輪。它吃 failure log,吐出可重用的規則清單,餵回 ② 的 {specific_rules}。
You are an expert Database Administrator and SQL Architect.
We are translating SQL queries from {source_dialect} to
{target_dialect}.
We have a list of failed translations where the translated
SQL result did not match the ground truth.
Your task is to analyze these error logs and summarize
specific, actionable translation rules to fix these issues.
Target {target_dialect} Schema (Reference for Exact
Table/Column Names and Types):
{schema}
Error Logs:
{error_logs}
Instructions:
Identify common patterns of failure (e.g., date formatting,
integer division, quoting rules, NULL handling, ordering
differences).
Formulate concise rules to address these failures.
The rules should be instructions for an AI translator (e.g.,
"When translating X, always do Y").
If a failure seems to be due to ambiguous logic rather than
SQL equivalence (e.g., unpredictable sort order), note it
but prioritize strict syntax/semantics rules.
Refer to the specific Schema info provided in each error
log to understand column types (e.g., if a column is
VARCHAR or INT).
Output Format:
Return ONLY the list of rules as a bulleted list. Do not
include introductory text.
這三個 prompt 其實構成一個小型的「自我改進 benchmark 建構器」。② 翻譯 → 執行驗證 → 失敗進 ③ 反思(最多 3 輪)→ 仍失敗則進 ④,由 ③ 把失敗抽象成規則、回注 ②。這個迴圈跑 3 輪之後,剩下的才交給人工。整條管線的設計哲學是:讓自動化處理「可歸納的失敗」,讓人類處理「需要語意判斷的失敗」。
程式碼與資料在 github.com/JerryGao818/UniQL:包含各方言的 SQL 標註(data/queries/)、schema 描述(data/schemas/)、方言專屬的執行式評估器(evaluation/)、開放權重模型的 vLLM 推論腳本(inference/)、各方言的資料庫遷移腳本(migration/),以及建構管線元件(construction/)。
但 16 個方言的資料庫實例並非可下載的預建 artifact。repo 提供遷移腳本與設定檔(含 Docker/本地設定說明),但你必須自行 provision 這 16 個資料庫系統,並調整連線參數、憑證、port 與檔案系統路徑。要完整重現這篇論文,門檻在基礎設施而不在模型。
以下都是作者自己在 Section 8 明確寫出的限制,不是我加的。
UniQL 優先追求受控的跨方言對齊:同一組自然語言意圖、對齊的 schema 與資料庫內容跨 16 方言保留。這個設計讓跨方言直接比較成為可能,但也限制了目標系統專屬資料模型的使用。
資料庫遷移過程大致保留原始 BIRD schema,而 BIRD schema 是 SQLite 衍生、且多為扁平的關聯式表格。因此目前的 benchmark 沒有系統性涵蓋:PostgreSQL / BigQuery 的 JSON 查詢、Spark SQL 與 Hive 的複雜型別(array、map、struct)、ClickHouse 與 Druid 針對大規模聚合與時序分析的分析型系統特性。
UniQL 的 SQL 標註設計上是為了保留原始查詢意圖,而不是最大化方言專屬慣用法。因此即使目標系統提供更 native 的表達方式,目標 SQL 仍可能採用比較可攜的寫法。
未來工作:以 native 資料模型重新設計目標資料庫,並創造明確要求方言專屬能力的自然語言問題——JSON 運算子、巢狀資料存取、array 函式、partition-aware 查詢、時間粒度操作。這樣的擴充能補足目前的 benchmark,讓它不只評估跨方言可攜性,也能評估真實異質資料庫環境中的 dialect-native text-to-SQL 生成。
即使有更嚴格的協定,執行式驗證仍無法完全保證翻譯後的 SQL 與原始 SQL 語意等價。兩個查詢可能在當前資料庫實例上回傳相同結果,卻編碼了不同的邏輯條件——尤其當資料庫內容沒有暴露出差異時。不同的謂詞、join 或聚合條件可能在觀察到的資料上無法區分,但在其他資料庫實例上會發散。
UniQL 透過保守的自動接受、執行導引檢查,以及對歧義/長尾案例的人工驗證來緩解這個風險。但作者誠實地說:執行一致性應被理解為 benchmark 資料庫上的強經驗證據,而非語意等價的完整形式保證。
Table 3 是你該看的表。你在 SQLite/單一方言上的離線分數,對其他方言的預期正確率沒有可靠的預測力——最好的模型也只有約 1/3 的 SQLite-correct 題目能跨到其餘 15 個方言。如果你的產品要接多種後端,就得針對每個後端分別評估。
Section 4 的 EX 協定(保序、multiset)值得直接借用。BIRD 式的 set-based EX 會把「順序錯」和「重複筆數錯」判為正確,在跨方言情境下這是實質的 false positive 來源。
Table 6 是一張現成的難度地圖:SQLGlot 在 MySQL/Doris/Trino 上覆蓋率超過 89%,但在 Teradata 上只有 54%。規則演化(公式 5)的做法——把失敗抽象成可重用規則而非逐條修 query——是可以直接移植的工程模式。
先評估基礎設施成本:你需要自行 provision 16 個資料庫系統。repo 提供遷移腳本但不提供預建實例。
UniQL 引入了一個人工驗證的 benchmark,用來評估跨方言 text-to-SQL 生成:1,534 個自然語言意圖對齊到 16 種 SQL 方言、24,544 筆方言專屬標註。透過資料庫遷移、混合翻譯、執行導引驗證、迭代規則摘要與人工驗證,UniQL 能受控地評估模型是否能在不同資料庫系統間保留同一個查詢意圖。
實驗顯示當前 LLM 距離 dialect-universal 還很遠:即使是強模型,平均也只解掉約一半的 benchmark,跨方言表現差異巨大,而且經常無法把 SQLite 上的成功轉移到其他資料庫系統。這些發現凸顯了對齊式跨方言 benchmark 與 dialect-aware text-to-SQL 方法的需求。