• ベストアンサー
  • 困ってます

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') );

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数270
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.4
noname#189141

> 但し、私は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句を利用した方がパフォーマンスが良くなるかもしれませんが詳しくは調べてください。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • oracle SQL

    売上情報を日別に集計して抽出しようと考えております。 その際に売上が存在しない日のレコードも纏めて抽出したいと考えております。 以下のように日付一覧を副問合せで生成し、left joinすれば良いかと 考えたのですが、結果は売上が存在するレコードしか抽出されません。 下記のSQLでは何が原因で全日付が抽出されないのか分る方がいらっしゃいましたらご教授頂けますと幸いです。 select 売明.商品コード, 売伝.納品日, 月日.全日, -- TO_CHAR(売伝.納品日,'DY') AS 曜日, TO_CHAR(月日.全日,'DD') AS 日, TO_CHAR(月日.全日,'DY') AS 曜日 -- count(売明.商品コード) AS 売上回数 from 売上伝票データ 売伝, 売上明細データ 売明, ( SELECT TO_DATE('20180401', 'YYYYMMDD') + ROWNUM - 1 AS 全日 FROM ALL_CATALOG WHERE TO_DATE('20180401', 'YYYYMMDD') + ROWNUM - 1 <= TO_DATE('20180430', 'YYYYMMDD') ORDER BY 1 ) 月日 where 売伝.納品日 BETWEEN TO_DATE('20180401','YYYY/MM/DD') AND TO_DATE('20180430','YYYY/MM/DD') AND 月日.全日 = 売伝.納品日(+) AND 売伝.売上伝票番号 = 売明.売上伝票番号 AND 売明.商品コード = '009405'

  • Oracle10gのsql分についての質問です。(WHERE句)

    Oracle10gのsql分についての質問です。(WHERE句) 先ほどの続きになります。申し訳ございません。 日付型のフィールドに[2006/07/01 01:02:03]と、 日付と時刻のデータが入っています。 SELECT文で日付が[2006/07/01]のみのデータを 抽出する場合、TO_CHAR(フィールド名,'YYYY/MM/DD')と 教えていただき成功いたしました。 ところが、WHERE句にこれと同じ文を書くと、 「リテラルが書式文字列と一致しません」とエラーに なります。 どうすれば良いのでしょうか? 宜しくお願い致します。

  • ORACLEでの日付編集形式

    ORACLEのSELECT分でシステム日付を『2001-9-6』という編集ではなく『06-SEP-2001』と返したいのですが、TO_CHAR(SYSDATE,'DD-???-YYYY')の'???'をどの様に書けば良いのでしょうか。 非常に初心者で申し訳ありません。宜しくお願いします。

その他の回答 (3)

  • 回答No.3
  • osamuy
  • ベストアンサー率42% (1231/2878)

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

共感・感謝の気持ちを伝えよう!

  • 回答No.2
noname#189141

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

共感・感謝の気持ちを伝えよう!

質問者からの補足

