2016-09-27 92 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;