【问题标题】:Translating MS Access Query for SQL Server为 SQL Server 翻译 MS Access 查询
【发布时间】:2020-07-05 01:34:11
【问题描述】:

我正在尝试重新创建在 MS Access 中完成的查询,现在正在 SQL Server 环境中处理。我了解 Access 中的某些 SQL 语法与 SQL Server 中的不同。网上是否有某个地方指出了主要区别,或者可以帮助将其中的一个翻译成另一个?

这是我需要更新才能在 SQL Server 中使用的查询:

  UPDATE
    dbo.TPR00100
  INNER JOIN (
    dbo.UPR10302
    LEFT JOIN dbo.B3980280 ON dbo.TPR10302.COMPTRNM = dbo.B3980280.COMPTRNM
  ) ON dbo.TPR00100.STAFFID = dbo.TPR10302.STAFFID
  SET
    dbo.B3980280.COMPTRNM = dbo.TPR10302.comptrnm,
    dbo.B3980280.BI_LOC_ID = dbo.TPR00100.locatnid
  WHERE
    (((dbo.B3980280.COMPTRNM) Is Null))

有哪些关键方面需要在 SQL Server 事务中针对该查询进行不同处理?

【问题讨论】:

  • 旁白:每当我将代码从一种 SQL 方言翻译成另一种 SQL 方言时,我发现在 " 几乎总能得到我需要的东西。例如"在 TSQL 中访问 CDate 等效项"。
  • @EricBrandt 是的,不能在 Access 中使用 UPDATEPIVOT。 T-SQL 没有这些的真正等价物。 UPDATE 可能需要重写为 3 个单独的 UPDATE/MERGE 查询,如果它涉及多个表,PIVOT 只能使用动态 SQL 处理。

标签: sql sql-server tsql ms-access sql-update


【解决方案1】:

如果发现为此使用可更新的 CTE 很方便:

with cte as (
    select
        b39.comptrnm b39_comptrnm
        b39.bssi_loc_id b39_bssi_loc_id,
        tpr.comptrnm tpr_comptrnm,
        tpr.locatnid tpr_locatnid
    from dbo.tpr00100 tpr
    inner join dbo.upr10302 upr on tpr.staffid = upr.staffid
    inner join dbo.b3980280 b39 on tpr.comptrnm = b39.comptrnm
    where b39_comptrnm is null
)
update cte 
set b39_comptrnm = tpr_comptrnm, b39_bssi_loc_id = tpr_locatnid

注意:我不太确定为什么要更新的表在原始查询中是 left joined,所以我把它变成了 `inner join 。

【讨论】:

  • 请注意,LEFT JOIN 可能是故意的。在 Access 中,UPDATELEFT JOIN 的等价物是 T-SQL 中的 MERGE。 Access 中带有外连接的UPDATE 查询将自动在不匹配的行上创建新行。
  • 是的,虽然我没有编写原始的 Access 查询,但我认为这是故意的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
相关资源
最近更新 更多