有難うございます。 しかし、今回質問をする際構文の内容を手入力した物で ORACLEの方ではシングルの"閉じ"は有り、また括弧も半角に なっていました。 そして、 WHERE TO_CHAR(SYSDATE,'yyyy/mm/dd)=TO_CHAR(登録日時,'yyyy/mm/dd') GROUP BY PPID,台車番号,入庫数量,ロット番号,TO_CHAR(登録日時,'yyyy,mm,dd') と1行入れ替えましたらエラーがかからず動きました。 但し、私はWHEREの所で、今日のデータの中の重複データを削除されるつもり でいたのですが、今日以前の物も全て削除されてしまいました。 構文に誤りがあるのでしょうか。 お分かりになる様でしたらご教示下さいます様、宜しくお願い致します。

  • 回答No.1
  • osamuy
  • ベストアンサー率42% (1231/2878)

引用符に着目。 > WHERE TO_CHAR(SYSDATE,'yyyy/mm/dd)=TO_CHAR(登録日時,'yyyy/mm/dd') たぶん早い者勝ちの回答。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • oracle9i 日付データに関して

    お世話になっております。 Oracle9i(9.0.1.0.1) Linux RedHat7.3J JDBC 接続でOracle Type4 ドライバを使用しています。 本日の日付は2003/09/10で、sysdateも2003/09/10です。 この環境で、以下のSQL文を発行すると、 0件が返ってきます。 select count(*) from dual where '20030910' >= sysdate 以下の条件だと1件返ってきます。 select count(*) from dual where '20030911' >= sysdate さらに、sysdateにフォーマットを指定すると select count(*) from dual where '20030910' >= to_char(sysdate,'yyyymmdd') 1件返ってきます。 質問は、sysdateにto_charのフォーマットを指定した場合と 指定しなかった場合との違いについて教えていただきたいのと、 その違いが明文化されているサイトやotnドキュメントが ありましたら教えていただきたいのです。 otnドキュメントの日付データのところを読んだのですが 詳しい事はわかりませんでした。 宜しくお願いいたします。

  • WHERE句でのデータ型について

    お願い致します。 ORACLEのWHERE句に対する疑問点ですが、 カレンダを管理するテーブル(カレンダマスタ)において、条件を指定してデータをSELECTする時にWHERE句に記入するデータ型についてご指導お願いします。 <詳細> 目的としてカレンダマスタよりSYSDATEの年月の休みの日を除く、稼動日数(COUNT)を求めるのが、目的です。 自分で作成した、SQLでは目的を果たしているのですが、WHERE句にTO_CHARを使用し、抽出項目(年月日-DATE型)を指定しているのですが、条件を指定する時は、TO_CHARで指定しても問題は無いのでしょうか? <SQL> SELECT COUNT(TO_NUMBER(休みFLG)) AS 稼動日 FROM カレンダマスタ WHERE 年月日 BETWEEN (TO_DATE(LAST_DAY(ADD_MONTHS(SYSDATE,-1))+1,'YYYY/MM/DD')) AND (TO_CHAR(LAST_DAY(SYSDATE),'YYYY/MM/DD')) AND 休みFLG='0' <補足> 休みFLG='0'は稼動日

  • oracle sql

    oracle sql SELECT TO_CHAR(sysdate,'eeyy"年 "month" "dd"日"','nls_calendar = ''Japanese Imperial''') as AA FROM DUAL というSQLを記述した際の検索結果は 平成22年 2月 03日 という値になります。 日の部分の前0を消したいのですが、なにか方法はありませんか? (「03日」→「3日」)

  • Oracleのselect文で日時表示する簡単な方法ないですか?

    SQL Plusで、select * from table とするとdata型はyyyy/mm/ddで表示されます。 いちいちto_char(time_stamp,’yyyy/mm/dd hh24:mi:ss’)とするのは苦痛なので、デフォルトで時間まで表示させる設定方法があったら教えてください。 # 私は、時々手作業でデータを集めている素人です。 # いままではSQL Serverだけだったのが、Oracleが増えて # 作法が異なるので戸惑ってます。

  • Oracleのタイムゾーン変更方法を教えてください

    現在、AIX5.2Lで2つのOracleデータベース(仮にA,Bとする)を実行しています。 以下のSQLを実行した際の結果が、おのおの異なっており 恐らくタイムゾーンの違いによる物かと相当しているのですが、 タイムゾーンの変更方法が分からず困っております。 ■実行SQL SELECT TO_CHAR( SYSDATE, 'yyyy/mm/dd HH24:MI:SS' ) FROM dual; ■結果(日本時間:21時44分に実行) A:2005/03/11 12:53:24 →NG B:2005/03/11 21:44:20 →OK ■環境 OS:AIX5.2L DB:Oracle9.2.0.0 AもBと同様に日本時間で結果を返すようにするには どのようにすればよろしいでしょうか? よろしくお願いいたします。

  • PL SQL のループ

    あるセレクト文のパフォーマンスを測定するためにループで複数回実行し時間を測定したいのですが、select 変数 into をしないとコンパイルできず実行できません。 同じセレクト文を複数回実行し時間を測定するのに良い方法は無いでしょうか? CREATE OR REPLACE PROCEDURE test IS BEGIN DBMS_OUTPUT.PUT_LINE(TO_CHAR(sysdate(),'YYYY/MM/DD HH24:MI:SS')); FOR i IN 1..100 LOOP SELECT a,b,c,d,e FROM tbl; END LOOP; DBMS_OUTPUT.PUT_LINE(TO_CHAR(sysdate(),'YYYY/MM/DD HH24:MI:SS')); END;

  • 同じSQL文での検索結果が異なる

    visualbasic2005とoracleを使ってデータベース管理ソフトを作っています。 ひとつのデータのフィールドはいくつかあるのですが、 DATAUPLOADというフィールド値をSQL文で検索するときのみ、 土曜日のデータを拾おうとするとなぜか検索をかけるごとに 件数が1件ずつ減っていくという現象が起きています。 他のフィールドや土曜日以外のフィールドの検索の時には そのようなエラーは起こらないのですが、 同じSQL文で検索結果が随時異なってしまう場合には どのような原因が考えられますでしょうか? DATAUPLOAD は'2008/03/12 00:00:00'の形式のDate型データです。 あるDATE(日付)のデータを検索するときに使用しているSQL文は、 SELECT * FROM DATABASE WHERE DATEUPLOAD BETWEEN TO_DATE(' & CStr(Format(DATE, "yyyy/MM/dd")) & 00:00:00','yyyy/MM/dd hh24:mi:ss') AND TO_DATE(' CStr(Format(DATE, "yyyy/MM/dd")) & 23:59:59','yyyy/MM/dd hh24:mi:ss') です。 いろいろとSQL文を変更してみたのですが、 同じエラーが続いています。 何か思い当たることがありましたら 教えていただければと思います。

  • Oracle9i プロシージャ内でのIF文の書き方について

    Oracle9iでプロシージャを作成しています。 テーブルの型はCHAR(10)で、 日付のデータ'YYYY/MM/DD'が入っているカラムがあります。 このMM/DDの部分が04/21~12/20なら○○○、 12/21~04/20なら△△△ というIF文を作りたいのですが、 どうしても思いつかなくて途方に暮れています。 どなたかアイデアがあれば教えてください。

  • Oracleで、DATE型カラムについて

    Oracle9iで、テーブルを作成しました。 各テーブルには、DATE型のカラムがあります。 テーブル内:2004-04-17 01:15:00 と、入っているとき SELECT TO_CHAR(日付,'yyyy/mm/dd hh24:mi') FROM テーブル という風にアクセスしました。 しかし、 あるテーブルでは、 4/04/17 省略形になったり、 はたまた、あるテーブルでは、 2004/04/17 00:00 と時分が0になってしまったり。 なぜ、上のように、フォーマットを指定しているのにもかかわらず、おかしくなってしまうのかわかりません。 わかる方、お教えください。

  • GROUP BY使用時のソートについて

    OracleSqlにて「GROUP BY」使用した日付のデータを取得するSql文を作成したのですが、 「ORDER by」句に「DESC」を付けても降順ソートが行えません。 作成したSql文は以下の通りなのですがなぜ降順ソートが行えないのでしょうか? 「GROUP BY」を使用するとソート出来ないと言うことなのでしょうか? それとも日付型なのでソートが出来ないと言うことなのでしょうか? どなたかご存知の方おりましたらご教授下さい。 ------------------------------------------------- SELECT TO_CHAR(RECORDDATE,'YYYY/MM/DD') ,RECORDYEAR ,RECORDMONTH ,RECORDDAY FROM STOCKTBL WHERE TO_CHAR(RECORDDATE,'YYYY/MM/DD')<='2002/03/07' AND TO_CHAR(RECORDDATE,'YYYY/MM/DD')>='2002/02/22' GROUP BY TO_CHAR(RECORDDATE,'YYYY/MM/DD') ,RECORDYEAR ,RECORDMONTH ,RECORDDAY ORDER by TO_CHAR(RECORDDATE,'YYYY/MM/DD') ,RECORDYEAR ,RECORDMONTH ,RECORDDAY DESC -------------------------------------------------