我目前正在构建一个基于以前的 MS Access 应用程序的 Shiny 应用程序。我需要在 SQL Server 中的每个 Shiny 应用程序按钮后面复制 MS Access 查询。在 R 中的 MS Access 中重用 SQL 语法的最佳方法是什么(即直接在 R 中复制粘贴 MS Access 查询)?
事实上,Access SQL 与 SQL Server 语法略有不同,因此我不能简单地使用 DBI (dbGetQuery()
、dbExecute()
、dbSendQuery()
) 或 dbplyr (sql()
)。
下面是 R 中 MS Access SQL 语法的示例。(故意留下“100%”,因为表名包含该字符串。)
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 语句中绑定(bind)”。
我建立了连接:
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 Server”
最佳答案
除了 UPDATEE...FROM
翻译之外,请考虑避免 JOIN
的嵌套,就像 MS Access 倾向于做的那样。具体来说,将所有 ON
子句移到 JOIN
子句之后,假设所有表都与 INNER JOIN
组合,该子句应该可以工作。事实上,您甚至可以将 WHERE
条件移至 ON
。
还请考虑表别名以提高速记可读性。最后,通常要更新的表列应该位于 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]
关于sql - 在 SQL Server 中转换 MS Access 更新查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63415599/