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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

2回答

971閲覧

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

Naoko_Coco

総合スコア54

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2019/05/10 09:11

前提・実現したいこと

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)

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alg

2019/05/10 10:40

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

2019/05/10 10:57

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

2019/05/14 03:31

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

回答2

0

SyBaseですよね?

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

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

投稿2019/05/10 09:26

編集2019/05/10 09:41
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alg

2019/05/10 10:53 編集

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

2019/05/10 11:19

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

2019/05/14 03:51

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

0

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

投稿2019/05/10 09:35

moredeep

総合スコア1507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Naoko_Coco

2019/05/14 04: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したいのですがこれではダメなんでしょうか?
Naoko_Coco

2019/05/14 04:36

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問