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/
0104NAME IS NULL
垢版 |
2016/11/09(水) 18:56:03.76ID:AtwDWs/+
Mysql で 出力データーを
20.00 → 20
21.40 → 21.4
23.05 → 23.05
20.10 → 20.1
みたいに少数以下の語尾のゼロを取ることをMySQL内ですることはできないでしょうか?
0105NAME IS NULL
垢版 |
2016/11/09(水) 19:00:44.82ID:???
普通付かないだろ
元の値は文字列なのか?
0106NAME IS NULL
垢版 |
2016/11/09(水) 19:05:31.21ID:AtwDWs/+
>>105
decimal です。
0108NAME IS NULL
垢版 |
2016/11/14(月) 22:17:52.79ID:bmYVZ934
truncとかfloorとか
文字ならsubstrみたいなやつで
0109NAME IS NULL
垢版 |
2016/11/18(金) 01:26:39.84ID:???
アドバイスをいただきたく
CFINFOテーブルのカラムが全てcharでvarcharに変更したい場合のSQLです。
数十件のデータではテストしてOKでしたが、大量のデータだと問題でそうですかね?

alter table CFINFO modify (
CF_GROUP VARCHAR2(10),
CF_NAME VARCHAR2(30),
CF_ID VARCHAR2(50),
CF_PSWD VARCHAR2(50)
)
/
update CFINFO d
set (d.CF_GROUP,d.CF_NAME,d.CF_ID,d.CF_PSWD)
= (
select trim(CF_GROUP),trim(CF_NAME),trim(CF_ID),trim(CF_PSWD)
from CFINFO m
where d.CF_NO = m.CF_NO
)
/
0110NAME IS NULL
垢版 |
2016/11/21(月) 06:49:29.05ID:sXX+G/pS
>>109
/があるあたりでOracleだと思うが、なんで並列処理化するとか考えないの?
0111NAME IS NULL
垢版 |
2016/11/21(月) 11:05:47.74ID:???
というか、ふつうにhoge=trim(hoge)で良い気がするんだが
なんで自己結合する必要があるんだ
0112NAME IS NULL
垢版 |
2016/11/21(月) 11:19:03.28ID:???
それか元のテーブルをRENAMEして
新しいテーブルにINSERT SELECTしたら?
表領域足りんのか
0113NAME IS NULL
垢版 |
2016/11/21(月) 18:31:53.36ID:CmVzeDRz
mysqlの質問です

[2016-11-21 18:20:12]のような[yyyy-mm-dd HH:mi:ss]の形の値を持つdatetime型のフィールド、recordがあるのですが、
ここから2016年10月1日〜2016年10月31日の期間の9:00〜12:00のレコードのみを抽出するにはどのような命令を書けば良いでしょうか?
日付のみなら

SELECT * FROM t_open WHERE record BETWEEN '2016-06-01' AND '2016-07-01';

