X



トップページDB@2ch掲示板
1002コメント330KB
SQL質疑応答スレ 17問目 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001NAME IS NULL
垢版 |
2016/07/10(日) 22:29:01.40ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。

質問するときはDBMS名を必ず付記してください。

【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明

前スレ:
SQL質疑応答スレ 16問目
http://echo.2ch.net/test/read.cgi/db/1447160858/
0150NAME IS NULL
垢版 |
2016/12/17(土) 00:34:45.23ID:L7Q4LZyG
教えてください
アクセスを使ってます

INSERT INTO 日時(日付,時刻)
SELECT 日付,時刻 FROM 日付,時刻
WHERE (日付,時刻) NOT IN(SELECT 日付,時刻 FROM 日時)

データをクロス結合して重複分を排除しつつ日時テーブルに書込みをしたいのですが、
上のSQLではエラーとなってしまいます
自分でも調べてはいるのですがどうにも分からず頼らせてもらえればと思います
よろしくお願いします
0151NAME IS NULL
垢版 |
2016/12/17(土) 01:19:14.54ID:L7Q4LZyG
150です

自己解決しました。失礼しました。
0152NAME IS NULL
垢版 |
2016/12/23(金) 14:37:04.89ID:???
それクロス集計じゃなくてただの直積じゃないのか…?
0153NAME IS NULL
垢版 |
2016/12/24(土) 04:08:40.81ID:???
クロス結合とクロス集計って違うよ
0154NAME IS NULL
垢版 |
2016/12/26(月) 23:30:53.01ID:???
すみません、教えていただけますでしょうか。
ACCESSなのですが、

【テーブルA】
ID、商品名
10.90.10、鉛筆赤
10.90.20、鉛筆青
20.800.101、はさみ青
20.800.102、はさみ緑
305.001、のり青
305.005.100、のり黒


【テーブルB】
ID、値段
10.90、100円
20.800、200円
305、500円


というテーブルがあったとします。
テーブルBのIDを取得し、テーブルAから、テーブルBのIDの文字列にて始まるIDを取得し、テーブルAに値段列を付加するSQLを
作成しようとしているのですが、作成方法がいまいちわかりません。

例えば、
【抽出したい結果】
ID、商品名、テーブルBの値段
10.90.10、鉛筆赤、100円
10.90.20、鉛筆青、100円
20.800.101、はさみ青、200円
20.800.102、はさみ緑、200円
305.001、のり青、500円
305.005.100、のり黒、500円
のような感じです。

おそらく、テーブルAとテーブルBをleft joinする形になると思うのですが、
よい方法があれば教えていただけないでしょうか。
0155NAME IS NULL
垢版 |
2016/12/27(火) 02:49:52.16ID:???
>>154
もしかして"10.90.10"で一つの項目に入っていて
そのうちの"10.90"と突き合わせたいとかいう話?

leftとmid組み合わせるとかinstr使うとかlike使うとか、いくつかやり方は思いつくけど
悪いことは言わないからまずDB設計見直せ
0156NAME IS NULL
垢版 |
2016/12/27(火) 07:38:43.84ID:???
>>155 早速のレス、ありがとうございます。

>>もしかして
0157NAME IS NULL
垢版 |
2016/12/27(火) 07:39:20.83ID:???
すみません、なぜか切れてしまいました。

>>もしかして"10.90.10"で一つの項目に入っていてそのうちの"10.90"と突き合わせたいとかいう話?
はい、そういうことをやりたいと考えています。IDの例があまりよくなかったので、サンプルを変更します。

【テーブルA】
ID、商品名
abc-10、鉛筆赤
abc-20、鉛筆青
ef-101、はさみ青
ef-102、はさみ緑
abdzz-001、のり青
abdzz-100、のり黒

【テーブルB】
ID、値段
abc、100円
ef、200円
abdzz、500円

【抽出したい結果】
ID、商品名、テーブルBの値段
abc-10、鉛筆赤、100円
abc-20、鉛筆青、100円
ef-101、はさみ青、200円
ef-102、はさみ緑、200円
abdzz-001、のり青、500円
abdzz-100、のり黒、500円
のような感じです。

データベース設計を見直したいのですが、もうシステムが動いてしまっていて、
変更がちょっと難しい状態なのです、、、
社内用のシステムでお客様で使っているものではないのが救いなのですが。
0158NAME IS NULL
垢版 |
2016/12/27(火) 10:42:43.28ID:???
テーブルAに一列追加して
B用のキーを追加した方がいいぞ
キー列が変わることなんざ無いだろうし、insertするとこだけ弄ればいい
既にある列も30分もありゃ出きるやろ
そしたら普通にインナージョインで処理できる
0159NAME IS NULL
垢版 |
2016/12/27(火) 11:54:27.23ID:???
>>158
それselect * してるやつがいたらこける可能性ある
0160NAME IS NULL
垢版 |
2016/12/27(火) 12:00:38.56ID:???
>社内用のシステムでお客様で使っているものではないのが救い

社内システムには直すお金がかけられないとかあるあるだけど
それ救いじゃなくて呪い(負債)だからな
0161NAME IS NULL
垢版 |
2016/12/27(火) 12:16:08.27ID:???
>>159
Accessの場合大分こけないはず
フォームとかではいちいちフィールド名指定するし
Select * のフィールド数不一致でエラー吐くパターンがむしろ想像できん

ソースは小規模Accessをフィールド建て増ししまくって用途10倍以上に増やした俺

まぁ、
A inner join B On A.ID like B.ID & '*'
でも動くだろうけど、ミスによるバグがクッソ増えそうだし嫌だわ
0162NAME IS NULL
垢版 |
2016/12/27(火) 14:28:17.14ID:???
わざわざ abczz じゃなく abdzz にしてる意図が気になるな
0163NAME IS NULL
垢版 |
2016/12/27(火) 15:14:12.20ID:???
>>162
likeしたときに
abc-とabcde-だと被るからじゃない?
0165NAME IS NULL
垢版 |
2016/12/27(火) 17:12:37.88ID:???
>>157
> データベース設計を見直したいのですが、もうシステムが動いてしまっていて、
> 変更がちょっと難しい状態なのです、、、

