2016-09-27 137 views
1

什么将语法是这个MS Access查询到SQL Server中运行转换,因为它不具有DISTINCTROW关键字女士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]; 
+0

你想达到什么目的?我对'DISTINCTROW'不熟悉,但它似乎在'UPDATE'中根本没有任何效果。查询是否需要在MyTable中用“第一个”J5F7NR值更新'AnotherTable'?如果有多行没有'DISTINCTROW',它们都是一样的 - 还是'J5F7NR'不同? –

+0

我想我们可能需要一些数据来帮助我们。在Access中,您可以运行2个查询并发布数据:从[MyTable] inner join [AnotherTable] ...中选择[MyTable]。*并从[MyTable] inner join [AnotherTable]中选择[AnotherTable]。*。 ..'使用上面的连接标准?我们需要看到至少3个连接键值。像@StevenHibble一样,我在'Update'语句中使用'distinct'或'distinctrow'的预期结果。 – SMM

+0

如果您可以在[SQL小提琴](http:// sqlfiddle。com /),在Access中使用和不使用DISTINCTROW时的行为不同,您可能会得到一个快速答案。 – Andre

回答

0
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) 
1

DISTINCTROW谓语MS Access SQL删除连接语句中表的所有字段中的重复项,而不仅仅是选定的查询字段(实际上所有SQL语言都使用DISTINCT)。所以考虑选择的所有字段在派生表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) 
+0

关闭但没有雪茄...原始查询更新38行。这一个更新35 – Eminem

+1

那么这是一个受过教育的猜测!没有表格结构,数据及其关系,很难测试。 – Parfait

0

查询的另一种变体。(懒得来获得原始表)。 但是,像上述查询更新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)) 
3

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

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

尽管的加入让你的ITEM_NUMBER相同的名字和多次时,有不止一个数量级呢,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; 

如何写updateble查询是从一个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;