对 SQL Server 的 Ms Access 查询 - DistinctRow

Posted

技术标签:

【中文标题】对 SQL Server 的 Ms Access 查询 - DistinctRow【英文标题】:Ms Access query to SQL Server - DistinctRow 【发布时间】:2016-09-27 03:51:12 【问题描述】:

将这个 MS Access 查询转换为在 SQL Server 中运行的语法是什么,因为它没有 DistinctRow 关键字

UPDATE DISTINCTROW [MyTable] 
INNER JOIN [AnotherTable] ON ([MyTable].J5BINB = [AnotherTable].GKBINB) 
                          AND ([MyTable].J5BHNB = [AnotherTable].GKBHNB) 
                          AND ([MyTable].J5BDCD = [AnotherTable].GKBDCD) 
SET [AnotherTable].TessereCorso = [MyTable].[J5F7NR];

【问题讨论】:

你想达到什么目的?我不熟悉DISTINCTROW,但它似乎在UPDATE 中根本没有任何影响。查询是否应该使用MyTable 中的“第一个”J5F7NR 值更新AnotherTable?如果有多行没有DISTINCTROW,它们是否都相同 - 还是J5F7NR 不同? 我认为我们可能需要一些数据来帮助我们解决这个问题。在 Access 中,您可以运行 2 个查询并发布数据:select [MyTable].* from [MyTable] inner join [AnotherTable]...select [AnotherTable].* from [MyTable] inner join [AnotherTable]... 在两者中都使用上面的连接条件吗?我们至少需要看到 3 个连接键值。像@StevenHibble 一样,我在Update 声明中对distinctdistinctrow 的使用和预期结果感到困惑。 如果您可以在 SQL Fiddle 中提供示例数据,在 Access 中使用和不使用 DISTINCTROW 时行为不同,您可能会得到一个快速的答案。 【参考方案1】:

DISTINCTROW [MyTable] 从结果中删除重复的 MyTable 条目。示例:

select distinctrow items 
  items.item_number, items.name
from items
join orders on orders.item_id = items.id;

尽管当有多个订单时,连接会多次为您提供相同的 item_number 和 name,但 DISTINCTROW 将其减少到每个项目一行。所以整个连接只是为了确保您只选择至少存在一个订单的项目。据我所知,您在任何其他 DBMS 中都找不到 DISTINCTROW。可能是因为不需要。在检查存在时,我们当然使用EXISTS(或IN)。

您正在加入 MyTable 和 AnotherTable 并且出于某种原因期望为一个 AnotherTable 记录多次获得相同的 MyTable 记录,因此您使用 DISTINCTROW 只获得一次。如果您有两条 不同 MyTable 记录对应一个 AnotherTable 记录,您的查询将(希望)失败。

更新的作用是:

update anothertable
set tesserecorso = (select top 1 j5f7nr from mytable where mytable.j5binb = anothertable.gkbinb and ...)
where exists       (select *            from mytable where mytable.j5binb = anothertable.gkbinb and ...)

但这两次使用了大约相同的子查询。所以我们想从查询中更新。

在标准 SQL 查询中为每个 获取一条结果记录的最简单方法是聚合数据:

select *
from anothertable a
join 
(
  select j5binb, j5bhnb, j5bdcd, max(j5f7nr) as j5f7nr
  from mytable
  group by j5binb, j5bhnb, j5bdcd
) m on  m.j5binb = a.gkbinb and m.j5bhnb = a.gkbhnb and m.j5bdcd = a.gkbdcd;

如何编写可更新查询因一个 DBMS 而异。这是 SQL-Server 的最终更新语句:

update a
set a.tesserecorso = m.j5f7nr
from anothertable a
join 
(
  select j5binb, j5bhnb, j5bdcd, max(j5f7nr) as j5f7nr
  from mytable
  group by j5binb, j5bhnb, j5bdcd
) m on m.j5binb = a.gkbinb and m.j5bhnb = a.gkbhnb and m.j5bdcd = a.gkbdcd;

【讨论】:

【参考方案2】:

MS Access SQL 中的DISTINCTROW 谓词删除连接语句中表的所有字段中的重复项,而不仅仅是查询的选定字段(DISTINCT 在几乎所有 SQL 方言中都会这样做)。因此,请考虑使用DISTINCT 谓词选择派生表中的所有字段:

UPDATE [AnotherTable]
SET [AnotherTable].TessereCorso = main.[J5F7NR]
FROM 
    (SELECT DISTINCT m.* FROM [MyTable] m) As main
INNER JOIN [AnotherTable]
    ON  (main.J5BINB = [AnotherTable].GKBINB) 
    AND (main.J5BHNB = [AnotherTable].GKBHNB) 
    AND (main.J5BDCD = [AnotherTable].GKBDCD) 

【讨论】:

Close but no cigar... 原始查询更新了 38 行。这个更新 35 嗯,这是一个有根据的猜测!没有表结构、数据及其关系,很难测试。【参考方案3】:

查询的另一种变体..(懒得获取原始表)。 但就像上面的查询更新了 35 行 =,这个也是

UPDATE [Albi-Anagrafe-Associati]
SET 
[Albi-Anagrafe-Associati].CRegDitte = [055- Registri ditte].[CRegDitte], 
[Albi-Anagrafe-Associati].NIscrTribunale = [055- Registri ditte].[NIscrTribunale], 
[Albi-Anagrafe-Associati].NRegImprese = [055- Registri ditte].[NRegImprese]
FROM  [055- Registri ditte]
WHERE EXISTS(
    SELECT * 
    FROM [055- Registri ditte]-- [Albi-Anagrafe-Associati] 
    WHERE ([055- Registri ditte].GIBINB = [Albi-Anagrafe-Associati].GKBINB) 
    AND ([055- Registri ditte].GIBHNB = [Albi-Anagrafe-Associati].GKBHNB) 
    AND ([055- Registri ditte].GIBDCD = [Albi-Anagrafe-Associati].GKBDCD))

【讨论】:

【参考方案4】:
Update [AnotherTable]
Set [AnotherTable].TessereCorso = MyTable.[J5F7NR]
From [AnotherTable]
Inner Join
(
    Select Distinct [J5BINB],[5BHNB],[J5BDCD]
    ,(Select Top 1 [J5F7NR] From MyTable) as [J5F7NR]
    ,[J5BHNB]
    From MyTable
)as MyTable
On  (MyTable.J5BINB = [AnotherTable].GKBINB) 
AND (MyTable.J5BHNB = [AnotherTable].GKBHNB) 
AND (MyTable.J5BDCD = [AnotherTable].GKBDCD) 

【讨论】:

以上是关于对 SQL Server 的 Ms Access 查询 - DistinctRow的主要内容,如果未能解决你的问题,请参考以下文章

我的应用程序如何同时使用 MS Access 数据库和 SQL Server 数据库?

我可以将MS Access连接到SQL Server而不是特定的SQL Server数据库吗?

MS SQL Server / Access 的在线表格编辑器?

SQL-Server 后端、MS Access 前端:连接

使用 MS Access 2003 连接到 SQL Server 2005

将 MS SQL Server 查询结果导出到 MS Access