SQL質疑応答スレ 17問目 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
このスレは 「こういうことをやりたいんだけどSQLでどう書くの?」 「こういうSQLを書いたんだけどうまく動きません><」 などの質問を受け付けるスレです。 SQLという言語はISOによって標準化されていますが この標準を100%実装したDBMSは存在せず、 また、DBMSによっては標準でない独自の構文が 追加されていることもあります。 質問するときはDBMS名を必ず付記してください。 【質問テンプレ】 ・DBMS名とバージョン ・テーブルデータ ・欲しい結果 ・説明 前スレ: SQL質疑応答スレ 16問目 http://echo.2ch.net/test/read.cgi/db/1447160858/ mysqlでやってみた select id , name , case name when "aaa" then 1 when "bbb" then 3 when "ddd" then 2 when "ccc" then 4 end as newcol from hogehoge order by newcol; +----+------+---------+ | id | name | newcol | +----+------+---------+ | 1 | aaa | 1 | | 4 | ddd | 2 | | 2 | bbb | 3 | | 3 | ccc | 4 | +----+------+---------+ 結局は>>77 さんの通りにやってるだけだし、件数が多ければやってられんw select id , name , case name when "aaa" then 1 when "ddd" then 2 else null end as newcol from hogehoge order by newcol is null; >>74 普通は名前のマスタテーブル用意しとくんじゃね まあ、なければないで効率とか考えないなら select distinct 名前 from ... とかで代用できなくもないけど >>76 すくなくとも、RDBでそれは基本的な考え方から外れてるから無理 データ補完とか、順序付けされてないデータの順序とか、設計考え直せ >>75 ,81 ありがとう。 75 で言われてハッとして distinct で作った名前の一覧と月の一覧とを掛け合わせて、 これと元のテーブルデータを外部結合して行けました。 SQLと直接関係ないのですが お名前.comSDサーバーの データベースって sshで入って dumpコマンドでエクスポートできないので バックアップを取ることができないのですが なにかうまく取る方法ないですか? >>83 お名前.com sdサーバー データベース バックアップ でググったらすぐに見つかったが? ○前提 会社id、名前や所在地などが入っている会社テーブルと、 会社id、従業員名、性別などが入っている従業員テーブルがあるとして、 (プログラム側で外部から受け取った)会社idから名前や所在地を得て、かつ、その会社の従業員を列挙表示したい ○質問 こういうとき、DB側、SQL側としては、会社テーブル・従業員テーブルそれぞれ1回ずつ2回SELECT発行するしかないでしょうか >>85 joinを知らないとか分からないとか、そういうレベル? とりあえず>>1 読んで出直して >>86 joinすると全レコードに>>85 で言う会社テーブルの名前、所在地などが入ってきませんか 返してもらうデータ量よりクエリ発行回数を気にするべきなんでしょうか また>>85 には書いていないことですがjoin対象が複数あったら、など考えるとどう考えたら良いのか >join対象が複数あったら、 複数joinすれば? 深く考える前にやってみればいいんじゃないかな、とか。 >>87 >データ量よりクエリ発行回数を気にするべきなんでしょうか そんなもんはケースバイケースだからすきにしろ もともとクエリ発行回数を問題にしたのはお前だろうが >>85 その前提なら > 会社テーブル・従業員テーブルそれぞれ1回ずつ2回SELECT発行する でいいと思う この場合それぞれ2回ずつSELECTが正解じゃね? 従業員に付与される会社情報の多さが気になるなら2回でいいんじゃね というか自分も2回だね >>85 〇足りない情報 どんなときに使う処理か(バッチ?それともユーザー操作に対する応答?) 出力はどのような形式か(画面表示?CSVファイル?) データベースを配置しているサーバーと出力を得るクライアントの構成は?(例:PostgreSQLto Apacheが同じサーバーにあり、クライアントはWEB表示で結果を得る。サーバーはAWSに配置しており、ネットワークの転送速度は毎秒1MBr程度が期待できる) レコードは何件あるのか。レコードあたりの容量は?要求されるレスポンスは?(1秒以内に出力完了など)。 転送速度が極端に遅い場合はローカルにデータベースをもってジョインするのも選択肢としてあり得なくもないが(2層方式も含めて検討だろう) それだったら出力結果を圧縮して転送だろうな HTTPで出力する場合は例えばgzip圧縮すりゃ設定いじる程度の工数で済むしな 月額2000円くらいの予算でvps借りるとしてmysqlで最大どれくらいのトランザクションを捌けるもんなの? どこで質問したらわからないんですが総合スレってありませんかね? Mysql で 出力データーを 20.00 → 20 21.40 → 21.4 23.05 → 23.05 20.10 → 20.1 みたいに少数以下の語尾のゼロを取ることをMySQL内ですることはできないでしょうか? truncとかfloorとか 文字ならsubstrみたいなやつで アドバイスをいただきたく 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 ) / >>109 /があるあたりでOracleだと思うが、なんで並列処理化するとか考えないの? というか、ふつうにhoge=trim(hoge)で良い気がするんだが なんで自己結合する必要があるんだ それか元のテーブルをRENAMEして 新しいテーブルにINSERT SELECTしたら? 表領域足りんのか 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'; という簡単な形で出せたのですが、時刻を指定する方法が分からず詰まっています。 >>113 and date_format(record, '%H:%i') between '09:00' and '12:00' >>114 できました!ありがとうございます! date_format関数について勉強しておきます >>114 こう言うのがササっと書けるようになるには何年くらいのSQL修行が必要ですか? >>116 > こう言うのがササっと書けるようになるには何年くらいのSQL修行が必要ですか? 本読まないでしょ。 初心者でも入門書を2,3冊こなせば書けると思うよ。 短いやつをちょっとずつ書けば慣れるけど MySQLの方言だからねえ、、、 確かにここのレスを見ただけだとササっと書いてるように思うのも仕方がないだろう だけど……裏では必死でググってんだぜオレたち 👀 Rock54: Caution(BBR-MD5:8368d31ad5c810f9ab23ea9fefa156d2) >>117 入門書を二冊も読んだら上級者でしょ? それもかなり上のクラスの sql初心者で2、3行程度の簡単なsqlしか実行した事がないんですが、世の中では何百行、何千行のsqlを実行する事もありますか? 100行程度なら描いたことがある メンテナンス性を考えると あまり長くしないようがいいように思う >>122 相対的には上級者になるのかもねw 絶対的にはもちろん違うけど >>124 自分がかなり上のクラスの上級者であると自己判定していて、自分のクラスになるには入門書2冊が必要だった、ということかも 入門書を何冊読んでも入門書レベルの知識しかつかないという、ごくあたりまえの話 >>121 そんな複雑なやつを書く前にストアドとかビューを組み合わせるとかを検討する そんなの書いたら検証がえらいことになる 聞いた話でそれを見たことはないけど、1000行くらいのが出来上がったとかなんとか。 見たくもない(ある証券系のシステムでのお話) 問い合わせ文じゃなくて、ややこしいストアド書くなら数百は余裕であり得るだろうけど 行が増えざるを得ない状況がストアド開発には多すぎるからなぁ つまり複雑度はなぜ行が多いのか次第 >>121 カラム数が多くて、改行してたらあっという間。 >>131 > カラム数が多くて それはそれでどうかと思うが... 二つのテーブルを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行とかいく。 カラム数はシステムが古かったり、考え方が古いひとが作ったものをだったりするとコントロールできない。 わざわざ1カラム1行でクエリ書いて行数多くてメンテナンス性落ちるなら本末転倒 >>137 >>134 みたいなケースで言うと、行数が多くてメンテナンス性が落ちるということはない。 逆に、1行に複数カラムを羅列される方がメンテナンス性が落ちる。 お前らの言うメンテナンス性ってテキストの編集しやすさの事だったんかw >>140 保守、仕様変更でSQLの構文が書き直されるようなのは馬鹿のやることだろ。 リスク高すぎ。 可読性が低くてメンテナンス性は高いという状況が思いつかない >>141 >保守、仕様変更で 手を入れないといけないときは なるべくSQL(ストアド)の変更だけで留めようと努力するけど違うのか >>143 > なるべくSQL(ストアド)の変更だけで留めようと努力するけど違うのか QiitaをkickされたSQLおじさん信者か何かか? >>145 SQLおじさんってどなた? ORMおじさんは知ってたけど >>146 SQLおじさん、Qiitaに炎上記事投稿 周囲の反応と垢BANまでの流れ http://togetter.com/li/1047474 教えてください アクセスを使ってます INSERT INTO 日時(日付,時刻) SELECT 日付,時刻 FROM 日付,時刻 WHERE (日付,時刻) NOT IN(SELECT 日付,時刻 FROM 日時) データをクロス結合して重複分を排除しつつ日時テーブルに書込みをしたいのですが、 上のSQLではエラーとなってしまいます 自分でも調べてはいるのですがどうにも分からず頼らせてもらえればと思います よろしくお願いします それクロス集計じゃなくてただの直積じゃないのか…? すみません、教えていただけますでしょうか。 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する形になると思うのですが、 よい方法があれば教えていただけないでしょうか。 >>154 もしかして"10.90.10"で一つの項目に入っていて そのうちの"10.90"と突き合わせたいとかいう話? leftとmid組み合わせるとかinstr使うとかlike使うとか、いくつかやり方は思いつくけど 悪いことは言わないからまずDB設計見直せ >>155 早速のレス、ありがとうございます。 >>もしかして すみません、なぜか切れてしまいました。 >>もしかして"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円 のような感じです。 データベース設計を見直したいのですが、もうシステムが動いてしまっていて、 変更がちょっと難しい状態なのです、、、 社内用のシステムでお客様で使っているものではないのが救いなのですが。 テーブルAに一列追加して B用のキーを追加した方がいいぞ キー列が変わることなんざ無いだろうし、insertするとこだけ弄ればいい 既にある列も30分もありゃ出きるやろ そしたら普通にインナージョインで処理できる >>158 それselect * してるやつがいたらこける可能性ある >社内用のシステムでお客様で使っているものではないのが救い 社内システムには直すお金がかけられないとかあるあるだけど それ救いじゃなくて呪い(負債)だからな >>159 Accessの場合大分こけないはず フォームとかではいちいちフィールド名指定するし Select * のフィールド数不一致でエラー吐くパターンがむしろ想像できん ソースは小規模Accessをフィールド建て増ししまくって用途10倍以上に増やした俺 まぁ、 A inner join B On A.ID like B.ID & '*' でも動くだろうけど、ミスによるバグがクッソ増えそうだし嫌だわ わざわざ abczz じゃなく abdzz にしてる意図が気になるな >>162 likeしたときに abc-とabcde-だと被るからじゃない? >>157 > データベース設計を見直したいのですが、もうシステムが動いてしまっていて、 > 変更がちょっと難しい状態なのです、、、 正しいデータベース設計後、古いテーブルと同じ形式のViewを作ることができれば、 現行システムに影響を与えることなくデータベースの変更が可能。 >>165 view賛成 ま、弊社の場合はviewだらけで訳が分からなくなってるけどね(笑 >>157 クエリ追加したいってことは、少なくとも何らかの変更/追加があるわけで そのうえでそのテーブルレイアウトで自分でクエリ書けないんだろ だったらテーブルレイアウト直すべきだと思うけどね ま、動いてて変えられんとかいう状況ならそのシステムに似たような事してるとこあるだろ >>165-166 普通のDBMSならビューで逃げる手はあるけど、ACCESSって結構テーブルとクエリで扱い方に差があるからなぁ >>165 accessで困ってる初心者に追加可能な選択クエリとか書けるかっていう疑問はあるけど出来たらそれで良いかもね viewじゃ更新できないカラムのsqlあったらどうすんの oracleのmergeについて質問です。 oracleは11gを使っています。 とあるテーブルにmergeを使ってpkのレコードが無ければレコード追加、レコードがあれば何もしないというsqlがありました。 このようなsqlで行が無い場合はinsertと同じようにロックを取得すると思うのですが、 既に行がある場合ってロックは取得されるのでしょうか? リファレンスを見ると細かいケースに言及せず、mergeの表ロックモードはsxとあるので、更新処理の有無に関わらずforupdateと同様にロックされるのかなぁと思っているのですが、、 【質問テンプレ】 ・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の値を結合したいです。 よろしくお願いします。 group_concat()があれば簡単なのに Access用にはDJoinという関数を作って公開してる人がいたみたいだけど ページが消えてる AccessならVBAでID受け取ってNameをカンマ連結した文字列返す関数作ればできんじゃね >>174-177 返信おそくなってすみません 質問に不足してた部分があったので また質問しなおしたいと思います どうもありがとうございました ・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月までの会計年度の行を取りたいのですが、そのようなことは可能でしょうか お願いします ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる