distinceとランダム行取得

解決


りな  2010-01-21 16:27:37  No: 37120

重複を許す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);


HOta  2010-01-21 17:48:52  No: 37121

同じIDが複数あるのですね。Uniqueになる条件を入れればできますよ。
ID以外に何が違うのですか?


HOta  2010-01-21 19:17:37  No: 37122

ランダムで行を取り出した後の処理なので、ランダム行にこだわると判らなくなります。
TQueryで取り出しているのですか?それなら、以前にお伝えしたTUpdateSQLを追加して、
Query1.Edit;
Query1.FieldByName('flag').AsString := '1';
Query1.Post;
で該当行だけを更新できます。


りな  2010-01-23 20:10:34  No: 37123

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へ表示・カウントしたいと思っています。

よろしくお願いいたします。


HOta  2010-01-24 00:26:14  No: 37124

この場合でしたら、選択する項目を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 + '''');
とすれば更新します。


りな  2010-01-25 07:21:24  No: 37125

HOtaさん

クエリの選択項目を変えたら、うまくいきました。どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加