sql - 在 SQL Server 中转换 MS Access 更新查询

标签 sql r ms-access dbplyr

我目前正在构建一个基于以前的 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 子句中。另外,如果 table1table4 不用于过滤,则它们是多余的。

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/

相关文章:

php - 使用 count 函数确定 if 语句中显示的内容

r - 为什么 R 使用基数排序?

r - 如何计算R中的加权和?

R在多图布局中仅在一个图上绘制插图

java - Hsqldb异常 : user lacks privilege or object not found: TABLE

ms-access - 如何压缩MS Access数据库

php - MYSQL复杂联合

mysql - 具有多个列分组依据和 where 子句的每列的最新值

sql - 查找表中值的最长序列

database - 使用表格和报告功能替代 MS Access