正しいデータベース設計後、古いテーブルと同じ形式のViewを作ることができれば、
現行システムに影響を与えることなくデータベースの変更が可能。
0166NAME IS NULL
垢版 |
2016/12/27(火) 19:31:30.63ID:???
>>165
view賛成
ま、弊社の場合はviewだらけで訳が分からなくなってるけどね(笑
0168NAME IS NULL
垢版 |
2016/12/27(火) 21:13:35.26ID:???
>>157
クエリ追加したいってことは、少なくとも何らかの変更/追加があるわけで
そのうえでそのテーブルレイアウトで自分でクエリ書けないんだろ
だったらテーブルレイアウト直すべきだと思うけどね
ま、動いてて変えられんとかいう状況ならそのシステムに似たような事してるとこあるだろ

>>165-166
普通のDBMSならビューで逃げる手はあるけど、ACCESSって結構テーブルとクエリで扱い方に差があるからなぁ
0169NAME IS NULL
垢版 |
2016/12/28(水) 06:24:05.12ID:???
>>165
accessで困ってる初心者に追加可能な選択クエリとか書けるかっていう疑問はあるけど出来たらそれで良いかもね
0170NAME IS NULL
垢版 |
2016/12/29(木) 07:14:51.28ID:???
viewじゃ更新できないカラムのsqlあったらどうすんの
0171NAME IS NULL
垢版 |
2017/01/04(水) 10:49:09.60ID:???
トリガー作るしか無いかなあ
0172NAME IS NULL
垢版 |
2017/01/29(日) 14:56:15.44ID:???
oracleのmergeについて質問です。
oracleは11gを使っています。


とあるテーブルにmergeを使ってpkのレコードが無ければレコード追加、レコードがあれば何もしないというsqlがありました。

このようなsqlで行が無い場合はinsertと同じようにロックを取得すると思うのですが、
既に行がある場合ってロックは取得されるのでしょうか?

リファレンスを見ると細かいケースに言及せず、mergeの表ロックモードはsxとあるので、更新処理の有無に関わらずforupdateと同様にロックされるのかなぁと思っているのですが、、
0173NAME IS NULL
垢版 |
2017/03/14(火) 22:41:55.92ID:???
【質問テンプレ】
・DBMS名とバージョン
Access?(Excel2013のデータ接続機能のところに書いて使いたいです)

・テーブルデータ
ID |Price|Name
-----------------
1001 100 ガム
1002 200 あめ
1002 300 チョコ
1003 400 クッキー
1003 500 ポテチ
1003 600 ポテチ

・欲しい結果
ID |Price|Name
-----------------
1001 100 ガム
1002 500 あめ,チョコ
1003 1500 クッキー,ポテチ,ポテチ

・説明
ID毎にPriceを合計してNameの値を結合したいです。
よろしくお願いします。
0174NAME IS NULL
垢版 |
2017/03/15(水) 00:45:52.14ID:???
主キーも何も無いのこれw
0175NAME IS NULL
垢版 |
2017/03/15(水) 14:25:20.71ID:???
Nameの結合の順番は決まってんの?
0176NAME IS NULL
垢版 |
2017/03/15(水) 18:49:35.26ID:???
group_concat()があれば簡単なのに

Access用にはDJoinという関数を作って公開してる人がいたみたいだけど
ページが消えてる
0177NAME IS NULL
垢版 |
2017/03/15(水) 20:10:02.29ID:???
AccessならVBAでID受け取ってNameをカンマ連結した文字列返す関数作ればできんじゃね
0178173
垢版 |
2017/03/17(金) 23:41:34.54ID:???
>>174-177
返信おそくなってすみません
質問に不足してた部分があったので
また質問しなおしたいと思います

どうもありがとうございました
0179NAME IS NULL
垢版 |
2017/04/26(水) 20:40:34.52ID:???
・Postgresql 8.4

・テーブルデータ
|year|month
-----------------
2017 4
2017 6
2018 3
2018 4

・欲しい結果
|year|month
-----------------
2017 4
2017 6
2018 3

・説明
integerの列year、monthに年、月が書かれており、2017年4月〜2018年3月までの会計年度の行を取りたいのですが、そのようなことは可能でしょうか お願いします
0180NAME IS NULL
垢版 |
2017/04/26(水) 21:37:32.38ID:???
select * from table where year*100+month between 201704 and 201803;

じゃだめか?
0181NAME IS NULL
垢版 |
2017/04/26(水) 21:56:03.44ID:yyy4jyWJ
俺じゃダメか?
0182NAME IS NULL
垢版 |
2017/04/26(水) 22:08:23.58ID:???
(year=2017 and month>=4) or (year=2018 and month<=3)でいいだろ
0183NAME IS NULL
垢版 |
2017/04/26(水) 22:54:12.56ID:???
IIf(Month<4,Year-1,Year) AS 会計年度
見たいなカラム持ったクエリ定義しとけよ
0184183
垢版 |
2017/04/26(水) 22:57:19.84ID:???
あ、なぜかACCESSだと思ってたw
標準的なSQLならCASEでビューか

まあ、わかるだろ
0185NAME IS NULL
垢版 |
2017/04/27(木) 04:56:49.99ID:???
>>179
性能は知らん
where make_date(year, month, 1) between '2017-04-01' and '2018-03-31'
0187NAME IS NULL
垢版 |
2017/04/27(木) 09:29:25.83ID:???
日付を分割してintに入れる糞実装、未だに存在するのかよ
0188NAME IS NULL
垢版 |
2017/04/27(木) 10:38:00.97ID:???
日付じゃなくて必要なのが月までだからだろ
0189NAME IS NULL
垢版 |
2017/04/27(木) 10:55:10.08ID:???
それでも /01 にしてdate型に突っ込むわ
0190NAME IS NULL
垢版 |
2017/04/27(木) 12:24:41.45ID:???
どうでもいいけど言うならせめて糞設計だよね
実装てw
0191sage
垢版 |
2017/04/27(木) 15:25:55.19ID:JuRKhktP
設計:年・月を保存する
実装:年・月を別カラムにする
0192NAME IS NULL
垢版 |
2017/04/27(木) 15:38:14.45ID:???
質問者への回答と、設計の改善提案は別だろうに
0193NAME IS NULL
垢版 |
2017/04/27(木) 16:00:01.62ID:???
number(8)に日付いれるのが好きなフレンズもいるな
0195NAME IS NULL
垢版 |
2017/04/27(木) 17:08:47.17ID:???
俺は >>180 支持だなぁ
速度的にも見た目的にも
0196NAME IS NULL
垢版 |
2017/04/27(木) 18:52:05.48ID:???
>>180
会計年度中も指定できるので非常に参考になりました

他の方法も含めご教示ありがとうございます
0197NAME IS NULL
垢版 |
2017/04/27(木) 18:59:16.96ID:???
年月を保持する要件で、データに意味を持たない日の情報が含まれるって、良いのでしょうか

バグを産む可能性を秘めてるような
0198NAME IS NULL
垢版 |
2017/04/27(木) 19:31:38.84ID:???
>>197
あり得ない月とかを突っ込める方が恐いわ
0199NAME IS NULL
垢版 |
2017/04/27(木) 19:39:19.72ID:QZ3/RiVo
>>198
そんなもんなんぼでもあるわwお前ビビりすぎw
0202NAME IS NULL
垢版 |
2017/04/27(木) 20:19:31.22ID:???
バグというより、データベースに事実にない情報を含めるとか違和感が
0203NAME IS NULL
垢版 |
2017/04/27(木) 20:44:47.72ID:???
numberでもバグを産む可能性を秘めてるし
どっちのリスクをとるかだけじゃね
0204NAME IS NULL
垢版 |
2017/04/27(木) 21:33:38.32ID:???
年月のみを管理したいっていう場合に
・日付としての正当性は保証されるけど不要な日の情報を持つ
・日付としての正当性は保証されないけど不要な情報を持たない
のどちらがいいか?
って話でしょ
個人的にはデータの正当性の方を重視するかな
0205NAME IS NULL
垢版 |
2017/04/28(金) 07:06:33.42ID:???
そして2017/4/1と2017/4/2など
同一年月で複数レコードできてしまうのでした
0206NAME IS NULL
垢版 |
2017/04/28(金) 07:18:39.77ID:???
年月情報をユニーク制約を保持する仕様で日付計算のためにdate使ってたら、皆さんはどう思いますか
0207NAME IS NULL
垢版 |
2017/04/28(金) 10:47:01.79ID:???
もうUNIQUE制約のある年月列と日付計算用の列を分けろよ
0208NAME IS NULL
垢版 |
2017/04/28(金) 11:33:54.87ID:???
レコードの入力時に日付が何入っていようと、1にしてしまえば良いだけだろう
0209NAME IS NULL
垢版 |
2017/04/28(金) 12:16:53.71ID:???
そんなもん制約がなければ全く信用できん
本当に頭が悪いなお前ら
0210NAME IS NULL
垢版 |
2017/04/28(金) 13:33:21.87ID:???
>>205
2017/00 とか 2017/13 とか入ってるのとどっちがいい?
0211NAME IS NULL
垢版 |
2017/04/28(金) 15:57:28.27ID:???
DB側の制約がいかに利用されていないか分かるな
0212NAME IS NULL
垢版 |
2017/04/28(金) 18:48:18.70ID:???
1日の0時になっているか確認するcheck制約つければいい
0213NAME IS NULL
垢版 |
2017/04/28(金) 20:51:04.78ID:???
そもそもカラムが年と月別なんだからcheck制約でもMonth>=1 and Month<=12でいいから簡単だろ
プログラムも同様
まさか日付を変換して1日かとかやるとか?
いらない情報付与からして、そんなのうちでは許されないわw
0214NAME IS NULL
垢版 |
2017/04/30(日) 03:36:41.43ID:???
>>182
後の人間を苦しめるコードをまき散らすのは止めよう
0215NAME IS NULL
垢版 |
2017/04/30(日) 19:54:54.91ID:PSrTmapn
>>214
馬鹿の苦しみなんか気にしてられんわw
0216NAME IS NULL
垢版 |
2017/04/30(日) 20:56:47.54ID:???
3年分取ってきてと言われて初めて問題に気付くパターンや
0217NAME IS NULL
垢版 |
2017/04/30(日) 23:19:56.68ID:???
where fiscal_year(year, month) = 2017
みたいな感じで関数使うかビュー使うほうがロジックが一箇所に集まっていい気がする
パフォーマンス気にするレベルならcalender yearとは別にfiscal yearをデータに持たせるかな
0218NAME IS NULL
垢版 |
2017/04/30(日) 23:33:29.04ID:???
あと fiscal_year(date) みたいにオーバーロードしとけば
インターフェースが統一されて使いやすい
0219NAME IS NULL
垢版 |
2017/05/01(月) 09:41:38.57ID:???
SQLにオーバーロードあるんですか?どんなRDB?
0220NAME IS NULL
垢版 |
2017/05/01(月) 10:54:41.81ID:???
え、、、普通にあるでしょ
むしろできないDBってどれよ
0222NAME IS NULL
垢版 |
2017/05/01(月) 14:14:22.87ID:???
そうなんか、OracleとPostgreSQLで出来てるから普通なのかと・・・
0223NAME IS NULL
垢版 |
2017/05/01(月) 14:29:03.64ID:???
まーた、俺様の「普通」が炸裂しとる
0224NAME IS NULL
垢版 |
2017/05/01(月) 14:33:46.48ID:???
Oracleは特例
いいね?
0225NAME IS NULL
垢版 |
2017/05/01(月) 15:03:51.32ID:???
てか、そもそもOracleでも単純なオーバーロードってあったっけ?
0227NAME IS NULL
垢版 |
2017/05/01(月) 15:07:37.27ID:???
このケースはComputed Columnが使えればそれがいいと思うけど
Postgresでは使えないから関数オーバーロードしとくって話
Computed Columnなら使えるDB多いだろ

SQL標準ならView使えって話かもしれんがViewは管理上のオーバーヘッドが高くなる傾向があるから
使わなくてすむケースならなるべく使わないようにしてる
0230NAME IS NULL
垢版 |
2017/05/01(月) 16:10:53.74ID:???
>>228
会計年度を必要とするたびに繰り返し同じことをするのでよければね
年度別に集計したい場合とかしんどいし俺はごめんだわ
0231NAME IS NULL
垢版 |
2017/05/01(月) 16:49:59.51ID:???
普通に関数でいいと思うんだが、あえて(関数?)オーバーロードって言ってるのはなんで?
0232NAME IS NULL
垢版 |
2017/05/01(月) 16:57:59.25ID:???
>>230
そういうこと言ってるからいつまでたってもスキルが向上しないんだよ
select case when month < 4 then year - 1 else year end as fiscal_year, sum(hoge)
from foo
group by case when month < 4 then year - 1 else year end
0233NAME IS NULL
垢版 |
2017/05/01(月) 17:06:24.57ID:???
つか、いたるところで会計年度を意識するようなシステムなら、会計年度カラムを作っとけばいいよな
0234NAME IS NULL
垢版 |
2017/05/01(月) 18:03:32.59ID:???
>>232
where句も入れて何回繰り返すのさ
面倒くさいとは思わないの?
単発の作業ならわからんでもないが会計年度みたいなのは1回じゃすまないだろ

>>231
日付型でデータを持ったテーブルがあったり
日付型に徐々に移行したい場合に同じ名前で扱えるとうれしいから
会計年度って概念をDBに反映させる一つの手段
0235NAME IS NULL
垢版 |
2017/05/01(月) 18:18:52.43ID:???
>>234
> 面倒くさいとは思わないの?
いや、まったく
>>232レベルのクエリなら10秒もかからずタイプできるだろ
0236NAME IS NULL
垢版 |
2017/05/01(月) 18:28:00.19ID:???
>>234
> where句も入れて何回繰り返すのさ
ストアドでも似たようなもんだろ。
select fiscal_year(year, month), sum(hoge) from fuga group by fiscal_year(year, month)
しかもストアド使うと、year, monthにインデックスあっても使われないし。
0237NAME IS NULL
垢版 |
2017/05/01(月) 18:37:19.33ID:???
ストアド最強!!!|バカの壁| SQL92以降
0238NAME IS NULL
垢版 |
2017/05/01(月) 18:46:32.86ID:???
kantomi@qiita_banned < ストアド!ストアド!
0239NAME IS NULL
垢版 |
2017/05/01(月) 18:53:59.52ID:???
>>235
面倒くさいと思わないならいいんじゃね

>>236
asで名前つけとけばgroup byでは繰り返す必要ないよ
たとえ繰り返しが必要だったとしても概念をその名前で直接扱える状態と
毎回展開しなきゃいけない状態では全く意味が違うんだけどね

インデックスは必要ならはればいい
0240NAME IS NULL
垢版 |
2017/05/01(月) 19:03:28.63ID:???
>>233
算出できる情報を別途カラム作って持たせるのは最終手段
0241NAME IS NULL
垢版 |
2017/05/01(月) 19:04:19.13ID:???
>>180 重み付けの定石
>>182 単年度でしか動かないクソ
>>185 意図が分かりやすい
>>217 ビジネスロジックをDBMSに持たせる派とアプリに持たせる派で戦争勃発
0243NAME IS NULL
垢版 |
2017/05/01(月) 21:25:30.10ID:???
>>234
fiscal_year(year, month)って関数自体はまだなにもオーバーロードしてないだろうが。
0244NAME IS NULL
垢版 |
2017/05/01(月) 21:52:46.85ID:45FTV8QE
>>241のどこが馬鹿なのか論理的に説明できないやついるの?
0245NAME IS NULL
垢版 |
2017/05/01(月) 23:12:56.24ID:???
>>240
分解せずに日付型で持っていればよかったって事だな
以降>>188へ戻る
0246NAME IS NULL
垢版 |
2017/05/02(火) 03:16:15.56ID:???
管理上のオーバーヘッドってのがユーザ側の話なのかシステム側の話なのかしらんが
関数オーバーロードができたとして、それがビューより管理が重いとか信じられん

会計年度が必要ならそう言うビュー作れ、で終わりじゃないのか
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況