2016-09-27 63 views
1

構文は何でしょうSQL Serverで実行するには、このMS Accessクエリを変換することがDISTINCTROWキーワードを持っていないよう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]; 
+0

達成しようとしていることは何ですか?私は 'DISTINCTROW'に精通していませんが、' UPDATE'ではここには何の効果もありません。クエリは 'MyTable'の' 'J5F7NR''の最初の値で' AnotherTable'を更新するべきですか? 'DISTINCTROW'がない複数の行がある場合、それらはすべて同じですか - ' J5F7NR'は異なっていますか? –

+0

私はこれを手助けするためにいくつかのデータが必要かもしれないと思います。 Accessで2つのクエリを実行し、データを投稿することができます: '[MyTable]内部結合[AnotherTable]から[MyTable]内部結合[AnotherTable] ... 'を選択し、[AnotherTable]。*を選択します。 .. ..両方から上の結合基準を使用していますか?少なくとも3つの結合キー値を確認する必要があります。 @StevenHibbleのように、私は 'Update'ステートメントの' distinct'または 'distinctrow'の使用と予想される結果に苦労します。 – SMM

+0

サンプルデータを[SQL Fiddle](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; 

それは、DISTINCTROWは、アイテムごとに1つの行にこれを削減するために、複数のオーダーがある場合、あなたに同じITEM_NUMBERと名前を複数回取得参加。したがって、結合全体は、少なくとも1つの順序が存在するアイテムのみを選択することを保証するためのものです。他のDBMSで私が知る限り、DISTINCTROWを見つけることはできません。おそらくそれが必要ではないからでしょう。存在を確認するときは、もちろんEXISTSを使用します(その点についてはIN)。

MyTableとAnotherTableに参加していて、1つのAnotherTableレコードに対して同じMyTableレコードを複数回取得する必要があるため、DISTINCTROWを使用して1回だけ取得します。あなたのクエリが2つあれば(うまくいけば)失敗します異なった 1つのAnotherTableレコードのMyTableレコード。

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クエリにいくつかの列に>を<ごとに1つの結果レコードを取得する最も簡単な方法は、データを集約することです:updatebleクエリを作成する方法

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; 
関連する問題