重複を許すIDを使用しているとき、同じIDをまとめて、そのなかの1つだけにフラグを立てるという処理をしたいとおもっています。
以下の命令文で実行すると、distinctされたIDすべてが更新されてしまいます。アドバイスいただけないでしょうか?
delphi4 oracle8iを使ってます。sqlplusで実行した場合も、同様の結果が得られました。
sql.add('update table set flag = ''1'' where id');
sql.add('in (select distinct ID from (select dbm_random.random() as rand');
sql.add(', ID from table order by rand) where rownom <= 20);
同じIDが複数あるのですね。Uniqueになる条件を入れればできますよ。
ID以外に何が違うのですか?
ランダムで行を取り出した後の処理なので、ランダム行にこだわると判らなくなります。
TQueryで取り出しているのですか?それなら、以前にお伝えしたTUpdateSQLを追加して、
Query1.Edit;
Query1.FieldByName('flag').AsString := '1';
Query1.Post;
で該当行だけを更新できます。
HOtaさんの助言のおかげで、かなり解決まで近づくことができました。
ちなみに、queryでIDと名前のみを指定して、select distinct ID, NAMEでデータをDBGridに出力して、query.recordcountで件数を数えると、同じID・NAMEをもつ重複データが5件あるとしたら、5件として表示して・数えてしまうのですけど、どのようにしたら、5件分の重複データを1件として表示・カウントすることができますか?
たとえば、ID/NAME 101 花子 101 花子 101 花子 101 花子 101 花子 のデータを1件としてDBGridへ表示・カウントしたいと思っています。
よろしくお願いいたします。
この場合でしたら、選択する項目をID, NAMEにしてそのまま表示すれば1件になります。これをDBGridへ接続すれば一件のデーターを表示します。
sql.add('update table set flag = ''1''');
sql.add(' where id = ' + Query1.FIeldByName('ID').AsString);
sql.add(' and Name = ''' + Query1.FIeldByName('Name').AsString + '''');
とすれば更新します。
HOtaさん
クエリの選択項目を変えたら、うまくいきました。どうもありがとうございました。
ツイート | ![]() |