在 SQL 服务器中转换 MS Access 更新查询
Convert an MS Access update query in SQL Server
我目前正在构建一个基于以前的 MS Access 应用程序的 Shiny 应用程序。我需要在 SQL 服务器中的每个闪亮应用程序按钮后面复制 MS Access 查询。在 R 的 MS Access 中重用 SQL 语法的最佳方法是什么(即直接在 R 中复制粘贴 MS Access 查询)?
事实上,Access SQL 与 SQL 服务器语法略有不同,因此我不能简单地使用 DBI(dbGetQuery()
、dbExecute()
、dbSendQuery()
) 或 dbplyr (sql()
).
这是一个在 R 中使用 MS Access SQL 语法的示例。(“100%”是故意留下的,因为 table 名称包含该字符串。)
UPDATE [table1]
INNER JOIN ([table2 100%]
INNER JOIN ([table3]
INNER JOIN table4
ON ([table3].[col1] = table4.[col1])
AND ([table3].col2 = table4.col2))
ON ([table2 100%].[col1] = [table3].[col1])
AND ([table2 100%].[col2] = [table3].[col2]))
ON [table1].col1 = [table3].col1
SET [table2 100%].[col2] = [table3]![col2]
WHERE ((([table3].[colY])<>0) AND (([table3].[colZ])=True));
导致 R 控制台中出现以下错误消息:
Erreur : nanodbc/nanodbc.cpp:1617: 42000: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'INNER'. [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'table3'. [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared.
当我调整查询时,我还得到:“多部分标识符......无法绑定在 Join 语句中”。
我与 :
建立了连接
con <- DBI::dbConnect(odbc::odbc(), driver = params.SQL.driver,
server = params.SQL.server, database = params.SQL.database,
encoding = params.SQL.encoding)
其中 params.SQL.server = "SQL 服务器"
Access 有一个非常奇怪和非典型的 UPDATE
语法与连接允许它同时更新多个 tables 和合并数据(添加行到 tables)。
SQL 服务器有不同的语法,您需要明确说明要更新的 table。
然而,重写很简单:
在 UPDATE
关键字后列出您要更新的 table。
将所有联接(包括 table)移动到 FROM
子句。
此外,在 SQL 服务器中没有感叹号而不是点,但为了兼容性,我建议您在 Access 中也避免使用感叹号。
UPDATE [table1]
SET [table2 100%].[col2] = [table3].[col2]
FROM [table1]
INNER JOIN ([table2 100%]
INNER JOIN ([table3]
INNER JOIN table4
ON ([table3].[col1] = table4.[col1])
AND ([table3].col2 = table4.col2))
ON ([table2 100%].[col1] = [table3].[col1])
AND ([table2 100%].[col2] = [table3].[col2]))
ON [table1].col1 = [table3].col1
WHERE ((([table3].[colY])<>0) AND (([table3].[colZ])=True));
除了 UPDATEE...FROM
翻译之外,考虑避免像 MS Access 那样嵌套 JOIN
。具体来说,将所有 ON
子句移动到 JOIN
子句之后,如果所有 table 都与 INNER JOIN
组合,这些子句应该有效。事实上,您甚至可以将 WHERE
条件移动到 ON
.
还考虑 table 别名以获得 short-hand 可读性。最后,通常要更新的 table 列应该在 FROM
子句中。另外,如果 table1
和 table4
不用于过滤,则它们是多余的。
UPDATE [t2] -- USING ALIAS
SET [t2].[col2] = [t3].[col2]
FROM [table2 100%] t2 -- MOVED DUE TO SET COLUMN REFERENCE
INNER JOIN [table3] t3
ON [t3].[col1] = [t2].[col1]
AND [t3].[col2] = [t2].[col2]
AND [t3].[colY] <> 0
AND [t3].[colZ] = 1 -- NO True CONSTANT IN SQL SERVER
INNER JOIN [table1] t1
ON [t1].[col1] = [t3].[col1]
INNER JOIN table4 t4
ON t4.[col1] = [t3].[col1]
AND t4.[col2] = [t3].[col2]
我目前正在构建一个基于以前的 MS Access 应用程序的 Shiny 应用程序。我需要在 SQL 服务器中的每个闪亮应用程序按钮后面复制 MS Access 查询。在 R 的 MS Access 中重用 SQL 语法的最佳方法是什么(即直接在 R 中复制粘贴 MS Access 查询)?
事实上,Access SQL 与 SQL 服务器语法略有不同,因此我不能简单地使用 DBI(dbGetQuery()
、dbExecute()
、dbSendQuery()
) 或 dbplyr (sql()
).
这是一个在 R 中使用 MS Access SQL 语法的示例。(“100%”是故意留下的,因为 table 名称包含该字符串。)
UPDATE [table1]
INNER JOIN ([table2 100%]
INNER JOIN ([table3]
INNER JOIN table4
ON ([table3].[col1] = table4.[col1])
AND ([table3].col2 = table4.col2))
ON ([table2 100%].[col1] = [table3].[col1])
AND ([table2 100%].[col2] = [table3].[col2]))
ON [table1].col1 = [table3].col1
SET [table2 100%].[col2] = [table3]![col2]
WHERE ((([table3].[colY])<>0) AND (([table3].[colZ])=True));
导致 R 控制台中出现以下错误消息:
Erreur : nanodbc/nanodbc.cpp:1617: 42000: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'INNER'. [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'table3'. [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared.
当我调整查询时,我还得到:“多部分标识符......无法绑定在 Join 语句中”。
我与 :
建立了连接con <- DBI::dbConnect(odbc::odbc(), driver = params.SQL.driver,
server = params.SQL.server, database = params.SQL.database,
encoding = params.SQL.encoding)
其中 params.SQL.server = "SQL 服务器"
Access 有一个非常奇怪和非典型的 UPDATE
语法与连接允许它同时更新多个 tables 和合并数据(添加行到 tables)。
SQL 服务器有不同的语法,您需要明确说明要更新的 table。
然而,重写很简单:
在
UPDATE
关键字后列出您要更新的 table。将所有联接(包括 table)移动到
FROM
子句。此外,在 SQL 服务器中没有感叹号而不是点,但为了兼容性,我建议您在 Access 中也避免使用感叹号。
UPDATE [table1]
SET [table2 100%].[col2] = [table3].[col2]
FROM [table1]
INNER JOIN ([table2 100%]
INNER JOIN ([table3]
INNER JOIN table4
ON ([table3].[col1] = table4.[col1])
AND ([table3].col2 = table4.col2))
ON ([table2 100%].[col1] = [table3].[col1])
AND ([table2 100%].[col2] = [table3].[col2]))
ON [table1].col1 = [table3].col1
WHERE ((([table3].[colY])<>0) AND (([table3].[colZ])=True));
除了 UPDATEE...FROM
翻译之外,考虑避免像 MS Access 那样嵌套 JOIN
。具体来说,将所有 ON
子句移动到 JOIN
子句之后,如果所有 table 都与 INNER JOIN
组合,这些子句应该有效。事实上,您甚至可以将 WHERE
条件移动到 ON
.
还考虑 table 别名以获得 short-hand 可读性。最后,通常要更新的 table 列应该在 FROM
子句中。另外,如果 table1
和 table4
不用于过滤,则它们是多余的。
UPDATE [t2] -- USING ALIAS
SET [t2].[col2] = [t3].[col2]
FROM [table2 100%] t2 -- MOVED DUE TO SET COLUMN REFERENCE
INNER JOIN [table3] t3
ON [t3].[col1] = [t2].[col1]
AND [t3].[col2] = [t2].[col2]
AND [t3].[colY] <> 0
AND [t3].[colZ] = 1 -- NO True CONSTANT IN SQL SERVER
INNER JOIN [table1] t1
ON [t1].[col1] = [t3].[col1]
INNER JOIN table4 t4
ON t4.[col1] = [t3].[col1]
AND t4.[col2] = [t3].[col2]