こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

oracle sqlについて

お世話になります。

Oracle Sqlでの質問を致します。
Oracleのデータで重複データを削除したく
下記の構文を書いたのですが、
右括弧がありませんと言うエラーが出てしまいます。
見た目括弧はちゃんとあると思うのですが、
どこが悪いのか分かりません。
ご親切な方、ご教示くださいます様、
宜しくお願いいたします。

         記

DELETE FROM D入庫データ
WHERE ID NOT IN
(
SELECT MIN(ID)
FROM D入庫データ
GROUP BY PPID,台車番号,入庫数量,ロット番号,TO_CHAR(登録日時,'yyyy,mm,dd')
WHERE TO_CHAR(SYSDATE,'yyyy/mm/dd)=TO_CHAR(登録日時,'yyyy/mm/dd')
);

投稿日時 - 2013-06-10 21:45:02

QNo.8128385

困ってます

質問者が選んだベストアンサー

> 但し、私はWHEREの所で、今日のデータの中の重複データを削除されるつもり
> でいたのですが、今日以前の物も全て削除されてしまいました。
> 構文に誤りがあるのでしょうか。
構文に誤りはありません。構文通りに削除されただけです。
*WHERE句とGROUP BY句は、なんか引っかかってたのですが気付きませんでした。

副問い合わせの部分で、今日(SYSDATE)の重複しているデーターのID最少値を取得しています。
DELETEでは、そのID以外をすべて削除、ですので、日付などは関係なく削除されます。
今日のみというのであれば、DELETE文にもWHERE句で日付の指定を入れてください。

DELETE FROM D入庫データ
WHERE ID NOT IN (
SELECT MIN(ID) FROM D入庫データ
WHERE TO_CHAR(SYSDATE, 'yyyy/mm/dd') = TO_CHAR(登録日時, 'yyyy/mm/dd')
GROUP BY PRID, 台車番号, 入庫数量, ロット番号, TO_CHAR(登録日時, 'yyyy,mm,dd')
)
AND TO_CHAR(SYSDATE, 'yyyy/mm/dd') = TO_CHAR(登録日時, 'yyyy/mm/dd')
;

----
NOT EXISTS句を利用した方がパフォーマンスが良くなるかもしれませんが詳しくは調べてください。

投稿日時 - 2013-06-12 21:32:40

お礼

ご親切におつきあい下さいまして誠に有り難う御座います。
大変参考になりました。本当に助かりました。

投稿日時 - 2013-06-13 01:28:19

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

ANo.2 takefuさんの回答をみて。
しまった、そんな落とし穴が。

投稿日時 - 2013-06-10 22:30:17

括弧の一部に全角のものがあります。
SYSDATEのTO_CHARの型指定にシングルクォーテーションの"閉じ"がありません。

投稿日時 - 2013-06-10 22:25:48

補足

有難うございます。

しかし、今回質問をする際構文の内容を手入力した物で
ORACLEの方ではシングルの"閉じ"は有り、また括弧も半角に
なっていました。

そして、
WHERE TO_CHAR(SYSDATE,'yyyy/mm/dd)=TO_CHAR(登録日時,'yyyy/mm/dd')
GROUP BY PPID,台車番号,入庫数量,ロット番号,TO_CHAR(登録日時,'yyyy,mm,dd')
と1行入れ替えましたらエラーがかからず動きました。

但し、私はWHEREの所で、今日のデータの中の重複データを削除されるつもり
でいたのですが、今日以前の物も全て削除されてしまいました。
構文に誤りがあるのでしょうか。
お分かりになる様でしたらご教示下さいます様、宜しくお願い致します。

投稿日時 - 2013-06-11 22:34:48

ANo.1

引用符に着目。

> WHERE TO_CHAR(SYSDATE,'yyyy/mm/dd)=TO_CHAR(登録日時,'yyyy/mm/dd')

たぶん早い者勝ちの回答。

投稿日時 - 2013-06-10 22:21:18

あなたにオススメの質問