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

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

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

Sybaseとは、RDBMSやデータベースに関する製品に特化したソフトウェア企業。また、同社の中核的RDBMS製品であった「Adaptive Server Enterprise (ASE) 」を指す場合もあります。独SAP社に買収され、現在は同社の子会社です。

SQL

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

Q&A

解決済

3回答

1524閲覧

Update文にて架空のカラムを作成しWhere句で指定ができない?エラーになる

Naoko_Coco

総合スコア54

Sybase

Sybaseとは、RDBMSやデータベースに関する製品に特化したソフトウェア企業。また、同社の中核的RDBMS製品であった「Adaptive Server Enterprise (ASE) 」を指す場合もあります。独SAP社に買収され、現在は同社の子会社です。

SQL

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

0グッド

0クリップ

投稿2019/05/14 05:43

前提・実現したいこと

先週下記で質問したものです。
[https://teratail.com/questions/188721]
環境
DSN名 RI
DBMS名 Sybase IQ
バージョン情報 15.40.0000
Commom SQL Environment ver1.59

UpdateとInsertは難しそうなので別々にやることにしたのですが
またエラーです。
更新したいテーブルA
+-------------+--------+---------------+-------------+
| ymd | kigyo | Code |receipt_key |
+-------------+--------+---------------+-------------+
| 2019-04-16 | 036 | 0362019-04-16 |12 |
| 2019-04-17 | 028 | 0282019-04-17 |24 |
| 2019-04-10 | 036 | 0362019-04-10 |15 |
| 2019-04-14 | 028 | 0282019-04-14 |25 |
+-------------+--------+---------------+-------------+
Selectして持ってきたいテーブルB
+-------------+--------+-------------+
| ymd | kigyo | receipt_key |
+-------------+--------+---------------
| 2019-04-16 | 036 | 12 |
| 2019-04-17 | 028 | 24 |
| 2019-04-10 | 036 | 15 |
| 2019-04-14 | 028 | 25 |
+-------------+--------+---------------+
AのテーブルにはCode(ymdとkigyoの文字連結)があるのですが
Bテーブルにはありません。
なのでwhere句最終行でBテーブルを文字連結し同じCodeあればUpdateと書いてるのですが
エラーになります。
receiptkeyは実際にはテーブルBの値をいろいろと足してます。
テーブルBにてもともとないカラムはWhere句で持ってこれないのでしょうか?

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

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

該当のソースコード

Sybase

1update A 2set receipt_key = ( 3 select 4 count(distinct(convert(varchar,jis.ymd,120)+jis.hhmm+jis.tenpo_cd+jis.posno+convert(varchar,jis.receiptno))) 5 from B 6 where 7 ymd between '2019-04-16 00:00:00' and '2019-4-23 00:00:00' 8 and 9 A.Code = B.jis.kigyo_cd || B.ymd

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

Orlofsky

2019/05/14 05:46

質問にCREATE TABLE文も載せてください。
Orlofsky

2019/05/14 05:50

jis ってテーブルかビューなら FROM などに記述が必要です。
sazi

2019/05/14 07:28

SQLのエラーなんですから、エラーとなった元のSQL文そのもので無いと、適切な回答を得られるとは限りませんよ。
Naoko_Coco

2019/05/14 07:35

Orlofskyさん saziさん 回答ありがとうございます。 もうSimpleにDelete文とInsertで対処しました。
sazi

2019/05/14 07:47 編集

Sybase IQはカラム型データベースの様ですので、delete+insertよりupdate+insertの方が高速かもしれません。あくまで推測ですが。
Naoko_Coco

2019/05/14 07:51

updateだと A.Code = B.jis.kigyo_cd || B.ymd の部分でA.Codeは存在しますが、B.jis.kigyo_cd || B.ymdは存在しないので エラーになるようです。Sybase IQの仕様とかも関係してくるんでしょうか? 一応、delete+insertでもそこまで期間が長くないのもあるかもしれませんが遅くはないのでよしとしちゃってます。 が、今後期間が長くなった場合には問題ですよね。 もう少しやり直してみます。 ありがとうございました。
sazi

2019/05/14 07:56 編集

`B.jis.kigyo_cd`などという修飾子が連なっている記述は普通エラーです。 なので、質問するなら変に略さずに全文でと言っているのです。
Orlofsky

2019/05/14 08:00

saziさん 架空のカラムって jis とかのことかと想像していました。
guest

回答3

0

別にわざわざ連結した項目生成する必要は無いですし、生成などしない方がインデックスがある場合は高速です。

SQL

1update tableA set tgt.receipt_key=src.receipt_key 2from tableA tgt join tableB src 3 on tgt.ymd = src.ymd and tgt.kigyo_cd=src.kigyo_cd 4where tgt.ymd between '2019-04-16 00:00:00' and '2019-4-23 00:00:00'

UPDATE (307P)

追記

相関サブクエリーとした場合

SQL

1update tableA tgt set 2 receipt_key=( 3 select receipt_key from tableB where ymd=tgt.ymd and kigyo_cd=tgt.kigyo_cd 4 ) 5where ymd between '2019-04-16 00:00:00' and '2019-4-23 00:00:00'

投稿2019/05/14 06:58

編集2019/05/14 08:55
sazi

総合スコア25195

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

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

Naoko_Coco

2019/05/14 07:44

回答ありがとうございます。 これからもよろしくお願いします。
Naoko_Coco

2019/05/14 08:22

saziさんのように下記Codeをwhereに書いたのですがやはり構文エラーになってしまいます。 where tgt.ymd = src.ymd and tgt.kigyo_cd=src.kigyo_cd 1行ずつクリアしていこうと下記も書きましたが行の終わり近くに構文エラーが出てしまいます。 where tgt.ymd = src.ymd and tgt.kigyo_cd=src.kigyo_cd and tgt.ymd between '2019-04-16 00:00:00' and '2019-4-23 00:00:00'
sazi

2019/05/14 08:42 編集

どんなエラーですか? Sybaseのupdate~fromは独特な記述の様です。 取り敢えずリファレンスを参考に訂正してみました。
Naoko_Coco

2019/05/14 08:44

SQL実行中に以下のエラーが発生しました。 エラーコード:-131 [Sybase][ODBC Driver][Sybase IQ]'(行の終わり)' 行 7 の近くに構文エラーがあります。 SQLステータス:37000 というエラー分になります。 where tgt.ymd = src.ymd and tgt.kigyo_cd=src.kigyo_cd の部分が7行目にあたります。
sazi

2019/05/14 08:56

サブクエリーを使用した場合を追記しました。 検証できる環境が無いので、確実でなくて申し訳ないですけど。
Naoko_Coco

2019/05/14 09:12

追記の文でできました! すごいです! 最後までお付き合いいただきましてありがとうございます^^
sazi

2019/05/14 09:19

複数の項目を更新する際に、update ~ fromの構文だと楽なので、確認されていた方が良いですよ。
guest

0

結論からいうと、架空のカラムは使えません。

投稿2019/05/14 06:29

Orlofsky

総合スコア16415

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

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

sazi

2019/05/14 07:16

質問では架空のカラムとは項目を結合した項目の事ですよ。 何に対して使えないという回答ですか?
Naoko_Coco

2019/05/14 07:36

架空のカラムは使えないようですね。ありがとうございます。
guest

0

自己解決

最初のSQL文では、テーブルBに架空の結合カラムを作成してましたが
やはりそれが原因のようでした。
なので、シンプルに対象期間をDelete

SQL

1delete from A 2where 3ymd between '2019-04-16 00:00:00' and '2019-4-23 00:00:00'

対象期間を含んだカラムをInsertにしました。

SQL

1insert into 2 A(kigyo_cd,ymd,receipt_key,Code) 3 select 4 jis.kigyo_cd, 5 ymd, 6 count(distinct(convert(varchar,jis.ymd,120)+jis.hhmm+jis.tenpo_cd+jis.posno+convert(varchar,jis.receiptno))) as receipt_key, 7 jis.kigyo_cd || ymd as code 8 from 9 B 10 where 11 ymd between '2019-04-16 00:00:00' and '2019-5-14 00:00:00' 12 group by 13 jis.kigyo_cd, 14 ymd

難しく考えるよりも自分でできる範囲のことでよかったんですね。
ご回答ありがとうございました。

投稿2019/05/14 07:41

Naoko_Coco

総合スコア54

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

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

sazi

2019/05/14 07:49

> テーブルBに架空の結合カラムを作成してましたがやはりそれが原因のようでした。 単なる文法エラーだと思いますよ。 因みに、Sybase IQはカラム型データベースの様ですので、delete+insertよりupdate+insertの方が高速かもしれません。あくまで推測ですが。
sazi

2019/05/14 08:16

少なくともupdate対象は、deleteするにしても本来更新しようとする値に変更がある時のみに行うようにした方が、高速では無いかと思われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問