という簡単な形で出せたのですが、時刻を指定する方法が分からず詰まっています。
0114NAME IS NULL
垢版 |
2016/11/21(月) 18:43:05.79ID:???
>>113
and date_format(record, '%H:%i') between '09:00' and '12:00'
0115NAME IS NULL
垢版 |
2016/11/21(月) 19:36:05.17ID:???
>>114
できました!ありがとうございます!
date_format関数について勉強しておきます
0116NAME IS NULL
垢版 |
2016/11/22(火) 17:17:14.56ID:???
>>114
こう言うのがササっと書けるようになるには何年くらいのSQL修行が必要ですか?
0117NAME IS NULL
垢版 |
2016/11/22(火) 18:14:09.68ID:???
>>116
> こう言うのがササっと書けるようになるには何年くらいのSQL修行が必要ですか?
本読まないでしょ。
初心者でも入門書を2,3冊こなせば書けると思うよ。
0118NAME IS NULL
垢版 |
2016/11/22(火) 18:28:47.65ID:???
短いやつをちょっとずつ書けば慣れるけど
MySQLの方言だからねえ、、、
0119NAME IS NULL
垢版 |
2016/11/22(火) 19:27:21.14ID:sjSydgSv
確かにここのレスを見ただけだとササっと書いてるように思うのも仕方がないだろう
だけど……裏では必死でググってんだぜオレたち 👀
Rock54: Caution(BBR-MD5:8368d31ad5c810f9ab23ea9fefa156d2)
0120NAME IS NULL
垢版 |
2016/11/22(火) 20:04:48.97ID:???
>>117
入門書を二冊も読んだら上級者でしょ?
それもかなり上のクラスの
0121NAME IS NULL
垢版 |
2016/11/24(木) 15:48:27.14ID:???
sql初心者で2、3行程度の簡単なsqlしか実行した事がないんですが、世の中では何百行、何千行のsqlを実行する事もありますか?
0123NAME IS NULL
垢版 |
2016/11/24(木) 16:40:02.92ID:???
100行程度なら描いたことがある
メンテナンス性を考えると
あまり長くしないようがいいように思う
0124NAME IS NULL
垢版 |
2016/11/24(木) 16:49:13.99ID:???
>>122
相対的には上級者になるのかもねw
絶対的にはもちろん違うけど
0125NAME IS NULL
垢版 |
2016/11/24(木) 17:00:52.88ID:???
>>124
自分がかなり上のクラスの上級者であると自己判定していて、自分のクラスになるには入門書2冊が必要だった、ということかも
0126NAME IS NULL
垢版 |
2016/11/24(木) 17:17:01.99ID:???
入門書を何冊読んでも入門書レベルの知識しかつかないという、ごくあたりまえの話
0127NAME IS NULL
垢版 |
2016/11/24(木) 20:22:40.50ID:???
>>121
そんな複雑なやつを書く前にストアドとかビューを組み合わせるとかを検討する
そんなの書いたら検証がえらいことになる
0128NAME IS NULL
垢版 |
2016/11/24(木) 21:42:31.35ID:???
聞いた話でそれを見たことはないけど、1000行くらいのが出来上がったとかなんとか。
見たくもない(ある証券系のシステムでのお話)
0129NAME IS NULL
垢版 |
2016/11/25(金) 19:24:44.86ID:???
問い合わせ文じゃなくて、ややこしいストアド書くなら数百は余裕であり得るだろうけど
0130NAME IS NULL
垢版 |
2016/11/25(金) 21:18:31.44ID:???
行が増えざるを得ない状況がストアド開発には多すぎるからなぁ
つまり複雑度はなぜ行が多いのか次第
0131NAME IS NULL
垢版 |
2016/11/25(金) 21:23:23.29ID:riZyA4Jk
>>121
カラム数が多くて、改行してたらあっという間。
0132NAME IS NULL
垢版 |
2016/11/25(金) 22:45:32.51ID:???
>>131
> カラム数が多くて
それはそれでどうかと思うが...
0133NAME IS NULL
垢版 |
2016/11/28(月) 10:24:40.80ID:???
データ抽出用のビュー作るとカラム数数百とかなる
0134NAME IS NULL
垢版 |
2016/11/28(月) 11:06:13.68ID:???
二つのテーブルをjoinし、マスターをそれぞれ5個joinすると、
select t1.hoge, -- t1のデータで10行
...
t2.fuga, -- t2のデータで10行
join hoge_master -- マスター系テーブルのjoinで3行
on ...
and ...
これだけで、10 + 10 + 3 * 5 * 2 = 50行
それにwhere句とsub queryがつき、さらにunionで3ブロックほど結合すれば簡単に200行とかいく。
0135NAME IS NULL
垢版 |
2016/11/28(月) 19:58:42.77ID:3f+IloFY
カラム数はシステムが古かったり、考え方が古いひとが作ったものをだったりするとコントロールできない。
0136NAME IS NULL
垢版 |
2016/11/28(月) 20:54:44.09ID:???
何か列と行がグチャグチャ
0137NAME IS NULL
垢版 |
2016/11/28(月) 21:16:32.90ID:???
わざわざ1カラム1行でクエリ書いて行数多くてメンテナンス性落ちるなら本末転倒
0138NAME IS NULL
垢版 |
2016/11/28(月) 22:25:17.16ID:PzYguHzt
>>137
はあ?
0139NAME IS NULL
垢版 |
2016/11/29(火) 10:41:34.96ID:???
>>137
>>134みたいなケースで言うと、行数が多くてメンテナンス性が落ちるということはない。
逆に、1行に複数カラムを羅列される方がメンテナンス性が落ちる。
0140NAME IS NULL
垢版 |
2016/11/29(火) 12:22:04.31ID:???
お前らの言うメンテナンス性ってテキストの編集しやすさの事だったんかw
0141NAME IS NULL
垢版 |
2016/11/29(火) 12:34:20.19ID:W7hPtk8B
>>140
保守、仕様変更でSQLの構文が書き直されるようなのは馬鹿のやることだろ。

リスク高すぎ。
0142NAME IS NULL
垢版 |
2016/11/29(火) 12:41:50.92ID:???
可読性が低くてメンテナンス性は高いという状況が思いつかない
0143NAME IS NULL
垢版 |
2016/11/29(火) 13:04:43.09ID:???
>>141
>保守、仕様変更で

手を入れないといけないときは
なるべくSQL(ストアド)の変更だけで留めようと努力するけど違うのか
0144NAME IS NULL
垢版 |
2016/11/29(火) 13:17:16.12ID:W7hPtk8B
>>143
ストアドだって同じだろw
0145NAME IS NULL
垢版 |
2016/11/29(火) 13:44:04.12ID:???
>>143
> なるべくSQL(ストアド)の変更だけで留めようと努力するけど違うのか
QiitaをkickされたSQLおじさん信者か何かか?
0146NAME IS NULL
垢版 |
2016/11/29(火) 21:15:59.57ID:???
>>145
SQLおじさんってどなた?
ORMおじさんは知ってたけど
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:???
バグというより、データベースに事実にない情報を含めるとか違和感が
■ このスレッドは過去ログ倉庫に格納されています

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