distinceとランダム行取得

解決


りな  2010-01-21 07:27:37  No: 37120  IP: 192.*.*.*

重複を許す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 08:48:52  No: 37121  IP: 192.*.*.*

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

編集 削除
HOta  2010-01-21 10:17:37  No: 37122  IP: 192.*.*.*

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

編集 削除
りな  2010-01-23 11:10:34  No: 37123  IP: 192.*.*.*

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-23 15:26:14  No: 37124  IP: 192.*.*.*

この場合でしたら、選択する項目を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-24 22:21:24  No: 37125  IP: 192.*.*.*

HOtaさん

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

編集 削除