我正在研究將Oracle SQL轉換爲ANSI SQL的工具。我有一個解析Oracle SQL和ANSI SQL的語法。將子樹從AST的一個部分移到另一個部分
我想從AST的where子句部分提取Oracle外部連接表達式,並在AST的from子句部分的末尾插入新的連接子句以用於匹配的select或subquery。
具有重寫規則的樹解析器可以執行這種類型的樹轉換嗎?
即採取從Oracle SQL
SELECT
a.columna, b.columnb
FROM
tablea a,
tableb b
WHERE
a.columna2 (+) = b.columnb2 (+)
AND
a.columna3 = 'foo'
AND
b.columnb3 = 'bar'
產生AST並將其轉換爲一個AST爲ANSI SQL
SELECT
a.columna, b.columnb
FROM
tablea a FULL OUTER JOIN tableb b ON (a.columna2 = b.columnb2)
WHERE
a.columna3 = 'foo'
and
b.columnb3 = 'bar'
註釋1:對於tablea
和tableb
表的引用從FROM
條款刪除並用引用相同表和表別名的JOIN
子句替換。
注2:Oracle連接條件在sql_condition比較兩端都存在OuterJoinIndicator(+)時被標識爲FULL OUTER JOIN
。注3:連接條件比較從WHERE
子句中刪除,並用於構造連接子句ON條件[刪除了OuterJoinIndicator(s)]。
只有1個語法分析Oracle SQL和我們需要的所有ANSI SQL語法。 – user2074928 2013-05-07 15:08:49
語法識別需要處理的sql_condition案例並添加可通過令牌類型搜索的「標籤」。 – user2074928 2013-05-07 15:12:28
condition_comparison : (\t(column_reference OuterJoinSign relop column_reference OuterJoinSign)\t => \t的col1a = column_reference oj1a = OuterJoinSign ROP1 = relop col1b = column_reference oj1b = OuterJoinSign \t - > ^( 't_full_join_condition' $的col1a $ oj1a $ ROP1 $ col1b $ oj1b) | \t(column_reference OuterJoinSign relop column_reference)\t => \t col2a = column_reference oj2a = OuterJoinSign ROP2 = relop col2b = column_reference \t - > ^( 't_right_join_condition' $ col2a $ oj2a $ ROP2 $ col2b) – user2074928 2013-05-07 15:12:44