質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.10%

SQLでレコードがあればupdateなければinsertしたい

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,082

score 50

前提・実現したいこと

SQL文書いてます。
他テーブルからSelectした内容をレコードがあればupdateなければinsertしたいです。
on duplicate key updateを記入するとできるようなのですがここでエラーが出てしまいます。
ご教示よろしくお願いします。

発生している問題・エラーメッセージ

SQL実行中に以下のエラーが発生しました。
エラーコード:-131  [Sybase][ODBC Driver][Sybase IQ]'on' 行 15 の近くに構文エラーがあります。
SQLステータス:37000

該当のソースコード

insert into
   daily_receipt(kigyo_cd,ymd,receipt_key,Code)
      select
         jis.kigyo_cd,
         ymd,
         count(distinct(convert(varchar,jis.ymd,120)+jis.hhmm+jis.tenpo_cd+jis.posno+convert(varchar,jis.receiptno))) as receipt_key,
         jis.kigyo_cd || ymd as code
      from
         jis     
      where 
         ymd between '2019-04-16 00:00:00' and '2019-4-23 00:00:00'
      group by
         jis.kigyo_cd,
         ymd  
   on duplicate key update
      receipt_key= if(Code = code,values(receipt_key),receipt_key)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • alg

    2019/05/10 19:40

    接続対象データベースの、製品名やバージョンを提示していただけますか?(例:SAP Sybase IQ 16.0 SP04)

    キャンセル

  • alg

    2019/05/10 19:57

    それと、使用しているODBCドライバーの名称やバージョンもあわせてご提示をお願いします。

    キャンセル

  • Orlofsky

    2019/05/13 07:02

    同じSQLでもデータベースによって方言が大きいですから、どのデータベースを使うのかを質問のタグで明示したり、バージョンも明記した方が適切なコメントが付き易いです。 [SQLの観点から Oracle Database, PostgreSQL, MySQL の特徴を整理しよう!](https://www.ashisuto.co.jp/corporate/column/technical-column/detail/1197236_2274.html)

    キャンセル

  • Naoko_Coco

    2019/05/14 12:31

    algさん
    Orlofskyさん
    ありがとうございます。説明が抜けており申し訳ございません。
    今回初めて使用するのであまりわかっておらずすいません。
    Sybase IQ
    Commom SQL Environment ver1.59
    になります。

    キャンセル

回答 2

+3

SyBaseですよね?

リファレンスではon duplicate keyの指定ができるようには見えませんが、参照されているリファレンスには可能と書いてありますか?
INSERT statement

Mergeも無いようですので、insertとupdateそれぞれ行う事になるかと思います。
Upsert (update or insert) in Sybase ASE?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/10 19:47 編集

    「Sybase」と名の付くRDBMSは、色々あるみたいですね(Sybase IQ, その後継のSAP IQ, Sybase SQL Anywhere, その後継のSAP SQL Anywhere, Sybase SQL Server, その後継のSybase Adaptive Server Enterprise, さらに後継のSAP Adaptive Server Enterprise, 他にもあるかも?)。今回初めて知りました。ということで、どのRDBMSのどのバージョンを対象にしているのかによって回答が変わりそうです。

    キャンセル

  • 2019/05/10 19:52 編集

    Adaptive Server Enterprise(略してASE) なら、バージョン次第ではmergeをサポートしているようです。http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36272.1572/html/commands/commands89.htm

    キャンセル

  • 2019/05/10 20:19

    @algさん
    フォローありがとうございます。
    そこまで色々枝分かれしているとは思いませんでした。

    キャンセル

  • 2019/05/14 12:51

    saziさん
    algさん
    ありがとうございます。
    なんかいっぱいあるんですね。
    『on duplicate key update』は使用できないようですね。
    DSN名 RI
    DBMS名 Sybase IQ
    バージョン情報 15.40.0000
    と、なっているのでmergeも使用できないみたいですね。。。
    それぞれ行うしかなさそうですね。
    ありがとうございました。

    キャンセル

+1

on existing updateならいけるかもしれません。INSERT statement

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/14 13:35

    moredeepさん
    回答ありがとうございます。
    どうもSybaseでは使用ができないようです。
    そこで別々にと思ってるのですが、それもエラーになってしまいダメです。。。
    まずはUpdateをしようと思っているのですが最終行目にて構文エラーになります。
    update daily_receipt
    set receipt_key = (
    select
    kr_custjis jis.count(distinct(convert(varchar,jis.ymd,120)+jis.hhmm+jis.tenpo_cd+jis.posno+convert(varchar,jis.receiptno)))
    from dba.kr_custjis jis
    where
    ymd between '2019-04-16 00:00:00' and '2019-4-23 00:00:00'
    and
    daily_receipt.Code = dba.kr_custjis jis.jis.kigyo_cd || dba.kr_custjis jis.ymd

    UpdateしたいテーブルにCodeとSelectしたテーブルBの文字列を連結したのが一致したものをUpdateしたいのですがこれではダメなんでしょうか?

    キャンセル

  • 2019/05/14 13:36

    別質問で質問しなおしますね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る