dポイントプレゼントキャンペーン実施中!

現在ACCESS2000で使用しているモジュールを、SQLServer上で動かすことになり、その移植作業で難航しております。皆さんのお知恵をお借りしたく思います。

具体的には重複レコードのあるテーブルから重複を省いたテーブルを作るという処理で、FIRST関数がSQLServerで使えなくて困っています。以下はACCESSでのSQL文です。

INSERT INTO tbl2(fld1,fld2,fld3) SELECT (tbl1.fld1),
First(tbl1.fld2) AS fld2の先頭,
Count(tbl1.fld3) AS カウント
FROM tbl1
GROUP BY tbl1.fld1;

よろしくお願いします。

A 回答 (4件)

これでいけるでしょう。



INSERT INTO tbl2(fld1,fld2,fld3)
select Q.fld1,(select top 1 fld2 from tbl1 T1
where T1.fld1 = Q.fld1 order by T1.キーとなる項目),Q.count_fld3
from (select fld1,count(fld3) as count_fld3 from tbl1 group by fld1) Q
    • good
    • 0
この回答へのお礼

なるほどtopを使えばいいんですね。大変参考になりました。ありがとうございました。

お礼日時:2005/04/26 10:08

#2です


まず重複のないように tbl2 に出力し、その後集計関数を使用して UPDATE するのではまずいのでしょうか。

また最初から GROUP BY でやるとして First ではなく Min などでは駄目ですか?

この回答への補足

レコード件数が数万件あるため、insertとupdateを分けてしまうと、ユニークなフィールドを使って数万回updateしないとならないために1つのSQL文で処理をしようとしています。

Min関数は最小値を求めるため、期待値の先頭の値は返してくれません。

補足日時:2005/04/25 17:59
    • good
    • 0
この回答へのお礼

迅速かつ複数回のご回答ありがとうございました。大変感謝してます。またの機会がありましたら、よろしくお願いします。

お礼日時:2005/04/26 10:09

INSERT tbl2(fld1)


SELECT (tbl1.fld1),
FROM tbl1 LEFT JOIN tbl2 ON tbl1.ID = tbl2.ID
WHERE (((tbl2.ID) Is Null));

ではどうでしょうか?

この回答への補足

補足いたします。tbl2はtbl1に対するワークテーブルです。
『tbl1のレコードの中で、fld1が重複しないようにしてtbl2へレコードを移す。また重複のあるレコードについては、その重複する数をカウントしてfld3にセットし、fld2については最初に出てくるレコードの値をtbl2にセットする。』
ということを実現したいと思っています。
質問文がつたなく、わかりづらいと思いますが、よろしくお願いします。

補足日時:2005/04/25 13:15
    • good
    • 0

ODBCは当然知っていますよね?


http://e-words.jp/w/ODBC.html

この回答への補足

補足させていただきます。ACCESSではGROUP BY句を使った場合に集計をかける関数が11種類ありますが、SQLServer上では5種類しかないように思われます。今回はその5種類にないFirst関数を使って集計をかけている場合についての質問です。
質問文が拙くご迷惑おかけしますが、よろしくお願いします。

補足日時:2005/04/25 13:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!