对 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
声明中对distinct
或distinctrow
的使用和预期结果感到困惑。
如果您可以在 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 的在线表格编辑器?