網頁

2017年8月16日 星期三

Transform SQL from Access to MySQL or others

情境

原先架構在 MS 的 Access 所以會有 mdb 檔案, 在 Access 裡頭可以看到一些既存的 Query 點 Design View 之後再去視窗上方按右鍵可以看到 SQL View

困境

把這樣的一串 SQL 丟到轉好的 phpMySQL 去執行是會發生問題的一堆 Syntax Error

原因

當初設計 Table 的人, 名稱設計不良用了空白在 table name, 導致 SQL 語法中要用到很多 [ ] 去把包含空白的 table 包起來。

解法



使用 ` (數字一左方, tab 上方那顆鍵, 不是單引號) 去替代原本的中括號 [ ]。還有在此例中把原先的 "No" 改成 "FALSE"


範例

MS Access 出來的 SQL

1
2
3
SELECT [Chip Name Table].[Chip Name], [9600 Chip Data Table].[Package ID], [9600 Chip Data Table].[Skb IDNa #1], [9600 Chip Data Table].[Model ID], [Mfr Table].[Mfr Name], [Mfr Table].[Mfr ID], [9600 Chip Data Table].[Release Version], [SKB Table].[Skb IDNa], [Socket Name Table].[Socket Name ID]
FROM [Socket Name Table] INNER JOIN ([SKB Table] INNER JOIN ([Mfr Table] INNER JOIN ([9600 Chip Data Table] INNER JOIN [Chip Name Table] ON [9600 Chip Data Table].[Chip list ID for 9600] = [Chip Name Table].[Chip List ID for 9600]) ON [Mfr Table].[Mfr ID] = [Chip Name Table].[Mfr ID]) ON [SKB Table].[Skb IDNa] = [9600 Chip Data Table].[Skb IDNa #1]) ON [Socket Name Table].[Socket Name ID] = [SKB Table].[Socket Name ID]
WHERE ((([9600 Chip Data Table].[Release Version])<>"NV") AND (([Chip Name Table].[Chip List ID for 9600])>0 And ([Chip Name Table].[Chip List ID for 9600]) Is Not Null));

經過修正後的 SQL 就可以順利丟到 phpMySQL 去執行囉

1
2
3
SELECT `Chip Name Table`.`Chip Name`, `9600 Chip Data Table`.`Package ID`, `9600 Chip Data Table`.`Skb IDNa #1`, `9600 Chip Data Table`.`Model ID`, `Mfr Table`.`Mfr Name`, `Mfr Table`.`Mfr ID`, `9600 Chip Data Table`.`Release Version`, `SKB Table`.`Skb IDNa`, `Socket Name Table`.`Socket Name ID`, `9600 Chip Data Table`.Testing
FROM `Socket Name Table` INNER JOIN (`SKB Table` INNER JOIN (`Mfr Table` INNER JOIN (`9600 Chip Data Table` INNER JOIN `Chip Name Table` ON `9600 Chip Data Table`.`Chip list ID for 9600` = `Chip Name Table`.`Chip List ID for 9600`) ON `Mfr Table`.`Mfr ID` = `Chip Name Table`.`Mfr ID`) ON `SKB Table`.`Skb IDNa` = `9600 Chip Data Table`.`Skb IDNa #1`) ON `Socket Name Table`.`Socket Name ID` = `SKB Table`.`Socket Name ID`
WHERE (((`9600 Chip Data Table`.`Release Version`)<>"NV") AND ((`9600 Chip Data Table`.Testing)=FALSE) AND ((`Chip Name Table`.`Chip List ID for 9600`)>0 And (`Chip Name Table`.`Chip List ID for 9600`) Is Not Null));

沒有留言:

張貼留言

Python TypeError: 'module' object is not callable

程式碼其實相當簡單 import random random.random() 那問題出在哪?出在當初的檔名取名為 random.py 結果造成 Python 在 import 的時候造成問題。所以在取名Python 的檔名時,切記不要取成跟 Default Module...