レス数が1000を超えているけど、まだ書けるかも知れないよ。
SQL質疑応答スレ 15問目
1 :NAME IS NULL :2014/06/16(月) 20:52:29.14 ID:???.net このスレは 「こういうことをやりたいんだけどSQLでどう書くの?」 「こういうSQLを書いたんだけどうまく動きません><」 などの質問を受け付けるスレです。 SQLという言語はISOによって標準化されていますが この標準を100%実装したDBMSは存在せず、 また、DBMSによっては標準でない独自の構文が 追加されていることもあります。 質問するときはDBMS名を必ず付記してください。 【質問テンプレ】 ・DBMS名とバージョン ・テーブルデータ ・欲しい結果 ・説明 前スレ: SQL質疑応答スレ 14問目 http://peace.2ch.net/test/read.cgi/db/1371476534/
2 :NAME IS NULL :2014/06/16(月) 20:54:01.50 ID:???.net SQL言語リファレンス一覧 Oracle Database http://docs.oracle.com/cd/E49329_01/server.121/b71278/toc.htm Microsoft SQL Server http://msdn.microsoft.com/ja-jp/library/bb510741 IBM DB2 Database http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/c0004100.html PostgreSQL http://www.postgresql.jp/document/current/html/sql.html MySQL http://dev.mysql.com/doc/refman/5.7/en/sql-syntax.html http://dev.mysql.com/doc/refman/5.1/ja/sql-syntax.html 参考リンク http://sql.main.jp/cont/sql/map.html http://www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html http://www.geocities.jp/oraclesqlpuzzle/ http://www.techscore.com/tech/sql/
3 :NAME IS NULL :2014/06/16(月) 20:55:26.32 ID:???.net 過去スレ 14問目:http://peace.2ch.net/test/read.cgi/db/1371476534/ 13問目:http://toro.2ch.net/test/read.cgi/db/1343899481/ 12問目:http://toro.2ch.net/test/read.cgi/db/1316769778/ 11問目:http://hibari.2ch.net/test/read.cgi/db/1299305530/ 10問目:http://hibari.2ch.net/test/read.cgi/db/1274791771/ 9問目:http://pc11.2ch.net/test/read.cgi/db/1252492296/ 8問目:http://pc11.2ch.net/test/read.cgi/db/1236253554/ 7問目:http://pc11.2ch.net/test/read.cgi/db/1223525474/ 6問目:http://pc11.2ch.net/test/read.cgi/db/1210940477/ 5問目:http://pc11.2ch.net/test/read.cgi/db/1193486961/ 4問目:http://pc11.2ch.net/test/read.cgi/db/1176553195/ 3問目:http://pc11.2ch.net/test/read.cgi/db/1160458216/ 2問目:http://pc8.2ch.net/test/read.cgi/db/1141622643/ 帰ってきた:http://pc8.2ch.net/test/read.cgi/db/1124178925/ Part 2:http://pc8.2ch.net/test/read.cgi/db/1103113155/ 初代:http://pc8.2ch.net/test/read.cgi/db/1056973582/
4 :NAME IS NULL :2014/06/16(月) 20:56:48.79 ID:???.net よくある質問1 (問) ID | DATE | DATA --+----------+----- 1 | 2007-11-11 | aaa 2 | 2007-11-11 | bbb 1 | 2007-11-10 | ccc 3 | 2007-11-12 | ddd 3 | 2007-11-11 | eee 4 | 2007-11-10 | fff 1 | 2007-11-12 | ggg このようなテーブルから、下記のように 1 | 2007-11-12 | ggg 3 | 2007-11-12 | ddd 2 | 2007-11-11 | bbb 4 | 2007-11-10 | fff 各idに対して最新の1件だけ抽出するSQLの書き方を教えてください。 (答) select A.ID, A.DATE, A.DATA from TableName A inner join (select ID, max(DATE) as MAX_DATE from TableName group by ID ) B on A.ID = B.ID and A.DATE = B.MAX_DATE ;
5 :NAME IS NULL :2014/06/16(月) 20:57:56.48 ID:???.net よくある質問2 (問) key data ---------------- 1 a 1 a 1 b 1 b 1 a 2 b 2 a 2 a というテーブルから key a b -------------------- 1 3 2 2 2 1 というExcelのピボットの様なデータを取得したいのですが、どういうSQLになりますか? a,bというのは固定なので、仮にcというデータがあっても無視して構いません。 (答) SELECT key, SUM(CASE data WHEN 'a' THEN 1 END) AS a, SUM(CASE data WHEN 'b' THEN 1 END) AS b FROM table GROUP BY key ORDER BY key ;
6 :NAME IS NULL :2014/06/16(月) 20:59:10.48 ID:???.net よくある質問3 (問) ID HOGE 01 A 01 B 01 C 02 A 03 B HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか (答1) SELECT id FROM TableName WHERE hoge in ('A','B','C') GROUP BY id HAVING count(DISTINCT hoge) = 3 ; (答2) select * from TableName T1 where not exists (select * from (values 'A', 'B', 'C') T2 (HOGE) where not exists (select * from TableName T3 where T1.ID = T3.ID and T2.HOGE = T3.HOGE ) ) ; ※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意
7 :NAME IS NULL :2014/06/16(月) 21:00:24.63 ID:???.net よくある質問4 (問) 列の数が可変な問合せはどう書きますか? (答) 標準SQLでは書けません。 pivotという機能を搭載したDBMSなら一見書けそうですが実はやっぱり書けません。 Oracle 11g以降でpivot xmlというキーワードを使用すれば一応可変っぽくはなります。 が、素直にプロシージャを書くかアプリケーションで処理したほうが良いでしょう。 SQL Serverのpivot(2005以降) http://msdn.microsoft.com/ja-jp/library/ms177410.aspx http://www.sqlprof.com/blogs/sqldev/archive/2008/04/12/pivots-with-dynamic-columns-in-sql-server-2005-2008.aspx Oracleのpivot(11g以降) http://download.oracle.com/docs/cd/E16338_01/server.112/b56299/statements_10002.htm#CHDCEJJE http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html
8 :NAME IS NULL :2014/06/16(月) 21:15:20.86 ID:???.net よくある質問5 (問) 年月(YYYYMM)を指定し、その年月に対応する年月日を取得したい 例:201006を指定したら、以下の結果を得たい 20100601 20100602 ・ ・ ・ 20100630 (答) SQLでは存在しないデータを生成することはできません。 この問いの場合は素直にカレンダーテーブルを用意しましょう。 どうしてもやりたければ以下のような方法もなくはないですが、 再帰問合せの本来の使い方ではありません。 やめておくことを強くお奨めします。 (PostgreSQLのgenerate_series()関数なら辛うじてセーフかもしれませんが 賛否の分かれるところでしょう。) with TEMP (NUM) as ( select 1 from dual union all select NUM + 1 from TEMP where NUM < 31 ) select to_char(to_date('201006', 'YYYYMM') + NUM - 1, 'YYYYMMDD') from TEMP where to_date('201006', 'YYYYMM') + NUM - 1 < add_months(to_date('201006', 'YYYYMM'), 1) ; ※上記はOracleの場合です。(11gR2以降) ※再帰問合せをサポートするDBMSならこれを適当に改変すれば動きますが どのみちお奨めしません。
9 :NAME IS NULL :2014/06/16(月) 21:17:04.25 ID:???.net 以上、テンプレ終わり
10 :NAME IS NULL :2014/06/18(水) 00:11:36.02 ID:???.net 誘導されて来ました ・DBMS Mysql ・テーブルデータ ■User id: account: ■Follow id: user_id: follow_id: ■Tweet id: text: user_id: is_replay: boolean is_delete: boolean ・ほしい結果 Twitterのようなものを作っていて「フォローしてるユーザーのタイムラインの表示」をするのがとても遅いです ・説明 こんな感じのDB構成で、自分がフォローしてるユーザー+自分のつぶやきを取得するには SELECT follow_id FROM follow WHER user_id: 自分のid 上記のクエリでfollowしてるユーザーのIDを引っこ抜いた後に SELECT * FROM tweet WHERE user_id IN ( 1, 233 , 222 , 333 ...上で引っこ抜いたIDのリスト) AND is_replay = 1 AND is_delete = 0 のように取得しています、これが2000人くらいになるととても遅くなってしまいます高速化する方法をアドバイス頂きたいです
11 :NAME IS NULL :2014/06/18(水) 04:03:04.15 ID:???.net tweet.user_id にインデックスを貼る。mysql の挙動しらないけど、まずは。
12 :NAME IS NULL :2014/06/18(水) 04:28:29.92 ID:???.net >>11 そこにはインデックス貼ってますが、例えばフォロワーが1000人とかになるとインデックスを利用していてもやっぱり数が増えてしまいまして
13 :NAME IS NULL :2014/06/18(水) 04:47:13.14 ID:???.net じゃあ次はその無駄に分かれているクエリをひとまとめにして、プランナに優しくする。
14 :NAME IS NULL :2014/06/18(水) 08:03:09.04 ID:???.net >>10 それどこが遅いんだよ? ホストアプリでINのリスト作るところかSQL発行するのが遅いんじゃないのか? 素直にINをサブクエリにしてSQL発行1回で済ましてみろよ SELECT * FROM tweet WHERE user_id IN ( SELECT follow_id FROM follow WHER user_id: 自分のid ) AND is_replay = 1 AND is_delete = 0 このクエリで実行計画みて、話はそれからだな まさかと思うがFollowはuser_idにインデックスがないって事はないだろうな (user_id,follow_id)で主キーにするか複合インデックス張ってみろ
15 :NAME IS NULL :2014/06/18(水) 08:55:54.75 ID:???.net >>10 主観が多い 何件のtweetに対して何msかかって遅いといっているのか? Explainの結果を貼るのがより良い SQLが汚い きちんとログから貼りなさい 解答もその汚いSQLから作られるので、そのままでは動かなくて困るだけだ 速度の話をするなら利用しているIndexぐらいは貼ろうよ
16 :NAME IS NULL :2014/06/18(水) 10:00:37.03 ID:???.net ログのSQLを直打ちで速度見てみることとついでにEXPLAINだな
17 :NAME IS NULL :2014/06/18(水) 11:24:55.14 ID:???.net >>13-14 INのリストを作るところは殆ど時間かかっていませんでした(10ms程度) フレームワークを使っていてラップされているのでSQLの発行が遅いってのも多分無いと思います SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`is_deleted` = 0 AND `tweets`.`is_replay` = 0 AND (user_id IN (SELECT follow_id FROM `users` INNER JOIN `follows` ON `users`.`id` = `follows`.`user_id` WHERE `folllows`.`user_id` = *user_id*)) ORDER BY tweets.updated_at DESC ご指摘頂いたとおりこんな感じで取得した場合、INで並べるよりは多少早くなりました!ありがとうございます 10000ms -> 4000ms Indexに関しては >>15 Follow -user_id index_user_id -folloe_id index_follow_id -複合 index_user_id_and_follow_id Tweet - user_id index_user_id - 複合 index_user_id_and_is_replay こんな感じで貼ってます >主観〜 申し訳ありません気をつけます テストデータとして以下のとおり挿入されています Tweet数が50万件 User数が5万件 Followが10万件 今回テストケースに利用したユーザーはこうなっています Follow 5000件 Tweet 5件 Tweet(Follow) 25000件 >>16 EXPLAINをしたところフォロー一覧の取得、つぶやきの取得共にindexは適切に使われていました 1 PRIMARY tweets ref user,index_user_and_is_replay index_user_and_is_replay 32 const 25000 Using where 1 PRIMARY users eq_ref PRIMARY PRIMARY 4 twitter.tweets.user_id 1 Using index 2 DEPENDENT SUBQUERY follows ref user,index_user_id_and_follow_id index_user_id_and_follow_id 10 const,func 1 Using where; Using index 2 DEPENDENT SUBQUERY users eq_ref PRIMARY PRIMARY 4 func 1 Using where
18 :NAME IS NULL :2014/06/18(水) 12:22:35.60 ID:2As4GCOc.net 【2chスレッド勢いランキングサイトリスト】 ★+ニュース板 ・2NN (推奨サイト) ・2chTimes ★+ニュース板新着 ・2NN新着 ・Headline BBY ・unker Headline ★+ニュース板その他 ・Desktop2ch ・記者別一覧 ★全板 ・全板縦断勢いランキング (推奨サイト) ・スレッドランキング総合ランキング ・ログ速 ★全板実況込み ・2勢 ・READ2CH ・i-ikioi ※ 要タイトル検索 ※ 2chブラウザ併用推奨
19 :NAME IS NULL :2014/06/18(水) 13:38:23.05 ID:???.net >>17 よかよか。 んじゃ次は in を exists に置き換えて試してみよう。 サブクエリ内でusersを結合する理由がないなら外そう。
20 :NAME IS NULL :2014/06/18(水) 20:43:31.32 ID:???.net >>17 なんで>>10 のSQLから>>17 のSQLになるんだ? usresなんてどっからでてきたんだよ >フレームワークを使っていてラップされているのでSQLの発行が遅いってのも多分無いと 多分とかじゃなくてフレームワークつかわずSQL直接発行して試せよ あとMySqlの実行計画の見方は詳しくないんだが followsのindex_user_id_and_follow_idでキー長が10 usersのPRIMARYでキー長が4 だよな おそらくusersのPRIMARY=user_idで4だから index_user_id_and_follow_idでからuser_idひいたらfollow_idは長さ6? index_user_id_and_follow_idのredがconst,funcって、funcは桁数変換? 正確な情報が少なすぎる >>19 inをexistsにするぐらいなら、joinで書きなおした方が良いんじゃね
21 :NAME IS NULL :2014/06/18(水) 20:49:53.47 ID:???.net >>17 それはそうと、リプライ(reply) と リプレイ(replay) は違うよ。 >>20 joinでもいいと思う。
22 :NAME IS NULL :2014/06/18(水) 21:08:16.67 ID:???.net >>20 inとexistsはオプティマイザによる変換難しいけど existsとjoinはオプティマイザが簡単に変換するから 読みやすいほうで良いでしょ
23 :NAME IS NULL :2014/06/18(水) 22:29:34.81 ID:???.net なんか、in exists join 関連の話よくループするね。 テンプレ入りするかも?しないかも?
24 :NAME IS NULL :2014/06/18(水) 22:40:29.77 ID:???.net >>20 mysqlのexplainを読めないなら黙ってても良いんだよ?
25 :17 :2014/06/19(木) 05:02:55.31 ID:???.net 不手際が多く色々と混乱させてしまったみたいで申し訳ありません ご指摘どおり joinへの置換えを行った所 10000ms→4000ms→0.04msまで落ちました 本当にありがとうございました
26 :NAME IS NULL :2014/06/19(木) 05:04:09.29 ID:???.net >>24 じゃああなたが>>20 の疑問点に解説を
27 :NAME IS NULL :2014/06/19(木) 12:12:14.69 ID:???.net おめでとー
28 :NAME IS NULL :2014/06/19(木) 12:15:07.32 ID:???.net >>17 が最初に質問した元スレで話題になってたんだけど 468 名前:nobodyさん[sage] 投稿日:2014/06/19(木) 11:53:09.08 ID:??? 彼は解決したって書いてるけどjoinを使うことでサブクエリが先に消化されてソート対象がメモリ上に乗るサイズになっただけで結局もっと数が増えたらメモリに乗らなくなってまた遅くなるよ 10万件程度のデータでもメモリに載り切らなくなるのはわかりきってるしTwitterみたいに大きくないから大丈夫なんて言える問題じゃない みたいな書き込みがあったんだけどそうなの?
29 :NAME IS NULL :2014/06/19(木) 12:25:50.89 ID:???.net お察しレベル。 元スレどこなの?
30 :NAME IS NULL :2014/06/19(木) 12:27:21.34 ID:???.net >>29 やっぱレベル低い争いなのか http://nozomi.2ch.net/test/read.cgi/php/1389438240/
31 :NAME IS NULL :2014/06/19(木) 12:42:55.77 ID:???.net >>28 INは全表をメモリに載せようとするけど JOINやEXISTSはしないで(HASH) SEMI JOINやINDEXで精査しようとするから速いんだよ ただ、JOINやEXISTSの方式でも件数が影響するので 桁がかなり増えれば、当然遅くなる 最近オプティマイザも賢くなったがな
32 :NAME IS NULL :2014/06/19(木) 13:01:52.81 ID:???.net あんまりORM批判はしたくはないが INはORMで簡単に実装できるからよく使われるのに対して テンプレに載せようかって話す位の常識を知らないやつが増えたね
33 :NAME IS NULL :2014/06/19(木) 16:41:08.52 ID:???.net >>31 それMySqlの話? なんかググっても、MySqlにはネステッドループとその変形しか実装されてないって書いてあるんだが 一般論なら、今時はINもEXISTSと同様に展開するんじゃね まあ、結局はオプティマイザの出来次第なんだが
34 :NAME IS NULL :2014/06/19(木) 16:44:02.06 ID:???.net SQLServer2005です 数年分のログを2週間ずつページングして表示させたいです 取り敢えず最初のページのケツの日付を次ページの先頭条件としてみましたが、当然前ページのと被ってしまいます 各ページの先頭行を取得するにはどのようにすればよいでしょうか?
35 :NAME IS NULL :2014/06/19(木) 16:56:24.54 ID:TW0nEEQA.net ページ番号から計算すればよさそうなもんだけど。
36 :NAME IS NULL :2014/06/19(木) 17:06:36.77 ID:???.net >>33 existsはjoinの変形とできるけど、inは違うから一概には一緒にはできないよ オプティマイザが賢ければやってくれるんだけどね MYSQLは5.6.5からNEST以外のjoin方法が実装されたよ
37 :NAME IS NULL :2014/06/19(木) 20:53:12.43 ID:???.net カラムの値を11倍にして格納したいんですが、どう書けばよろしいでしょうか? 検索しても2000を10000に置き換えるといった置換ばかりかヒットして思うように見つけられません ご教示お願いいたします
38 :NAME IS NULL :2014/06/19(木) 20:53:59.97 ID:TW0nEEQA.net update tbl set col = col * 11where 〜
39 :NAME IS NULL :2014/06/19(木) 21:04:07.09 ID:???.net >>38 ありがとうございます! たすかりました!
40 :NAME IS NULL :2014/06/19(木) 21:29:26.50 ID:???.net >>34 > 取り敢えず最初のページのケツの日付を次ページの先頭条件としてみましたが、当然前ページのと被ってしまいます 被るの嫌なら、ケツの次の日にすればいいだけじゃないのか? そもそも要件が2週間毎なら、>>35 の言うようにページ番号から計算すればいいだけだろ。
41 :NAME IS NULL :2014/06/19(木) 21:57:39.98 ID:???.net 日付に時間が含まれてるかどうかとかいろいろ細かい考慮点はあるにはあるけど 開始を<=じゃなくて<にするとか、そんな程度の話じゃないの
42 :マッチ棒 :2014/06/24(火) 23:01:35.90 ID:???.net こんにちはいつもお世話になります。 mySQLとPHPで会社の案件管理をつくっています。 日付で抽出し、たとえば6月の案件一覧を見ているとします。 そこであるレコードを修正して戻ってくると、抽出が解除され全件表示になります。 こういうときに前の抽出状態を維持するいい方法はありませんけ よろしくお願いします
43 :NAME IS NULL :2014/06/24(火) 23:07:13.82 ID:???.net >>42 なにで編集してるの?
44 :NAME IS NULL :2014/06/24(火) 23:19:57.07 ID:???.net どうせ phpMyAdmin の話だろ・・・
45 :NAME IS NULL :2014/06/24(火) 23:22:20.86 ID:???.net phpmyadminって条件維持されなかった?
46 :NAME IS NULL :2014/06/24(火) 23:34:45.32 ID:???.net mysqlスレに帰れよ
47 :マッチ棒 :2014/06/24(火) 23:44:03.72 ID:???.net こんばんは。 DreamWeaverでハンドコーディングしています IE上で動く案件管理DBです
48 :NAME IS NULL :2014/06/25(水) 00:13:04.67 ID:???.net >>42 内容的にmysqlスレかphpスレで聞くべき物だよ ここはSQLに関するもの以外は答えない http://peace.2ch.net/test/read.cgi/db/1376466127/ http://nozomi.2ch.net/test/read.cgi/php/1397862294/ どっちかにお行き
49 :NAME IS NULL :2014/06/25(水) 00:15:28.96 ID:Agv1+kTb.net フレームワークでもなく自作なんだし、間違いなくPHPスレ。
50 :マッチ棒 :2014/06/25(水) 00:41:04.95 ID:???.net まあそう言わんと
51 :NAME IS NULL :2014/06/25(水) 00:45:19.80 ID:???.net マジレスすると、 ここでお前にマジ回答しても絶対に理解できない スレ違いな上に分からせることが不可能という二重苦
52 :マッチ棒 :2014/06/25(水) 00:57:34.06 ID:???.net こう見えても基本情報技術者や電気工事士もってるプロですよ!
53 :マッチ棒 :2014/06/25(水) 00:59:14.65 ID:???.net 私が優秀で嫉妬してるから教えたくないんですね それともわからないんですか?偉そうなこと言ってるのに口だけなんですね!
54 :NAME IS NULL :2014/06/25(水) 01:00:20.65 ID:???.net 電気工事士はいいけど 基本情報技術者とかゴミやん。アマの証だろ
55 :マッチ棒 :2014/06/25(水) 01:01:35.98 ID:???.net ちなCADトレース技師初級もあります
56 :NAME IS NULL :2014/06/25(水) 01:03:15.74 ID:???.net >>55 初級かよ。最低中級とってこないと
57 :NAME IS NULL :2014/06/25(水) 02:59:48.97 ID:???.net よそなら挑発して回答もらえるだろうけど、ここでは無理だな 大人しくphpスレいきゃよかったのにね あっちとこっちと重複してる住人も多いかもしれんけど
58 :NAME IS NULL :2014/06/26(木) 10:41:08.62 ID:???.net SQLServer2008です。 コミットの最中にネットワーク障害などが起きてコミットが中断された場合、 更新系SQL1、2、3と実行していたもののうち、1だけがロールバック され、残りはコミットされるということは起こりえますか?
59 :NAME IS NULL :2014/06/26(木) 10:57:34.43 ID:???.net Microsoft SQL Server 総合スレ 10 http://peace.2ch.net/test/read.cgi/db/1385363382/
60 :NAME IS NULL :2014/06/26(木) 11:50:08.28 ID:???.net >>58 それ同一トランザクション前提だよな? そんな事がおこったら、トランザクションの一貫性が保ててない欠陥DBMSです
61 :NAME IS NULL :2014/06/26(木) 13:26:15.62 ID:???.net >>60 もちろん同一トランザクションでのことです。
62 :NAME IS NULL :2014/06/28(土) 20:55:24.29 ID:???.net "売上"表に含まれない商品コードを"商品"表から抽出している。 言い換えれば、"売上"表に存在していて"商品"表に存在しない商品コードを抽出している。 SQLを勉強していたらこういう記述を見かけたのですが、 どうしても理解できません。 前者の文と後者の文では結果が違うと思うのですが・・・
63 :NAME IS NULL :2014/06/28(土) 21:20:46.91 ID:???.net 言い換えれば、"売上"表に存在していて"商品"表に存在しない商品コードを抽出している ↓ 言い換えれば、"商品"表に存在していて"売上"表に存在しない商品コードを抽出している だね。技術書って専門家が書いている割にこういう誤植がよくある。 金出して買ったんなら、出版元にガンガン文句言ってやれ。 出版業なら校正に命賭けろってね。
64 :NAME IS NULL :2014/06/28(土) 21:25:35.22 ID:???.net >>62 本によっては誤植お知らせみたいなのが載ってるから調べてみるといいかもね。
65 :NAME IS NULL :2014/06/28(土) 22:37:24.51 ID:???.net なんで? なぜわざわざ「言い換えれば、」と前置きしてるのか、このSQLが例示されてないから 真意は不明だけれど、国語の問題じゃあ無いんだからこういう発想で捉えれば、このSQLでも 同じ結果は得られるんだよ という解説にも読めるんだけどな。 おまえら、そういう発想でSQL 書いたりすること無いのか?
66 :NAME IS NULL :2014/06/28(土) 23:53:45.86 ID:WF1rplta.net >>65 >>62 の前後で別のクエリが記載されてるのかなぁという気はしなくもないが、 それよりあなたの日本語。
67 :NAME IS NULL :2014/06/29(日) 00:34:49.09 ID:???.net 空気を読まずに、教えてください。 [DB] PostgreSQL 9.3 [やりたいこと] 親子関係の定義をしているテーブルから特定の親から子、孫、、、な関係にあるレコードを再帰的に検索し、 結果に、大本の親のレコードの id と、子(ryのレコードの id を一緒に表示させたい。 [テーブルデータ] id parent ------------------- 1 NULL 2 1 3 1 4 3 このテーブルはそれぞれのレコードの親となるレコードの id を格納しています。 この例の場合は id 1 のレコードの子(ryとして、2, 3, 4 のレコードを抽出することが出来ます。 [得たい結果] 上記のテーブルに対して親レコードの id として 1 を指定した場合に、以下のようにデータを抽出したいです。 root id ------------------- 1 2 1 3 1 4 子(ryレコードを抽出する SQL は以下のようになると思います。※ネットの受け売りですが WITH RECURSIVE r AS ( SELECT * FROM test_table WHERE id = 1 UNION ALL SELECT test_table.* FROM test_table, r WHERE test_table..parent = r.id ) SELECT * FROM r ORDER BY id; 実行結果は以下のような感じです。 id parent ------------------- 2 1 3 1 4 3 これに大本の親レコードの id を表示させたいのです。 どのように SQL を書けばいいのか分からず、教えていただければと思いました。 何をしたいかと言えば、上記の SQL に複数の親レコードの id を指定した場合でも、子(ryレコードごとの大本の親レコードの id を識別できるようにしたいのです。 よろしくお願いします。
68 :NAME IS NULL :2014/06/29(日) 04:25:55.41 ID:???.net >>65 その日本語2文に対応して、同じ結果になるSQL二つ書いてみてくれ
69 :NAME IS NULL :2014/06/29(日) 04:49:13.93 ID:???.net >>67 WITH RECURSIVE r AS ( SELECT *,id as root_id FROM test_table WHERE id = 1 UNION ALL SELECT test_table.*,r.root_id FROM test_table, r WHERE test_table..parent = r.id ) SELECT * FROM r ORDER BY id; とかでどう?
70 :NAME IS NULL :2014/06/29(日) 09:45:13.09 ID:SPV+8b8/.net ◎2chスレッド勢いランキングサイトリスト◎ ★+ニュース板 ・ 2NN (推薦) ・ 2chTimes ★+ニュース板新着 ・ 2NN新着 ・ Headline BBY ・ unker Headline ★+ニュース板その他 ・ Desktop2ch ・ 記者別一覧 ★全板 ・ 全板縦断勢いランキング (推薦) ・ スレッドランキング総合ランキング ・ ログ速 ★全板実況込み ・ 2勢 (推薦) ・ READ2CH ・ i-ikioi ※ 要タイトル名検索 ※ 2chブラウザ併用推奨
71 :NAME IS NULL :2014/06/29(日) 11:58:37.45 ID:v5cRsR0p.net select * from tbl1 where a = 100 order by b; こういうクエリを大量に投げてます。 tbl1のaだけじゃなくてbにもインデックス張った方が高速になりますか?
72 :NAME IS NULL :2014/06/29(日) 12:01:59.30 ID:???.net 構成による bが性別とかだったら張らないほうが早い 普通のデータのカラムなら張ったほうが良いけど まあ試せばいいじゃん トラン系だったらupdateとかinsert遅くなるのにも注意な
73 :NAME IS NULL :2014/06/29(日) 14:54:15.91 ID:v5cRsR0p.net ありがとうございましたm(_ _)m
74 :NAME IS NULL :2014/06/29(日) 21:42:25.83 ID:???.net >>71 そのクエリならおそらく(a,b)の複合インデックスで早くなるけど bの単独インデックスは有っても使われない まあ、DBMSによるし、試すしかないけど
75 :67 :2014/06/29(日) 22:13:15.00 ID:???.net >>69 ありがとうございます。 助かりました。 もっとお勉強しないとダメですね。。がんばります。
76 :NAME IS NULL :2014/06/30(月) 00:09:48.21 ID:g9ImG6pV.net データ消去後カラムidを指定せずデータを追加するとIDを飛ばし追加されますが それはなぜでしょうか
77 :NAME IS NULL :2014/06/30(月) 00:26:52.33 ID:???.net autoincrement指定の場合、番号はテーブル外で記録しているから。
78 :NAME IS NULL :2014/06/30(月) 01:04:09.83 ID:g9ImG6pV.net >>77 成程! ありがとうございます!
79 :NAME IS NULL :2014/06/30(月) 05:46:09.41 ID:???.net truncateしてる? DBMSによると思うけどtruncateでリセットされるのもあるよ
80 :NAME IS NULL :2014/07/04(金) 14:04:39.65 ID:???.net あるテーブルに対して数量の合計と単価の平均を取得して、 それを新しい列を生成してそこに挿入することはできますか? それとSQL文中では四則演算を行うのは変でしょうか?
81 :NAME IS NULL :2014/07/04(金) 17:16:14.78 ID:???.net 計算するタイミングをいつにするかで変わってくるのでもうちょっと詳しく 四則演算を入れるのはおかしくないと思うよ
82 :NAME IS NULL :2014/07/04(金) 18:48:14.49 ID:+mQ6XEVA.net >>80 > SQL文中では四則演算を行うのは変でしょうか? 変じゃないよ。 こんな感じのクエリを書けるよ。 select 商品名, sum(数量), avg(単価) from table_1 group by 商品名 あと、挿入という言葉は insert の意味で使われるので、避けたほうがいいよ。
83 :NAME IS NULL :2014/07/04(金) 19:34:04.43 ID:ddlDmBgZ.net >>81 >>82 言葉不足ですみません 列Aと列Bを取り出して(列A+列B)を計算して その結果を列Cとして新しく列を作りそこに表示させたいです 列A | 列B ↓ 列A | 列B | 列C のような感じです 関数としてsumやavgはありますが、それよりも自由な計算を行いたいです
84 :NAME IS NULL :2014/07/04(金) 21:13:59.23 ID:Skkvw/6O.net 値をいちいちフィールドに埋め込んでしまうより計算した方が融通きくと思うんだけど。 その計算方法や列A(B)の値を変えた時なんかC列をupdateするわけ?
85 :NAME IS NULL :2014/07/04(金) 21:28:33.75 ID:+mQ6XEVA.net >>83 新しく作り、表示させたいというのは、テーブルに新しく列を作成し、そこに格納したいという話なの? きっとそうではないだろうと思っているんだけど。 select 列A, 列B, 列A + 列B * 3 AS 列C のような抽出をしたいだけなんじゃないかなと。
86 :NAME IS NULL :2014/07/04(金) 21:36:06.82 ID:ddlDmBgZ.net >>84 そういうわけではないです 無理にSQLに組み込む必要はないですかね >>85 SQLのテーブル自体は変えずに 抽出する結果として列Cを作りたいです 書いていただいたSQL文が自分の希望に近いです
87 :NAME IS NULL :2014/07/04(金) 23:56:46.36 ID:+mQ6XEVA.net 近いですワロタ。 テーブル構成も何も書かずに正解を出せるレベルにはなかなか達しないなぁ。 >>82 がダメだったわけだから、こうかなぁ。 select 数量1 + 数量2 + ... + 数量n as 数量合計, (単価1 + 単価2 + ... + 単価n)/n as 単価平均 from あるテーブル あと、言葉が不足しているのではなく、不適切な言葉が使われていることが問題です。
88 :NAME IS NULL :2014/07/05(土) 00:01:30.38 ID:???.net >>87 先ほど書いていただいた select 列A, 列B, 列A + 列B * 3 AS 列Cで解決しました 「近い」という表現は変でした ありがとうございました
89 :NAME IS NULL :2014/07/05(土) 00:02:23.22 ID:vKMEzrER.net あ、解決したならよかった。 がんばってね
90 :NAME IS NULL :2014/07/05(土) 18:35:29.20 ID:???.net group byの使い方がいまいちわからんとです グループ化してそこから抽出しなくてもwhereで事足りるのではないかと思います
91 :NAME IS NULL :2014/07/05(土) 19:39:42.99 ID:???.net 一例として、 id point 1 10 2 5 3 10 1 5 3 1 2 21 みたいなデータが収められているテーブルがあるとする。 これを id point 1 15 2 26 3 11 みたいに、idごとにpointを合計するときなどに使える。
92 :NAME IS NULL :2014/07/05(土) 19:56:19.38 ID:???.net >>91 だからwhereとどう違うんだ
93 :NAME IS NULL :2014/07/05(土) 20:04:05.23 ID:???.net 例えばwhereの条件にあうレコードの件数を知りたい時 一々結果の行数見るのは面倒でしょ 特定の月ごとの総売上の推移を知りたい時 結果のレコードを自分で計算するの? group byは集計に使うのであって、絞り込みに使うんじゃ無いんだよ
94 :91 :2014/07/05(土) 20:20:26.30 ID:???.net >>92 試しにwhereで書いてみ? ただしidは1〜3までとは『限らない』ことが仮定で。
95 :NAME IS NULL :2014/07/05(土) 20:24:51.32 ID:???.net 必要ないなら無理に使わなくていいよ 必要に駆られたときに覚えればいい この先DB触っていくならwhereだけで対処出来ないことが出てくると思うし
96 :NAME IS NULL :2014/07/05(土) 20:35:00.10 ID:???.net わからないなら使わなければいいだけのこと。 ってか英単語の意味で普通わかる気がするけど。
97 :マッチ棒 :2014/07/05(土) 20:36:23.08 ID:???.net こんにちは質問です 画像のように、月ごとの小計つきの帳票を出したいのですが SQLで一発でいい書き方ありますか PHP側でやるべきですか http://i.imgur.com/tnzkfBc.jpg
98 :NAME IS NULL :2014/07/05(土) 21:07:45.40 ID:???.net group by使え
99 :マッチ棒 :2014/07/05(土) 21:33:11.68 ID:???.net こんにちは。 group by すると、各月に一件のレコードしか出なくなるんですけど 何がおかしいのでしょうけ?
100 :NAME IS NULL :2014/07/05(土) 21:47:25.27 ID:???.net 日本語も英語も不自由なマッチ棒君キテンネ
101 :NAME IS NULL :2014/07/05(土) 21:54:11.52 ID:???.net 書いてやろうか?
102 :NAME IS NULL :2014/07/05(土) 22:21:34.46 ID:???.net 頭がおかしい
103 :NAME IS NULL :2014/07/05(土) 22:23:21.60 ID:???.net >>97 Excel 使え
104 :マッチ棒 :2014/07/05(土) 22:29:55.12 ID:???.net >>101 よろしくお願いします
105 :NAME IS NULL :2014/07/05(土) 22:55:32.08 ID:???.net with rollup
106 :NAME IS NULL :2014/07/06(日) 00:05:16.21 ID:???.net SELECT CONCAT(`支払月`, '月') AS `支払月`, CASE WHEN `仕入額` IS NULL THEN NULL ELSE `仕入先` END AS `仕入先`, `仕入額`, `合計` FROM (SELECT `支払月`, `仕入先`,NULL AS `仕入額`,SUM(`仕入額`) AS `合計` FROM `仕入` GROUP BY `支払月` WITH ROLLUP UNION ALL SELECT `支払月`, `仕入先`,`仕入額`,NULL AS `合計`FROM `仕入` ) D ORDER BY `支払月` IS NULL,`支払月`,`仕入額` IS NULL,`仕入額`;
107 :マッチ棒 :2014/07/06(日) 01:06:27.48 ID:qOfyYrO2.net >>106 うまくいった!さすが神! 大儀である
108 :マッチ棒 :2014/07/06(日) 09:37:36.15 ID:qOfyYrO2.net >>106 やれたので問題ないですけんど ORDER BY の前にある Dはどんな意味なんすか? 消すとエラー起こすので、意味あるみたいだけんど 調べてもそんな句はでてこないのである
109 :NAME IS NULL :2014/07/06(日) 10:13:42.24 ID:???.net >>108 fromの後ろ、カッコついて中で別のクエリが書かれてるでそ? そういうのを副問い合わせっつって、識別のために名前をつけてやる必要があるのよ
110 :NAME IS NULL :2014/07/06(日) 10:44:38.40 ID:???.net AS D のASが省略されてると思えば
111 :マッチ棒 :2014/07/06(日) 11:45:26.58 ID:qOfyYrO2.net なるほど なんて為になるインタネッツなんだ
112 :NAME IS NULL :2014/07/09(水) 08:15:00.48 ID:???.net ・MySQL5.5.38 集計について質問です 果物が販売された日を格納したデータがあるとして それぞれの果物が最後に販売された日を取得するのには どういったSQLにすればよいでしょうか? `種類` `日付` りんご 2月4日 レモン 3月10日 りんご 5月8日 いちご 7月15日 レモン 10月3日 SELECT `種類`, `日付` FROM 販売日表 GROUP BY `種類` ORDER BY `日付` DESC `種類`でGROUP BYにすると、りんごは最初に格納された「2月4日」が返されます ほしい値は最後の日付なので「5月8日」になります よろしくお願いします
113 :NAME IS NULL :2014/07/09(水) 08:36:44.28 ID:???.net >>112 そのSQLってエラーではないんだ maxつかえばいいと思うよ
114 :NAME IS NULL :2014/07/09(水) 09:15:46.23 ID:???.net >>113 max()ですね ありがとうございます SELECT `fruits`, max( `date` ) FROM `sale_by_date` GROUP BY `fruits` ORDER BY max( `date` ) DESC LIMIT 0, 10 最近販売された物品の日付一覧がほしいのでこう作りました ありがとうございました
115 :NAME IS NULL :2014/07/09(水) 13:40:14.46 ID:DTeLHLr1.net mysqlは特殊仕様によって group by に指定されていない項目を取得することができるけど、 その場合、取得される値は候補のうちランダムでひとつが選ばれる。 だったと思う。最近postgresqlもその特殊仕様を取り込んだかもしれない。
116 :NAME IS NULL :2014/07/09(水) 15:07:49.51 ID:???.net ランダムじゃなくてどれか。
117 :NAME IS NULL :2014/07/10(木) 14:46:12.36 ID:???.net DBに画像を登録するときはINSERT文で画像のパスを入力すればそのまま保存されるのでしょうか?
118 :NAME IS NULL :2014/07/10(木) 14:54:18.36 ID:???.net >>117 >>1
119 :NAME IS NULL :2014/07/10(木) 18:52:37.72 ID:???.net >>118 失礼しました ・DBMS名とバージョン MySQL ・テーブルデータ 特になし ・欲しい結果 画像登録 ・説明 DBに画像を登録したいのですが、 どういう理論で保存できるのかよくわかりません DBの中に保存できるのか、 DBにパスを入れると勝手に参照してくれるのかどちらでしょうか?
120 :NAME IS NULL :2014/07/10(木) 19:08:48.91 ID:???.net MySQLの質問スレに行った方がいいと思う バイナリデータを扱う機能はDBMSごとにけっこう異なるので
121 :NAME IS NULL :2014/07/10(木) 19:57:30.75 ID:f6aU6xxZ.net >>119 いずれにせよ、パスを入れると勝手に参照してくれるなんて機能はない。 バイナリデータを入れるか、パスを入れておいて、必要に応じて参照するようにするか。 そういや、前者が適している用途に遭遇したことないなぁ。
122 :NAME IS NULL :2014/07/10(木) 20:44:10.53 ID:???.net >>120 そうなんですか ありがとうございます >>121 >パスを入れておいて、必要に応じて参照するようにするか。 パスを登録したあとSELECT文で指定すれば画像を持ってきてくれるのでしょうか?
123 :NAME IS NULL :2014/07/10(木) 21:13:13.81 ID:f6aU6xxZ.net >>122 いや、パスを持ってきてくれるだけだよ。
124 :NAME IS NULL :2014/07/10(木) 21:28:54.43 ID:???.net >>122 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13106887083 お勧めはしない。
125 :NAME IS NULL :2014/07/10(木) 21:52:44.29 ID:???.net >>123 ただパスの文字列を持ってきてもしょうがないですよね・・・ >>124 参考にさせていただきます ありがとうございます
126 :NAME IS NULL :2014/07/10(木) 21:59:38.26 ID:f6aU6xxZ.net >>125 しょうがなくないんだけどね。 お勧めしないって言われてるのになぁ。 DBに直接画像ファイルを格納したい明確な理由があるんだろうね。 使い方によってはパフォーマンスががた落ちするけど、それに勝る理由だと信じて、がんばってね。
127 :NAME IS NULL :2014/07/11(金) 09:31:25.13 ID:???.net >>121 パスってDBに入らなくね? 入れようとしてもエラーで弾かれてしまう
128 :NAME IS NULL :2014/07/11(金) 09:54:26.34 ID:???.net んなわきゃない
129 :NAME IS NULL :2014/07/11(金) 10:11:27.93 ID:???.net >>128 フォルダの場所とか関係してくる? DBのなかとか
130 :NAME IS NULL :2014/07/11(金) 10:24:35.53 ID:???.net パスって、ファイルの格納位置を示す文字列だよね?
131 :NAME IS NULL :2014/07/11(金) 10:36:31.28 ID:???.net パスはただの文字列だし入らないわけない Win系だと区切りが\だから、直書きならエスケープいるが。
132 :NAME IS NULL :2014/07/11(金) 10:36:58.83 ID:???.net ただの文字列じゃねーの?
133 :NAME IS NULL :2014/07/11(金) 10:37:24.71 ID:???.net win mysqlでは \ をエスケープしないといけない mysql> desc testpath; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | folder | varchar(30) | NO | | NULL | | +--------+-------------+------+-----+---------+-------+ 2 rows in set mysql> insert into testpath -> values(1,"c:\\"); Query OK, 1 row affected mysql> select * from testpath; +----+--------+ | id | folder | +----+--------+ | 1 | c:\ | +----+--------+ 1 row in set
134 :NAME IS NULL :2014/07/11(金) 11:00:29.56 ID:???.net 小学生かよ
135 :NAME IS NULL :2014/07/11(金) 13:03:07.09 ID:???.net ここまでSQLアンチパターンのファントムファイルの言及なし http://www.slideshare.net/itabashimasayuki/sql-34381955
136 :NAME IS NULL :2014/07/11(金) 13:03:09.62 ID:???.net どっかで中継あるの?
137 :NAME IS NULL :2014/07/11(金) 13:05:49.25 ID:???.net SQLでidだけ持ってきてそれを画像名にしといて呼び出せば簡単だよな わざわざDBに登録する必要ないよな?
138 :NAME IS NULL :2014/07/11(金) 13:31:12.27 ID:???.net 無いが、コロっとDBファイルだけで移動したいとかいう 融通の効かない事を言ってくる輩は多い
139 :NAME IS NULL :2014/07/11(金) 13:47:45.75 ID:???.net >>126 > DBに直接画像ファイルを格納したい明確な理由があるんだろうね。 > 使い方によってはパフォーマンスががた落ちするけど、それに勝る理由だと信じて、がんばってね。 逆に言えば、パフォーマンスががた落ちするようなファイルサイズ・量の画像でないのなら、いつでもDBに登録した方が良いともいえる。
140 :NAME IS NULL :2014/07/11(金) 13:52:22.12 ID:???.net ちょろっと差し替えたいとか、実ファイル開いて中身確認死体とか ままあるし、運用的には扱い辛い事この上ないけどなあ
141 :NAME IS NULL :2014/07/11(金) 13:57:45.19 ID:???.net そうしたいならそういうシステムを作れば良いだけじゃん
142 :NAME IS NULL :2014/07/11(金) 15:41:30.94 ID:SfLsxBaO.net >>139 パフォーマンスが落ちるといっているのはサイズや量によるものじゃないよ。 静的コンテンツを静的コンテンツとして扱えなくなることの問題の話だよ。 もちろん、影響がないのならDBに登録しても(!= したほうが)いいよね。しなくてもいいよね。
143 :NAME IS NULL :2014/07/11(金) 15:49:26.90 ID:???.net >>142 > パフォーマンスが落ちるといっているのはサイズや量によるものじゃないよ。 いや、サイズや量によるよ。 > 静的コンテンツを静的コンテンツとして扱えなくなることの問題の話だよ。 それって、(ファイルを含めた)データベースやデータ、SQLに関する問題? そうじゃないなら、スレ違いと思うけど。 > もちろん、影響がないのならDBに登録しても(!= したほうが)いいよね。しなくてもいいよね。 DBに登録したときのメリットとデメリットを天秤にかければいいよ。
144 :NAME IS NULL :2014/07/11(金) 16:35:58.89 ID:???.net アクセスが多くて数もあるサムネイルとかはどうかと思うけど ファイルの場合は置いたパスにしか存在しないが DBに格納してどこからでも取り出せる方法はアリだと思う web領域をリセットしても問題ないし パスを変更したい時もファイル郡の移動がなくて短縮されるし
145 :NAME IS NULL :2014/07/11(金) 16:41:34.08 ID:???.net いいから>>135 よめ
146 :NAME IS NULL :2014/07/11(金) 16:45:56.27 ID:SfLsxBaO.net >>143 >> 静的コンテンツを静的コンテンツとして扱えなくなることの問題の話だよ。 > それって、(ファイルを含めた)データベースやデータ、SQLに関する問題? > そうじゃないなら、スレ違いと思うけど。 (ファイルを含めた)データベースやデータの話はスレ違いじゃないの? >> もちろん、影響がないのならDBに登録しても(!= したほうが)いいよね。しなくてもいいよね。 > DBに登録したときのメリットとデメリットを天秤にかければいいよ。 そうだね。 だからこそ一概に「いつでもDBに登録した方が良い」なんて決めてはいけないね。
147 :NAME IS NULL :2014/07/11(金) 17:19:08.84 ID:???.net >>146 > (ファイルを含めた)データベースやデータの話はスレ違いじゃないの? 静的コンテンツかどうかみたいな話よりはスレの趣旨に近いと思うけど。 > だからこそ一概に「いつでもDBに登録した方が良い」なんて決めてはいけないね。 画像をDBに登録するのはお勧めしないとか、 > DBに直接画像ファイルを格納したい明確な理由があるんだろうね。 > 使い方によってはパフォーマンスががた落ちするけど、それに勝る理由だと信じて、がんばってね。 みたいな意見に対するカウンターだよ。 俺も本気でいつでもBLOB、なんて思ってないし。 何の考えもなく、ファイルとして画像を保存してDBにはパスだけ登録しときゃいいでしょ的な思考停止へのカウンター。
148 :NAME IS NULL :2014/07/11(金) 17:24:08.67 ID:???.net あ、付けくわとくけど、 > (ファイルを含めた)データベースやデータの話はスレ違いじゃないの? これは俺もスレ違いだと思うよ。 > 静的コンテンツを静的コンテンツとして扱えなくなることの問題 というのが、一体どういうことを言ってるのかがわからなかったから > それって、(ファイルを含めた)データベースやデータ、SQLに関する問題? と聞いただけ。
149 :NAME IS NULL :2014/07/11(金) 17:24:51.72 ID:???.net >>142 キミはWebサーバの仕組みから勉強しなおした方が良いかもな リバースプロキシとかそこらへんを特にな
150 :NAME IS NULL :2014/07/11(金) 17:50:18.68 ID:???.net >>142 静的な方が動的より速度的に優位であるとしても >静的コンテンツを静的コンテンツとして扱えなくなることの問題 と速度は関係ないんだが そもそもパスのみをDBに格納するとしても、それをDBから取り出してる時点で静的コンテンツではないわけだが バイナリデータの取り扱いはDBMSによりいろんな制約がかかったりするし 最終的にはファイルに落としたかったりすることも多い (ファイルとセットで管理するような仕組みもってるDBMSもあるけど) あまりDBMS側で扱いやすいものではないよ
151 :マッチ棒 :2014/07/13(日) 08:10:39.66 ID:rJcU+XbI.net おはようございますいつもお世話になりますマッチ棒です また相談ですけんど 日付フォーマットはYYYY-MM-DDで固定なのでしょうか 表示するときに、日は省略で「2014年7月」と表示させたいのですけんど PHPで文字列加工してやるものですけ
152 :NAME IS NULL :2014/07/13(日) 08:12:17.23 ID:???.net 調べたら一発で出るんだけどなあ
153 :マッチ棒 :2014/07/13(日) 10:38:56.06 ID:rJcU+XbI.net まあそう言わんと
154 :NAME IS NULL :2014/07/13(日) 10:49:10.39 ID:???.net それでも自分で調べる気はないんだ。。。
155 :マッチ棒 :2014/07/13(日) 10:56:46.63 ID:rJcU+XbI.net 人生はみじかいんですよ
156 :NAME IS NULL :2014/07/13(日) 11:10:51.92 ID:???.net >>155 >>1 読め
157 :マッチ棒 :2014/07/13(日) 11:16:39.20 ID:rJcU+XbI.net テンプレ書いても答えれんくせに
158 :NAME IS NULL :2014/07/13(日) 11:18:14.77 ID:???.net そういう口答えしてると回答する奴がいなくなるよ
159 :マッチ棒 :2014/07/13(日) 11:22:00.52 ID:???.net こう見えても基本情報技術者や電気工事士もってるプロですよ!
160 :マッチ棒 :2014/07/13(日) 11:24:09.29 ID:???.net ちなCADトレース技師初級もあります
161 :マッチ棒 :2014/07/13(日) 11:25:09.42 ID:rJcU+XbI.net DBMSってなんぞ?
162 :NAME IS NULL :2014/07/13(日) 11:30:05.28 ID:???.net >>161 テンプレすらかけない奴に誰が答えるかって話だよ
163 :NAME IS NULL :2014/07/13(日) 11:32:46.67 ID:???.net マッチ野朗はテンプレの埋め方もわからんのだよ
164 :NAME IS NULL :2014/07/13(日) 12:13:18.34 ID:???.net mysqlだとdate_formatみたいなのがあった気がする ポスグレとかオラクルは別の関数だったのは覚えてるけどたまにしか使わないからいちいち覚えてないわ
165 :NAME IS NULL :2014/07/13(日) 12:28:48.17 ID:???.net 底辺はphpでmysqlと決まってるから大丈夫じゃねぇか
166 :NAME IS NULL :2014/07/13(日) 12:30:41.07 ID:???.net この際、ポスグレかオラクルを例に回答してみたら
167 :NAME IS NULL :2014/07/14(月) 04:18:08.00 ID:uL3aRoUg.net >>151 まあそう言わんと
168 :NAME IS NULL :2014/07/14(月) 14:40:05.65 ID:fCq7eZD9.net select to_char(date '14 Jul 2014', 'YYYY年MM月');
169 :NAME IS NULL :2014/07/14(月) 22:44:32.07 ID:m5zGMQZ/.net t-sqlなんですが素人なんで悩んでます 前日07時からと当日07時までのデータ配信顧客数を知りたいのですが 前日も当日も配信した顧客の重複は1としての 累計顧客数をだすにはどうしたらいいでしょうか?
170 :NAME IS NULL :2014/07/14(月) 23:47:55.34 ID:???.net >>169 カラム名分からないんで適当に書くけど、こんな感じでできないかな? select count(distinct `顧客ID`) from `配信LOG` where `配信TIME` between '前日日付 7:00' and '当日日付 7:00';
171 :NAME IS NULL :2014/07/15(火) 07:03:38.38 ID:Fpc5z+kr.net 前日日付は指定日の前日になるので 変数からの代入してると betweenですると無効な構文になります どう書けばいいのでしょうか… a_dateはDBの日付 @date1は指定日の前日 @dateは指定日 between a_dte = @date1 and 7時 and a_dte = @date and 7時 はエラーになる
172 :NAME IS NULL :2014/07/15(火) 09:05:42.78 ID:???.net ストアドプロシジャとかストアドファンクションとかの話だろうけど >>1 くらい読めや
173 :NAME IS NULL :2014/07/15(火) 12:20:03.32 ID:???.net まあ引き続きT-SQLだろうからSQL Serverなんだろうけど せめてSQLの構文ぐらい確認しろよ
174 :NAME IS NULL :2014/07/15(火) 13:08:51.67 ID:LzDuo0wi.net 変数使う以前にbetween知らないんじゃん。 sql between 使い方 でぐぐってみたら?
175 :NAME IS NULL :2014/07/16(水) 12:14:52.45 ID:JZzBhKA1.net postsテーブル(ブログ記事)とcategoiresテーブル(カテゴリー)とがあり、 postsにはcategory_idを持たせています。 カテゴリー一覧と各カテゴリーに属する記事数を取得するにはどういったsqlを書けばいいでしょうか。 ググったところ http://okwave.jp/qa/q2196405.html を見つけましたがカテゴリーごとに DBにアクセスしててよろしくないのではないかと思いました。 よろしくお願いします。
176 :NAME IS NULL :2014/07/16(水) 12:30:49.48 ID:???.net SELECT カテゴリ名,coalesce(count,0) FROM categoires LEFT JOIN (SELECT category_id, count(category_id) FROM posts GROUP BY category_id) A ON A.category_id = categoires.id こんな感じを想定してる?
177 :NAME IS NULL :2014/07/16(水) 13:31:11.87 ID:???.net SELECT カテゴリ名, count(*) FROM categories INNER JOIN posts ON categories.category_id = posts.category_id SELECT カテゴリ名, count(*) FROM posts INNER JOIN categories ON categories.category_id = posts.category_id
178 :NAME IS NULL :2014/07/16(水) 14:14:37.55 ID:4RZW5vEM.net >>175 こんな感じか select カテゴリ名, (select count(*) from posts where category_id=t.id ) as cnt from categoires t オプティマイザが賢くないならjoinの方が早いかもしれんが >>177 group byは?
179 :NAME IS NULL :2014/07/16(水) 14:16:06.29 ID:???.net >>178 後ろが落ちた GROUP BY category_id
180 :NAME IS NULL :2014/07/16(水) 15:24:31.80 ID:JZzBhKA1.net categoiresは自分のタイポでした。すみません。 >>176 最初no such column: count と出ましたがcount(category_id) as count としたところ動きました。 coalesce()とか初めて見たので勉強になりました。ありがとうございます! >>177 属する記事があるカテゴリのみ取ってくることもできるんですね。ありがとうございます! >>178 こちらも動きました。ありがとうございます! 困っていたので本当に助かりました。自分で書けるように>>2 の参考リンクで勉強します。 ありがとうございました!
181 :NAME IS NULL :2014/07/16(水) 19:29:13.96 ID:???.net >>175 select c.name, count(*) from posts p left join categoires c on p.category_id = c.id group by c.name
182 :NAME IS NULL :2014/07/16(水) 19:47:33.64 ID:???.net 今あえて書いたってことは、カテゴリ名でグループ化することが大事だって言いたいのかな。
183 :NAME IS NULL :2014/07/16(水) 19:48:15.77 ID:???.net と思ったけど、 post left join category だと… o_O
184 :NAME IS NULL :2014/07/17(木) 17:50:24.87 ID:???.net 画像投稿サービスに日ごとのランキング機能を付けたいです。 imagesテーブルにはid、title、view(累計閲覧数)、like(累計いいね数)、created_at(投稿日時)を保存しています。 今回ランキング機能を作るにあたって日ごとのデータが必要と思い、新たにimage_countsテーブルを作りました。 image_countsテーブルはid、image_id(画像ID)、view(累計閲覧数)、like(累計いいね数)、created_at(集計日時)を保存しています。 毎日23時50分頃にimagesテーブルのid、view、likeをimage_countsテーブルに保存しています。 ランキングのは計算方法は、point = 閲覧数 + ユーザーからのいいね * 10 です。 新たにranksテーブルを作り、その日の上位100位についての情報を保存しようと思っています。 image_id、rank(その日の順位)、view(その日の閲覧数)、like(その日のいいね数)、point、created_at(集計日時)を保存したいです。 長くなってしまいましたが質問です。 image_countsテーブルからポイントを計算し、上位100位の順位、ポイント、その日の閲覧数、その日のいいね数をranksテーブルにinsertするにはどうしたらいいでしょうか。 まずお聞きしたいのはそもそもSQLだけでこれだけ複雑なことが実現できるのかということです。 計算部分は最悪python側でやってしまおうかとも思っていますが、できるならSQLでやりたいです。 よろしくお願いします。
185 :NAME IS NULL :2014/07/17(木) 18:14:16.52 ID:???.net insert into ranks select t.image_id, t.view - y.view + (t.like - y.like) * 10, t.view - y.view, t.like - y.like, t.created_at from (select * from image_counts where created_at = 今日) as t join (select * from image_counts where created_at = 昨日) as y using (image_id) order by t.view - y.view + (t.like - y.like) * 10 limit 100 こういうこと?
186 :NAME IS NULL :2014/07/17(木) 18:17:32.17 ID:???.net あ、order by は desc が必要だった。 ともあれ、image_counts には累計が入っているということなので、 当日の増分を得るためには昨日のデータと結合して引き算すればよいですよ。
187 :NAME IS NULL :2014/07/17(木) 19:30:36.55 ID:???.net image_countsを累計じゃなくてその日のカウントにしとけばいいのに
188 :NAME IS NULL :2014/07/17(木) 23:12:20.81 ID:???.net 例えば列Aと列Bを割った結果を出すときに 小数点や整数の桁数を指定することはできますか? (列Aと列Bを割った結果が0.25なら0.2として抽出のように)
189 :NAME IS NULL :2014/07/17(木) 23:23:49.35 ID:???.net >>188 >1
190 :NAME IS NULL :2014/07/21(月) 17:22:28.57 ID:???.net SQL Server2008R2 Expressの質問です。 SQLの知識が全く無く、物凄く曖昧な内容になりますがすみません。 おそらく、「インスタンスを追加する場合にはどうすればよいか」といった質問になるのだと思いますが なにぶん知識が無いものでして、以下に状況を記載しますので問題点・解決策を汲んでは頂けないでしょうか・・・ あるソフトA、そして別のソフトBを1台のPC(Windows7 64bit)で動かそうとしています。 ソフトA,Bは共にSQL Server2008 R2を使用しています。インスタンス名は共に"MSSQLSERVER"です。 このPCは既にソフトAでセットアップされています。 ここにソフトBをインストールしようとしているのですが、ソフトBはSQLのインストール時にsaのパスワードを 「bbbb」(仮)に変更しろと記載されています。 ですが上記の通り、このPCのSQLはソフトAインストール時に設定されているのでsaのパスワードは 「aaaa」(仮)に設定されており、変えられません。 もちろん、そのままソフトBのインストールを試すと、ソフトBはインストール時に失敗してしまいます。 厳密には、本来インストール時に作成されるはずのデータベースが作れないようです。 そこで、色々調べてsaのパスワードを「bbbb」へ変更してSQLを再起動した上でソフトBのインストールを 試行してみました。これでも現象は変わりませんでした。 検索して調べた範囲では、 ・SQLは複数のインスタンスを持てる。 ・同じインスタンス名(MSSQLSERVER等)は持てない とのことなので、インスタンスを分けることも出来ず、幸いにもソフトA,Bを同時に使用することはないため どちらかのソフトを起動する際にsaのパスワードを切り替えて対応できれば・・・と思ったのですが 上記の通り、予想が外れて頓挫しております。 ソフトの作りの話になると思いますので、同じインスタンス名を共存させることはできないのではないかと思います。 こうした場合、どうするのが良いのでしょうか。一日半潰しましたがここまでやったものの分かりませんでした。 何卒お知恵をお貸し下さい。
191 :NAME IS NULL :2014/07/21(月) 17:32:00.45 ID:???.net >>190 こちらで聞いてみてはどうか Microsoft SQL Server 総合スレ 10 http://peace.2ch.net/test/read.cgi/db/1385363382/
192 :NAME IS NULL :2014/07/21(月) 18:37:02.48 ID:???.net >>191 誘導ありがとうございます。向こうで聞いてみます。
193 :NAME IS NULL :2014/08/14(木) 18:55:48.56 ID:???.net 結婚披露宴に呼ぶ友達がいないときはどうしてる?
194 :NAME IS NULL :2014/08/14(木) 20:47:48.99 ID:???.net >>193 人材派遣会社に頼む 赤い霊柩車の再放送でやってた
195 :NAME IS NULL :2014/08/14(木) 21:58:41.11 ID:???.net select 友人 from 人材派遣会社 where の条件は?
196 :NAME IS NULL :2014/08/14(木) 22:03:22.65 ID:???.net IS NULL
197 :NAME IS NULL :2014/08/16(土) 13:04:04.19 ID:CDUM23fr.net ・DBMS名とバージョン(MySQL= 5.1.41) ・テーブルデータ (rating_tb) mysql> select name_no,rating_point,date from rating_tb; +---------+--------------+---------------------+ | name_no | rating_point | date | +---------+--------------+---------------------+ | 1 | 1 | 2014-08-13 01:36:29 | | 2 | 10 | 2014-08-13 01:36:31 | | 6 | 1 | 2014-08-13 01:36:32 | | 9 | 10 | 2014-08-13 01:36:34 | | 10 | 1 | 2014-08-13 01:36:35 | | 1 | 4 | 2014-08-13 01:37:46 | | 1 | 8 | 2014-08-13 01:37:47 | | 1 | 8 | 2014-08-13 01:37:57 | | 6 | 10 | 2014-08-13 01:38:05 | | 2 | 9 | 2014-08-13 01:40:19 | <以下略 ※数が100以上あるので省略>
198 :NAME IS NULL :2014/08/16(土) 13:04:52.61 ID:CDUM23fr.net <説明> //1つ目 select name_no,sum(rating_point)as vote FROM rating_tb group by name_no; +---------+------+ | name_no | vote | +---------+------+ | 1 | 232 | | 2 | 199 | | 6 | 107 | | 9 | 87 | | 10 | 89 | | 11 | 95 | | 12 | 46 | | 13 | 42 | | 14 | 27 | | 15 | 26 | | 16 | 17 | | 17 | 19 | | 19 | 6 | | 20 | 12 | | 23 | 6 | | 24 | 8 | | 25 | 7 | | 27 | 9 | | 34 | 1 | | 35 | 7 | | 45 | 3 | +---------+------+ -------------------- //2つ目 (同じテーブルから現在から5時間以内のdatetimeを持つデータだけ集計して表示) select name_no,sum(rating_point)as active from rating_tb WHERE DATE_ADD(date, INTERVAL 5 HOUR) > NOW() group by name_no; +---------+--------+ | name_no | active | +---------+--------+ | 1 | 10 | | 2 | 3 | | 10 | 9 | | 11 | 9 | | 12 | 8 | | 20 | 8 | +---------+--------+
199 :NAME IS NULL :2014/08/16(土) 13:05:40.94 ID:CDUM23fr.net --------------------------------------- 得たい結果(↓のように、この2つを同時に表示したいです) +---------+------+--------+ | name_no | vote | active | +---------+------+--------+ | 1 | 232 | 10 | | 2 | 199 | 3 | | 6 | 107 | null | | 9 | 87 | null | | 10 | 89 | 9 | | 11 | 95 | 9 | | 12 | 46 | 8 | | 13 | 42 | null | | 14 | 27 | null | | 15 | 26 | null | | 16 | 17 | null | | 17 | 19 | null | | 19 | 6 | null | | 20 | 12 | 8 | | 23 | 6 | null | | 24 | 8 | null | | 25 | 7 | null | | 27 | 9 | null | | 34 | 1 | null | | 35 | 7 | null | | 45 | 3 | null | +---------+------+--------+ どうか教えてください。よろしくお願い致します。
200 :NAME IS NULL :2014/08/16(土) 13:45:35.23 ID:???.net 外部結合するだけちゃうんか
201 :NAME IS NULL :2014/08/16(土) 14:07:49.99 ID:???.net >>199 > //1つ目 と > //2つ目 を join するだけじゃないの?
202 :NAME IS NULL :2014/08/16(土) 14:47:47.53 ID:CDUM23fr.net >>200 >>201 先生たち!それが出来ないんですよ('_;) select name_no,sum(rating_point)as vote, (select sum(rating_point) from rating_tb WHERE DATE_ADD(date, INTERVAL 5 HOUR) > NOW())as active from rating_tb group by name_no; 上のようにやってみたら、activeが合計値が出て個別にならなくて、初心者で全然ここから打開出来ないです;; ↓こんな風にしか出来ない初心者です。お助けください。お願い致します。 +---------+------+--------+ | name_no | vote | active | +---------+------+--------+ | 1 | 232 | 47 | | 2 | 199 | 47 | | 6 | 107 | 47 | | 9 | 87 | 47 | | 10 | 89 | 47 | | 11 | 95 | 47 | | 12 | 46 | 47 | | 13 | 42 | 47 | | 14 | 27 | 47 | | 15 | 26 | 47 | | 16 | 17 | 47 | | 17 | 19 | 47 | | 19 | 6 | 47 | | 20 | 12 | 47 | | 23 | 6 | 47 | | 24 | 8 | 47 | | 25 | 7 | 47 | | 27 | 9 | 47 | | 34 | 1 | 47 | | 35 | 7 | 47 | | 45 | 3 | 47 |
203 :NAME IS NULL :2014/08/16(土) 16:14:49.39 ID:???.net せめて 外部結合 とか sql join とかでググってから出直せ
204 :NAME IS NULL :2014/08/16(土) 16:21:02.14 ID:???.net よく分からんが、 select * from ( 【一つ目のクエリ】 ) t1 left join ( 【二つ目のクエリ】 ) t2 on t1.name_no = t2.name_no こういうことしたいの?
205 :NAME IS NULL :2014/08/16(土) 16:22:36.85 ID:???.net >>203 調べてもわかんなくて時間ないから聞いたのに、出なおせとか、なんなんだよ! どうせ、わからないんだろ? おまえなんか、死ね!
206 :NAME IS NULL :2014/08/16(土) 16:23:58.15 ID:???.net >>204 ありがとう。あんたは好きだ。 ちょっと試して見る。 >>203 死ね!!!
207 :NAME IS NULL :2014/08/16(土) 16:31:37.44 ID:???.net >>206 お前が氏ね
208 :NAME IS NULL :2014/08/16(土) 16:33:14.90 ID:???.net >>207 おまえなんか嫌いだ!!! わからないんだろ?バカめ!!! こっち見んな! >>204 ありがとうございます。今、試しています。 恩にきります。
209 :NAME IS NULL :2014/08/16(土) 16:43:38.36 ID:???.net >>205 > 時間ないから 知らんがな
210 :NAME IS NULL :2014/08/16(土) 17:07:33.76 ID:???.net 時間ないなら札束でオラクルのDBエンジニアの頬をたたけばいい
211 :NAME IS NULL :2014/08/16(土) 17:13:10.68 ID:???.net 分かんないんだろうって煽って教えて貰えたのは十年前まで
212 :NAME IS NULL :2014/08/16(土) 18:12:29.32 ID:???.net お前らも向きになるなよ 中学生のガキだと思えば可愛いだろ
213 :NAME IS NULL :2014/08/16(土) 19:22:09.81 ID:???.net >>204 出来ました。本当に助かりました。 心から感謝致します。ありがとうございました。 自分で調べても全然わからくて、他のみんなにも 乱暴な言葉づかいをしてしまって、申し訳ないと思っている。 どうせ、ググれカスって言われて終わりだと思っていて実際、そういうレスで涙出てきた。 何度やっても出来なくて、切羽詰まっていたんだけど、大人気なかった。 悪かった。教えてくれなかった人は、わかると思うんでこれ以上書きません。 204先生、本当にありがとうございました。
214 :NAME IS NULL :2014/08/16(土) 19:42:17.87 ID:???.net >>202 のクエリ、エラーにならずに実行できるのか MySQLホントSQLの勉強に向いてないな
215 :NAME IS NULL :2014/08/16(土) 21:49:17.62 ID:ty/0qgaq.net >>213 しね にどとくるな しね
216 :NAME IS NULL :2014/08/16(土) 22:40:25.63 ID:???.net >>213 あらためて >>200-201 を読んだらどういう気持ちになるんだろう。 それと、結合しても出来ないんだと言わんばかりのレスをしている >>202 のクエリが まるで結合になっていないことにも気づけるようになったんだろうか。 そうなれているなら成長してんだが。
217 :NAME IS NULL :2014/08/17(日) 00:09:11.48 ID:???.net >>216 SQLどころかプログラム初心者に結合しろって一言だけだと、サブクエリを使うっていうことが理解できんのだろうきっと。 つか理解できたらここには来ないレベルの質問だろうし。
218 :NAME IS NULL :2014/08/17(日) 03:11:24.93 ID:???.net >>216 どう見たって結合という概念すら理解していない超初心者なのは明白だろ 対応がまずいから怒らせることになる 相当怒ってたぞあれ
219 :NAME IS NULL :2014/08/17(日) 07:48:50.97 ID:???.net 釣りだと思ってたらガチだったのか? 学校の宿題かなんかだったのかね・・・
220 :NAME IS NULL :2014/08/17(日) 09:58:50.73 ID:???.net 別に釣りでもガチでもいいよ ヒントだけでなんとかできないならそれまでの奴だろうし、俺には関係ないしな
221 :NAME IS NULL :2014/08/17(日) 10:13:43.90 ID:???.net 深くSQLを学ぶつもりはなく、ズバリの回答を求めている人に joinでググれというのが適切なヒントかどうかは疑問だけどな
222 :NAME IS NULL :2014/08/17(日) 10:23:10.33 ID:???.net 質問の態度がよく、問題が面白そうなら回答する それ以外はスルー
223 :NAME IS NULL :2014/08/17(日) 10:24:54.88 ID:???.net そうだな 上から目線で突き放して怒らせるくらいならスルーがいい 自分も今回はスルー組 回答するならば真摯な姿勢で頼む 下手に怒らせて殺伐としたレスを読まされるのは勘弁
224 :NAME IS NULL :2014/08/17(日) 10:37:59.23 ID:I2qPzeaH.net CURSOR 〜(〜 IN CHAR, 〜 IN CHAR, 〜 IN CHAR) IS SELECT SUB1.〜,SUB1.〜,SUB1.〜 --@ FROM ( SELECT ,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜 --A FROM ( SELECT MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜 --B FROM ( SELECT MR.〜,MR.〜,MR.〜,MR.〜,MR.〜 --C FROM テーブル名 MR WHERE 〜 GROUP BY 〜 ) MRK INNER JOIN テーブル名 MR ON 〜 INNER JOIN テーブル名 MGR ON 〜 ) WHERE 〜 ) SUB1 LEFT JOIN 〜〜以下省略 これはどういうものなのでしょうか? SELECT FROMが4連発してるのと、SELECTしてる列の個数が違う意味と 、カッコの付き方で分からなくなっています。 @ABCのSELECTが互いにどう関係してるのか教えてください。
225 :NAME IS NULL :2014/08/17(日) 10:46:39.85 ID:???.net >>224 せめて 外部結合 とか sql join とかでググってから出直せ
226 :NAME IS NULL :2014/08/17(日) 11:01:45.37 ID:???.net >>225 ほーということは副問い合わせの問題じゃなくて結合の方に 私が知りたい答えがあるというお導きですね? ちょっと考えてみますね
227 :NAME IS NULL :2014/08/17(日) 11:30:06.56 ID:???.net あー分かったかもしれません。 何も調べずに考えただけなのでアレですが・・・ もし正解だった場合はさすがに意地悪して優越感ゲットとか抜きでそう言ってくださいね!w ()の内から外へドンドン、ってことですかね? 一番内側のカッコCのSELECTは、その外側のカッコBの条件INNER JOINで使用するために用意した。 その二番目に内側のカッコBのSELECTは、その外側のカッコAのSELECTで使用するために用意した。 その三番目に内側のカッコAのSELECTは、その外側の LEFT JOIN〜〜以降ので使用するために用意した。 という感じで正しいでしょうか?
228 :NAME IS NULL :2014/08/17(日) 11:59:13.64 ID:???.net >>227 リファレンス全部 >>2 、目を通してるか? 通してないから正しいかどうかもわからない ネタかガチかすら怪しいレベル
229 :NAME IS NULL :2014/08/17(日) 12:02:41.81 ID:???.net >>227 OK SELECT4連発は、クエリの中にクエリがあるサブクエリというものだ 結合が絡んでいるのと、カッコで優先順位が指定されているので 複雑になっている
230 :NAME IS NULL :2014/08/17(日) 12:03:35.75 ID:???.net >>227 まず質問テンプレのルールを守れ。 ・DBMS名とバージョンくらい書け。常識ないの? 【質問テンプレ】 ・DBMS名とバージョン ・テーブルデータ ・欲しい結果 ・説明
231 :NAME IS NULL :2014/08/17(日) 12:04:19.52 ID:???.net >>229 OKもなにも、常識過ぎて話にならないわ くだらない
232 :NAME IS NULL :2014/08/17(日) 12:10:05.40 ID:???.net こういうことをするSQLはどう書くの、ではなく このSQLは何をしているの、という質問に対しては ここのテンプレは役に立たない もっと柔軟に行こう 人に教えることで自分の知識も底上げされる
233 :NAME IS NULL :2014/08/17(日) 12:22:17.87 ID:???.net >>229 ありがとうございました。
234 :NAME IS NULL :2014/08/17(日) 12:48:13.67 ID:???.net >>221 ズバリの回答欲しいなら外注にでも頼みなよ 金は出したくないがズバリの回答ほしいとか、どんだけゆとりなんだよ
235 :NAME IS NULL :2014/08/17(日) 12:56:55.55 ID:???.net >>234 オマエには質問してないんじゃね? >>233 がんばって!
236 :NAME IS NULL :2014/08/17(日) 12:59:01.06 ID:???.net >>234 その通りだがお前はそういう奴に答えなきゃ良いだけじゃね?
237 :NAME IS NULL :2014/08/17(日) 13:22:40.40 ID:???.net タダで教えられると都合が悪いというのでなければ、放っておいてくれw
238 :NAME IS NULL :2014/08/17(日) 13:33:19.85 ID:???.net >>234 ネットの質問掲示板なんて そのためにあるようなもんじゃないの? ギブアンドテイクで済ますことで 互いにコストと時間を節約できる
239 :NAME IS NULL :2014/08/17(日) 14:32:40.04 ID:???.net 質問者の適度な礼節と 回答者の適度な優越感の獲得 で成り立てばいいんだが、 なんせ人間は本来的ににのび太くんであり(質問者) エゴの固まりである(回答者)からそうもいかない
240 :NAME IS NULL :2014/08/20(水) 10:24:52.50 ID:4cvw8JQq.net 保守
241 :NAME IS NULL :2014/08/21(木) 21:59:10.67 ID:???.net MariaDB 10.0.13です MySQLと思って答えて頂いて結構です CREATE TABLE deny_days ( `id` int(11) NOT NULL AUTO_INCREMENT, deny_day date NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk (denyday) ); こんなテーブルがありまして、これは連番と日付だけが入っていく単純なテーブルです。 欲しいデータは明日以降で、且つこのテーブルに入っていない直近の日付です。 このテーブル内のデータが (1,2014-08-22), (2,2014-08-24), (3,2014-08-26) だとしたら、 2014-08-23が欲しいデータです どのようにすれば取れるでしょうか
242 :NAME IS NULL :2014/08/21(木) 22:42:23.80 ID:???.net >>241 そもそもSQLは存在しないデータを生み出すためのものじゃない カレンダーマスタみたいなものを用意するか再帰SQLかじゃないと出来ないんじゃない MariaDBって再帰SQL使える?それかプロシジャ作るか 連続した空き日付は無いって前提なら標準的なSQLだけで出来なくはないかも
243 :NAME IS NULL :2014/08/22(金) 00:30:39.41 ID:???.net >>241 select min(t1.deny_day) from (select deny_day + 1 as deny_day from deny_days union all select '2014/8/22'::date + 1) t1 left join (select deny_day from deny_days) t2 using (deny_day) where t2.deny_day is null and t1.deny_day > '2014/8/22'::date
244 :243 :2014/08/22(金) 00:32:11.66 ID:???.net あ、mysqlで試してないけど、おかしなことはしてないから大丈夫と思ってそのまま書いた。 ダメだったらいってください。
245 :NAME IS NULL :2014/08/22(金) 06:45:09.44 ID:???.net >>243 出来ました、ありがとうございます。 日付計算をdeny_day + INTERVAL 1 DAYにして、"2014/8/22"::dateの部分はDATE(NOW() + INTERVAL 1 DAY)にするとMySQLでも動きました。
246 :NAME IS NULL :2014/08/23(土) 15:17:09.89 ID:???.net >>243 詳しく無いけど こういうトリッキーな技は業務でも使われてるの? DB業界では可読性とか保守性とかは気にしないの?動けばいいの? 最適化されるのか知らないけど(内容の割りに)糞遅くなりそうだし。 このスレ的にはSQLだけで何とかするのが正解で回答者もパズル感覚で答えてるんだろうから、ここだけの話と信じたい。
247 :NAME IS NULL :2014/08/23(土) 15:21:08.17 ID:???.net 今回の場合速度って問題になるか? 日付だろ、100年分毎日入ってたとしても3万行だぞ 可読性もそんなに悪いと思わないし、わからなきゃサブクエリ1個ずつ実行してみて納得すればいい
248 :NAME IS NULL :2014/08/23(土) 15:39:18.20 ID:???.net >>243 で目的は達成できてるようだし 要件が足りないなら改めて聞き直せばいい事だな エスパーお節介もほどほどに
249 :NAME IS NULL :2014/08/23(土) 16:03:36.59 ID:???.net >>246 なに、その上から目線? それなら、こうするべきだという、お手本を是非みせてくださいよ。
250 :NAME IS NULL :2014/08/23(土) 16:07:24.24 ID:???.net ドキュメントに >>241 の内容書いときゃ大丈夫だぁ
251 :NAME IS NULL :2014/08/23(土) 16:20:11.77 ID:???.net >>249 放置しとけ 人のコードを見ると頼みもしないのに身勝手な論評を 始める人って2ちゃんにはよくいるんだよ
252 :NAME IS NULL :2014/08/23(土) 16:27:25.12 ID:???.net >>247 内容の割りに遅そうだって言ってるじゃん >>243 をどういう場面で使うかによるでしょ >>248 はごもっとも
253 :NAME IS NULL :2014/08/23(土) 16:58:49.29 ID:???.net >>246 業務ならトリッキーだろうがなんだろうが、どうにかして求められる答えを出さないとならない SQLがトリッキーになるのは大概設計が悪いんだが、設計段階終わってたら簡単には変えられん 速度に関して言えばホストアプリやプロシジャでやるより早いだろ 納得できないならあれ以上早くて綺麗な解決方法を提示したうえで反論してね
254 :NAME IS NULL :2014/08/23(土) 17:07:47.51 ID:???.net >>253 実務だったらホストアプリでやるのがベターだと思っただけなんだ ホストアプリと>>243 どっちが速いかは使い方次第だよね? それ以外はあなたの言う通り
255 :NAME IS NULL :2014/08/23(土) 17:56:10.60 ID:???.net >>243 がトリッキーだと思う人は集合論的な考えができない人だけだと信じたい。 論じるべきは、トリッキーでもなんでもない>>243 と ホストアプリでループしながらクエリを発行することのどちらがよいかではないかな。
256 :NAME IS NULL :2014/08/23(土) 18:05:45.89 ID:???.net >>255 そういうのは、処理速度以外も含めて総合的な判断でするものだと思うよ 特にメンテナンス性の容易さは重要な要素だと思う
257 :NAME IS NULL :2014/08/23(土) 18:18:01.11 ID:???.net >>254 速度問題にしたのはお前じゃないのか? 使い方次第って、どういう使い方の想定かしらんが、ホストアプリで複数回のクエリ発行するなら 一般的なDBMSならまず間違いなく>>243 の方が早いぞ。オプティマイザが腐ってなければ >>255 SQLは存在しないデータを生成するためのものじゃない そういう意味でもあれはトリッキーなのは間違いない >>256 仕様書なりコメントなりがちゃんとしてればあれぐらいは許容範囲じゃね
258 :NAME IS NULL :2014/08/23(土) 18:29:43.03 ID:???.net >>257 うん、仕様書がきちんとしてあれば問題ない
259 :NAME IS NULL :2014/08/23(土) 18:38:10.14 ID:???.net >>>254 >速度問題にしたのはお前じゃないのか? うん。最初のレスからずっと一貫して速度はきにしてますよ。 ホストアプリの方が速い気がしてた >使い方次第って、どういう使い方の想定かしらんが、 このクエリを更にサブクエリとして使うケースとか >一般的なDBMSならまず間違いなく>>243 の方が早いぞ。オプティマイザが腐ってなければ そうなのか ちなみに答えが見つからない場合は? 普通にタイムアウト?
260 :NAME IS NULL :2014/08/23(土) 18:48:27.03 ID:???.net >>259 相関サブクエリじゃない限り何回も実行されることはないよ 相関サブクエリだとしたら、それこそSQLで処理するしかなくなるよね?
261 :NAME IS NULL :2014/08/23(土) 19:16:06.96 ID:???.net >>259 だけど今更ちゃんとクエリよんだらタイムアウトとか頓珍漢なこと言ってたね。 >>260 なるほど。ありがとう
262 :NAME IS NULL :2014/08/23(土) 20:25:24.07 ID:???.net >>257 > そういう意味でもあれはトリッキーなのは間違いない update t set c = c + 1 where ~ トリッキー?
263 :NAME IS NULL :2014/08/23(土) 21:30:41.51 ID:???.net >>257 今回の場合は存在しないデータを生成する行為に当たらないってことだよ。 存在しないデータを生成するためのものじゃないっていう知識を得てしまったばかりに そこで思考停止しちゃってんだろうなぁ。
264 :NAME IS NULL :2014/08/23(土) 22:08:00.04 ID:???.net なまじ結果がでてるだけに、本質が見えなくなってるのね 思考停止はどっちなんだか
265 :NAME IS NULL :2014/08/23(土) 22:47:41.95 ID:???.net >>264 >>262 データを生み出すための元ネタがある限り、 それは存在しないデータを生成する行為じゃないってことぐらいわからんかな もっかい>>8 でもよめば?
266 :NAME IS NULL :2014/08/23(土) 22:50:03.22 ID:???.net 本質ってw ホストアプリで解決を試みることがいかに本質から外れているか気づいてないんだなw
267 :NAME IS NULL :2014/08/23(土) 23:11:01.86 ID:???.net >>265 だから >>243 には、元データがあるって言ってるんだが、アホなの?
268 :NAME IS NULL :2014/08/23(土) 23:41:47.06 ID:???.net え?だから>>263 や>>265 を書いたんだけど。 >>257 みたいな勘違いさんは見事に思考停止してるでしょ? てか、>>264 は>>263 への反論ではないってことか。
269 :NAME IS NULL :2014/08/24(日) 00:14:57.02 ID:???.net >>262 が勘違いした可能性があるな。
270 :NAME IS NULL :2014/08/24(日) 05:23:24.43 ID:???.net ひょっとして >>265 では、>>264 は >>262 を見ろって言う意味で書いてる? >>269 アホは、絡んで来るなよ...
271 :NAME IS NULL :2014/08/24(日) 06:11:46.00 ID:???.net >>262 あれは元テーブルに存在しない今日(+1)をunionしてるところがミソだぞ 計算で値を出すこと自体がデータ生成じゃないのなんて当たり前だぞ 今日(+1)をunionすることがデータ生成かそうじゃないかならまあ好きに議論してくれ
272 :NAME IS NULL :2014/08/24(日) 15:28:14.32 ID:???.net >>270 ひょっとしなくてもそうだろ。流れ的に。
273 :272 :2014/08/24(日) 15:33:33.43 ID:???.net IDがないから、分かってる人と分かってない人の区別がつかなくなって 分かってる人同士で変なことになるのはよくあることだとは思うよ。
274 :NAME IS NULL :2014/08/24(日) 15:52:57.85 ID:tWIgsl3k.net よろしくお願いいたします。 【DBMS名とバージョン】Oracle 11g 【テーブルデータ】 ID YMD 1 20140101 1 20140102 1 20140103 1 20140105 1 20140106 2 20140101 2 20140102 【欲しい結果 】 ID START_YMD END_YMD 1 20140101 20140103 1 20140105 20140106 2 20140101 20140102 【説明】 レコード単位で一日の日付を持つデータをグループかして、 開始日付と終了日付に集約したいです。 ただし、一日でも間があれば、集約データ内では別レコードとして扱いたいです。 どなたかいいお知恵がございましたら、よろしくお願いいたしますm(_ _)m
275 :NAME IS NULL :2014/08/24(日) 16:05:50.95 ID:???.net あらあら、これこそトリッキーな何かを仕込まないと無理そうな気がする。 前日が存在しないものと翌日が存在しないもので末端は見つけられるけど、 それを横につなげるのが大変そうという点で。
276 :NAME IS NULL :2014/08/24(日) 16:23:14.98 ID:???.net >>274 前後が孤立している、前にも後ろにも間がある単独レコードは START_YMD=END_YMDの1件という処理でいいの?
277 :NAME IS NULL :2014/08/24(日) 16:43:15.06 ID:???.net >>276 そうだと思う。 末端値に対して ID YMD の昇順で連番振ってそれをキーに結合すればよいだけだと思う。
278 :NAME IS NULL :2014/08/24(日) 16:43:50.36 ID:tWIgsl3k.net レスありがとうございます。 >>275 今のところLAG関数を使って前後のレコードを分析するのがいいのでは・・・と考えてます。 おっしゃるとおり、前日に存在しないもの、翌日に存在しないもの、というのは簡単でしたが、 それを横につなげるうまい方法がわかりません。。 >>276 はい。 テーブルデータ 1 20140101 1 20140103 1 20140105 上記の場合、欲しい結果は以下になります。 ID START_YMD END_YMD 1 20140101 20140101 1 20140103 20140103 1 20140105 20140105
279 :NAME IS NULL :2014/08/24(日) 16:49:27.88 ID:???.net >>278 横につなげるキーとして row_number() over (order by id, ymd) as row_number を作ったら素直にいけないかな。
280 :274 :2014/08/24(日) 17:01:53.27 ID:???.net >>279 レスありがとうございます。 すみません。。ちょっとわからないです。 row_numberを使用して採番して、それをどう横に展開するのかイメージできません。
281 :NAME IS NULL :2014/08/24(日) 17:11:59.32 ID:???.net > 前日に存在しないもの、翌日に存在しないもの、というのは簡単 これに、row_numberを加えれば、以下の二つの集合が取れるよね。 採番値 ID START_YMD 1 1 20140101 2 1 20140105 3 2 20140101 採番値 ID END_YMD 1 1 20140103 2 1 20140106 3 2 20140102 これを横につなげればよいと思うよ。採番値をキーに。
282 :274 :2014/08/24(日) 17:30:39.66 ID:???.net >>284 なるほど!でいそうですね。 ただ、WHERE句で日付を絞るとうまくいかないように思えます。 一度フルスキャンしてから、という方法しかないでしょうか?
283 :NAME IS NULL :2014/08/24(日) 17:43:02.72 ID:???.net >>282 > WHERE句で日付を絞るとうまくいかないように思えます。 1/2以降で取得したいってときにも20140101 - 20140103 と出したいなら、 指定日以前の開始末端値以降のデータを使えばいいよね。 20140102 - 20140103 と出てもいいのなら単に絞ればいいし。 前者の場合はwithを使ったほうがよさげ。
284 :274 :2014/08/24(日) 17:50:23.77 ID:???.net >>283 レスありがとうございます! なんとかなりそうです!感謝!!
285 :NAME IS NULL :2014/08/29(金) 19:18:04.33 ID:z7QCa06Cf Oracle 10g 以下のSQLを実行すると、OR内で外部結合するなとエラーになります。 unionを使用しないで実現する方法はありますでしょうか? よろしくお願いします。 select * from tableA A,tableB B where (A.ID = B.ID(+) and A.Type = 'A' and B.No(+) = '001' and B.VER(+) = '1') OR (A.ID = B.ID(+) and A.Type = 'B' and B.No(+) = '002' and B.VER(+) = '1') OR (A.ID = B.ID(+) and A.Type = 'C' and B.No(+) = '003' and B.VER(+) = '1')
286 :NAME IS NULL :2014/08/30(土) 21:11:15.39 ID:enm/9WWz.net Oracle 10g 以下のSQLを実行すると、OR内で外部結合するなとエラーになります。 unionを使用しないで実現する方法はありますでしょうか? よろしくお願いします。 select * from tableA A,tableB B where (A.ID = B.ID(+) and A.Type = 'A' and B.No(+) = '001' and B.VER(+) = '1') OR (A.ID = B.ID(+) and A.Type = 'B' and B.No(+) = '002' and B.VER(+) = '1') OR (A.ID = B.ID(+) and A.Type = 'C' and B.No(+) = '003' and B.VER(+) = '1')
287 :NAME IS NULL :2014/08/30(土) 21:30:25.35 ID:???.net tableA A left join tableB B using (ID) where (A.Type = 'A' and (B.ID is null or B.No = '001' and B.VER = '1')) or (A.Type = 'B' and (B.ID is null or B.No = '002' and B.VER = '1')) or ... ってことかなぁ
288 :NAME IS NULL :2014/08/31(日) 10:17:18.52 ID:???.net select * from tableA A,tableB B where A.ID = B.ID(+) and B.ID not is null and B.VER(+) = '1' and ( (A.Type = 'A' and B.No(+) = '001' ) OR (A.Type = 'B' and B.No(+) = '002') OR (A.Type = 'C' and B.No(+) = '003') )
289 :NAME IS NULL :2014/09/01(月) 00:21:23.25 ID:ufzSgRWS.net mysql5.5を使っています。 select today.point - yesterday.point from (select point from points where date = '2014-08-31') as today left join (select point from points where date = '2014-08-30') as yesterday on today.user_id = yesterday.user_id このSQLを実行すると、todayのデータはあってもyesterdayのデータがないとき nullになってしまうのですが、yesterdayのデータがないときは yesterday.pointを0として計算する方法はないでしょうか?
290 :NAME IS NULL :2014/09/01(月) 00:34:37.24 ID:???.net select today.point - coalesce(yesterday.point, 0)
291 :NAME IS NULL :2014/09/01(月) 10:01:28.05 ID:???.net >>290 できました! ありがとうございます
292 :NAME IS NULL :2014/09/01(月) 13:25:34.56 ID:???.net 何度も質問すみません >>290 の today.point - coalesce(yesterday.point) がマイナスのときは0にするということはできますか?
293 :NAME IS NULL :2014/09/01(月) 13:42:48.70 ID:???.net coalesce はNULLの時に次のパラメタを返す関数 条件入れたければ CASE WHEN でどう?
294 :NAME IS NULL :2014/09/01(月) 17:15:41.79 ID:???.net >>293 できました! ありがとうございます
295 :NAME IS NULL :2014/09/03(水) 20:37:45.24 ID:0t9jRBQp.net 仕事で詰まっているので質問させてください (なお、どうしても急いでいるためSQLserverのスレにも 質問させていただきました連投すみません) C#でストアドを呼び出します。 その後、Sqlserverのストアドの戻り値を 呼び出したC#で受け取る方法はありますでしょうか? コーディングレベルで教えていただければと思います。 具体的に話しますと、 ストアドで複数テーブルをDELETEしたりINSERTしたりします。 どのテーブルでどのような処理(DELETE、又は、INSERT)で異常終了したかを知り その情報をC#で受け取りたいです。 ただ、ストアドは正常系のリターン0、異常系のリターン1の2択しかなかったような気がして 無理なんでしょうか? リターン値に値セットしても、C#では正常0、異常1しか戻らないし 困ってます
296 :NAME IS NULL :2014/09/03(水) 20:52:02.18 ID:???.net >>295 > ストアドは正常系のリターン0、異常系のリターン1の2択しかなかったような気がして どこにそんなこと書いてあんの?
297 :NAME IS NULL :2014/09/03(水) 20:52:14.43 ID:???.net 知らないしお前の態度も気に入らない
298 :NAME IS NULL :2014/09/03(水) 20:55:59.23 ID:???.net ×SQLServer と SQLスレにマルチポスト △C# と SQLServerスレにマルチポスト ○MSDN読む
299 :NAME IS NULL :2014/09/03(水) 20:59:41.58 ID:???.net SQLServerスレで5分レスがつかなかっただけでマルチポストするような人が 15分レスがついてないこのスレにまだいるはずがないね。
300 :NAME IS NULL :2014/09/03(水) 21:17:27.62 ID:???.net マルチポストのチェックって、何分間隔でしているんですか?
301 :NAME IS NULL :2014/09/04(木) 10:19:11.36 ID:???.net 基本的に関連するスレを巡回してるんだから 同じ質問を何度も読まされればうんざりするでしょ
302 :NAME IS NULL :2014/09/04(木) 15:12:28.31 ID:???.net mysql5.5を使用しています。 SELECT id, a, b, c, (a + b + c) / 3 as heikin, (SELECT count(id)+1, (a + b + c) / 3 as heikin FROM points b WHERE b.heikin > a.heikin) as ranking FROM points a ORDER BY ranking DESC; こう書くとUnknown column 'b.heikin' in 'where clause'というエラーが出てしまいます。 どう書くべきですか?
303 :NAME IS NULL :2014/09/04(木) 15:21:50.84 ID:???.net テーブル「a」fromに無くね?
304 :NAME IS NULL :2014/09/04(木) 16:40:34.12 ID:???.net >>302 where句に select句で作成した列は使えない。 面倒だけどこうする。/3する必要はないので除外してもいい。 SELECT id, a, b, c, (a + b + c) / 3 as heikin, (SELECT count(id)+1, (a + b + c) / 3 as heikin FROM points b WHERE (b.a + b.b + b.c) / 3 > (a.a + a.b + a.c) / 3) as ranking FROM points a ORDER BY ranking DESC; 別案としては、heikin列込みのサブクエリを挟むなど。
305 :NAME IS NULL :2014/09/04(木) 16:56:15.48 ID:???.net >>304 「where句に select句で作成した列は使えない」知りませんでした・・・ 勉強になりました。ありがとうございます
306 :NAME IS NULL :2014/09/04(木) 18:28:46.71 ID:???.net >>304 > where句に select句で作成した列は使えない。 これなんでできるようにならないんだろう。 >>302 じゃないけど、select に書いた式を where とか、group by にコピペする度になんとかならないものかと思う。 実行時に展開してくれればいいだけだから、実装が難しいとは思えないんだが...
307 :NAME IS NULL :2014/09/04(木) 23:21:45.23 ID:???.net >>301 偶に巡回するスレ全部にそいつが居た・・・ 死ねばいいのにと思っちゃった
308 :NAME IS NULL :2014/09/05(金) 04:15:16.91 ID:???.net >>306 havingじゃダメか?
309 :NAME IS NULL :2014/09/05(金) 06:07:11.82 ID:???.net >>308 ん? ちょっと意味わからん。
310 :NAME IS NULL :2014/09/05(金) 23:44:10.60 ID:b4ZTk9dXW 高校生のみでゲーム売りたいんだがどーすればいい?
311 :NAME IS NULL :2014/09/16(火) 09:28:13.48 ID:f4Wsk25V.net MYSQL MYSQL-5.5.39-WINX64.MSI をインストールする http://know-how-tree.com/archives/644
312 :NAME IS NULL :2014/09/30(火) 14:51:02.00 ID:???.net SQLServer2012です 日々の売上の合計が一定額を越えた日を知るにはどうすればいいでしょうか? 10/1 |\100 10/2 |\200 10/3 |\300 10/4 |\200 10/5 |\400 10/6 |\100 上記で\1000を越えた日=10/5と出したいです
313 :NAME IS NULL :2014/09/30(火) 17:05:29.85 ID:???.net SELECT min(date) FROM (SELECT date, t1.price, (SELECT SUM(price) FROM table t2 WHERE t1.date >= t2.date ) AS sum_price FROM table t1 ORDER BY date) a WHERE sum_price > 1000; とか、、、Window関数あるならそれ使ったほうが簡潔
314 :NAME IS NULL :2014/09/30(火) 17:17:45.63 ID:???.net >>313 ありがとうございます やってみます
315 :NAME IS NULL :2014/10/01(水) 00:02:45.65 ID:???.net >>313 サブクエリのORDER BYは(TOPとか無いと)意味ないし、SQL Serverならエラー出るぞ >>312 select top 1 日付 from (select 日付,(select sum(売上) from テーブル where 日付<=t.日付) as 売上累計 from テーブル t ) t2 where 売上累計>1000 order by 日付 とか やってることは>>313 と大差ないけど、サブクエリ増やしてminとるぐらいなら並べ直して先頭行取る方がわかりやすい気が
316 :NAME IS NULL :2014/10/01(水) 05:55:07.34 ID:???.net >>315 311はSQL serverで動くでしょ
317 :NAME IS NULL :2014/10/01(水) 15:29:44.48 ID:???.net >>316 >メッセージ 1033、(略 >TOP、OFFSET、または FOR XML が指定されていない場合、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では ORDER BY 句は無効です。 ORDER BY削らないと動きません 2012EXPRESSで確認してるけど、それ以降のバージョンで動くようになってたらしらん
318 :NAME IS NULL :2014/10/02(木) 09:32:51.93 ID:???.net mysql 5.6.20 master code (pk) sname kbn1 kbn2 〜 datatbl code month sname kbn1 kbn2 〜 (pkは code+mnonth) とあります。 datatblは都合上masterにないcodeも存在しています。 (だから外部制約は掛けていません) で、datatblのsname,kbn1,kbn2について masterに存在するなら 一括で更新したいのですが、 update datatbl set のところでどう書けば良いのでしょうか?
319 :NAME IS NULL :2014/10/02(木) 15:15:58.64 ID:???.net >>318 UPDATEはDBMSごとの差が大きいんだよなぁ MySQLはUPDATEにJOIN使えるっぽいから update datatbl join master using (code) set datatbl.sname=master.sname, ... とかで行けるんじゃね?試してないけど
320 :NAME IS NULL :2014/10/02(木) 15:44:02.51 ID:???.net >>317 へぇぇ。なんかケチだなぁと思っちゃう。 無効です→無視されますにして、警告どまりでいいような気がするんだけどね。
321 :NAME IS NULL :2014/10/02(木) 15:50:30.61 ID:???.net >>318 ところで、datatbl.kbn1 がすでに設定されている場合にも更新するの? つまり、datatbl.kbn1 kbn2 を削除して、参照時にmasterと結合するのを提案したい。
322 :NAME IS NULL :2014/10/02(木) 16:26:12.44 ID:???.net >>319 こういう書き方ができるの初めて知りました。感謝 >>321 そうです。masterに登録されていたらそちらの情報優先という事です。
323 :NAME IS NULL :2014/10/02(木) 17:39:01.34 ID:???.net >>322 master優先なら datatbl に持つ必要がないという話です。 単に正規化という言葉でもいいけど。
324 :NAME IS NULL :2014/10/02(木) 17:56:57.09 ID:???.net あぁそういう事ですか。そうすべきなんでしょうが、316にもちょろっと書きましたが、 masterにないcodeも持つ必要があり、そういうcodeのためにそうしているんですよ。 masterにないcodeとは何ぞやってな話にもなってしまうんですが、ま、そこら辺は 都合上ってことで^^;;
325 :NAME IS NULL :2014/10/02(木) 18:00:50.10 ID:???.net datatblの更新と同時にmasterのレコード追加がめんどくさいからそうなってしまったというのが、ありがちな流れかなぁ。
326 :NAME IS NULL :2014/10/16(木) 17:34:09.27 ID:r5v71qt4t 質問失礼します MySQL5.5 id aa bb cc 1 1 1 0 2 0 0 1 3 1 0 1 というテーブルから値が1のカラム名を取得できないでしょうか? 例 1 aa,bb 2 cc 3 aa,cc
327 :NAME IS NULL :2014/10/16(木) 17:47:14.74 ID:uSecLKVY.net scはミス、再度質問失礼します MySQL5.5 id aa bb cc 1 1 1 0 2 0 0 1 3 1 0 1 というテーブルから値が1のカラム名を取得できないでしょうか? 例 1 aa,bb 2 cc 3 aa,cc
328 :NAME IS NULL :2014/10/16(木) 17:53:57.98 ID:???.net aa,bbみたいに文字で取りたいならIFで書くしか無いんじゃね
329 :NAME IS NULL :2014/10/16(木) 20:03:11.92 ID:???.net 取得したカラム名の用途次第だと思うけれど、 どうしても本当に「カラム名」でなければならないならinformation_schema使う
330 :NAME IS NULL :2014/10/16(木) 20:18:46.27 ID:???.net 列数可変は置いといて 問題はinformation_schemaとどうJOINさせるかだと思うが なぜそんな事をやりたいのかわからんが ホストアプリある前提ならホストアプリで列名みるのが手っ取り早そうだ
331 :NAME IS NULL :2014/10/16(木) 20:38:09.60 ID:???.net select id, group_concat(col) from ( select id, 'aa' as col from test_test where aa = 1 union all select id, 'bb' as col from test_test where bb = 1 union all select id, 'cc' as col from test_test where cc = 1 ) as a group by id order by id
332 :NAME IS NULL :2014/10/16(木) 20:55:01.34 ID:???.net group_concatなんて始めて知ったわ…あまり使いたくないなw
333 :NAME IS NULL :2014/10/16(木) 21:02:53.49 ID:???.net select id, concat_ws(',', if(aa = 1, 'aa', null), if(bb = 1, 'bb', null), if(cc = 1, 'cc', null)) from test_test
334 :NAME IS NULL :2014/10/16(木) 21:03:46.65 ID:???.net じゃあこうかな。 select id, trim(',' from (case aa when 1 then 'aa,' else '' end || case bb when 1 then 'bb,' else '' end || case aa when 1 then 'cc,' else '' end)) from tname
335 :NAME IS NULL :2014/10/16(木) 21:04:48.27 ID:???.net おおう、concat_wsしらなかった。>>333 で。
336 :NAME IS NULL :2014/10/30(木) 10:29:02.45 ID:???.net SQLServerでストアド内で別のストアドを呼び出して その結果(テーブル)を作業テーブルに入れたいです。 別ストアドが返すテーブルのレイアウトに従って 事前に create table #tmp 〜 しておいて insert into #tmp exec 別ストアド〜 したら出来るのは分かるんですが select into ぽくやることできないですか。 別ストアドが返すテーブルレイアウトが変更されるたびに(項目が追加されるたびに) 呼ぶ側のストアドが影響を受けたくありません。
337 :NAME IS NULL :2014/10/30(木) 14:10:35.44 ID:???.net select intoでもinsert selectでも列名書いてやれば良いんじゃないのか
338 :NAME IS NULL :2014/10/30(木) 19:41:19.15 ID:???.net 「sqlserverの」select into 使えばいいんじゃない http://msdn.microsoft.com/ja-jp/library/ms188029.aspx
339 :NAME IS NULL :2014/10/31(金) 16:27:26.79 ID:???.net 別ストアドの名前をどこに書くんだ?
340 :NAME IS NULL :2014/11/03(月) 21:58:24.62 ID:???.net プログラムをシーケンス図、データベースをER図などでドキュメント化するように、SQLをドキュメント化する場合に標準の形式ってありますか?
341 :NAME IS NULL :2014/11/08(土) 10:06:39.97 ID:???.net ・DBMS Mysql Verは5.5.36 ・テーブルデータ +--------+--------+---------+ | 部品ID | 部品名 |製造番号 | +--------+--------+---------+ | B1 | 部品A | No001 | | B2 | 部品A | No002 | | B3 | 部品B | No001 | | B4 | 部品B | No002 | | B5 | 部品C | No001 | | B6 | 部品C | No002 | | B7 | 部品A | No003 | | B8 | 部品A | No004 | | B9 | 部品B | No005 | | B10 | 部品B | No006 | +--------+--------+---------+ ・テーブルほしい結果 +---------+-------+-------+-------+ |製造番号 | 部品A | 部品B | 部品C | +---------+-------+-------+-------+ | No001 | B1 | B3 | B5 | | No002 | B2 | B4 | B6 | | No003 | B7 | NULL | NULL | | No004 | B8 | NULL | NULL | | No005 | NULL | B9 | NULL | | No006 | NULL | B10 | NULL | +---------+-------+-------+-------+ 生産管理記録です。 製品は部品A 、 部品B 、 部品Cで構成され 各製品にどのIDの部品が使用されたかを記録 したいです。 当該部品が無い箇所はNULLにすることで、 生産途中の状態もある程度把握できるように したいと考えています。 最初から結果に相当するテーブル作れと 突っ込みが入りそうですが、部品DEFGで 違う製品をつくったりもするので、製品が増えるたびに テーブルが増えるのも大変かなと思って 質問してみることにしました。 初心者なのでヒントだけでもいただければ 幸いと考えいます。
342 :NAME IS NULL :2014/11/08(土) 11:56:25.20 ID:???.net >>341 >>7 参照のこと アプリケーションでやった方がいい
343 :>>338 :2014/11/08(土) 12:40:26.91 ID:???.net 今回、出力する列は製造番号,部品A , 部品B , 部品C の4つで 固定したいのですが、無理でしょうか? 見かけはクロス集計の変形みたいな感じです。 こんな感じの3つの表をつくって最後に製造番号で結合すれば いいかなっと思っているのですが、SQL的にどんな手順を踏めば いいのかがわかりません。。。 +---------+-------+ |製造番号 | 部品A | +---------+-------+ | No001 | B1 | | No002 | B2 | | No003 | B7 | | No004 | B8 | | No005 | NULL | | No006 | NULL | +---------+-------+ +---------+-------+ |製造番号 | 部品B | +---------+-------+ | No001 | B3 | | No002 | B4 | | No003 | NULL | | No004 | NULL | | No005 | B9 | | No006 | B10 | +---------+-------+ +---------+-------+ |製造番号 | 部品C | +---------+-------+ | No001 | B5 | | No002 | B6 | | No003 | NULL | | No004 | NULL | | No005 | NULL | | No006 | NULL | +---------+-------+
344 :NAME IS NULL :2014/11/08(土) 13:35:48.89 ID:???.net CASE
345 :NAME IS NULL :2014/11/08(土) 13:53:19.40 ID:???.net >>341 質問は、既存の生産管理記録テーブルに対する問い合わせではなく、 生産管理記録のテーブル設計方法なのかな? それならば、ここではなく「DB設計」で質問するのが適切だと思う DB設計としては >>341 で間違っていないので、以下のように考えよう: ・製品テーブル、部品テーブル、製品構成テーブルがある ・製品テーブルは (製造番号, .....) というカラムを持ち、製造番号 が PK である ・部品テーブルは (部品ID, 部品名, .....) というカラムを持ち、部品ID が PK である ・製品構成テーブルは製品テーブルと部品テーブルを結合するテーブルであり、 (製造番号, 部品ID, 部品名) というカラムを持つ ・製品構成テーブルのタプル (部品ID, 部品名) に対してユニーク制約をかける この制約により、ある製品が複数の同じ部品から構成されることを防ぐ また >>343 について、表を分離する必要は無いし NULL を認めるカラムを設計すべきではない ある製品である部品が使われていないことは、製品構成テーブルにロウが存在しないことで表せるのだから あとこのDB設計における製品製造ルールでは、 ある製品を製造するたびに(=製品番号ごとに)部品構成が変わることを認めている けれども一般的には製品仕様によって部品構成が決定され、それに従って製品は大量生産される (オブジェクト指向であれば、製品仕様がクラスに、製造した製品がインスタンスに相当する) これをどうDB設計するのかを検討することも良い演習になると思う
346 :NAME IS NULL :2014/11/08(土) 14:06:50.16 ID:???.net >>345 を訂正 X:それならば、ここではなく「DB設計」で O:それならば、ここではなく「DB設計」スレで
347 :NAME IS NULL :2014/11/08(土) 14:07:21.73 ID:???.net 設計方法ではなく >>341 の元テーブルから>>343 の上3つの テーブルを作り出すSQLを知りたいのでしょう それは無理と言っているのだけどね
348 :NAME IS NULL :2014/11/08(土) 14:13:15.48 ID:???.net 列が可変じゃなけりゃ別におかしいことはなかろう。 製造番号のユニーク列と>>343 の各部品毎のクエリを外部結合するだけ。
349 :338,340 :2014/11/08(土) 14:33:12.65 ID:???.net >>345 まだ全部は理解していないのですが、 製品αは部品A,部品B,部品Cで構成 製品ベータは部品C,部品D,部品F,で構成 ・・・ っとどこかで定義しないとまずいですね。。。 今回は製品は一種類、部品A,部品B,部品Cの3種類という想定でした。 また、NULLがあるのは生産途中とか部品入荷まちみたいな状態を 考えていました。 DB設計も見直してみます。アドバイスありがとうございました。
350 :338,340 :2014/11/08(土) 14:45:01.46 ID:???.net >>347 ,354 Baseでは一応できました。 (1)製造番号をgroubp By +---------+ |製造番号 | +---------+ | No001 | | No002 | | No003 | | No004 | | No005 | | No006 | +---------+ (2-1) 部品A抽出 +---------+-------+ |製造番号 | 部品A | +---------+-------+ | No001 | B1 | | No002 | B2 | | No003 | B7 | | No004 | B8 | +---------+-------+ (2-2) 部品B抽出 +---------+-------+ |製造番号 | 部品B | +---------+-------+ | No001 | B3 | | No002 | B4 | | No005 | B9 | | No006 | B10 | +---------+-------+ (2-3) 部品B抽出 +---------+-------+ |製造番号 | 部品C | +---------+-------+ | No001 | B5 | | No002 | B6 | +---------+-------+ (1)と(2-1)製造番号で外部結合 (1)と(2-2)製造番号で外部結合 (1)と(2-3)製造番号で外部結合 で、>>343 の3つの表が得られ、最終的に>>341 の表ができました。 しかし、Serect分を合計で8回(サブクエリを3層?)は、馬鹿みたいに長い SQL分になりそうなのでちょっと中断して、>344ご指摘のCASEからの アプローチしてみようと思います。
351 :NAME IS NULL :2014/11/08(土) 16:36:04.34 ID:???.net あれ、案外あっさりできちゃったのね>>350 自分の考察では、クエリを18個作って横に連結するという 非現実的なやり方しか浮かばなかったので…正直スマンカッタ 一回のみの臨時作業ならこれでいいんじゃない?
352 :NAME IS NULL :2014/11/08(土) 18:39:36.82 ID:???.net >>350 サブクエリ3回は解るが、8回とか3層とかどういうことだ? とりあえず select distinct 製造番号, (select 部品ID from データ where 部品名='部品A' and 製造番号=t.製造番号) as 部品A, (select 部品ID from データ where 部品名='部品B' and 製造番号=t.製造番号) as 部品B, (select 部品ID from データ where 部品名='部品C' and 製造番号=t.製造番号) as 部品C from データ t こんなSQL書いてみた。MySQLで動くかどうかはしらん 部品名が一意に決まらんとエラーになると思うが、MySQLだといいかげんな結果出力するかもしれん
353 :349 :2014/11/08(土) 18:46:19.66 ID:???.net ×部品名が一意に決まらんと ○部品A,B,Cに対する部品IDが一意に決まらんと に修正しとく
354 :NAME IS NULL :2014/11/09(日) 01:23:14.29 ID:???.net >>340 無い
355 :347 :2014/11/09(日) 09:41:29.15 ID:???.net >>350 ,340です >>352 こんな感じで元になるテーブルが二つある感じでしょうか? ・データ +--------+--------+---------+ | 部品ID | 部品名 |製造番号 | +--------+--------+---------+ | B1 | 部品A | No001 | | B2 | 部品A | No002 | | B3 | 部品B | No001 | | B4 | 部品B | No002 | | B5 | 部品C | No001 | | B6 | 部品C | No002 | | B7 | 部品A | No003 | | B8 | 部品A | No004 | | B9 | 部品B | No005 | | B10 | 部品B | No006 | +--------+--------+---------+ ・製品 +---------+ |製造番号 | +---------+ | No001 | | No002 | | No003 | | No004 | | No005 | | No006 | +---------+ テーブルの構造としてこちらが良い感じでした。 でも、そのままだと、エラーが取れなかったのでLEFT JOINでつなげたらできました。 SELECT 製品No.`製造番号` as '製造番号', `データ`A.`部品ID` as '部品A', `データ`B.`部品ID` as '部品B', `データ`C.`部品ID` as '部品C' FROM 製品 製品No LEFT JOIN ( SELECT `データ`.`製造番号`, `データ`.`部品ID` From `データ` where 部品名='部品A' ) as `データ`A ON ss.`製造番号` = `データ`A.`製造番号` LEFT JOIN ( SELECT `データ`.`製造番号`, `データ`.`部品ID` From `データ` where 部品名='部品B' ) as `データ`B ON ss.`製造番号` = `データ`B.`製造番号` LEFT JOIN ( SELECT `データ`.`製造番号`, `データ`.`部品ID` From `データ` where 部品名='部品C' ) as `データ`C ON ss.`製造番号` = `データ`C.`製造番号`
356 :347 :2014/11/09(日) 09:49:36.92 ID:???.net おっと>>524 は``のつけ方間違っていました``とれば大丈夫だと思います。 ちなみに 当初の目的であるデータ のテーブルからだけでもできました。 今のところと使いどころがないですが(笑) SELECT DISTINCT データs.製造番号, データs.製造番号 as '製造番号S', データA.部品ID as '部品A', データB.部品ID as '部品B', データC.部品ID as '部品C' FROM データ ss Right JOIN (SELECT データ.製造番号 From データ GROUP BY データ.製造番号) as データs ON ss.製造番号 = データs.製造番号 LEFT JOIN ( SELECT データ.製造番号, データ.部品ID From データ WHERE 部品名='部品A' ) as データA ON ss.製造番号 = データA.製造番号 LEFT JOIN ( SELECT データ.製造番号, データ.部品ID From データ WHERE 部品名='部品B' ) as データB ON ss.製造番号 = データB.製造番号 LEFT JOIN ( SELECT データ.製造番号, データ.部品ID From データ WHERE 部品名='部品C' ) as データC ON ss.製造番号 = データC.製造番号 スレを下さった方々とは違う形ではありますが、おかげさまで一先ず目的は達成できました。 (ホントは、もっとスマートにできそうですね。) ありがとうございました。
357 :NAME IS NULL :2014/11/09(日) 09:56:26.43 ID:???.net case文がsqlserverなのでアレンジして試して SELECT 製品No.`製造番号` as '製造番号', case `部品名` when `部品A` else null then `部品ID` end as '部品A', case `部品名` when `部品B` then `部品ID` end as '部品B', case `部品名` when `部品C` then `部品ID` end as '部品C', FROM 製品 製品No inner JOIN `データ` ON 製品No.`製造番号` = `データ`.`製造番号`
358 :NAME IS NULL :2014/11/09(日) 10:42:26.99 ID:???.net >>354 それ微妙ですね コード読むしかないのか
359 :NAME IS NULL :2014/11/09(日) 10:50:47.62 ID:???.net >>357 >>341 が期待したものとぜんぜん違う歯抜けの結果が返ってきそうだが。 ひょっとしてSQLServerはこれでいけるのか?
360 :NAME IS NULL :2014/11/09(日) 11:01:59.80 ID:???.net >>358 世界標準が無いだけで、会社の示した標準はあるでしょ シーケンス図=ER図、プログラムソース=SQLソースはコーディング規約とヘッダ情報書 プログラムソースのドキュメント=SQLソースのドキュメント
361 :NAME IS NULL :2014/11/09(日) 11:21:51.57 ID:???.net >>359 ああ、済まん 製造番号は重複しないと思ってたわ
362 :NAME IS NULL :2014/11/09(日) 12:06:02.46 ID:???.net select 製造番号, max(case when 部品名 = '部品A' then 部品ID else null end) as "部品A", max(case when 部品名 = '部品B' then 部品ID else null end) as "部品B", max(case when 部品名 = '部品C' then 部品ID else null end) as "部品C" from テーブルデータ group by 製造番号 order by 製造番号
363 :NAME IS NULL :2014/11/09(日) 12:10:40.53 ID:???.net 名前てmaxいけるんだっけ
364 :NAME IS NULL :2014/11/09(日) 12:16:52.66 ID:???.net >>362 あと、それだとnull上書きになるかもなのでmaxはcase内が良い
365 :338 :2014/11/09(日) 14:55:48.28 ID:???.net >>359 すごい、すっきりしてます! それにクロス集計っぽいのがいいです! >>364 maxはcase内ってどんな感じでしょうか? もし、よろしければSQL文を書いていただけたら幸いです こうすると期待してるのと違う出力になったので。。。 select 製造番号, case when 部品名 = '部品A' then max(部品ID) else null end as "部品A", case when 部品名 = '部品B' then max(部品ID) else null end as "部品B", case when 部品名 = '部品C' then max(部品ID) else null end as "部品C" from テーブルデータ group by 製造番号 order by 製造番号
366 :NAME IS NULL :2014/11/09(日) 16:47:31.95 ID:???.net max(null)はnullのはずだが、MySQLでは違うのか?
367 :NAME IS NULL :2014/11/10(月) 00:42:53.19 ID:???.net >>365 359で上手くいくなら、それで完結でいいかと
368 :NAME IS NULL :2014/11/10(月) 13:56:29.54 ID:???.net なんだこの流れは。 この2行で終わる話じゃないのかい。 >>341 >>5
369 :NAME IS NULL :2014/11/10(月) 22:23:42.07 ID:???.net WITH RECURSIVEとCASEはどのDBでもSQL99互換にして欲しいわ
370 :NAME IS NULL :2014/11/10(月) 23:30:02.89 ID:???.net caseってそんなに違う?
371 :NAME IS NULL :2014/11/11(火) 00:33:34.11 ID:???.net 違いを気にしたことはなかったけど、なんか変わってんのかな?
372 :NAME IS NULL :2014/11/11(火) 14:45:51.02 ID:c2NG27AU.net ■使用DB firebird 1.03 ■受注table 受注Num 顧客名 1 A社 2 B社 ■明細table 受注Num アイテムNum 数量 1 1 100 1 2 10 1 3 20 2 1 50 ■アイテムtable アイテムNum 種別 名前 1 果物 りんご 2 野菜 だいこん 3 果物 みかん ■欲しい結果 果物 2件 野菜 1件 種別ごとの受注件数を出したいです。なので果物の受注件数は3でなく2です。 SELECT COUNT(DISTINCT 受注Num) FROM 受注table j, 明細table m, アイテムtable i WHERE j.受注Num = m.受注Num AND m.アイテムNum = i.アイテムNum AND i.アイテムNum = 1; --で、果物の件数、2で野菜の件数 と2回問い合わせればできるようなのですが、1回でできないでしょうか。 ※DBの都合でCASE文は使えないです。
373 :NAME IS NULL :2014/11/11(火) 14:51:30.20 ID:???.net 1.0とか投げ捨てようぜ
374 :NAME IS NULL :2014/11/11(火) 16:07:30.52 ID:???.net group by をしらないのか、使えないDBなのかしらんが
375 :NAME IS NULL :2014/11/11(火) 16:14:41.50 ID:???.net >>372 やりたい事がいまいちわからん >AND i.アイテムNum = 1; --で、果物の件数、2で野菜の件数 >と2回問い合わせればできるようなのですが アイテムNum=3の果物はどうするんだよ 受注件数ってのは受注Num単位でってことか? 明細とアイテムjoinしたものを種別でグループ化して、受注Numのcount(distinct) で出来る気がするが SQLがどこまでサポートされてるかは知らん
376 :NAME IS NULL :2014/11/11(火) 16:38:50.19 ID:???.net >>373 そうしたいです。 >>374 使えるのですが使い方がわかりません。 >>375 種別ごとなので、例で言えば 果物と野菜の2種類です。 果物と野菜の受注(注文)がそれぞれ何件あるかということです。 ここでいう受注というのは、注文回数のことで、1回の注文で 果物が5つ注文されていても、1件とカウントします。 果物を2つと野菜を4つ1回の注文でなされていたら 果物1件、野菜1件とカウントします。 説明が下手ですみません。
377 :NAME IS NULL :2014/11/11(火) 17:05:36.91 ID:???.net select 種別, count(*) from 明細table join アイテムtable using (アイテムNum) group by 種別 こういうことじゃないの? "果物 2件 野菜 1件"という文字列が欲しいのなら、それはクエリでやることじゃない。 どうしてもというならできるが非効率だ。
378 :NAME IS NULL :2014/11/11(火) 17:26:09.21 ID:???.net >>377 > "果物 2件 野菜 1件"という文字列が欲しいのなら、それはクエリでやることじゃない。 > どうしてもというならできるが非効率だ。 select 種別, 種別 + to_char(count(*)) ってやるのが非効率?
379 :NAME IS NULL :2014/11/11(火) 17:52:58.30 ID:???.net >>376 1回の注文とかいっても、お前が知ってても通じないんだよ 1回の注文ってのは受注Numが同じものは1回の注文でいいのか? アイテムNum=3も1も同じ果物としてカウントしていいのか? >>375 のやり方のSQL書いて思う結果と違ったのか? それとも、そもそもそのSQLが書けなかったのか? >>378 "果物 2件","野菜 1件"(という2行)ではなく、"果物 2件 野菜 1件"の1行が欲しいなら、ってことかと
380 :NAME IS NULL :2014/11/11(火) 17:57:42.91 ID:???.net >>378 え、そこ? group_concat使えばいいじゃんっていう特定RDBMS脳ですらないことに感動した
381 :NAME IS NULL :2014/11/11(火) 18:16:13.37 ID:???.net うーむ、 > ■欲しい結果 > 果物 2件 野菜 1件 で、"果物 2件 野菜 1件"が欲しいと判断する人のが多数なのか。
382 :NAME IS NULL :2014/11/11(火) 18:21:05.39 ID:???.net 神経質、早とちり、小さな親切大きなお世話 これをセットで持ってる人多いからね
383 :NAME IS NULL :2014/11/11(火) 18:47:07.34 ID:???.net 質問者の様子を見ればそれを欲しがっていてもおかしくないと判断するわな
384 :NAME IS NULL :2014/11/11(火) 19:13:31.94 ID:???.net そう判断したのは>>377 だけじゃないのか それも可能性としてはそう高くないと感じてるような言い方だが まあ>>377 の本意が>>379 に沿ってるのかどうかも解らんが
385 :NAME IS NULL :2014/11/12(水) 10:19:47.65 ID:???.net 普通に入力と出力例書けばいいだけなのに、文章で説明しようとするからややこしくなるw
386 :369 :2014/11/12(水) 15:36:57.42 ID:???.net ええと、説明下手ですみません。どこからどなたに返答していいものやら・・・ >>379 受注Numが同じものは、1回の注文です。 アイテムNumの3も1も果物としてカウントします。 372のSQLは書けません。 >>377 それだと、明細の種別の集計となると思います。(果物3 野菜1) 欲しい結果は種別毎の受注Numの数なので 種別 数量 果物 2 野菜 1 です。(という書き方をしないといけなかったですね)
387 :NAME IS NULL :2014/11/12(水) 15:44:23.26 ID:???.net >>386 select 種別, count(distinct 受注Num) from 明細table join アイテムtable using (アイテムNum) group by 種別 じゃあこれでいいんじゃないの? count(distinct 〜が使えないならサブクエリ使って工夫すればよいと思うよ
388 :NAME IS NULL :2014/11/12(水) 15:46:50.22 ID:???.net それでいいなら、>>375 はなぜだめだったのかという話にもなるか。
389 :NAME IS NULL :2014/11/12(水) 17:14:38.93 ID:???.net firebird 1.03 がどこまでサポートしてるのかみんなわからないからな 質問者が試して結果を書いてもらうしか無い
390 :NAME IS NULL :2014/11/12(水) 17:27:42.45 ID:???.net ぶっちゃけ1.5か2にアプデ出来ないんだろうか
391 :NAME IS NULL :2014/11/12(水) 18:19:03.82 ID:???.net >>386 select 種別, count(distinct 受注Num) from 明細table join アイテムtable on 明細table.アイテムNum=アイテムtable.アイテムNum group by 種別 このSQLでエラーがでるなら、出たエラーの内容正確に書いて
392 :369 :2014/11/13(木) 18:44:31.83 ID:???.net >>387 あはは、受注table必要なかったですね。なんで思い込んでたんだろう。 >>391 丁寧にありがとうございます。そのSQLでばっちりでした。
393 :NAME IS NULL :2014/11/14(金) 14:28:00.13 ID:???.net SQL Server2012を使用し、以下のようなテーブルを作成しています。 CREATE TABLE staff ( staff_id nvarchar(7) NOT NULL UNIQUE, name nvarchar(100), email nvarchar(100), PRIMARY KEY (staff_id) ); CREATE TABLE section ( section_id int NOT NULL IDENTITY , name nvarchar(100), code nvarchar(4), PRIMARY KEY (section_id) ); CREATE TABLE post ( post_id int NOT NULL UNIQUE IDENTITY , name nvarchar(100), code nvarchar(4), PRIMARY KEY (post_id) ); CREATE TABLE department ( id int NOT NULL IDENTITY , staff_id nvarchar(7) NOT NULL UNIQUE, section_id int NOT NULL, post_id int NOT NULL UNIQUE, PRIMARY KEY (id) ); ALTER TABLE department ADD CONSTRAINT FK01 FOREIGN KEY (staff_id) REFERENCES staff (staff_id) ON UPDATE CASCADE ON DELETE CASCADE ; ALTER TABLE department ADD CONSTRAINT FK02 FOREIGN KEY (section_id) REFERENCES section (section_id) ON UPDATE CASCADE ON DELETE CASCADE ; ALTER TABLE department ADD CONSTRAINT FK03 FOREIGN KEY (post_id) REFERENCES post (post_id) ON UPDATE CASCADE ON DELETE CASCADE ;
394 :NAME IS NULL :2014/11/14(金) 14:29:58.41 ID:???.net 各テーブルの内容は以下の通りです。 staff(社員テーブル) ┏━━━━━━┯━━━━━┯━━━━━━━┓ ┃staff_id │name │email ┃ ┃0000001 │田中 │tana@a.com ┃ ┃0000002 │佐藤 │sato@a.com ┃ ┃0000003 │鈴木 │suzu@a.com ┃ ┗━━━━━━┷━━━━━┷━━━━━━━┛ section(部署テーブル) ┏━━━━┯━━━━━┯━━┓ ┃section_id│name │code┃ ┃1 │A部 │0010┃ ┃2 │B部 │0020┃ ┃3 │B部a課 │0021┃ ┗━━━━┷━━━━━┷━━┛ post(役職テーブル) ┏━━━━━┯━━━━━┯━━┓ ┃post_id │name │code┃ ┃1 │部長 │0010┃ ┃2 │部次長 │0011┃ ┃3 │課長 │0020┃ ┃4 │主任 │0030┃ ┗━━━━━┷━━━━━┷━━┛ department(所属テーブル) ┏━━━┯━━━━━━┯━━━━┯━━━━━┓ ┃id │staff_id │section_id│post_id ┃ ┃1 │0000001 │1 │1 ┃ ┃2 │0000002 │2 │1 ┃ ┃3 │0000003 │2 │2 ┃ ┃4 │0000003 │3 │3 ┃ ┗━━━┷━━━━━━┷━━━━┷━━━━━┛
395 :NAME IS NULL :2014/11/14(金) 14:41:19.39 ID:???.net すみません化けました。 各テーブルの内容は以下の通りです。 staff(社員テーブル) ┏━━━━┯━━━┯━━━━━━━┓ ┃staff_id │name │email ┃ ┃0000001 │田中 │tana@a.com ┃ ┃0000002 │佐藤 │sato@a.com ┃ ┃0000003 │鈴木 │suzu@a.com ┃ ┗━━━━┷━━━┷━━━━━━━┛ section(部署テーブル) ┏━━━━┯━━━━━┯━━┓ ┃section_id│name │code┃ ┃1 │A部 │0010┃ ┃2 │B部 │0020┃ ┃3 │B部a課 │0021┃ ┗━━━━┷━━━━━┷━━┛ post(役職テーブル) ┏━━━┯━━━━━┯━━┓ ┃post_id│name │code┃ ┃1 │部長 │0010┃ ┃2 │部次長 │0011┃ ┃3 │課長 │0020┃ ┃4 │主任 │0030┃ ┗━━━┷━━━━━┷━━┛ department(所属テーブル) ┏━┯━━━┯━━━━━┯━━━┓ ┃id│staff_id │section_id │post_id┃ ┃1 │0000001│1 │1 ┃ ┃2 │0000002│2 │1 ┃ ┃3 │0000003│2 │2 ┃ ┃4 │0000003│3 │3 ┃ ┗━┷━━━┷━━━━┷━━━┛
396 :NAME IS NULL :2014/11/14(金) 14:56:11.85 ID:???.net 欲しい結果は以下のような表です。 ┏━━━━┯━━┯━━━━━┯━━━┯━━━┓ ┃0000001 │田中│tana@a.com │A部 │部長 ┃ ┃0000002 │佐藤│sato@a.com │B部 │部長 ┃ ┃0000003 │鈴木│suzu@a.com │B部 │部次長┃ ┗━━━━┷━━┷━━━━━┷━━━┷━━━┛ 説明 ・staffテーブルの内容を重複させずに表示。 ・それぞれのstaff_idに対してpostテーブルのcodeカラムの値が最小のレコードを取得。値が同一の場合はsectionテーブルのcodeが最小のレコードを取得。 どなたか教えてください。よろしくお願いします。
397 :NAME IS NULL :2014/11/14(金) 15:34:37.52 ID:q7nye6cv.net SQLiteのtimestamp型に入れたものと比較したいのですが、 unixtimeのような数値ではなく、2014-11-14 15:30:00のような文字列が入っています。 なんとなくそのまま select * from t where created > '2014-11-14 15:30:00' といった感じにしたところ通りました。 動作も期待通りになっているようですが、 何かこういうものを入れたら通らないみたいな、まずいところはありますでしょうか?
398 :NAME IS NULL :2014/11/14(金) 17:11:51.13 ID:???.net >>396 departmentのstaff_idとかpost_idとかUNIQUEなのおかしいだろ with cte as( select staff_id, department.post_id,post.code as post_code,post.name as post_name, department.section_id,section.code as sect_code,section.name as sect_name from department join post on post.post_id=department.post_id join section on section.section_id=department.section_id ) select staff_id,name,email, (select top 1 sect_name from cte where cte.staff_id=s.staff_id order by post_code,sect_code) as sect_name, (select top 1 post_name from cte where cte.staff_id=s.staff_id order by post_code,sect_code) as post_name from staff s とりあえずこんなSQLでいけるんじゃね 効率とか保守性とかしらね
399 :NAME IS NULL :2014/11/14(金) 21:51:02.85 ID:???.net >>397 そういう文字列が入っているんじゃなく、あなたが使っているクライアントがそういう形式で表示しているだけ。 その書き方でいいけど、心配なら case('2014-11-14 15:30:00' as timestamp) って明示する
400 :アヌビモン :2014/11/15(土) 08:36:12.99 ID:Um8yiYPe.net ?2BP(0) 女神転生シリーズと錯覚の科学がコラボして欲しい 女神転生シリーズと錯覚の科学がコラボレーションして欲しい 女神転生シリーズと錯覚の科学がクロスオーバーして欲しい 女神転生シリーズと錯覚の科学が共演して欲しい 女神転生シリーズと錯覚の科学が協力して欲しい
401 :NAME IS NULL :2014/11/22(土) 19:26:50.98 ID:???.net SELECT a, b, c, a/c as d WHERE concat(a,b,c,d) LIKE "%test%" ORDER BY a ASC asで別名をつけたカラムもconcatに組み込みたい場合はどうすればいいのでしょうか? dが認識されずエラーになってしまいます
402 :NAME IS NULL :2014/11/22(土) 20:00:05.35 ID:???.net 処理の順番的に無理なので concat(a,b,c,a/c)ってする
403 :NAME IS NULL :2014/11/22(土) 20:06:32.46 ID:???.net SELECT a,b,c,d FROM (SELECT a, b, c, a/c as d FROM TableName) WHERE concat(a,b,c,d) LIKE "%test%" ORDER BY a ASC
404 :NAME IS NULL :2014/11/22(土) 20:53:29.34 ID:???.net >>401 これなんでできるようにしないのかすごく疑問 a/c ぐらいならまだいいけど、ちょっと長めの式書いたときとか、あとから見ても分かりにくいし $つけたら、alias の名前と解釈するとかして、式を展開するだけでいいと思うんだけど
405 :NAME IS NULL :2014/11/22(土) 21:19:07.48 ID:???.net >>402 ありがとうございます、助かりました
406 :NAME IS NULL :2014/11/23(日) 00:11:12.86 ID:???.net >>401 みたいなクエリが何に使われるのか知りたい
407 :NAME IS NULL :2014/11/23(日) 08:51:49.98 ID:???.net >>404 SELECT a,b,c FROM table ORDER BY d ができるのは疑問に思わないぜ?
408 :NAME IS NULL :2014/11/23(日) 09:31:05.95 ID:???.net >>407 ごめん、何を言いたいのかさっぱりわからん
409 :NAME IS NULL :2014/11/24(月) 23:09:28.31 ID:???.net >>408 朝鮮人?
410 :NAME IS NULL :2014/11/25(火) 00:05:07.47 ID:???.net >>409 >>407 の解説をお願いします
411 :NAME IS NULL :2014/11/25(火) 04:25:50.27 ID:???.net >>410 俺は>>409 じゃないけど selectに別名が使えないのに、order byだと使えるのは疑問に思わないのか? って事だと思う >>407 の書きかたで普通に通じると思ってるやつは日本語能力に問題があると思うわ
412 :NAME IS NULL :2014/11/25(火) 04:54:28.18 ID:???.net いきなり朝鮮人とか言い出す人には触れない方がいい
413 :NAME IS NULL :2014/11/25(火) 15:20:03.07 ID:???.net select a as b from table where b = c order b こんなクエリ流すと aでorderされんの?bでされんの?
414 :NAME IS NULL :2014/11/25(火) 15:57:12.21 ID:???.net >>413 質問というより、>>401 への回答?
415 :NAME IS NULL :2014/11/25(火) 15:58:10.98 ID:???.net 398じゃなかった、>>404 への答えね
416 :NAME IS NULL :2014/11/25(火) 16:05:25.11 ID:???.net bが実際にテーブルにある項目名ならエラーになるんじゃないかと思ったが 手元のDBだと動いてるなw order byされるのは結果セットで、結果セットではb=実項目aなので aでorder byされてるっぽいけど これが規定された動作なのかたまたまなのかはしらん
417 :NAME IS NULL :2014/11/25(火) 18:25:53.22 ID:???.net 大抵別名優先で行われる。 sql標準でどう規定されているかわからないけど、処理の順番的に自然な流れだと思う。 >>414-415 は? >>404 は多義性を解決するための手法を提示しているので、結構納得いく内容に見えるよ
418 :NAME IS NULL :2014/11/25(火) 18:38:14.30 ID:???.net 疑問が内容なのかね?
419 :NAME IS NULL :2014/11/25(火) 18:40:56.96 ID:???.net 後段は提案でしょ
420 :NAME IS NULL :2014/11/25(火) 18:42:21.76 ID:???.net つか、よりにもよって >>404 の疑問とするところについて、 >>413 が回答たりうると思っているのって いろいろ欠落してないか
421 :NAME IS NULL :2014/11/26(水) 00:12:11.67 ID:???.net >>416 SQL SERVER2005 2008はエラーやね
422 :413 :2014/11/26(水) 05:01:12.25 ID:???.net >>421 単にorder byのby抜けてるだけじゃないのか?それかテーブル名か 今確認したけどそこ直せば2008でも動いたぞ 俺SQL Server2000で確認したんたが 仕様変更でもあったのかと思ったぜ
423 :NAME IS NULL :2014/11/26(水) 05:18:32.28 ID:???.net この話? http://msdn.microsoft.com/ja-jp/library/ee240807.aspx
424 :NAME IS NULL :2014/11/26(水) 08:26:16.51 ID:???.net >>422 エイリアス名でソートできた?
425 :NAME IS NULL :2014/11/26(水) 13:00:31.97 ID:???.net >>423 それはorder by に .(ドット)でつないだ名前はダメって話 >>424 されてるっぽいが、たまたまの可能性は否定できん 一応調べた限りでは asで指定した名前でソートされるのがSQL規格に沿ってるように思うけど それぞれのDBMSでそう実装されてるかどうかもわからんし
426 :NAME IS NULL :2014/11/26(水) 15:45:17.11 ID:???.net >>425 > それはorder by に .(ドット)でつないだ名前はダメって話 ぶっ
427 :NAME IS NULL :2014/11/26(水) 15:57:31.53 ID:???.net 別名テーブルで指定すんなって話だと思った
428 :NAME IS NULL :2014/11/26(水) 20:12:00.70 ID:iKNX8LUi.net 一人2つまでコメントができる掲示板のテーブルがあります。 id │user_id │session│posted_date │comment│ ─┼───┼───┼──────┼────┤ 11│u11111│ 1 │2014/10/31 │hoge │ 12│u11111│ 1 │2014/10/31 │fuga │ 13│u21111│ 2 │2014/11/31 │foo │ 14│u21111│ 2 │2014/11/31 │bar │ 15│u31111│ 3 │2014/12/31 │nullpo │ これを下記のような形でデータとして抜き出して欲しいと言われました。 投稿日時 │ユーザーID │セッション番号│コメント1 │コメント2 │ 2014/10/31 │u11111 │1 │hoge │fuga │ 2014/11/31 │u21111 │2 │foo │bar │ 2014/12/31 │u31111 │3 │nullpo │ │ ■前提 ・DBはMySQL5.6 ・コメントは同時投稿なので、投稿日(posted_date)やセッション(session)は常に一致 どんなSQLを書けばいいのかわからなくてつまりました。 SELECT t1.posted_date t1.user_id, t1.session, t1.comment, t2.comment FROM table t1, table t2 WHERE t1.user_id = t2.user_id AND t1.session = t2.session これだと重複が出てしまい、DISTINCTつけても変わりません・・・・
429 :NAME IS NULL :2014/11/26(水) 20:38:58.52 ID:???.net ユーザIDとセッションの関連があいまいなので2種類。なんとなく後者で満たせそうな気はする。 select posted_date, user_id, session , (select comment from table t_sub where t_sub.user_id = t_main.user_id and t_sub.session = t_main.session order by id limit 1) as comment1 , (select comment from table t_sub where t_sub.user_id = t_main.user_id and t_sub.session = t_main.session order by id desc limit 1) as comment2 from table as t_main group by user_id, session select posted_date, user_id, session , (select comment from table t_sub where t_sub.session = t_main.session order by id limit 1) as comment1 , (select comment from table t_sub where t_sub.session = t_main.session order by id desc limit 1) as comment2 from table as t_main group by session
430 :NAME IS NULL :2014/11/26(水) 22:08:30.01 ID:???.net >>429 ありがとうございます 質問に曖昧なところがあり申し訳ありまんでした 実際の要件がもう少し複雑だったため、質問に落としこむところで不手際があったようです ただ、各コメントをSELECTで更に取ってくればいいとうのはわかりました これでなんとかなりそうで
431 :NAME IS NULL :2014/11/26(水) 22:48:55.55 ID:???.net テーブルが別れてればもっと効率よいクエリが書けただろうけどね。 それはきっと変えてはいけない(というか、変えさせてくれない)んだろうと思った。
432 :NAME IS NULL :2014/11/28(金) 12:21:36.50 ID:???.net >>429 group by 使う時って、集計関数外のカラムを 全部指定しなくていいの?
433 :NAME IS NULL :2014/11/28(金) 14:05:58.50 ID:???.net >>432 対象がMySQLだからできるんじゃないかと思って。
434 :NAME IS NULL :2014/11/28(金) 16:43:43.35 ID:???.net >>433 でも、その場合の値って不定だよね たとえば>>429 の下のクエリなら 最低限session に対応するposted_date拾ってくれるっていう「保障」はあるのかな? 全行で2014/10/31になったりすることはないの? そこまで意識してMySQLの仕様を理解した上でのクエリならいいけど 素直にグループ化項目に追加しとく方が良いんじゃないかな
435 :NAME IS NULL :2014/11/28(金) 18:28:28.72 ID:???.net つか、MySQL知ってる同士で会話してくれ ノイズはいらん
436 :NAME IS NULL :2014/11/28(金) 20:32:57.43 ID:???.net >>434 group化された中で不定なだけだよ。それは保障されてる。 MySQLメインで使ったことないけどこれ有名な仕様だと思う。 ちなみにPostgreSQLも9.1から似たようなことができるようになった。 https://www.postgresql.jp/document/9.1/html/sql-select.html#SQL-GROUPBY ただし、MySQLのそれよりは厳密。
437 :NAME IS NULL :2014/11/28(金) 20:33:53.29 ID:???.net >>435 SQLServerのバージョン依存の話には何も言わないのにMySQLだと途端に噛み付くのはノイズではないの?
438 :NAME IS NULL :2014/11/28(金) 20:52:29.47 ID:???.net それぞれが必要な情報を拾えばいいんだよ そういう意味で、ノイズはいらないから捨てる
439 :NAME IS NULL :2014/12/01(月) 05:08:30.06 ID:???.net それって要するに「俺の知らないDBMSの話はするな」ってことだよねぇ。 わがままな御仁だ。
440 :NAME IS NULL :2014/12/01(月) 11:12:16.80 ID:???.net DBMS独自の関数でもない限り、考え方だけ伝われば良い場合も多いしな
441 :NAME IS NULL :2014/12/01(月) 14:38:38.23 ID:???.net う
442 :NAME IS NULL :2014/12/01(月) 15:16:02.89 ID:???.net め
443 :NAME IS NULL :2014/12/01(月) 15:19:14.81 ID:???.net ぼ
444 :NAME IS NULL :2014/12/02(火) 00:19:56.16 ID:???.net ぬ
445 :NAME IS NULL :2014/12/04(木) 20:23:50.35 ID:???.net し
446 : ◆XEt1nraFOcTd :2014/12/05(金) 21:46:10.94 ID:???.net 無から有が生まれた これが全ての真理
447 :NAME IS NULL :2014/12/08(月) 18:52:47.27 ID:slTxxYTB.net パスツールdisってんのか
448 :NAME IS NULL :2014/12/11(木) 11:03:57.75 ID:48xV1tZI.net ☆☆☆☆☆ / / / | \ ヽ / / / / / || | i ヽ i i / / / / / / || || |│ |ノス |// / /___, -一ァ| /! |ト、|│ | | く」 |,-‐¬  ̄---┘'7 |! ハ! |,、-┼十|! | | | , -‐ ''" し' '´_ /,ィ二l |ト、/!ヽト、\_ヽ!|!l | ハ | ,r/ __ ,イ|リ ヾハ! ヽ! ,ィ⌒ヾミリノ!/リ | ☆ 自民党、グッジョブですわ。 ☆ / ||ヽ -' / ̄ )` __ |ヒノ:} '` ,イ/ | | http://www.soumu.go.jp/senkyo/kokumin_touhyou/index.html ,r ' ヾ、 ,-、____ , イ ̄,r==- ==-' レ' /| | / ヽ `ーソ ' | |ト、,ヘ ′"" "" / / || | ☆ 日本国民の皆様、12月14日(日)の . / \_ / | ハ ヽ`゙'ヘ ' '__. ィ / / | | | 『衆議院議員総選挙』に必ず投票にいきましょう。 ☆ / / / | ヽ 川\ ヾ三ニ‐'′//! | | | | / / / 八 \川| |`ト- .. __ , イ‐ァヘ | | || |! / / / / \ \ 「`ー- 、 / .〉 ト、| ヽ、 ,イ /-─=¬ニヘ、_ \ 厂\ 厂ヽ /!| | `ー=ヘ -‐  ̄ /─ '  ̄ ├- ヽ\ \ノ\ \ 人 ハ!ヽ || |-┤ ヽ / /!‐-- | |\ ト、_`ヽ oヽ ト、! || |‐┤- ヽ // 〉 __ / ├‐- || | 川-‐ | | 厂7! ハ! ├:┤  ̄ヽ / / ー ─  ̄ ├‐- リ || ハ!ヘ | | ト┤|/′ ヾ,┤ ゙i_ ‐ ' 〉‐- | / /\ .|o | /ヽ/(′ ∨ \ ‐--─ ──-r、___-、 /ー_ {( '´>、! /ヽ/ |\ \
449 :NAME IS NULL :2014/12/11(木) 20:02:20.51 ID:???.net SQLite3で数値列A,Bで、列Aの全行合計→SUM(A)とBがNULLじゃない行の 列Aの合計がほしいんですけど、一回のSQL文では無理ですか?
450 :NAME IS NULL :2014/12/11(木) 20:08:11.52 ID:???.net Select Sum(A) From Table Where B Is Not Null;じゃアカンの?
451 :NAME IS NULL :2014/12/11(木) 20:23:39.22 ID:???.net 列Aの全行合計→SUM(A)と BがNULLじゃない行の列Aの合計の 二つを一回でだから、駄目だろ
452 :NAME IS NULL :2014/12/11(木) 20:23:43.09 ID:???.net select sum(a), sum(case when b is null then 0 eles a end) from table sql server 以外で動くは知らんし そも sql serverで動くかもわからんが こんなんだろ多分
453 :NAME IS NULL :2014/12/11(木) 20:23:43.82 ID:???.net caseが使えるDBMSなら select sum(A), sum(case when B is not null then A end) from TableName でいけるけどSQLiteだと select SUM1, SUM2 from (select sum(A) as SUM1 from TableName), (select sum(A) as SUM2 from TableName where B is not null) とかかな
454 :NAME IS NULL :2014/12/11(木) 20:24:07.10 ID:???.net >>449 select sum(A), sum(case when B is null then 0 else A end) from table >>450 全行の合計は?
455 :NAME IS NULL :2014/12/11(木) 20:24:57.51 ID:???.net すまんsqlite っての見てなかった
456 :NAME IS NULL :2014/12/11(木) 20:26:53.47 ID:???.net あれ? リロードし忘れたかと思ったら、なんか書き込みが次々と w
457 :NAME IS NULL :2014/12/11(木) 20:34:07.45 ID:???.net >>453 , >>455 バージョンによるだろうけど、今時は使えるみたいよ http://www.sqlite.org/syntax/expr.html 知らん間に、再起とかもできるみようになってる
458 :NAME IS NULL :2014/12/11(木) 20:49:44.74 ID:???.net 446です。CASE文とSELECTを複数使うやり方どちらもできました。 ありがとうございました。
459 :NAME IS NULL :2014/12/11(木) 22:05:07.25 ID:SJi4cj2w.net 環境:Access、ないしSQL Server(LocalDB) やりたいこと:3つ以上のテーブルにわたる、同一名項目の結合 [項目名]と[個数]からなるテーブルがA〜Jまで10個あり(年度ごとにテーブルが 新設されてた)、これを[項目名]で結合して[個数]の変化履歴を作りたいと 考えています。 テーブルの[項目名]は、[個数]が1個以上のものだけが入っているため、 起点となるテーブルで項目が無い場合に、[項目名]すべてが表示されません。 最大で10個のテーブルを結合する時、A〜Jまでの全ての[項目名]を表示させる には、どのようなクエリにすれば良いでしょうか?
460 :NAME IS NULL :2014/12/11(木) 22:18:30.70 ID:???.net OUTER JOIN でぐぐれ
461 :NAME IS NULL :2014/12/11(木) 22:46:49.32 ID:???.net full outer join でぐぐってもらうのがよいのではないか。
462 :NAME IS NULL :2014/12/11(木) 23:08:28.48 ID:???.net >>460 ,458 full outer join でやりたいことが出来ました! [left|right] outer joinは試してたのですが、full outer join はしらんかった……どうもありがとうございます
463 :NAME IS NULL :2014/12/12(金) 05:19:00.82 ID:???.net まぁ、left/rightしかしらない、またはそれしか使えない環境でも ( select 項目名 from A union select 項目名 from B union ... union select 項目名 from J ) left join A using (項目名) left join ... ってやれば実現できるけどね。パフォーマンスは悪いが、使い方次第で実現はできるってことで。
464 :名無しさん@そうだ選挙に行こう :2014/12/13(土) 16:22:18.34 ID:???.net すみません Oracleですが あるSQLで結果が0件の場合0を表示 結果がある場合(その場合は必ず結果は1件のみ)はその結果を表示したいのですが やり方がわかりません NVL(結果,0)でやっても結果が無い状態だと0にならないし カウントを駆使しようとしてもなかなか思うようにはなりません 教えてください
465 :名無しさん@そうだ選挙に行こう :2014/12/13(土) 17:35:51.09 ID:???.net >>464 それ以外の条件がよくわからんが count(*)で良い気がするが
466 :名無しさん@そうだ選挙に行こう :2014/12/13(土) 17:49:12.44 ID:???.net カウントだと結果が1件だと1しか出ないんですが たとえば select nubmer from table1 where emp_no=? というSQLでemp_noを可変にして emp_noがDBに存在していたら、そのemp_noにひもづくnumberも存在しているのでそのnumberを返す 存在していなかったら結果が返ってこないので結果の欄に0をだす みたいなことをしたいです
467 :名無しさん@そうだ選挙に行こう :2014/12/13(土) 19:11:28.51 ID:???.net nubmerでいいのか? select case when exists (select nubmer from table1 where emp_no=4) then 4 else 0 end case from dual; 4のところを可変にして
468 :名無しさん@そうだ選挙に行こう :2014/12/13(土) 19:23:30.45 ID:???.net nubmerが必要なんだった、訂正 select case when exists (select nubmer from table1 where emp_no=4) then (select nubmer from table1 where emp_no = 4) else 0 end case from dual;
469 :名無しさん@そうだ選挙に行こう :2014/12/13(土) 20:07:59.09 ID:???.net nvl(max(nubmer),0)とかで行けるんじゃ
470 :名無しさん@そうだ選挙に行こう :2014/12/13(土) 21:48:47.12 ID:???.net select sum(number) from ( select number from table1 where emp_no = 4 union select 0 from dual )
471 :名無しさん@そうだ選挙に行こう :2014/12/13(土) 21:50:59.85 ID:???.net あ、これってできるのかな。 select number from (select 0 from dual) left join table1 on (true) where emp_no = 4
472 :名無しさん@そうだ選挙に行こう :2014/12/13(土) 21:51:45.04 ID:???.net オゥ。。。 select nvl(number, 0) from (select 0 from dual) left join table1 on (true) where emp_no = 4
473 :名無しさん@そうだ選挙に行こう :2014/12/13(土) 23:47:03.27 ID:???.net みんな親切にありがとうな
474 :NAME IS NULL :2014/12/14(日) 02:10:01.43 ID:???.net すご〜く単純に考えて、行がない時だけ、0の行を追加する。 with as t (select nubmer from table1 where emp_no = 4) select number from t union select 0 from t where rownum = 1 having count(*) = 0
475 :NAME IS NULL :2014/12/14(日) 02:11:09.71 ID:???.net あ、with t as ね。
476 :名無しさん@そうだ選挙に行こう :2014/12/14(日) 02:24:21.60 ID:???.net どう考えても>>469 の select nvl(max(nubmer),0) from table1 where emp_no=? が一番単純だろ
477 :名無しさん@そうだ選挙に行こう :2014/12/14(日) 02:58:22.64 ID:???.net >>476 ああ、今読み返したら最大一行なのか。 マッチした時は複数行返ってくるとおもってたわ。
478 :名無しさん@そうだ選挙に行こう :2014/12/14(日) 18:08:42.98 ID:???.net ふつうにselectしてホストアプリ側で件数チェックする方が楽だとは思うがな
479 :NAME IS NULL :2014/12/14(日) 21:01:04.78 ID:???.net >>477 むしろあらぬ方向に突き進んでいるが大丈夫か?
480 :NAME IS NULL :2014/12/15(月) 10:36:21.42 ID:???.net >>479 「having count(*)=0」は戻り行がないとき「だけ」行を返す常套句だが、なんか変か?
481 :NAME IS NULL :2014/12/15(月) 11:11:28.78 ID:???.net 俺ならその手のやつはOUTER JOINだな select nvl(number, 0) from (select number from table1 where emp_no = ?) right outer join dual on 1=1 ; where emp_no=?の結果が最大1行だと分かっていれば>>476 でもいいと思うが
482 :NAME IS NULL :2014/12/15(月) 12:24:21.96 ID:???.net >>481 >>472 書いたものだけど、dualって1行1列のデータなんだね。ありがとう。
483 :NAME IS NULL :2014/12/15(月) 12:26:00.78 ID:???.net あ、しかも>>472 だと結果でなかった。おはずかしい。
484 :NAME IS NULL :2014/12/16(火) 21:23:26.87 ID:???.net SELECT SUM(a) (SELECT a*2 as a from table1 where a='1111' UNION SELECT a from table1 where a='2222' UNION SELECT a from table1 where a='3333' ) と合計値を出したいのですがもっと簡単な方とかありますでしょうか? ※a='1111'の時だけ結果の二倍にしています
485 :NAME IS NULL :2014/12/16(火) 21:35:05.65 ID:???.net >>484 >>5 の応用でいける
486 :NAME IS NULL :2014/12/18(木) 14:42:35.75 ID:N3vS6BKW.net 環境:Access 接続方法:ADO(VC++) やりたいこと:フィールドのプロパティに設定されている「インデックス」の設定を変更したい 詳細: AccessのmdbファイルにADOをつかって接続しているのですが、テーブルAのフィールドXに 設定されているプロパティ「インデックス」の設定値を、「はい(重複なし)」から「いいえ」 に変更したいとかんがえています。 Accessでやれば一発なのは全くその通りなのですが、実運用にすでに入っている関係で、 プログラムでこっそり直せないかとかんがえています。 直書きSQLでフィールドのプロパティの設定値を変更するには、どのようにすればよいでしょうか?
487 :NAME IS NULL :2014/12/18(木) 21:30:38.63 ID:???.net >>486 一般的なSQLでやるならDROP INDEXだろうけど ちゃんとした環境書かんと何とも言えんが、ADOでは無理だからADOX使え これ以上はどっかADOのスレでも探して聞け
488 :NAME IS NULL :2014/12/22(月) 23:17:24.90 ID:l3MlvLHh.net ・DB2 Employeeテーブルがあります。 カラムは共通項目com_01~10 user_name user_id user_org user_age user_payment 等です。 select * from Employeeで指定したとき、共通項目cm_01~10を除く全てのカラム情報が欲しい時、 どうやって指定すればいいですか? ちなみに他にもいくつかそういうテーブルがあって、 1個1個まじめに指定するとかなりの量になってしまうので、何か良い取り出し方があれば 教えて欲しいです。
489 :NAME IS NULL :2014/12/22(月) 23:25:59.40 ID:???.net >>488 view作るのは駄目なの?
490 :NAME IS NULL :2014/12/23(火) 04:05:57.10 ID:???.net 環境:Oracle テーブル名 D_EMP 店コード゙部門コード 社員コード @ 1000 001 00001 A 1001 001 00002 B 1002 002 00003 C 1002 001 00001 (プライマリキーは店コード、部門コード、社員コード) 質問 D_EMPの中から同一の店コードがあればそれと同じ部門コード, 社員コードを持つレコードのみを取得したい 例えば検索キーを店コード=1002、部門コード=002、社員コード=00003とした場合、 まずBがヒットし、同一の店コードを持つCの部門コード、社員コードから@を取得したい ※ただし取得は@のみとし、BやCは除外させたい SQLではどのように記述すればよろしいでしょうか?よろしくお願いします。
491 :NAME IS NULL :2014/12/23(火) 06:03:13.77 ID:???.net 試してないけどそのまま書いてみた select t3.* from D_EMP t1 join D_TMP t2 on (t1.店コード = t2.店コード) join t3 on (t2.部門コード = t3.部門コード and t2.社員コード = t3.社員コード) where t1.店コード = 1002 and t1.部門コード = 002 and t1.社員コード = 00003 and t2.店コード <> 1002
492 :NAME IS NULL :2014/12/23(火) 19:34:18.89 ID:???.net ・カレンダーテーブルA 日付 1/1 1/2 1/3 1/4 … みたいなデータ ・テーブルB 名前 日付 山田 1/1 田中 1/2 佐藤 1/4 みたいなデータ これをつなげて 日付 名前 1/1 山田 1/2 田中 1/3 1/4 佐藤 としたいのですが SELCET A.日付 AS 日付, B.名前 AS 名前 FROM テーブルA A LEFT JOIN テーブルB B ON (A.日付 = B.日付) とすると 全部出ると思ってるのですが どうしてもデータ行として1/3が出ないのですが 何か間違っている箇所とかあるのでしょうか?
493 :NAME IS NULL :2014/12/23(火) 20:07:19.50 ID:???.net >>492 FULL OUTER JOIN
494 :NAME IS NULL :2014/12/23(火) 23:10:17.03 ID:???.net >>492 SELECTのTYPOは置いといて 普通に考えてそれで行けるはずだけど 日付の比較でちゃんと出来てないのかも DBMS何か知らんが、実際の日付カラムの型と入ってるデータ確認してみれば?
495 :NAME IS NULL :2014/12/24(水) 22:10:20.39 ID:???.net >>494 うーん Oracle、比較するカラムは両方とも日付型 それでFULL OUTER JOINでやっても RIGHT JOINにしても TO_CHARにしても なにをどうやってもINNER JOINと同じ形になってしまい 1/1 山田 1/2 田中 1/4 佐藤 になってしまいます もうお手上げです。
496 :NAME IS NULL :2014/12/24(水) 22:54:57.74 ID:???.net create table t_date (day date); insert into t_date values ('14/1/1'); insert into t_date values ('14/1/2'); insert into t_date values ('14/1/3'); insert into t_date values ('14/1/4'); create table t_member (name varchar(10), day date); insert into t_member values ('山田', '14/1/1'); insert into t_member values ('田中', '14/1/2'); insert into t_member values ('佐藤', '14/1/4'); 1 select t_date.day,t_member.name from t_date,t_member where t_date.day=t_member.day(+) order by t_date.day; 2 select t_date.day,t_member.name from t_date left join t_member on t_date.day=t_member.day order by t_date.day; どちらかでうまく行きませんか?
497 :NAME IS NULL :2014/12/24(水) 23:07:59.12 ID:???.net >>495 on 1=1 にしたらどうなる?
498 :NAME IS NULL :2014/12/24(水) 23:34:23.58 ID:???.net 明らかにおかしいね Accessに>>492 のSQLをそのまま打ち込んでも ちゃんと1月3日の行は出る Oracleに特有の落とし穴でもあるのかな? (外部結合が内部結合に格下げされてしまうような)
499 :NAME IS NULL :2014/12/24(水) 23:36:39.82 ID:???.net >>495 あとはLEFT OUTER JOINと書いてみるぐらいしか思いつかんな
500 :NAME IS NULL :2014/12/25(木) 02:55:50.26 ID:???.net >>495 DDL貼るぐらいの努力もしないあなたにはお手上げです
501 :あ :2014/12/25(木) 19:36:29.49 ID:???.net /:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ヽ /:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://ヽ:::::::::::::::| l:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::// ヽ::::::::::::::l l:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::/:::「'ヽ:::::::::::// ヽ:::::::::::| |::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ノl:::ノ l:::::::/ ヽ::::::::| ノ:::::::::::::::::::::::::::::::::::::::::::::::::::::/ ゙゙ ノ:::/ ,,;;;;;;,, ,,,,ヽ:::::l ):::::::::::::::::::::::::::::::::::::::::::::::/ ノ/ __,'''i: ('''__):::l )::::::::::::::::::::::::::::::::::::::::::::::::::/  ̄ ̄ン:. :「 ̄`ヾ 1:::::::::::::::::::::::「 `┤l:::::::::::::::::l  ̄ , ヽ ̄ l `l:::::::::::::::::::::ヽ :l li:::::::::::::/ ヽ /´ `l | ヽ::::::::::::::::::::::\_」 lヽ::::/ .l !:-●,__ ノ / ノ:::::::::::::::::::::::::::ノ | l `゙゙ i ,,;;;;;;;;;;;;;;;;;;;;, /ヽ ,/ ヽ::::::::::::::::::::::( l l::::::::.. /.:''/´ ̄_ソ / `ヽ ヽ:::::::::::::::ヽ | l:::::::::::... /::// ̄ ̄_ソ / \ ヴッ!! ヽ:::::::\| l::::::::::::::::... / :::.ゝ` ̄ ̄/ / ヽ ヽ:::l l:::::::::::::::::::..  ̄ ̄;;'' / ヽ l l;;;;;;:::::::::::::::.....;;;;............;;;;;;''ノ l l l '''''''''''''''''''''''''''''''''''''' ̄l | | http://www.youtube.com/watch?v=z2qK2lhk9O0
502 :NAME IS NULL :2014/12/27(土) 03:59:20.56 ID:???.net 環境 Excel2010, SQLServer2012 SQLServerに入ってるDate型のデータをExcelにインポートしたところ、形式が yyyy-mm-dd でした。mm/ddになるようにExcel側で表示形式を選んでも変わりません。 そこでクエリにCAST()を使ってDate型のデータをDateTime型にしてインポートたところ mm/dd表示にできました。 これの原因は何なのでしょうか? よろしくお願いします。
503 :NAME IS NULL :2014/12/27(土) 18:28:35.40 ID:???.net >>502 どうやってインポートしたか知らんが、スレ違いだ ExcelかSQLServerのスレ行って聞け
504 :NAME IS NULL :2014/12/27(土) 18:56:39.63 ID:???.net スレチでしたか、失礼しました。
505 :NAME IS NULL :2014/12/29(月) 15:07:26.87 ID:???.net 【質問テンプレ】 ・DBMS名とバージョン 10.0.15-MariaDB ・テーブルデータ +--------------------------------------------------------------------+---------------------+ | mailaddr | insert_dt | +--------------------------------------------------------------------+---------------------+ メールアドレス 日付 ・説明 受け取ったメールアドレスを格納しているのですが、署名の削除のプログラムに不備があり、一部のアドレスがおかしくなっています。 %k<hogehoge@docomo.ne.jp B<hogemoge@docomo.ne.jp y <testtest@icloud.com など・・・ "<"が入るとおかしくなるようなので、"<"含む左側を全て削除したいのですがSQLで可能でしょうか?
506 :NAME IS NULL :2014/12/29(月) 16:45:51.07 ID:???.net >>495 dateだからミリ秒まで一緒にならないとか? to_charでYYYYMMDDにしてLEFT JOINすればいいよ。
507 :NAME IS NULL :2014/12/29(月) 16:47:35.88 ID:???.net >>505 update テーブル set mailaddr = substring_index('<', mailaddr, -1) where mailaddr like '%<%' かなぁ。使ったことないけど。 (参考) https://mariadb.com/kb/en/mariadb/documentation/functions-and-operators/string-functions/substring_index/
508 :NAME IS NULL :2014/12/29(月) 16:50:50.62 ID:???.net >>506 あー。なるほどね。 それなら別案として ON (trunc(A.日付) = trunc(B.日付)) も提案しておく >>495
509 :NAME IS NULL :2014/12/29(月) 16:52:41.89 ID:???.net >>505 署名のほうに < が入ってるとそこで切っちゃうんじゃないのかな? ISO-2022?のマルチバイトに混じってるのかな、、、 どっちにしても複数の<が混ざるなら正規表現使ったほうが良さげ
510 :NAME IS NULL :2014/12/29(月) 17:40:26.57 ID:???.net >>507 ありがとうございます、参考にし以下で解決しました。 update mailaddr_new set mailaddr = substring_index('mailaddr', '<', -1) where mailaddr like '%<%';
511 :NAME IS NULL :2014/12/29(月) 18:54:43.32 ID:???.net >>506 ,505 外部結合なんだから、onで一致しなくても出力されないとおかしいだろ whereでなんかしてない限り
512 :NAME IS NULL :2014/12/31(水) 08:57:44.22 ID:???.net >>511 FULL OUTER JOIN ならそうだね
513 :NAME IS NULL :2014/12/31(水) 17:34:33.93 ID:???.net >>512 FULLじゃなくても、どちらかのテーブルは全行出力されるはずだが?
514 :NAME IS NULL :2015/01/01(木) 02:47:12.39 ID:???.net >>513 なぜかでないって話からはじまってるので、出なきゃおかしいっていわれてもw
515 :NAME IS NULL :2015/01/01(木) 06:09:54.33 ID:???.net >>514 このケース、基準となるテーブルAが左なのだから LEFT JOINでAのレコードは全部抽出されるわけで >>512 のレスは的外れだと言いたいのでしょ
516 :NAME IS NULL :2015/01/13(火) 13:31:43.45 ID:???.net SQLServerですが 1億レコードのうち3000万レコードほどをdeleteしようとしてますが 24時間たっても終わりません。 ちなみに同じwhere条件で、select into で別テーブルに吐き出してみると 数分で完了します。 delete時に削除されるレコードを一旦トランザクションログに吐き出しているせいだとは分かりますが どうにかなりませんか?
517 :NAME IS NULL :2015/01/13(火) 13:40:33.86 ID:???.net なら必要なレコードだけ別テーブルに吐き出して テーブルごと削除しちまえば?
518 :NAME IS NULL :2015/01/13(火) 13:42:15.73 ID:???.net インデックスとか参照整合性制約とかあると遅いかもね 消さないほうの7000万件を別テーブルにselect intoしてから 元テーブルをdrop、別テーブルを元の名前にリネームってのはどうだろう
519 :NAME IS NULL :2015/01/13(火) 13:54:35.84 ID:???.net もし途中でコケても復元不能でいいから truncate table ぽく、トランザクションログに落とさず削除してくれる with オプションがあるといいのですがー >>517-518 やっぱそれしかないですか・・・
520 :NAME IS NULL :2015/01/13(火) 14:11:52.10 ID:???.net insertしたレコードを含む一定範囲を安全にupdateするにはテーブルロックするっきゃないですか insert直後にwith updlockしても別スレッドのselectでデッドロック発生してしまう…
521 :517 :2015/01/13(火) 14:12:27.95 ID:???.net あ、SQLServer2012です
522 :NAME IS NULL :2015/01/13(火) 14:25:08.00 ID:???.net 自己解決しました
523 :NAME IS NULL :2015/01/13(火) 15:03:13.67 ID:???.net ここ技術板なんだから どう解決したか書けよ
524 :NAME IS NULL :2015/01/13(火) 18:33:44.99 ID:???.net 自分でロックどうこうするより、まず分離レベル変えてダメか検討するべきだと思うが そもそも反復読み取り可能な分離レベルより低いなら insert前にロックしてからinsertしないと、insert直後に範囲ロックしてもダメだと思うが 単なるロック待ちとデッドロックが区別できてない気もする
525 :NAME IS NULL :2015/01/14(水) 21:40:19.74 ID:???.net >>516 論理削除
526 :NAME IS NULL :2015/01/21(水) 19:46:07.15 ID:???.net mysql 5.6.20 comment_text varchar(50) default null null xxxx yyyy-mm-dd eee yyyy-mm-dd ggggggg yyyy-mm-dd となっているところから日付だけを抜き出すにはどうすれば良いでしょうか?
527 :NAME IS NULL :2015/01/21(水) 20:10:07.14 ID:???.net >>526 これを見てサッパリ理解できないヴァカは俺だけ?
528 :NAME IS NULL :2015/01/21(水) 20:28:50.45 ID:???.net 日付が必ず文字列の最後にあり、yyyy-mm-ddという形式だと決まっているなら substring(comment_text, -10) でいいと思うけど
529 :NAME IS NULL :2015/01/21(水) 20:34:16.39 ID:???.net >>526 正規表現使えばいいんじゃね?
530 :NAME IS NULL :2015/01/21(水) 20:44:23.91 ID:???.net >>528 ありがとうございます。それでなんとかやれそうです。 >>529 正規表現は、、、いずれ勉強しますw
531 :NAME IS NULL :2015/01/21(水) 20:54:51.51 ID:???.net 正規表現自体は使えるけどsedとかと違って一致部分だけ取り出すことはできんよ
532 :NAME IS NULL :2015/01/23(金) 13:33:07.63 ID:???.net >>527 そうじゃないかな
533 :NAME IS NULL :2015/01/24(土) 00:55:28.84 ID:Vm6DGlpD.net id a b ------------- 1 1 1 2 1 1 3 2 1 4 2 1 5 3 2 6 3 2 このようなテーブルがあって まずaで group by してから bで group by して idをカウントしたくてこんなSQLを書いたのですが遅いです。 select count(result.id) from (select id, b from table goup by a) as result goup by result.b もっと早くできないでしょうか?よろしくお願いします。
534 :NAME IS NULL :2015/01/24(土) 01:43:19.27 ID:???.net 何をやりたいか今一わからないけど これじゃだめなのか? select count(id),a,b from table group by a,b;
535 :NAME IS NULL :2015/01/24(土) 02:04:23.21 ID:???.net よくわからん。こうか? select count(distinct a),b from table group by b;
536 :NAME IS NULL :2015/01/24(土) 02:50:20.77 ID:???.net やりたかったのは >>535 でしたが 早さはあまり変わりませんでした。 sqlがシンプルなので使わせていただきます。 遅いのは件数が膨大なためでしょうね。 早さは諦めました。 ありがとうございました。
537 :NAME IS NULL :2015/01/24(土) 04:07:38.18 ID:???.net >>536 SQLは書き方では単純に速度はきまらない とりあえずbか(b,a)でインデックス張れ
538 :NAME IS NULL :2015/01/24(土) 13:58:07.92 ID:EzqNjDLs!.net >>537 インデックスが効くのは行を選択するカラムだけ。 ま、クエリに現れるすべてのカラムを 一つのコンポジットインデックスに叩き込めば テーブルにアクセスしなくなるので早くなるけどな。
539 :NAME IS NULL :2015/01/24(土) 16:29:43.23 ID:???.net >>538 一般的なRDBMSならソートにも効く group by は実質ソートなんでgroup by にも効く
540 :NAME IS NULL :2015/01/24(土) 23:38:19.67 ID:yNKl6pEn!.net >>539 インデックスがソートに効くっていうのは、 「インデックスを使ってテーブルにアクセスしたため、結果的にソートが不要になった」場合だけ。 ソートする目的でわざわざインデックスにアクセスするわけではない。 メモリソートのほうが、比べ物にならないくらい早いからね。 ただ、目的のソートと同じ並びのインデックスをもつテーブルへのアクセスを 実行計画の最後にもってきて、意図的にソートを不要にするテクニックもあることはある。
541 :NAME IS NULL :2015/01/25(日) 00:37:45.29 ID:???.net >>540 腐ったオプティマイザじゃなければ、それが結果的に速いと判断すれば ソートを不要にするためにわざわざインデックスを使うんじゃないかな たまたま不要になったとか、今のオプティマイザそんなにアホじゃないよ インメモリだとしてもソートのコストは馬鹿にならん
542 :NAME IS NULL :2015/01/25(日) 00:43:54.95 ID:f9eyxImL.net ID末尾が!ってどうやるんだろう。これで同じことになるかな
543 :NAME IS NULL :2015/01/25(日) 00:44:58.17 ID:f9eyxImL.net ならなかった恥ずかしい それはそれとして「インデックスにアクセスする」行為よりもメモリソートのほうが比較にならないほど早いっていうのは インデックスがメモリに乗っかってない前提の話なのかな
544 :NAME IS NULL :2015/01/25(日) 01:26:43.52 ID:iuYSGmrF!.net >>541 データブロックの物理読み込みと比べれば、インメモリのソートは無視できるくらい早い。 従ってソートのコストを考慮したとしても、オプティマイザがソートエリミネーションを選択するのは、 たまたまソートオペレーションが不要になったとかクエリとか、そうなるよう意図的書いたクエリとかがほとんど。 ただし、クエリ実行中にユーザメモリ領域に読み込んでるデータが多すぎて、 ソートするのに中間データを一時領域に退避しないとならない場合は、 ダイレクトに物理書き込みと物理読み込みが発生するので非常に高コスト。 オプティマイザがそれを認識すれば、ソートの無いパスを選択する可能性はあるが、 それにしても、目的のソートと同じ並びのインデックスが存在して、 そのインデックスでテーブルにアクセスするパスがあって、、 さらにそのテーブルにクエリの最後の最後にアクセスしなければならない。 しかも、ORDER句のカラムが複数のテーブルから来ていればお手上げ。 可能性は、めちゃくちゃ低い。
545 :NAME IS NULL :2015/01/25(日) 05:49:29.89 ID:???.net >>544 で、>>535 のクエリに対して>>537 ってのは その条件に合致するのしないの?
546 :NAME IS NULL :2015/01/25(日) 10:35:22.37 ID:???.net そもそもどこからインメモリーなんて話が出てきたんだ?
547 :NAME IS NULL :2015/01/27(火) 22:59:12.70 ID:???.net SQL ServerのテーブルにODBCでリンクしたAccess上でクエリを作る際、 FULL OUTER JOINって使えないんでしたっけ? そんな語句ね−よと怒られるんですが……
548 :NAME IS NULL :2015/01/27(火) 23:04:37.62 ID:???.net >>547 T-SQL使いたいならパススルークエリ使わないとだめ リンクテーブルでやるなら JOINを書かないでFROM句に FROM table1,table2とか書いて直積を
549 :NAME IS NULL :2015/01/28(水) 00:16:05.57 ID:???.net 直積とFull Outer Joinは同じじゃないだろ JETはFull Outer Joinサポートしてないぽいな 左右の外部結合をunionするとか、SQL Server側でビュー作ってそれにリンク張るとか
550 :NAME IS NULL :2015/01/28(水) 23:40:21.92 ID:???.net >>549 あ、そうだった。 LET JOINしたビュー UNION RIGHT JOINしたビュー か
551 :NAME IS NULL :2015/01/29(木) 00:10:25.25 ID:???.net それと直積が常にイコールになるわけでもないけどな
552 :NAME IS NULL :2015/01/29(木) 00:11:09.71 ID:???.net full outer joinだわ。すまん。
553 :NAME IS NULL :2015/01/29(木) 06:16:54.18 ID:???.net FULL OUTER JOINって聞いたことないなあと思って 手元の「SQLポケットリファレンス」て本で調べてみたら MySQLとAccessではサポートしていない命令で 左にのみ存在する行と右にのみ存在する行の両方を取得する、とあるな こんなややこしい命令、増やして欲しくないものだなあ やりたければ>>550 でできるのだし
554 :NAME IS NULL :2015/01/29(木) 15:44:24.44 ID:???.net そんなこと言ったら普通の外部結合も内部結合とunionで書けるわけだが
555 :NAME IS NULL :2015/01/29(木) 15:46:39.28 ID:???.net 釣りか何か?
556 :552 :2015/01/29(木) 15:47:58.05 ID:???.net ああ、もちろん>>553 に対してね
557 :NAME IS NULL :2015/01/29(木) 16:22:42.90 ID:???.net データベース初心者なのですが、 mysqlで User(id int, name varchar) Follow(to int, from int) の時に、to,fromにidの外部参照整合性つけるにはどうすればよいですか
558 :NAME IS NULL :2015/01/29(木) 16:42:01.98 ID:???.net データベース初心者なのですが、 java persistence api を使ってデータベースを利用する場合、どの程度正規化すべきですか?
559 :NAME IS NULL :2015/01/29(木) 17:57:38.87 ID:???.net データベース初心者なのですが、 後藤さんを救うSQL教えてください
560 :NAME IS NULL :2015/01/31(土) 09:56:49.07 ID:VUE6c9hh.net wp_postmetaテーブルのmeta_key(varchar(255))レコードの_thumbnail_idを全部 削除したいです。 頭良い人! SQL文を教えてください。
561 :NAME IS NULL :2015/01/31(土) 10:19:54.11 ID:???.net drop wp_postmeta;
562 :靖国参拝、皇族、国旗国歌、神社神道を異常に嫌うカルト :2015/02/05(木) 10:08:29.69 ID:P8frCpjL.net ★マインドコントロールの手法★ ・沢山の人が偏った意見を一貫して支持する 偏った意見でも、集団の中でその意見が信じられていれば、自分の考え方は間違っているのか、等と思わせる手法 ・不利な質問をさせなくしたり、不利な質問には答えない、スルーする 誰にも質問や反論をさせないことにより、誰もが皆、疑いなど無いんだと信じ込ませる手法 偏った思想や考え方に染まっていたり、常識が通じない人間は、頭が悪いフリをしているカルト工作員の可能性が高い 10人に一人はカルトか外国人 「ガスライティング」で検索を! ...
563 :NAME IS NULL :2015/02/08(日) 03:36:02.40 ID:ut3aJyT0.net 夜間から朝方にかけてあるデータAが複数の場所から送られてくるんだけど 前日分のAの合計と当日分のAの合計をだす 綺麗な書き方教えて下さい
564 :NAME IS NULL :2015/02/08(日) 04:32:45.29 ID:???.net select sum(A) from テーブル where 日付 in (今日, 機能) group by 日付
565 :NAME IS NULL :2015/02/09(月) 00:53:29.30 ID:3M/msCTP.net 店名 ファイル名 時間 A店 10時売上 10:01 A店 11時売上 11:01 D店 10時売上 10:03 D店 11時売上 11:01 F店 10時売上 10:01 A店 従業員リスト 00:03 B店 ブラックリスト 02:05 こんな感じのテーブルで F店が11時売上が来てないのを 抽出するにはどうすればいいのでしょうか? 店名、ファイル名テーブルが残念な仕様で リストがなく来たものは制限なく追記されます
566 :NAME IS NULL :2015/02/09(月) 01:25:55.33 ID:???.net >>565 10時売上がある店名 - 11時売上がある店名 = 10時売上があったが11時売上がなかった店名
567 :NAME IS NULL :2015/02/09(月) 01:50:27.78 ID:eZmoEYfM.net >>566 ありがとうございます 考え方はわかりましたが どういう式にすればいいかが わかりません(^_^;)
568 :NAME IS NULL :2015/02/09(月) 02:32:50.21 ID:???.net 試したSQL書いてみ
569 :NAME IS NULL :2015/02/10(火) 00:10:37.20 ID:???.net http://jbbs.shitaraba.net/sports/42269/
570 :NAME IS NULL :2015/02/10(火) 06:53:09.04 ID:???.net >>567 ・10時売上がある店名 ・11時売上がある店名 ・引き算 どれがわからんの?
571 :NAME IS NULL :2015/02/10(火) 11:37:16.66 ID:???.net SQL Serverです。 あるお店で商品を売っています。システムで用意しているテーブルは以下です。 売上データの商品コードは外部キーです。 ・売上データ(列は、商品コード、売上数量) ・商品マスタ(列は、商品コード、商品名) それで商品別の売上数量の合計を見ます。その際、SQLの結果に商品名も出すことにします。 その場合、以下のどちらでも同じに結果になると思います。 @SELECT U.商品コード, S.商品名, SUM(U.売上数量) AS 数量 FROM 売上データ U INNER JOIN 商品マスタ S ON U.商品コード = S.商品コード GROUP BY U.商品コード, S.商品名 ASELECT U.商品コード, MAX(S.商品名) AS 商品名, SUM(U.売上数量) AS 数量 FROM 売上データ U INNER JOIN 商品マスタ S ON U.商品コード = S.商品コード GROUP BY U.商品コード @とAで、どちらを使うのがいいとかいうのはあるのでしょうか? どちらでも、気にすることはないでしょうか?
572 :NAME IS NULL :2015/02/10(火) 14:02:50.30 ID:???.net 後者のほうがSQL Serverが標準SQLに準拠したときにすっきりしやすくていいかもしんない
573 :NAME IS NULL :2015/02/10(火) 15:03:03.44 ID:???.net >>571 レコード数やインデックスの具合にもよるけど、実行計画が違う可能性がある。確認してみたら? なんとなくだけど、1の方が速い気がする。
574 :NAME IS NULL :2015/02/10(火) 15:20:13.53 ID:???.net >>572 mysqlとかpgsqlがやってるあれのことなら むしろgroup by削るだけで済む@の方が楽じゃないだろうか。
575 :NAME IS NULL :2015/02/10(火) 21:07:14.18 ID:qNvKu1yt.net >>570 店名はテーブルだせばいいのでしょうが 引き算や使う構文がわかりません
576 :NAME IS NULL :2015/02/10(火) 21:11:14.92 ID:???.net >>575 基礎からやり直し。というか、たぶん始めてすらいないよね。 年貢の納め時は近いぞ。
577 :NAME IS NULL :2015/02/10(火) 21:19:13.78 ID:???.net >>575 > 店名はテーブルだせばいいのでしょうが まずこの SQL は書けるのか? 書けないんだったら、SQL のお勉強からやりなよ
578 :NAME IS NULL :2015/02/10(火) 23:41:26.22 ID:8M1v3r1O.net >>577 店名は出せます。
579 :NAME IS NULL :2015/02/10(火) 23:57:03.20 ID:???.net それを条件に合わせて絞り込めば良いだけじゃないの?
580 :NAME IS NULL :2015/02/11(水) 00:06:03.09 ID:???.net >>578 だから、その SQL 書いてみてよ
581 :NAME IS NULL :2015/02/11(水) 01:09:33.77 ID:sDJiZbD1.net SELECT 店名 from データベース名 where ファイル名=10時売上
582 :NAME IS NULL :2015/02/11(水) 02:51:44.56 ID:???.net >>581 他の人が言ってるマイナス処理はDBMSによって差があるから とりあえずDBMS明記しろ マイナス以外の考え方としては、素直に 10時売上がある かつ 11時売上がない っていうWhere条件書く方法もあるけど 11時売上がないっていう条件は 相関サブクエリを(not)existsでチェックするか 11時売上がある店名に含まれているかを(not)inでチェックするか この方法ならほほとんどのDBMSでそのまま動く
583 :NAME IS NULL :2015/02/11(水) 09:30:57.30 ID:???.net 傍観してるけど、引き算とかいうてる人たち、どう着地させるのかと思ってる。 教えるの下手すぎ。
584 :NAME IS NULL :2015/02/11(水) 09:48:40.98 ID:???.net 引き算ってEXCEPTのことかと思ったぜ・・
585 :NAME IS NULL :2015/02/11(水) 09:56:57.08 ID:???.net >>565 単に11時売上が来ていない店だけなら select T1.店名 from TableName T1 where not exists ( select * from TableName T2 where T1.店名 = T2.店名 and T2.ファイル名 = '11時売上' ) これだとB店も出ちゃうので 10時売上が来ていて11時売上が来ていない店なら上記に and T1.ファイル名 = '10時売上' を追加
586 :NAME IS NULL :2015/02/11(水) 10:50:15.00 ID:???.net これ10時のが来てないと困るよね
587 :NAME IS NULL :2015/02/11(水) 11:44:34.21 ID:???.net >>586 普通は店名マスターぐらいは持つからなぁ
588 :NAME IS NULL :2015/02/11(水) 19:50:15.95 ID:???.net >>583 集合理論における引き算だけど何かおかしな点でも
589 :NAME IS NULL :2015/02/12(木) 01:10:16.71 ID:???.net >>583 DBMSによってはMINUS使えるじゃん
590 :NAME IS NULL :2015/02/13(金) 15:19:09.63 ID:???.net fulltextでインデックスを作った2gramのカラムを検索しても引っかかりません。どのような原因が考えられますか? mysqlです
591 :NAME IS NULL :2015/02/13(金) 17:03:15.37 ID:???.net >>590 最低限 ・検索対象のデータ ・どのように検索したか
592 :NAME IS NULL :2015/02/13(金) 17:13:49.67 ID:???.net >>591 適当な日本語を2gramに分けました。 日本 本語 語で であ あそ そぼ ぼう みたいに 検索は select * from hage where match(words) against('+日本 +本語' in boolean mode); とやりました 英語も検索できないです
593 :NAME IS NULL :2015/02/13(金) 19:42:19.41 ID:???.net >>592 ft_min_word_len で調べるといいかもしんない
594 :NAME IS NULL :2015/02/13(金) 23:09:55.18 ID:???.net >>593 それっぽいです ありがとうございます
595 :NAME IS NULL :2015/02/14(土) 03:46:01.22 ID:???.net よかったよかった。 ところで >>583 の疑問は解決したんだろうか。
596 :NAME IS NULL :2015/02/14(土) 19:28:35.09 ID:???.net 効率的なページネーションの書き方ってどうやるんですか? select * from hage order by ts desc limit 0, 15 だとデータが増えると遅くてダメらしいのですが
597 :NAME IS NULL :2015/02/14(土) 20:34:38.19 ID:???.net すごい重いのは普通はプログラム側で処理してるよ どうしてもSQLにしたいならインデックスとかで頑張るしかない
598 :NAME IS NULL :2015/02/14(土) 21:15:23.37 ID:???.net >>596 ページネーションなんてアホな単語覚える前にインデックス覚えろよ
599 :NAME IS NULL :2015/02/14(土) 21:32:01.30 ID:???.net MySQLだとoffsetに当たる部分が大きくなればなるほど遅くなっていくからダメ。 wehre句でそのページに当たる部分を抜き出すとかそういった処理が必要。
600 :NAME IS NULL :2015/02/14(土) 21:33:06.46 ID:???.net mysqlだとインデックスだけだとダメらしいんですよ 英語だから読めないけど、このページに書いてありました http://www.xarg.org/2011/10/optimized-pagination-using-mysql/
601 :NAME IS NULL :2015/02/14(土) 21:45:05.22 ID:???.net お前らまとめてMySQLのスレ行けや
602 :NAME IS NULL :2015/02/14(土) 23:13:25.65 ID:???.net >>600 >質問するときはDBMS名を必ず付記してください。 情報の後出し乙
603 :NAME IS NULL :2015/02/14(土) 23:36:57.03 ID:???.net >>602 すみませんでした テンプレ読んでなかったです mysql5.6です
604 :NAME IS NULL :2015/02/14(土) 23:44:42.99 ID:???.net >>598
605 :NAME IS NULL :2015/02/14(土) 23:45:18.50 ID:???.net >>602
606 :NAME IS NULL :2015/02/19(木) 03:36:48.52 ID:???.net 失礼します。 ・DBMS名とバージョン SQLite3 ・テーブルデータ user_id, item_id1, item_id2, item_id3, item_id4, item_id5 ======================== 1, 10, 20, 30, 40, 50 2, 40, 50, 60, 70, 80 3, 70, 80, 90, 100, 110 ・欲しい結果 1, 2 ・説明 アイテムID40および50を持ってるユーザを検索したいのですが、 SQL文が膨大な長さになってしまいます。 select user_id from table where (item_id1 = 40 and item_id2 = 50) or (item_id1 = 40 and item_id3 = 50) or (item_id1 = 40 and item_id4 = 50) or (item_id1 = 40 and item_id5 = 50) or (item_id2 = 40 and item_id1 = 50) or (item_id2 = 40 and item_id3 = 50) or ・・・ どうすればスマートに検索できますでしょうか 検索クエリや、そもそもデータも持ち方がおかしいのかと思ってますが、方法が浮かびません よろしくお願い致します。
607 :NAME IS NULL :2015/02/19(木) 05:52:56.34 ID:???.net >>606 >>6
608 :NAME IS NULL :2015/02/19(木) 10:49:17.00 ID:???.net >>607 10回くらい読んでようやく理解できました ありがとうございます
609 :NAME IS NULL :2015/02/19(木) 13:08:52.35 ID:???.net >>606 where 40 in (item_id1, item_id2, item_id3, item_id4, item_id5) and 50 in (item_id1, item_id2, item_id3, item_id4, item_id5)
610 :NAME IS NULL :2015/02/19(木) 17:20:08.37 ID:???.net >>58 で質問したものですが、SQL1を実行時にデッドロックが発生し、 トランザクションが自動ロールバックされたのに、それをアプリ側で 検出できず、トランザクションが終了したまま次のSQL2,3が自動コミット で実行され、最後にコミットしようとしたところでトランザクションが 終了しているので例外になって終わっていたようです。 おそらく、↓のページの事象によるものだと思われます。 ttp://support.microsoft.com/kb/315662/ja
611 :NAME IS NULL :2015/02/19(木) 20:52:50.12 ID:???.net >>610 >>それをアプリ側で検出できず ほんとに検出できないならそれは問題だが たんにお前のアプリが検出してないだけだろ 普通デッドロックはDBMS側で検知してアプリにエラーを戻す リンク先みたけど、2000のSP3で修正されてるような大昔のバージョンだし その記事の内容みるに、ロック開放待ちでずっと待ってる(=デッドロックが発生してる)のに DBMS側で検知できない=当然アプリにも通知されない って内容に見えるが だったら後続のSQLはそもそも実行されない
612 :NAME IS NULL :2015/02/20(金) 00:47:06.66 ID:???.net dbms mysql 5.6 data review(item_id,user_id,rating) query DECLARE cur CURSOR FOR SELECT x.rating,y.rating FROM (SELECT * FROM review WHERE item_id=id1) as x, (SELECT * FROM review WHERE item_id=id2) as y WHERE x.user_id = y.user_id 文法に間違いがあるらしいのですが、どこにあるのかわかりません
613 :NAME IS NULL :2015/02/20(金) 00:53:45.96 ID:???.net >>612 最後に;をつけたのですが文法エラーでした レスに書き忘れました。
614 :NAME IS NULL :2015/02/20(金) 14:51:08.38 ID:???.net >>612 自己解決しました 変数、カーソル、例外ハンドラの順に宣言しないといけなかったようです
615 :NAME IS NULL :2015/02/20(金) 15:55:38.37 ID:???.net mysqlで item(id,name) sim(id1,id2,sim default 0) insert into sim(id1,id2) values(新しいid,itemの今までのすべてのid) をやりたいのですがどういうふうに書けばよいですか
616 :NAME IS NULL :2015/02/20(金) 18:05:30.57 ID:???.net select 新しいid as id1, id as id2 from item ってこと?
617 :NAME IS NULL :2015/02/20(金) 18:11:25.39 ID:???.net >>615 新しいidは誰がどうやって決めるんだ?
618 :NAME IS NULL :2015/02/20(金) 18:54:12.30 ID:???.net idが数値だとして、その最大値 + 1 を返すストアドファンクションを作ってはいるけど
619 :NAME IS NULL :2015/02/20(金) 23:09:00.17 ID:???.net >>615 です。 新しいidはクエリーの呼び出し側でせっていして、古い方のidをitem tabl eからとってきて、挿入したかったのですが、ストアドプロシージャで作れました
620 :NAME IS NULL :2015/02/20(金) 23:16:33.00 ID:???.net mysql5.6 sim(id1,id2,sim,ts) でタイムスタンプの最も古いものを最新のsimを持ったものに更新するストアドプロシージャを作ったのですが、290万回実行したいのに1800回実行したあたりで実行結果が反映されなくなってしまいます。 どうしたらよいですか?
621 :NAME IS NULL :2015/02/21(土) 00:01:15.38 ID:???.net >>619 誰に安価つけてんのかわからんがストアドいらんよ >>620 何をしたいのか具体的に書いてくれ
622 :NAME IS NULL :2015/02/21(土) 00:12:49.55 ID:???.net >>621 最初はうまく行ったのに、作ったストアドプロシージャを呼び出しても0 rows affectedになってしまうんです。 ストアドプロシージャの中身はreviewテーブルのデータから相関係数を求めて、それをsimに入れるだけです
623 :NAME IS NULL :2015/02/21(土) 02:04:50.37 ID:???.net だめだこりゃ
624 :NAME IS NULL :2015/02/21(土) 11:11:02.04 ID:brE3by3l.net DELIMITER // CREATE PROCEDURE updateSimilarity() BEGIN DECLARE id1,id2 int unsigned; DECLARE done int default 0; DECLARE id1_ave,id2_ave,v1,v2,cov float default 0; DECLARE rating1,rating2 tinyint unsigned default 0; DECLARE result float default 0; DECLARE cur CURSOR FOR SELECT x.rating,y.rating from ( SELECT * from Review where item_id=id1 ) as x , ( SELECT * from Review where item_id=id2 ) as y where x.user_id = y.user_id; DECLARE continue handler for not found set done=1; SELECT item_id1,item_id2 from Similarity order by ts asc limit 0,1 into id1,id2; SELECT AVG(rating) from review where item_id=id1 into id1_ave; SELECT AVG(rating) from review where item_id=id2 into id2_ave; open cur; while done != 1 do fetch cur into rating1,rating2; set cov = (rating1-id1_ave)*(rating2-id2_ave)+cov; set v1 = (rating1-id1_ave)*(rating1-id1_ave)+v1; set v2 = (rating2-id2_ave)*(rating2-id2_ave)+v2; end while; close cur; IF v1 != 0 OR v2 != 0 then set result=cov/sqrt(v1)/sqrt(v2); END IF; update Similarity set similarity=result where item_id1=id1 and item_id2 = id2; update Similarity set similarity=result where item_id1=id2 and item_id2 = id1; END // DELIMITER ; これを実行したのですが1800回程度実行して以降テーブルに結果が反映されなくなりました。
625 :NAME IS NULL :2015/02/21(土) 11:47:13.79 ID:brE3by3l.net IF v1!=0 and v2!=0 then でした 書き間違えました
626 :NAME IS NULL :2015/02/21(土) 13:46:07.12 ID:???.net これ以上はmysqlスレに行ったほうがいいと思うけど、 show warnings;やshow errors; でメッセージとか出てないの?
627 :NAME IS NULL :2015/02/21(土) 18:34:26.25 ID:???.net >>626 けいこくもがエラーもないです mysqlスレでも聞いてみます
628 :NAME IS NULL :2015/02/21(土) 19:17:01.44 ID:brE3by3l.net 自己解決しました。 類似度が0の場合、updateされた時にタイムスタンプが更新されないためでした。 ご迷惑をお掛けしました
629 :NAME IS NULL :2015/02/23(月) 19:57:45.96 ID:???.net accessの2000くらいの、古いバージョンなんですが、 いくつかのテーブルからフィールドを選んで結合したクエリがあって、 そのクエリの日付型フィールドから、既に開いてるフォームのテキストボックスに入力された日付に合致したレコードのみを取り出し、 Aフィールドの文字列によって、AフィールドとBフィールドのどちらかの値を取り出し、 新しいテーブルに書き込むということをしたいと考えてます さしあたって日付に一致したレコードを取り出すとこからやりたいのですが クエリの抽出条件に[forms]![フォーム名]![テキストボックス名]と書いて、 SQLで OpenRecordset("クエリ名",dbopendynaset) とするとパラメーターが足りないとエラーが返されます 次に、 OpenRecordset("SELECT * FROM クエリ名 where フィールド名 = # & [forms]![フォーム名]![テキストボックス名] & #, dbOpenDynaset,) としてみると日付型が一致しないとエラーが出てしまいます どー直せば期待する結果を得られるでしょうか
630 :NAME IS NULL :2015/02/23(月) 23:32:37.22 ID:???.net >>629 クエリ定義をSQLビューで表示して全部書いてみて 下のOpenRecordsetは"が閉じてないけど、ちゃんとプログラム通りに書いて
631 :NAME IS NULL :2015/02/25(水) 13:31:45.28 ID:67mWbYxh.net お世話になります、質問です。 あるテーブルに、ふりがな列と生年月日の列があります。 これを歳の若い順に50件出力したいのですが、 出力の順番はふりがな順(あいうえお順)にしたいのです。 こういうのってSQLだけでできますか? (PostgreSQLです)
632 :NAME IS NULL :2015/02/25(水) 13:33:32.44 ID:67mWbYxh.net >>631 あ、すいません、もちろん副問い合わせとかなしでの話です。
633 :NAME IS NULL :2015/02/25(水) 13:41:11.21 ID:???.net もちろん って普通サブクエリ使うだろ
634 :NAME IS NULL :2015/02/25(水) 13:48:53.25 ID:???.net 余裕でできる→無理 に変わった瞬間を見た
635 :NAME IS NULL :2015/02/25(水) 13:59:59.31 ID:???.net >>631 select * from ユーザ order by 生年月日 desc, ふりがな limit 50;
636 :NAME IS NULL :2015/02/25(水) 14:05:25.24 ID:???.net それ生年月日順やん
637 :NAME IS NULL :2015/02/25(水) 15:31:27.88 ID:???.net >>636 select * from ユーザ order by date_part('years', age(生年月日)) desc, ふりがな limit 50;
638 :NAME IS NULL :2015/02/25(水) 15:39:51.76 ID:???.net >>635 >>637 ポスグレのorder byってこれでふりがな順になるの?逆におかしくね?
639 :NAME IS NULL :2015/02/25(水) 15:47:57.32 ID:???.net >>638 何がおかしいのか理解できない
640 :NAME IS NULL :2015/02/25(水) 15:48:25.79 ID:???.net サブクエリ以外でやれるDBっていったらaccessくらいしか思いつかん 通るか知らんがこんなイメージ select * from (select * from ユーザ order by 生年月日 desc limit 50 ) order by ふりがな
641 :NAME IS NULL :2015/02/25(水) 15:48:50.95 ID:???.net あと、年の若い順だから>>637 でdescはいらないね
642 :NAME IS NULL :2015/02/25(水) 15:51:54.46 ID:???.net >>640 なんだそのアホクエリーは
643 :NAME IS NULL :2015/02/25(水) 15:58:38.49 ID:???.net なんかOracleみたいだな
644 :NAME IS NULL :2015/02/25(水) 16:04:01.95 ID:???.net >>638 descが余分なのは置いといて、俺も>>637 の何がおかしいのかわからんぞ。 年齢順・フリガナ順に並べて先頭50件だろ?
645 :NAME IS NULL :2015/02/25(水) 16:05:08.07 ID:???.net row_number() over 〜 って Postagre でも使えたっけ?
646 :NAME IS NULL :2015/02/25(水) 16:06:15.59 ID:???.net ん、ひょっとして、 ・年齢順に並べて ・その先頭50件を ・フリガナ順で並べる ってことか?結果として年齢順にならないソート。
647 :NAME IS NULL :2015/02/25(水) 16:07:22.18 ID:???.net >>644 生年月日順に若い方50件抜き出した上で、それを名前順にソート >>640 は別名必須
648 :NAME IS NULL :2015/02/25(水) 16:08:36.73 ID:???.net 若いほうじゃないか、まあどっちでもいいな 50件以降はいらないのだよね?
649 :NAME IS NULL :2015/02/25(水) 16:13:09.78 ID:???.net >>647 そういう要件なのか−。 でも、それって年齢順に並べたときに50件目と51件目が同じ年齢だったら破綻するんじゃないか? 50件目が、20歳、サイトウ 51件目が、20歳、アベ で、アベが最終的に表示されなくていいのかって問題がある。
650 :NAME IS NULL :2015/02/25(水) 16:18:39.65 ID:???.net >>649 その場合は、19歳まで全部と、20歳をふりがな順にソートした(50-19歳までのレコード数)を抜き出して、 さらに全体をふりがな順に並べる、というのが要件なのか?
651 :NAME IS NULL :2015/02/25(水) 16:19:52.65 ID:???.net >もちろん副問い合わせとかなしでの話です。 副問い合わせの意味わかって書いてるのかなあこれ、、、 SQL一発で済ませろ的な意味なんじゃないかと、、それじゃなきゃ無理だろw
652 :NAME IS NULL :2015/02/25(水) 16:22:45.54 ID:???.net > 歳の若い順に50件出力 をもっと正しく表して欲さないと終わらない話だなこれ
653 :NAME IS NULL :2015/02/25(水) 17:09:28.38 ID:???.net Window関数使えば出来るのかな? まあ副問い合わせ禁止する理由がわからんが >>640 それも普通は副問い合わせに入るんじゃね
654 :NAME IS NULL :2015/02/25(水) 18:43:39.80 ID:???.net select t1.age,t1.name,t1.seq from user t1 left join user t2 on t1.age > t2.age or (t1.age = t2.age and t1.name > t2.name) or (t1.age = t2.age and t1.name = t2.name and t1.seq > t2.seq) group by t1.age,t1.name,t1.seq having count(1) < 50 order t1.name 動作確認はしてないが同姓同名、同年齢なら一意キーで若い方 という想定で作ってみたが、こんなんでどうだ?
655 :NAME IS NULL :2015/02/25(水) 18:47:47.34 ID:???.net レコード件数増えたら面白いことになりそうだな、これ
656 :NAME IS NULL :2015/02/26(木) 03:05:55.44 ID:???.net 副問い合わせは許されんのに結合は許されるのだろうか
657 :NAME IS NULL :2015/02/27(金) 17:00:21.61 ID:oUXcvWpV.net ・mySQL5.5 ・1つのカラムにカンマ区切りの数値が格納されている→1,2,3,4,5のような値 ・指定した数値(複数有)がカラムに含まれているデータを取得したい 画面上にチェックボックスが複数あり、チェックされた項目に応じた 数値がカンマ区切りでカラムに格納されます。 別途、検索画面がありそのカラムに指定した数値(こちらもチェックボックスです)が 含まれているデータを抽出したいという処理です。 likeを使った曖昧検索のようなイメージです。 例えば レコードA → 1,2,3,4,5 レコードB → 1,2,3,4 検索条件 検索パターンA:2,3を選択 → レコードAもBも抽出される 検索パターンB:1,6を選択 → レコードAもBも抽出される 検索パターンC:5を選択 → レコードAだけ抽出される 検索パターンD:6を選択 → どちらのレコードも抽出されない カンマで格納されているデータをカンマ区切りで分割するのは特に問題ありません。 チェックする項目毎にtinyint(1)型のカラムを作るという案もあったのですが 将来的に増えていく可能性もあるので、その案は取りやめになりました。 1つのテーブルだけで実装するという仕様があるものの、 データの持ち方がそもそもおかしいかもしれませんが、いい方法あったら教えて下さい。
658 :NAME IS NULL :2015/02/27(金) 17:04:53.95 ID:???.net in('dummy',',選択1,',',選択2,',',選択3,')
659 :NAME IS NULL :2015/02/28(土) 01:44:52.06 ID:???.net WHERE concat(',',カラム,',') regexp '\\,(2|3)\\,' WHERE concat(',',カラム,',') regexp '\\,(1|6)\\,' WHERE concat(',',カラム,',') regexp '\\,(5)\\,' WHERE concat(',',カラム,',') regexp '\\,(6)\\,' 正規表現で出来るんじゃないかと始めて見たものの 結局俺には出来なくてカラムにカンマ付け足した。
660 :NAME IS NULL :2015/02/28(土) 02:58:09.92 ID:???.net カンマは正規表現で特殊な意味を持たないよ(=エスケープしなくていいよ)
661 :NAME IS NULL :2015/02/28(土) 03:01:31.77 ID:???.net で、今調べたけど、mysqlならこれでいいんじゃないの? http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set
662 :NAME IS NULL :2015/03/01(日) 03:55:58.57 ID:???.net >>657 です。 レス遅くなりましたが、回答ありがとうございます。 >>661 こちらが自分のイメージにぴったりでした! ありがとうございましたー
663 :NAME IS NULL :2015/03/03(火) 17:00:11.79 ID:???.net SQLServerですけど checksum は稀にコリジョン起きるという話ですが select checksum('ab'),checksum('a-b') これが同じ値を示します。 「-」の有無だけなのですが・・・
664 :NAME IS NULL :2015/03/03(火) 17:05:47.46 ID:???.net 失礼しました binary_checksumを使って解消しました
665 :NAME IS NULL :2015/03/03(火) 20:16:04.97 ID:???.net >>663 コリジョン(偶然の一致)じゃなくて一致する値を返してるだけだろ 'ab'と'a-b'が同じと判定される照合順序なら同じ値返してくれないと困るじゃないか
666 :NAME IS NULL :2015/03/03(火) 20:52:09.81 ID:???.net 最初は binary_checksum なるものの存在を知らず、checksum がバイナリ比較かと思ってたんですよ どうもすみません。。
667 :NAME IS NULL :2015/03/04(水) 10:07:21.72 ID:???.net ま、おかしいと思った時点で a--b a---bとか試してみることに気がつくべきだったな
668 :NAME IS NULL :2015/03/06(金) 19:19:46.23 ID:???.net inner joinとinて内部の処理はどんなことしているんですか?
669 :NAME IS NULL :2015/03/06(金) 19:25:47.59 ID:???.net 全然ものが違うんじゃ
670 :NAME IS NULL :2015/03/06(金) 19:48:34.08 ID:???.net 先頭の2文字が同じ in だからって w
671 :NAME IS NULL :2015/03/06(金) 22:28:55.36 ID:???.net jpaでユーザーの友達関係を作ろうとしたのですが、スタックオーバーフローに保守性が低いからやめといた方がいいって書いてありました http://stackoverflow.com/questions/1831186/many-to-many-on-the-same-table-with-additional-columns 保守とかよくわからないのですが、なぜダメなんでしょうか
672 :NAME IS NULL :2015/03/07(土) 00:22:12.01 ID:???.net それぞれ内部処理はどうなってるのって話かと思ったけど、二人もそう認識するってことはそっちの話なんだろうか >>671 OR/Mでクラス作成がめんどいよって話であって、SQLの話じゃないと思うんだけど、どうなの
673 :NAME IS NULL :2015/03/07(土) 00:31:44.35 ID:???.net >>672 内部処理の話です sql書くときにどっちを使うか参考にしようと思たんです
674 :NAME IS NULL :2015/03/07(土) 04:22:49.09 ID:???.net >>673 やりたいこと書いたほうがはやいと思うわ
675 :NAME IS NULL :2015/03/07(土) 07:06:29.30 ID:???.net >>673 簡単に説明できるほど単順な処理はしてないよ 使ってるDBMSの実行計画について勉強して下さい
676 :NAME IS NULL :2015/03/07(土) 07:46:15.23 ID:???.net テレビを見るのに内部の構造を知らないと…なんて思ってる人なのか
677 :NAME IS NULL :2015/03/09(月) 10:12:53.76 ID:???.net クルマを運転するのに内部構造知っていたほうがいいよね
678 :NAME IS NULL :2015/03/09(月) 11:29:46.08 ID:???.net 知りたいのは構わないがそれが役立つかどうかは別次元のお話
679 :NAME IS NULL :2015/03/09(月) 12:39:41.38 ID:???.net >>677 インターフェースだけ知ってりゃ問題ない。 調子悪いときや壊れたときは内部構造知ってれば役立つけども。
680 :NAME IS NULL :2015/03/09(月) 14:23:40.89 ID:???.net その辺がまさに、JAF呼べる人と自分で何とかしなきゃいけない人の違い 日本で整備された道路だけで運転するかどうかだね
681 :NAME IS NULL :2015/03/09(月) 14:35:29.33 ID:???.net 平気で据え切りする嫁 パワステ入ってても、やっぱ据え切り控える俺
682 :NAME IS NULL :2015/03/09(月) 15:50:45.77 ID:???.net 工具もなしに治せる奴はいないしw 結局は整備屋呼ぶ羽目になるだけの話 どうせパンクかチェーンベルト切れてパンスト使う程度だろw
683 :NAME IS NULL :2015/03/09(月) 15:52:46.99 ID:???.net ん?工具は目の前の箱があるじゃないか。
684 :NAME IS NULL :2015/03/09(月) 16:36:09.84 ID:Hti+99XL.net SQL ServerないしAccessで、下のようなテーブルAがある時、 Person apple memo ------------------------------------------- Mr.A 1 "紅玉を所望" Mr.B 2 "サイズ揃っていること" SELECT count(apple) as Cnt FROM A GROUP BY apple; で、 Cnt ------------------------------------------- 3 のような出力になりますが、 Cnt memo ------------------------------------------- 3 [Mr.A "紅玉を所望"][Mr.B "サイズ揃っていること"] のように、テーブルAのmemo欄を込める、簡便な手段はないでしょうか?
685 :NAME IS NULL :2015/03/09(月) 16:51:42.41 ID:???.net cnt 2じゃね
686 :NAME IS NULL :2015/03/09(月) 16:54:34.61 ID:???.net >>5 と >>7 が近いかな?
687 :NAME IS NULL :2015/03/09(月) 16:59:06.63 ID:???.net って GROUP BY apple じゃcountは1,1の2行じゃないか
688 :NAME IS NULL :2015/03/09(月) 17:04:56.32 ID:???.net MySQLのGROUP_CONCATを実現したいなら FOR XML PATH を組み合わせればいけそうかな
689 :681 :2015/03/09(月) 21:28:14.46 ID:???.net アドバイスありがとうございます。 見ないで書いたので間違っちゃってましたが、意図を読んでくれて助かりました。 しかし……ちょっと難しそうですね(死
690 :NAME IS NULL :2015/03/10(火) 21:57:31.79 ID:???.net すみません携帯から質問させてください。 よくある質問3に似た質問になります。 環境:Oracle ほしい結果: 1レコード目のカラムA,カラムBと同一の値ならば、 他のレコードからも抽出する GROUP BY A,B HAVING HAVING以下についてご教授願えませんでしょうか。
691 :NAME IS NULL :2015/03/10(火) 22:24:18.00 ID:???.net かなり優秀なエスパーが必要だな
692 :NAME IS NULL :2015/03/11(水) 04:07:43.88 ID:???.net >>690 having count(*)>=2とかじゃないかと予想 順序指定しないと、テーブルの行に1レコード目とか2レコード目とかはないよ
693 :NAME IS NULL :2015/03/11(水) 04:29:41.01 ID:???.net なんとなくJOINで解決する話のような気がしなくもない
694 :NAME IS NULL :2015/03/12(木) 15:15:25.05 ID:IyShe7pY.net ・DBMS名とバージョン:ACCESS2003 ・テーブルデータ: ID 姓 名 住所 1 田中 一郎 東京都 2 田中 二郎 大阪府 3 田中 一郎 京都府 ・欲しい結果 ID 姓 名 住所 1 田中 一郎 東京都 ・説明: 姓と名で重複のデータが欲しいです。 重複をチェックする列が姓だけなら SELECT * FROM 名簿 GROUP BY 姓 HAVING COUNT(姓)>1 で良いと思うのですが、 チェックする列が2つの場合はどうしたらよいでしょうか。
695 :NAME IS NULL :2015/03/12(木) 15:35:07.44 ID:???.net GROUP BY 姓,名 でいいと思うけど、ACCESSは * で出るのか、、、 そのへんどうなるのかはわからない。
696 :NAME IS NULL :2015/03/12(木) 15:39:32.88 ID:???.net >>694 本題と関係ないけど、その「重複チェック後の結果」って意味あるの? ID=1,3は別人じゃないの?
697 :NAME IS NULL :2015/03/12(木) 16:13:44.16 ID:???.net >>694 ACCESSなら重複クエリウィザードでクエリ作れるはずだが、2003には無かったか? 2007でやったらこんなSQLだった SELECT テーブル1.姓, テーブル1.名, テーブル1.ID FROM テーブル1 WHERE (((テーブル1.姓) In (SELECT [姓] FROM [テーブル1] As Tmp GROUP BY [姓],[名] HAVING Count(*)>1 And [名] = [テーブル1].[名]))) ORDER BY テーブル1.姓, テーブル1.名; いかにも複数項目は付け足しましたって感じなSQLだなw
698 :691 :2015/03/12(木) 18:28:12.13 ID:???.net 今試せる環境でないのですがお礼かたがた >>695 GROUPに姓、名を指定すれば、HAVING は姓だけでも良いのですか? >>696 例としては1,3は別人の可能性が高いです。が、姓と名だけでチェックの説明として挙げました。 >>697 ウィザード見てみますが、すみません、そのSQLが何をやっているのかわからんです。
699 :691 :2015/03/12(木) 18:30:20.16 ID:???.net 追伸です。ごめんなさい。691の欲しい結果は 姓 名 田中 一郎 だけです。IDや住所は不要です。ごめんなさい。
700 :NAME IS NULL :2015/03/12(木) 18:32:42.77 ID:???.net >>694 IDと住所の表示は仕様が不明だから重複姓名だけで SELECT T.姓, T.名, Count(*) FROM 名簿 AS T GROUP BY T.姓, T.名 HAVING Count(*)>1;
701 :NAME IS NULL :2015/03/12(木) 20:40:09.12 ID:???.net ・DBMS Oracle ・テーブルデータ: A B C D 111 010 111 20150312 111 020 222 20150310 111 020 222 20150308 111 010 111 20150306 ・欲しい結果 A B C D 111 010 111 20150312 111 010 111 20150306 ・説明: FETCHして1レコードずつ読み込んでいるプログラムにおいて IF文で、AとCの値ならば抽出する判定がしたいです。 よろしくお願いします。
702 :NAME IS NULL :2015/03/12(木) 23:37:16.06 ID:???.net とあるテーブルに含まれるデータを重複したキー値毎に数えることは可能でしょうか。 想定データは以下のような感じです。 [データテーブル] key value ------------ a 1 b 2 c 3 [グループ定義テーブル] group key ------------- group1 a group1 b group2 a group2 c [欲しいデータ] group value ------------- group1 3 group2 4 [欲しいデータ]の value の値は、group1 が[データテーブル]の key:a, b の value の合計(1+2)、 group2 が key:a, c の value の合計(1+3)です。 union とかで連結すれば出来ると思うのですが、 グループの数が増えた場合に大変そうなので、より簡潔に書く方法がないものかと。 お知恵をお貸しください。
703 :699 :2015/03/12(木) 23:38:22.59 ID:???.net 失礼。 環境を書き忘れました。 DB は SQL Server 2014 です。
704 :NAME IS NULL :2015/03/12(木) 23:58:41.22 ID:???.net >>702 joinしてgroupでgroup byしてsum(value) グループの数増えても変わらないよ
705 :699 :2015/03/13(金) 00:19:26.29 ID:???.net >>704 ありがとう。 そっか。そういうやり方があったんだ。自分では思いつきませんでした。 試してみます。
706 :691 :2015/03/13(金) 17:31:49.47 ID:???.net >>700 ありがとうございました。 できました。 COUNT(*)ってグループ化したものにも使えるんですね。 勉強になりました。
707 :NAME IS NULL :2015/03/13(金) 19:40:09.62 ID:???.net >>706 > COUNT(*)ってグループ化したものにも使える むしろそれが本懐だと思っていただければと。 sumやmaxなんかもね
708 :NAME IS NULL :2015/03/15(日) 21:51:49.80 ID:???.net 教えてください。 [環境] SQLServer2014 [やりたいこと] 本来は連続している筈のデータが欠けている箇所を補完したい。 [元のデータ] date kind value -------------------- 03/01 1 1 03/01 2 2 03/03 2 3 [欲しいデータ] date kind value -------------------- 03/01 1 1 03/01 2 2 03/02 1 NULL ←ここを補完 03/02 2 NULL ←ここを補完 03/03 1 NULL ←ここを補完 03/03 2 3 [現状] とりあえずとして、上のテーブルの kind を考えずに postgres の CreateSerial っぽい関数を作成。 それで 03/01 - 03/03 の日付だけを持った一時テーブル?を 作成して以下のような sql で上のテーブルを結合すると、 日付部分の欠けは補完できました。 select t2.date, t2.value from create_serial('03/01'.'03/03',1) t1 left inner join data_table t2 on t1.num = t2.date ※create_serial は create function で作成した関数で 列名 num に指定した期間の連続した日付型を格納したテーブルを返します ただ、すごく重いです。 create_serial や data_table の単独表示ではすぐに返るのですが。 この手前、date と kind を含めて一時テーブルを作成して外部結合すると さらに重くなると思います。 こういった場合、sql だけで対処するとして、皆さんならどうするでしょうか。 お知恵をお借りできると幸いです。
709 :NAME IS NULL :2015/03/16(月) 12:19:02.62 ID:???.net create_serialが何か知らんが、generate_seriesを使って同じように書くと思う
710 :NAME IS NULL :2015/03/16(月) 12:19:56.22 ID:???.net あれっSQLサーバだった。 現状を読んでpostgresqlと勘違いしたごめんごめん
711 :NAME IS NULL :2015/03/16(月) 23:31:12.26 ID:???.net mysql5.6 やりたいこと 出荷数をカウントして在庫を調べる 商品(商品id,名前,総数) 出荷(出荷id,数量) 欲しいデータ 商品id,名前,在庫
712 :NAME IS NULL :2015/03/16(月) 23:40:32.06 ID:???.net sqlの書き方がよくわかりません よろしくお願いいたします
713 :NAME IS NULL :2015/03/17(火) 00:51:24.30 ID:???.net どの商品を出荷したかが出荷テーブルにないよ
714 :NAME IS NULL :2015/03/17(火) 21:00:40.62 ID:???.net 在庫の元もないな
715 :NAME IS NULL :2015/03/18(水) 17:08:39.71 ID:dhUOHK4A4 クソ詰まりました。 消火器内科に行っても改善されなかったので助けて下さい。 (問) id| name | permission --+----------+----- 1 | a | 1 2 | b | 0 3 | c | 1 4 | d | 0 5 | a | 1 6 | b | 0 7 | c | 0 8 | d | 1 このようなテーブルから、下記のように 1 | a | 1 5 | a | 1 3 | c | 1 7 | c | 0 8 | d | 1 4 | d | 0 2 | b | 0 6 | b | 0 nameでソートするが、 同じname内にpermissionが1のデータが1つも無い場合、 そのnameのデータを後ろに回すようなSQLってどんなものになりますでしょうか?? 詰まりすぎて破裂しそうです。 どなたか助けて下さい。
716 :NAME IS NULL :2015/03/19(木) 12:53:00.23 ID:???.net >>702 select A.group ,SUM(isnull(B.value,0)) from グループ定義テーブル A LEFT OUTER JOIN データテーブル B ON A.key = B.key GROUP BY A.group >とあるテーブルに含まれるデータを重複したキー値毎に数えることは可能でしょうか。 >想定データは以下のような感じです。 > >[データテーブル] >key value >------------ >a 1 >b 2 >c 3 > >[グループ定義テーブル] >group key >------------- >group1 a >group1 b >group2 a >group2 c > >[欲しいデータ] >group value >------------- >group1 3 >group2 4 > >[欲しいデータ]の value の値は、group1 が[データテーブル]の key:a, b の value の合計(1+2)、 >group2 が key:a, c の value の合計(1+3)です。 > >union とかで連結すれば出来ると思うのですが、 >グループの数が増えた場合に大変そうなので、より簡潔に書く方法がないものかと。 >お知恵をお貸しください。
717 :NAME IS NULL :2015/03/19(木) 13:38:01.96 ID:???.net >>716 ・外部結合 ・isnull
718 :NAME IS NULL :2015/03/19(木) 14:07:29.99 ID:???.net ビッ○カメラ札幌店の副店長の佐藤伸弦が暴行事件が起きていた 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦
719 :NAME IS NULL :2015/03/19(木) 17:23:41.78 ID:???.net >>701 1レコードずつ抽出して、 A=Cのとき出力させるなら↓でいけるんじゃない? IF カーソル.A = カーソル.C THEN dbms_output.put_line(カーソル.AからD); END IF;
720 :NAME IS NULL :2015/03/19(木) 21:34:08.57 ID:???.net カーソルに条件追加したほうがよさそうだけど、そうはできない理由があるんだろうねきっと。
721 :NAME IS NULL :2015/03/20(金) 18:00:13.90 ID:q8ZkcxR75 >>715 sc? group by でpermissionの計をだして0のやつ後回しにするとかでいいのかな
722 :NAME IS NULL :2015/03/21(土) 19:45:35.88 ID:oAiGdMlr+ 親品目と子品目について、 親 子 A B B C B" C C D Z Y Y Z のようなレコードがある場合に Cを起点に、それを含む上階層のレコードを全て取得したいのですが 親 子 A B B C B" C C D どのように記述すればよいでしょうか?
723 :NAME IS NULL :2015/04/14(火) 23:15:06.11 ID:???.net ローディングファイルの値 半角スペース コントロールファイル(sql loder ) テーブルの該当項目 NULL許可項目 ローディングファイルに格納されている半角スペースの項目は、 コントロールファイル(sql loder) を使用した場合、 テーブルにNULLか半角スペースが入るかは、コントロールファイル次第でしょうか。
724 :NAME IS NULL :2015/04/15(水) 09:03:19.33 ID:hzCuAyDj.net >>1
725 :NAME IS NULL :2015/04/15(水) 15:47:22.88 ID:???.net SQLServerなのですが、 半角カナの濁音を区別して検索する方法はないのでしょうか。 「マゼラン」という項目があるのですが Like 'マゼ%' だけでなく、Like 'マセ%' でも対象にしたいのですが、なにか方法ありませんか。
726 :NAME IS NULL :2015/04/15(水) 15:53:37.59 ID:???.net orであかんのか?
727 :NAME IS NULL :2015/04/15(水) 16:09:24.34 ID:???.net 前方一致検索用のテキストボックスがあって ユーザーが「マセ」と入力して検索させたとき、「マゼラン」が出ないのはおかしいと言ってきてまして・・・ ちなみに「ハ」と「パ」でも同様のことをしたいです。LIKE 'ハ%' で「パリ」も対象に
728 :NAME IS NULL :2015/04/15(水) 16:09:32.87 ID:???.net >>725 > Like 'マセ%' でも対象にしたいのですが 対象にならないんだっけ?
729 :NAME IS NULL :2015/04/15(水) 16:15:56.82 ID:???.net 開発前ならバージョンにもよるが照合順序AI_CIで対応、 改修ならAP側で濁点なり取ってwhere工夫かねえ
730 :NAME IS NULL :2015/04/15(水) 17:48:37.50 ID:???.net where xxx like 'マゼ%' collate Japanese_CI_AI でいけるんじゃね?
731 :NAME IS NULL :2015/04/15(水) 18:05:33.69 ID:???.net >>730 ありがとうございます。 それで完璧でした!
732 :NAME IS NULL :2015/04/15(水) 18:08:25.91 ID:???.net ソート順に影響ないかだけよく確認するんやで
733 :NAME IS NULL :2015/04/15(水) 20:06:40.17 ID:???.net >>731 お疲れ、解決してなにより ちょっと前に照合順序でトラブって、色々調べた時に where にまで書けるのかよ、ってビックリしたのが記憶の片隅に残ってた 役立って嬉しいよ
734 :NAME IS NULL :2015/04/16(木) 21:26:21.55 ID:OSjNoEwY.net ここで試験の質問はしたらだめか
735 :NAME IS NULL :2015/04/16(木) 23:27:28.62 ID:???.net 何の試験か知らないが試験に出てどうしても分からなかった問題とかなら それと分からないように質問すればOKだろう 試験対策に何をすればよいか?みたいな質問はダメだろう
736 :NAME IS NULL :2015/04/17(金) 01:33:00.29 ID:???.net 学校の試験なのか、それとも単体試験・結合試験なんかの試験なのか、どっちかな
737 :NAME IS NULL :2015/04/17(金) 06:54:43.73 ID:???.net 試験で SQL の問題がでる学校なんてあるのか?
738 :NAME IS NULL :2015/04/17(金) 06:54:52.00 ID:???.net 時期的にDBスペシャリストだと予想
739 :NAME IS NULL :2015/04/17(金) 07:52:18.67 ID:s+fo38NZ.net ごめんなさいもっと低レベルな試験です。。。(oracleブロンズ)
740 :NAME IS NULL :2015/04/18(土) 15:41:30.57 ID:MaZufVQSi はじめまして。 (問) id| month | limit | price --+-------+------------+------ 1 | 1月 | 2015/01/01 | 100 1 | 1月 | 2015/02/01 | 100 1 | 2月 | 2015/03/01 | 200 1 | 2月 | 2015/04/01 | 200 1 | 3月 | 2015/05/01 | 300 1 | 4月 | 2015/06/01 | 300 1 | 5月 | 2015/07/01 | 300 1 | 6月 | 2015/08/01 | 300 このようなテーブルから、下記のような結果を取得したいです。 id| month | limit | price --+---------+------------+------ 1 | 1月 | 2015/02/01 | 200 1 | 2月 | 2015/04/01 | 400 1 | 3月以降 | 2015/08/01 | 300 条件1.同一id,同一monthでグループ化 条件2.priceは各グループの合計金額 条件3.limitは、各グループで最も新しい日付 条件1について、1月または2月以外の月は、同一月とみなしてグループ化したい、という希望です。 必死で考えましたが、思うような結果が得られず、アドバイスいただけないでしょうか。
741 :NAME IS NULL :2015/04/18(土) 20:25:54.44 ID:VQbr/3yiu 1,2月用のselectと3月以降用のselectをunion all
742 :NAME IS NULL :2015/04/22(水) 14:52:31.65 ID:???.net DBはMariaDB 5.5.33a-MariaDB-1~squeeze tableは以下のようなもの 番号,単品管理番号,複数個組管理番号,名前 1111,12345678,0987654321234,NAME SELECT * FROM table WHERE `単品管理番号` = "12345678" OR `複数個組管理番号` = "12345678" SELECT * FROM table WHERE `単品管理番号` = "0987654321234" OR `複数個組管理番号` = "0987654321234" のようにした時にマッチしたカラム全てとどちらのカラムにマッチしたかを知りたいです
743 :NAME IS NULL :2015/04/22(水) 16:00:40.78 ID:???.net >>742 イメージわかないなあ、ストアドかプログラム判断にした方がいいんじゃ? 無理やりSQLだけでやるとこうかなあ・・・ SELECT a.番号,a.名前,b.単品管理番号,c.複数個組管理番号 FROM table a LEFT JOIN table b ON '12345678' = b.単品管理番号 LEFT JOIN table c ON '12345678' = c.複数個組管理番号 WHERE '12345678' IN (a.単品管理番号,a.複数個組管理番号) やっぱわからん、、、
744 :NAME IS NULL :2015/04/22(水) 16:10:39.49 ID:???.net >>742 SELECT *, 単品管理番号 = '12345678', 複数個組管理番号 = '12345678' FROM table WHERE '12345678' in (単品管理番号, 複数個組管理番号) 両方にマッチしたときのレコードのハンドリングさえ間違えなければ、 union all → group by でもいいかも。
745 :NAME IS NULL :2015/04/22(水) 19:11:27.90 ID:???.net case使った判断じゃダメなのかね select *, case '検索条件' when 単品管理番号 then 1 else 0 end as 単品, case '検索条件' when 複数個組管理番号 then 1 else 0 end as 複数 以下略てなもんで?
746 :NAME IS NULL :2015/04/22(水) 20:56:45.10 ID:???.net >>742 両方にマッチしたときどうしたいのかしらんが SELECT *,'単品管理番号' as マッチカラム WHERE 単品管理番号 = "12345678" UNION ALL SELECT *,'複数個組管理番号' as マッチカラム WHERE 複数個組管理番号 = "12345678" こんな感じじゃね
747 :NAME IS NULL :2015/04/22(水) 22:51:01.37 ID:???.net >>745-746 って>>744 とは違う話なの?
748 :NAME IS NULL :2015/04/26(日) 23:50:16.86 ID:???.net sqlserver あ select a-data from TB_z where name = 'system' で得られる a-dataは 1 い select b-data,c-data from TB_y where sys_no in (1,10,100,103) で得られる b-dataが1 c-dataが 定休日 として あで得られる 数値といで得られる数値が 同じなら 行にある「定休日」と出したいのですが LEFT JOINとか使うのか良く分からないので ご教授お願いいたします
749 :NAME IS NULL :2015/04/27(月) 20:27:20.29 ID:???.net >>748 やりたい事がいまいちよくわからんが select c-date from TB_z join TB_y on TB_z.a-data=TB_y.b-data where TB_z.name = 'system' and TB_y.sys_no in (1,10,100,103) こういう事? まずは本屋で入門書探して読んだ方がいいんじゃね
750 :NAME IS NULL :2015/04/27(月) 22:33:59.48 ID:???.net MicrosoftのJET SQLです groupID, ID, param groupA , ID1 , 10 groupA , ID2 , 2 groupC , ID3 , 1 groupB , ID1 , 10 groupC , ID3 , 11 のようなデータがあり groupA , 3 , 13 groupB , 1 , 10 groupC , 1 , 11 group by で groupをまとめ それに対して数値を sum(param) でまとめて出したく。 IDを count(distinct ID) として出力する。 JET SQLではcount(distinct 要素)が使えないようで サブクエリでやるしかないと思っていますが、そうすると group by と sumがどうなるのかわからなくなり。 ご教示お願いします。
751 :NAME IS NULL :2015/04/27(月) 23:21:40.58 ID:???.net >>750 ためしてないけど select groupID,count(ID),sum(param) from (select groupID,ID,sum(param) as param from table group by groupID,ID) t group by groupID かな
752 :NAME IS NULL :2015/04/27(月) 23:36:02.54 ID:???.net ありがとうございます。自宅に環境がないため明日試してみます サブクエリのIDにはdistinctは不要ですか?
753 :NAME IS NULL :2015/04/28(火) 00:40:13.43 ID:???.net sql severです テーブル 地球 フラグ 名前 コード名 グループNo ? 敵 teki. 777 0 亀仙人 kame. 112 1. ピッコロ pk. 113 1. 猫 ne 234 2. サイヤ sk 114 2. 鳥 tr. 456 3. フリーザ fz. 115 3. 山田 ya. 856 4. ブー bu. 116 続く というテーブルで ?は現在の状態によって数値が 0-4に変わります その数値によって同フラグ数値の グループNo 11xだけを選び 名前を表示するにはどうしたらいいのでしょうか?
754 :NAME IS NULL :2015/04/28(火) 10:31:39.30 ID:???.net 「その数値によって」の意味がわからない。 具体例を出してくれ。
755 :NAME IS NULL :2015/04/28(火) 19:57:55.53 ID:???.net >>753 select 名前 from 地球 where フラグ = (select フラグ from 地球 where コード名 = 'teki.') and グループNo between 110 and 119
756 :NAME IS NULL :2015/04/28(火) 20:16:34.18 ID:???.net >>753 Drop Table 地球;
757 :NAME IS NULL :2015/04/29(水) 09:13:59.22 ID:???.net >>753 フラグにピリオドついたりついてなかったりしてるが、ないとすれば select [名前] from [地球] where [フラグ] in ( select [フラグ] from [地球] where [コード名] = 'teki.') and [グループNo] like '11%'; で、どうかな 試してないけど
758 :NAME IS NULL :2015/05/12(火) 01:28:17.84 ID:VnHvga0q1 TableAのある列の重複件数を数えて、別のテーブルに出力する方法を教えてください。 えーーーっと、 ↓みたいな感じです。 TableAに、Name列があって、次のような値が入っています。 --- Name 東京 東京 大阪 大阪 大阪 --- これをTableB(Name列、Count列があります。)に移したです。 --TableBの目標-- Name, Count 東京, 2 大阪, 3 とりあえず、↓みたいなSQLを実行しましたが、 MERGE INTO TableB USING TableA ON TableB.Name = TableA.Name WHEN MATCHED THEN UPDATE SET TableB.Count = TableB.Count+1 WHEN NOT MATCHED THEN INSERT VALUES (TableA.Name, 1); 一意インデックス 'IX_Name' を含むオブジェクト 'dbo.TableB' には重複するキー行を挿入できません。重複するキーの値は (東京) です。 というエラーメッセージが表示されて失敗してしまいます。
759 :NAME IS NULL :2015/06/11(木) 15:11:27.18 ID:???.net 一時テーブルてテーブル変数って、全然ちがうんだな テーブル変数を JOIN に使ったら、死ぬほど遅くなりやがった
760 :NAME IS NULL :2015/06/20(土) 10:57:20.48 ID:lz2tDsvx.net テーブル名couple id,cuoole_id,name,sex,age 1,1,山本,男,31 2,1,岡田,女,24 3,2,多田,女,28 4,2,佐々木,男,22 以下を出力したいんだけど教えてくださいませ 「couple_id,name,sex,age,(同じcouple_idの)name,sex,age」 1,山本,男,31,岡田,女,24 1,岡田,女,24,山本,男,31 2,多田,女,28,佐々木,男,22 2,佐々木,男,22,多田,女,28
761 :751 :2015/06/20(土) 11:28:23.81 ID:???.net GROUP_CONCAT つかったらできますた すみませんでした
762 :NAME IS NULL :2015/06/22(月) 19:44:25.44 ID:+SZ+E64m.net INSERT INTO person(_id, name, parent_id, age) VALUES (1, '山田一郎', 0, 60), (2, '山田一一郎', 1, 40), (3, '山田一一一郎', 2, 20), (4, 山田一二郎, 1, 40), (5, '田中一郎', 0, 50), (6, '田中一一郎', 5, 30); こういうデータがあったとき、age <= 30 の一覧とそのルートの親を取得する SQL は 一応↓で出来るはずなのですが、他にもう少し効率のいい方法はありませんか WITH RECURSIVE r AS ( SELECT _id, name, '' AS parent_name, parent_id FROM person WHERE age <= 30 UNION ALL SELECT r._id, r.name, person.name AS parent_name, person.parent_id FROM person, r WHERE person._id = r.parent_id ) SELECT _id, name, parent_name FROM r WHERE parent_id = ''
763 :753 :2015/06/22(月) 21:30:01.14 ID:???.net あれ、勘違いだこの方法ではダメだ、あと最後 parent_id = 0 の間違い
764 :NAME IS NULL :2015/06/22(月) 21:40:01.06 ID:???.net 世代数が限定されていれば他にやりようもあるけど 制限がなければ再帰を使わざるを得ない
765 :NAME IS NULL :2015/06/23(火) 08:10:35.04 ID:???.net >>1 にもあるようにDBMSの名前書いてよ
766 :NAME IS NULL :2015/06/23(火) 15:21:32.91 ID:???.net 再帰SQLってどの程度最適化されるんだろうな
767 :NAME IS NULL :2015/06/24(水) 21:38:26.99 ID:pEAa+us3.net mysqlで INSERT INTO table (col1,col2,col3) VALUES (val1, val2, IF(col2 = '1', 'hoge', 'huga')), (val3, val4, IF(col2 = '1', 'geho', 'gahu')) ON DUPLICATE KEY UPDATE col3 = VALUES(col3) ってやると更新掛かるところ(VALUES(col3))が全部ELSEの結果になってしまって困っています。 どなたか「こう書くんだぜ!」っていうのご存知であればお助けください。 宜しくお願いします。
768 :NAME IS NULL :2015/06/24(水) 21:56:03.15 ID:???.net >>767 >>1 テンプレも読まないような宿題野郎奴多すぎだろ
769 :NAME IS NULL :2015/06/24(水) 21:58:02.52 ID:???.net mysqlだとこのSQLこのままで実行できるの?
770 :758 :2015/06/24(水) 22:10:56.88 ID:???.net >>769 テーブル名だけ適せん使えるテーブル名に変えないと予約語なのでダメですけれど。 INSERT INTO table1 (col1,col2,col3) とかにすれば実行できまする。
771 :NAME IS NULL :2015/06/24(水) 22:17:13.98 ID:???.net 適宜、か・・・。
772 :758 :2015/06/24(水) 22:20:11.51 ID:???.net 自己解決しました
773 :NAME IS NULL :2015/06/24(水) 22:21:04.77 ID:???.net >>771 おまえすげーな
774 :758 :2015/06/24(水) 22:56:28.84 ID:???.net >>772 君は誰だ・・・。 解決してないです。
775 :NAME IS NULL :2015/06/24(水) 23:50:11.66 ID:???.net それぞれのvalが何であってもってことだよね
776 :758 :2015/06/25(木) 00:31:10.69 ID:???.net >>775 そうです。 col1がキーとして |val1|1|null| |val3|0|null| というデータがあった場合 |val1|1|hoge| |val3|0|gahu| となって欲しいのですが実際には |val1|1|huga| |val3|0|gahu| になってしまいます。 最初からここまで書いておけばよかったですね、すみません。
777 :NAME IS NULL :2015/06/25(木) 11:14:11.04 ID:???.net >>776 ON DUPLICATE KEY UPDATE col3 = VALUES(col3) ← ここで条件判断してやるもんだったりはしないの
778 :NAME IS NULL :2015/06/28(日) 12:35:07.25 ID:???.net 指定日時より前(後)の1個目のデータと、そのデータと同じ日のデータを 一括取得するにはどう書けばいいですか?
779 :NAME IS NULL :2015/06/28(日) 13:39:35.03 ID:???.net >>778 >>1
780 :NAME IS NULL :2015/06/28(日) 19:27:43.26 ID:???.net select * from テーブル where データ= (select max(データ) from テーブル where データ<指定日付) とかかな
781 :NAME IS NULL :2015/06/29(月) 21:30:36.54 ID:???.net >>780 いやいや。 select * from テーブル where 日付 = (select (max(日付)〜 でしょうよ
782 :NAME IS NULL :2015/07/02(木) 23:00:14.87 ID:???.net >>781 指定日時の前または後の一個目のデータって言ってるじゃん、これだと前後にならなくね
783 :NAME IS NULL :2015/07/02(木) 23:56:57.70 ID:kmAroUj+R すいません。 飲食店の売上実績から、材料をどれだけ使用したかを アクセスに取り込んで、計算したいと思います。 メニューマスタ ID | メニュー名 | ハンバーグ(枚)|鶏肉(枚)|玉子 --+----------+----- 1 | ハンバーグ | 1 | | 2 | 目玉焼ハンバーグ | 1 | |1 3 | おろしハンバーグ | 1 | | 4 | ダブルハンバーグ | 2 | | 5 | チキングリル | |1 | 6 | おろしチキン | |1 | 7 | スパイシーチキン | |1 | 売上テーブル ID | DATE |メニューID |メニュー名 |売上数量 --+----------+----- 1 | 2007-11-11 | 1 |ハンバーグ |10 2 | 2007-11-11 | 2 |目玉焼ハンバーグ|5 3 | 2007-11-11 | 4 |ダブルハンバーグ|5 4 | 2007-11-12 | 1 |ハンバーグ |8 5 | 2007-11-12 | 2 |目玉焼ハンバーグ|4 4 | 2007-11-12 | 5 |チキングリル |12 1 | 2007-11-12 | 6 |スパイシーチキン|4 欲しい結果 ID | DATE | ハンバーグ(枚)|鶏肉(枚)| 玉子 --+----------+----- 1 | 2007-11-11 | 25 |0 |5 2 | 2007-11-12 | 12 |16 |0 のような使用した材料の合計数が出るようにしたいです。 恐れ入りますが、 ご教授願います。
784 :NAME IS NULL :2015/07/03(金) 00:00:16.61 ID:zasuee71q すいません。 列がぐちゃぐちゃになってました。 欲しい結果の数字も誤ってました 再度書き込みます。 飲食店の売上実績から、材料をどれだけ使用したかを アクセスに取り込んで、計算したいと思います。 メニューマスタ ID | メニュー名 | ハンバーグ(枚)|鶏肉(枚)|玉子 --+----------+----- 1 | ハンバーグ | 1 | | 2 | 目玉焼ハンバーグ | 1 | |1 3 | おろしハンバーグ | 1 | | 4 | ダブルハンバーグ | 2 | | 5 | チキングリル | |1 | 6 | おろしチキン | |1 | 7 | スパイシーチキン | |1 | 売上テーブル ID | DATE |メニューID |メニュー名 |売上数量 --+----------+----- 1 | 2007-11-11 | 1 |ハンバーグ |10 2 | 2007-11-11 | 2 |目玉焼ハンバーグ|5 3 | 2007-11-11 | 4 |ダブルハンバーグ|5 4 | 2007-11-12 | 1 |ハンバーグ |8 5 | 2007-11-12 | 2 |目玉焼ハンバーグ|4 4 | 2007-11-12 | 5 |チキングリル |12 1 | 2007-11-12 | 6 |スパイシーチキン|4 欲しい結果 ID | DATE | ハンバーグ(枚)|鶏肉(枚)| 玉子 --+----------+----- 1 | 2007-11-11 | 25 |0 |5 2 | 2007-11-12 | 12 |16 |4 のような使用した材料の合計数が出るようにしたいです。 恐れ入りますが、 ご教授願います。
785 :NAME IS NULL :2015/07/03(金) 01:43:07.56 ID:???.net すいません。 飲食店の売上実績から、材料をどれだけ使用したかを ACCESS 2007 に取り込んで、計算したいと思います。 メニューマスタ ID | メニュー名 | ハンバーグ(枚)|鶏肉(枚)|玉子 --+----------+----- 1 | ハンバーグ | 1 | | 2 | 目玉焼ハンバーグ | 1 | |1 3 | おろしハンバーグ | 1 | | 4 | ダブルハンバーグ | 2 | | 5 | チキングリル | |1 | 6 | おろしチキン | |1 | 7 | スパイシーチキン | |1 | 売上テーブル ID | DATE |メニューID |メニュー名 |売上数量 --+----------+----- 1 | 2007-11-11 | 1 |ハンバーグ |10 2 | 2007-11-11 | 2 |目玉焼ハンバーグ|5 3 | 2007-11-11 | 4 |ダブルハンバーグ|5 4 | 2007-11-12 | 1 |ハンバーグ |8 5 | 2007-11-12 | 2 |目玉焼ハンバーグ|4 4 | 2007-11-12 | 5 |チキングリル |12 1 | 2007-11-12 | 6 |スパイシーチキン|4 欲しい結果 ID | DATE | ハンバーグ(枚)|鶏肉(枚)| 玉子 --+----------+----- 1 | 2007-11-11 | 25 |0 |5 2 | 2007-11-12 | 12 |16 |4 のような使用した材料の合計数が出るようにしたいです。 恐れ入りますが、 ご教授願います。
786 :NAME IS NULL :2015/07/03(金) 08:46:40.07 ID:???.net JOINしてSUM
787 :NAME IS NULL :2015/07/03(金) 09:55:58.63 ID:???.net >ID | メニュー名 | ハンバーグ(枚)|鶏肉(枚)|玉子 ここに突っ込んじゃダメ? 設計の話になっちゃうかw
788 :NAME IS NULL :2015/07/03(金) 10:22:07.56 ID:???.net 一応、今後のために順番にやると>>786 さんの通りで、 まずJOIN SELECT * FROM 売上テーブル JOIN メニューマスタ ON メニューマスタ.ID = 売上テーブル.メニューID; トータル数算出 SELECT 売上テーブル.メニューID, 売上テーブル.DATE 売上テーブル.売上数量 * メニューマスタ.ハンバーグ(枚) AS ハンバーグ(枚), 売上テーブル.売上数量 * メニューマスタ.鶏肉(枚) AS 鶏肉(枚), 売上テーブル.売上数量 * メニューマスタ.玉子 AS 玉子, FROM 売上テーブル JOIN メニューマスタ ON メニューマスタ.ID = 売上テーブル.メニューID; 日付でまとめる SELECT 売上テーブル.メニューID, 売上テーブル.DATE, SUM(売上テーブル.売上数量 * メニューマスタ.ハンバーグ(枚)) AS ハンバーグ(枚), SUM(売上テーブル.売上数量 * メニューマスタ.鶏肉(枚)) AS 鶏肉(枚), SUM(売上テーブル.売上数量 * メニューマスタ.玉子) AS 玉子, FROM 売上テーブル JOIN メニューマスタ ON メニューマスタ.ID = 売上テーブル.メニューID GROUP BY 売上テーブル.DATE ORDER BY 売上テーブル.DATE; という手順を踏めば、テーブル構成変わっても対処できると思う。
789 :NAME IS NULL :2015/07/03(金) 10:23:55.62 ID:???.net accessってJOINの指定いらんの?
790 :NAME IS NULL :2015/07/03(金) 10:25:34.87 ID:???.net あ、最後の 売上テーブル.メニューID, は要らない。 質問の欲しい結果のIDが何を指してるのか混乱してつい書いてしまった
791 :NAME IS NULL :2015/07/03(金) 10:27:22.31 ID:???.net 端折っても補完されたと思う
792 :NAME IS NULL :2015/07/03(金) 10:40:38.97 ID:???.net >>787 突っ込みたいところだな
793 :NAME IS NULL :2015/07/03(金) 14:24:47.87 ID:???.net >>787 突っ込みたくなるよね、つか釣りじゃないのかと疑いたくなるわ w > ID | メニュー名 | ハンバーグ(枚)|鶏肉(枚)|玉子 > --+----------+----- > 7 | スパイシーチキン | |1 | > > ID | DATE |メニューID |メニュー名 |売上数量 > --+----------+----- > 1 | 2007-11-12 | 6 |スパイシーチキン|4
794 :NAME IS NULL :2015/07/05(日) 17:19:45.03 ID:???.net VARCHARで入っているYearという変数を数値に変えて比較演算子使って取り出すことってできる? 具体的には CAST(Year AS INT) > 2000 みたいなことをやりたいけど、これじゃできなかった
795 :NAME IS NULL :2015/07/05(日) 17:37:40.22 ID:EFnjyGIJ.net RDBMSは何? キャストも変換関数もそれぞれのシステムであると思うけど
796 :NAME IS NULL :2015/07/05(日) 17:39:17.56 ID:???.net >>795 MySQLです
797 :NAME IS NULL :2015/07/05(日) 17:54:08.94 ID:???.net >>794 Yearには具体的に何が入っているの
798 :NAME IS NULL :2015/07/05(日) 18:33:17.40 ID:???.net '2000' '2001' '2002' … みたいに年が文字列で入ってる それをSELECTで取り出したい
799 :NAME IS NULL :2015/07/05(日) 19:37:22.34 ID:???.net >>798 それなら上記のでよさそうだけどね。 単に select cast(Year as int) from 〜ってやってみたら。
800 :NAME IS NULL :2015/07/05(日) 19:40:59.46 ID:???.net SELECT CAST(Year AS INT) > 2000 FROM テーブル ではなく SELECT Year FROM テーブル WHERE CAST(Year AS INT) > 2000 とする必要があるよ。 馬鹿にするなと思われるかもしれないけど、質問からは上のクエリの可能性を除去しきれないので。
801 :NAME IS NULL :2015/07/05(日) 19:42:02.77 ID:???.net 変数って書いてるけどcolumn名でいいんだよね? CAST(year AS SIGNED) でできない?
802 :NAME IS NULL :2015/07/05(日) 19:45:26.15 ID:???.net あらほんと、intだと構文エラーになるのかな。門外漢がレスをすべきではなかったか。 http://mysql.stu.edu.tw/doc/refman/5.1-olh/ja/cast-functions.html#function_convert
803 :783 :2015/07/05(日) 20:12:50.07 ID:???.net >>801 これで行けた! 皆様、ありがとうございました
804 :NAME IS NULL :2015/07/05(日) 21:08:44.89 ID:???.net SQL SERVERだけど、テーブル内の性別列が男だったら男マスタ、女だったら女マスタと結合するという場合、 case when テーブル.性別=男 then inner join 男マスタ on 結合条件 else inner join 女マスタ on 結合条件 end としようとするのですが、 inner joinは使うとダメですか?
805 :NAME IS NULL :2015/07/06(月) 01:04:42.02 ID:???.net 普通に結合条件に 性別=男 と 性別=女 入れとくだけじゃないのか
806 :NAME IS NULL :2015/07/06(月) 01:25:52.71 ID:???.net > case when テーブル.性別=男 then inner join 男マスタ on 結合条件 > else inner join 女マスタ on 結合条件 end sql serverってこんなことできるんだ?
807 :NAME IS NULL :2015/07/06(月) 18:13:02.95 ID:???.net ダメかって試せば良いだけだろ。それが通るんだったらOKなんだろうし
808 :NAME IS NULL :2015/07/06(月) 18:45:35.57 ID:???.net >>807 試せる環境じゃないんだよ。
809 :NAME IS NULL :2015/07/06(月) 20:55:09.53 ID:hvHpFyrnf Oracle10gでちょっと聞きたいのだが サーバ内で「SELECT * FROM テーブルA」ってSQLを打つ →そのサーバからログオフする →その後別のPCからテーブルAの内容をDELETE文で全削除 →INSERT文でテーブルAにデータを挿入しようとしたら待ち状態のまま固まる という現象が起きてるんだが セッション情報見たらログオフしたサーバのSELECT関係のセッションが 残っていたのだが… DELETE文がちゃんと通ってるならINSERT文も通るはずなんだが INSERT文ってSELECTのセッションが残ってたら待ち状態になるものだっけ? SELECT文にFORUPDATEとかつけてたらなるって聞いたことあるけど そんなのつけてないし… 調べてもよくわからなかったのでどなたか助けておくれ
810 :NAME IS NULL :2015/07/07(火) 10:52:43.36 ID:Bl1g/stp.net PDOのようなプリペアドステートメントで、 where のIN where HOGE in ('うんこ', 'ちんこ', 'しっこ', 'ちゅー') の各項目を安全に増やしたり減らしたりする方法って どんな方法があるの? クエリ文字列を動的に作って ? を増やすしかない?
811 :NAME IS NULL :2015/07/07(火) 11:17:24.94 ID:???.net >>810 >>1
812 :NAME IS NULL :2015/07/22(水) 14:44:37.51 ID:UWYfbRq0.net sybaseでテーブルからcreate table文を抽出したいんだけど SQLでどう書くのか教えてエロい人!
813 :NAME IS NULL :2015/07/22(水) 15:17:18.34 ID:???.net sybaseとか、まだこの世に存在してたんだ
814 :NAME IS NULL :2015/07/22(水) 15:35:39.62 ID:???.net スレもあるね 諸君、私はSybaseが大好きだ【ASE】 http://peace.2ch.net/test/read.cgi/db/1080536260/
815 :800 :2015/07/22(水) 15:36:48.67 ID:UWYfbRq0.net select o.id, o.type, c.text from sysobjects o, syscomments c where o.id = c.id and o.type ='U' みたいな感じかなあ おせーてください
816 :NAME IS NULL :2015/07/22(水) 18:27:21.63 ID:???.net >>815 sybase table definition extract でググったら結構ヒットするんだけど、これ参考になるのでは?
817 :NAME IS NULL :2015/07/22(水) 18:37:09.01 ID:???.net 俺は sybase table export とググった
818 :NAME IS NULL :2015/07/25(土) 18:21:30.55 ID:fl7A9m+E.net カウントについて select count(*) as total, price from table where price > 4000 とかだったらカウントできるのですが、 select count(*) as total, price *1.08 as tax_price from table having tax_price > 4000 というふうに HAVINGが入ると、HAVINGの結果を反映した カウントができません。 一応 select count(*) as total, price *1.08 as tax_price from table group tax_price having tax_price > 4000 と、グループを挟むとカウントができるようですが、 having が複数になった時hどうするのかともおもいます。 他に方法とかあるのでしょうか。
819 :NAME IS NULL :2015/07/25(土) 19:44:14.17 ID:???.net >>818 まずDBMS何なのか書け まあその出鱈目なSQLが通るんならたぶんMySQLだろうけど having が複数になった時 って言うのが意味不明だが そもそもグループ化しないんならwhereで良いんじゃないかね
820 :NAME IS NULL :2015/07/25(土) 21:49:48.95 ID:???.net havingを実行してselectを実行するだろ。
821 :NAME IS NULL :2015/07/26(日) 10:57:37.81 ID:???.net 何で group by しないのに having 使いたいと思った?
822 :NAME IS NULL :2015/07/26(日) 13:20:56.39 ID:???.net 素人だけど group byなしでhaving使えるの?
823 :NAME IS NULL :2015/07/26(日) 13:35:16.16 ID:???.net >>822 普通はセットで使うが、group byなしだと全レコードを1グループとみなす。
824 :NAME IS NULL :2015/07/27(月) 12:52:29.34 ID:???.net なるほど、 price *1.08 as tax_price 略 where price *1.08 > 4000 とするところをMySQLだと price *1.08 as tax_price 略 having tax_price > 4000 みたいに書けるのか
825 :NAME IS NULL :2015/07/29(水) 02:44:19.39 ID:???.net OracleのNumber型で保存されている特定の項目を小数点以下4桁でJIS丸めしたて取得したいです。 簡単に実装する方法はないでしょうか。 よろしくお願いいたします。 ・DBMS名とバージョン Oracle 11g ・テーブルデータ @1.00015 A1.00025 B5.0 ・欲しい結果 @1.0002 A1.0002 B5.0 ※Bは値が常に下5桁以上あるわけではないことを表しています、 ・説明 Oracle標準のRoundでRound(値,4)をすると、四捨五入になってしまって困っています。
826 :NAME IS NULL :2015/07/29(水) 05:57:32.56 ID:???.net caseで頑張るしかないかな 10000倍してfloorしてから奇数偶数を判定 五捨五超入は10000倍して0.5を引いてceilして10000で割る
827 :NAME IS NULL :2015/07/29(水) 13:06:42.97 ID:oVM1baXa.net 該当する関数がないならストアドの出番かな
828 :NAME IS NULL :2015/07/30(木) 00:17:18.17 ID:???.net Host側で出来ない理由を書かないと。
829 :NAME IS NULL :2015/07/30(木) 06:51:31.40 ID:???.net >>825 特定のDBMSの話題はそのDBMSのスレで聞く方が適切だと思うが ORACLEのRoundは >BINARY_FLOAT値およびBINARY_DOUBLE値の場合、最も近い偶数値に丸められます。 らしい 桁数指定するとダメとか言う話もあるみたいだから 10000倍してBINARY_DOUBLEにキャストしてRoundしてから10000で割ればいいんじゃね
830 :NAME IS NULL :2015/08/01(土) 02:28:09.30 ID:???.net はじめまして MySQLでone or zero to one or zeroの関係を作りたいのですが、どのようにすればよいでしょうか よろしくおねがいします
831 :NAME IS NULL :2015/08/01(土) 03:54:51.58 ID:???.net はじめまして。なんでこのスレだと思ったの?
832 :NAME IS NULL :2015/08/01(土) 17:15:30.93 ID:???.net 質疑応答と書いてあったので
833 :NAME IS NULL :2015/08/01(土) 17:51:29.63 ID:???.net はじめまして Oracle11gで好きな子と相思相愛関係を作りたいのですが、どのようにすればよいでしょうか
834 :NAME IS NULL :2015/08/01(土) 23:47:00.53 ID:???.net はじめまして。なんて子をスキだと思ったの?
835 :NAME IS NULL :2015/08/02(日) 18:46:02.44 ID:???.net ここはSQLの質疑応答であってMySQLの質疑応答のスレじゃないよ
836 :NAME IS NULL :2015/08/04(火) 12:23:47.77 ID:PykgGvaD.net チッス! 初心者でっす! LEFT JOINでテーブルを7個くっつけようとしてる中学生でっす! 4個目で頭が破裂して詰んだのだがこういうのってJOINでやるべきじゃないの? 何か凄いおまじないとかある?? マヂMySQLウルトラCたが優Cおぢさん達が教えてくれると僕うれC
837 :NAME IS NULL :2015/08/04(火) 13:50:50.12 ID:???.net 別にいいんじゃないかな 適時VIEWを作るとか
838 :NAME IS NULL :2015/08/04(火) 14:35:32.78 ID:???.net 4個目で混乱する理由がわからん。 2個だろうが4個だろうが7個だろうが100個だろうが、記述の難易はかわらんだろ
839 :NAME IS NULL :2015/08/04(火) 14:38:30.11 ID:???.net つか、LEFT JOINのかわりにJOINは使えないだろ
840 :NAME IS NULL :2015/08/04(火) 15:15:10.97 ID:???.net 自分なりに記述ルールを決めておけば何個表結合しようと サブクエリーの中に再帰クエリーを記述しようが問題ないよ
841 :NAME IS NULL :2015/08/04(火) 15:37:07.93 ID:Qk98A0jW.net 回答サンクス! 何個ネストしようが遅くならないの? 6個繋げようとしたら頭がこんがらがらがらったから3個LEFT JOINしたクエリーを2個用意した!! 6個x1と3個x2だとどっちが速いの? どうせWHEREで1個か多くても5個くらいまでしか取り出さないからあんまり関係ないが後学のために
842 :NAME IS NULL :2015/08/04(火) 15:52:43.56 ID:???.net >>841 遅くなるかどうかの話をする前に、なぜ頭がこんがらがるのかを教えてくれ。 設計がおかしいのか、よほど複雑なことをしているのか
843 :NAME IS NULL :2015/08/04(火) 16:17:18.42 ID:???.net 何か根本的に間違ってないか? SELECT * FROM t1 LEFT JOIN t2 ON t2.id = t1.a_id LEFT JOIN t3 ON t3.id = t1.b_id LEFT JOIN t4 ON t4.id = t1.c_id いくつ(LEFT)JOINしようと、同じなんだが。
844 :NAME IS NULL :2015/08/04(火) 16:21:51.17 ID:???.net 改行できることを知らないだけだろう
845 :NAME IS NULL :2015/08/04(火) 17:22:15.22 ID:???.net joinっていう歌 オリビアニュートンジョンが歌ってたよな
846 :NAME IS NULL :2015/08/04(火) 18:19:12.03 ID:???.net >>845 笑ってしまった(歳がばれそう)
847 :NAME IS NULL :2015/08/05(水) 00:26:56.78 ID:???.net 1、2、3、たくさん。て部族。
848 :NAME IS NULL :2015/08/05(水) 16:41:15.50 ID:SshmOuQH.net >>844 マヂかよ改行できるのかよ。。。 しかも()無くても良いんだな、めっちゃ簡単だったはwwwww お前らトンくす!!
849 :NAME IS NULL :2015/08/05(水) 16:41:29.56 ID:SshmOuQH.net >>843 重ね重ねありがとう!!
850 :NAME IS NULL :2015/08/05(水) 16:56:14.97 ID:???.net 本気だったんだな。 早く困ってることの詳細を人に説明できるようになるといいな。
851 :NAME IS NULL :2015/08/05(水) 17:24:30.84 ID:???.net SQLの入門書、一から読み直せ…
852 :NAME IS NULL :2015/08/06(木) 03:36:52.02 ID:RECedlTb.net 入門書とか読まないぜ!! HTML5, PHP, JS, CSS入門みたいなやつ読んでるは
853 :NAME IS NULL :2015/08/08(土) 23:23:14.59 ID:???.net まだプログラミングの初心者なんですが、Visual studio 2015 のC#言語でSQL serverへの接続の認証?とcsvへの接続は具体的にどういったプログラミングを書けばいいでしょうか?初心者にも分かりやすいページがあれば是非お願いしますorz
854 :NAME IS NULL :2015/08/09(日) 01:01:14.10 ID:???.net スレ違いだけど。 http://okwakatta.net/code/ado03.html 続きはC#スレで。
855 :NAME IS NULL :2015/08/09(日) 18:43:50.77 ID:???.net どうもです
856 :NAME IS NULL :2015/08/24(月) 17:26:19.16 ID:???.net SQLの left outer join を使った場合、on句ないで指定する条件と 外のwhere句で条件を指定する場合での挙動の違いについて教えて下さい。 ・MySQL5.6.25 ・テーブルデータ key price date -------------------------------- 1 1 2015-08-21 1 2 2015-08-21 1 3 2015-08-21 1 3 2015-08-22 2 1 2015-08-21 2 2 2015-08-21 3 3 2015-08-22 3 3 2015-08-22 というテーブルから key today_price yesterday_price ------------------------------------------------------------ 1 9 6 3 6 0 購入履歴の中から本日購入データがある場合、本日までと昨日までのpriceの合計値を求めるために以下の様なSQLを組みました。 select today.key, today_t.price as today_price ifnull(yesterday_price, 0) as yesterday_price (select key, sum(price) from point_t where date <= ‘2015-08-22’) as today_t left outer join (select key, sum(price) from point_t where date <= ‘2015-08-21’) as yesterday_t on ( today_t.key = yesterday_t.key and today_t.price <> yesterday_t.price ) が、差分のある金額を求める、today_t.price <> yesterday_t.priceという条件でうまく弾いてくれません。 ただ、SQLを以下のように修正すると想定通り取得できます。 理由を教えて頂けないでしょうか? (改行が多いと怒られたので分割。)
857 :NAME IS NULL :2015/08/24(月) 17:27:11.68 ID:???.net >> 844 の続き(想定通り取得できるSQL) select today.key, today_t.price as today_price ifnull(yesterday_price, 0) as yesterday_price (select key, sum(price) from point_t where date <= ‘2015-08-22’) as today_t left outer join (select key, sum(price) from point_t where date <= ‘2015-08-21’) as yesterday_t on ( today_t.key = yesterday_t.key ) where today_t.price <> yesterday_t.price
858 :NAME IS NULL :2015/08/24(月) 18:56:41.89 ID:???.net 連投失礼します。SQL見難い&間違えだらけだったので修正しました。 ■想定通り取れないSQL select today.key, today_t.price as today_price ifnull(yesterday_t.price, 0) as yesterday_price from (select key, sum(price) from point_t where date <= ‘2015-08-22’ group by key) as today_t left outer join (select key, sum(price) from point_t where date <= ‘2015-08-21’ group by key) as yesterday_t on ( today_t.key = yesterday_t.key and today_t.price <> yesterday_t.price ) ■想定通り取得できるSQL select today.key, today_t.price as today_price ifnull(yesterday_t.price, 0) as yesterday_price from (select key, sum(price) from point_t where date <= ‘2015-08-22’ group by key) as today_t left outer join (select key, sum(price) from point_t where date <= ‘2015-08-21’ group by key) as yesterday_t on (today_t.key = yesterday_t.key) where today_t.price <> yesterday_t.price
859 :NAME IS NULL :2015/08/24(月) 19:20:59.55 ID:???.net left outer joinではonの条件を満たそうが満たすまいが left側のレコードは必ず返される。 その例で言えばkey=2のsum(price)はleft側もright側も3なので keyが等しくsum(price)が等しくないレコードはright側に存在しないことになり left側のレコードだけが返される。 ちなみに2個目のSQL(うまくいったと言っているほう)だと where句に「or yesterday_t.key is null」も入れとかないと left outer joinの意味がなくなるはず。
860 :NAME IS NULL :2015/08/24(月) 22:53:07.27 ID:???.net >>859 ありがとうございます。 理解出来ました。 と、同時にSQLで実施するのが間違えているような気がしてきました。 ぱっとロジック出てきませんが、工夫出来そうですね。 ついでと言ってはなんですが、紐解くヒントを頂けたらと・・・ 追伸. ボカしたら結果を間違えました。 うまくいく方も実はうまく行かないですね。 エスパーして頂き、重ねて感謝します。
861 :NAME IS NULL :2015/08/31(月) 19:31:55.28 ID:???.net ■想定通り取得できるSQL where yesterday_t.price is null or today_t.price <> yesterday_t.price ってすればよさそうに見える
862 :NAME IS NULL :2015/08/31(月) 19:46:40.24 ID:s1diMrwg.net TABLE1(1万件程度)と条件(100条件程度)表(※DB管理されていない)を使用し、 TABLE1の各レコードに対し、条件に該当したら1を表示するビューを作成。 ビュー1からさらに縦表示したビュー2を作成したいです。 条件ごとにUNIONで結合しようとしたが、条件が100程度あるため あまりやりたくないのですが、 パフォーマンスを考慮した方法はないでしょうか。 【TABLE1】 No Colum1 Colum2 Colum3 --------------------------- 001 A-B-C Y 10 002 B-C N 20 003 C-D-E Y 10 004 D Y 10 005 A Null 30 006 A-B-C Null 20 (10000件くらい) 【条件】 条件1:Colum1がAを含む 条件2:Colum1がBを含む 条件3 : Colum2がY 条件4 : Colum1がDを含む AND Colum2がY 条件5 : Colum1がC-Dを含む ・・・・ (100条件位) 【View1】 No Colum1 Colum2 Colum3 ・・・ 条件1 条件2 条件3 ・・・ --------------------------------------------------------------- 001 A-B-C Y 10 1 1 1 002 B-C N 20 1 003 C-D-E Y 10 1 004 D Y 10 1 005 A Null 30 1 006 A-B-C Null 20 1 1 【View2】 No Colum1 Colum2 Colum3 ・・・ 条件 --------------------------------------------- 001 A-B-C Y 10 条件1 001 A-B-C Y 10 条件2 001 A-B-C Y 10 条件3 002 B-C N 20 条件2 003 C-D-E Y 10 条件3 004 D Y 10 条件3 005 A Null 30 条件1 006 A-B-C Null 20 条件1 006 A-B-C Null 20 条件2 ・・・
863 :NAME IS NULL :2015/08/31(月) 20:08:16.24 ID:???.net >>862 条件がDB管理されていないという意味がよく分からないが。 実行時にはDBに格納してないとSQLは実行できないよね? 条件を格納するテーブルをあらかじめ作っておいて良いと言うことだよね?
864 :NAME IS NULL :2015/08/31(月) 22:20:39.96 ID:???.net View1はcase式でいいしView2はunion allでいい上にView1を経由する必要はない
865 :NAME IS NULL :2015/08/31(月) 23:07:17.49 ID:???.net >>863 条件が複雑なので、マスタ化せずにCASEを100条件分つなげる予定です。
866 :NAME IS NULL :2015/08/31(月) 23:09:50.11 ID:???.net >>864 条件が100程度あるため、UNION ALLで100個繋げることになるのですが、パフォーマンスが心配です
867 :NAME IS NULL :2015/09/01(火) 02:40:53.28 ID:???.net 単純な条件が100個あるのかと思ったけど、条件が複雑なのか
868 :NAME IS NULL :2015/09/01(火) 02:41:31.93 ID:???.net まぁ、なんというか、きっと元の設計が悪いんだろうなと逃げたくなる案件ではある
869 :NAME IS NULL :2015/09/01(火) 06:56:17.74 ID:???.net >>867 簡単な条件(例に挙げた程度)だったら、マスタ化して、CASEやUNIONを100個つなげたりしなくても実現可能なのでしょうか? 条件部をマスタ化したsqlを実行したことがないため、sqlをどうかいていいかわかりません。
870 :NAME IS NULL :2015/09/01(火) 10:24:03.53 ID:???.net 条件が特定Columnに対してパターン文字列の有無だけなら、できるんじゃないの。
871 :NAME IS NULL :2015/09/01(火) 12:30:15.43 ID:???.net そもそもunion要らない
872 :NAME IS NULL :2015/09/01(火) 13:43:51.32 ID:???.net phpの質問でDBでやればいいのに、、と思った案件と同じ内容だな
873 :NAME IS NULL :2015/09/01(火) 16:23:08.21 ID:???.net 動的にSQLを組み立てるには、普通はホストアプリかストアド使わないと無理 条件を固定化して条件テーブルを工夫すればある程度は何とかなるかもしれんが 最終的な結果をどうしたいのかしらんが 素直にホストアプリで100回クエリ流せばいいんじゃね
874 :NAME IS NULL :2015/09/01(火) 16:29:50.64 ID:???.net >>869 > 簡単な条件(例に挙げた程度)だったら、マスタ化して、CASEやUNIONを100個つなげたりしなくても実現可能なのでしょうか? 条件によっては、はい。
875 :NAME IS NULL :2015/09/01(火) 19:18:08.05 ID:???.net 条件を算出するCASE式を重複させたくないならView0がいるんじゃないの
876 :NAME IS NULL :2015/09/01(火) 22:16:06.13 ID:bbewiwaq.net ・RDBMS postgres ・データ 【テーブルA】 id value --------- 1 10 2 11 3 12 【csvファイルX】 id , value 2 , 110 3 , 120 ・欲しい結果 【テーブルA】 id value --------- 1 10 2 110 3 120 ・説明 外部より更新用のidとvalueを与える。 テーブルAの、外部より与えられたidに該当するレコードのvalueを更新する。 ・・・ということがやりたいです。 条件指定して、複数レコードを更新するUPDATE文の書き方をご教示いただけないでしょうか もし可能であれば、csvファイルを読み込み、テーブルを更新する手法についても教えていただけると幸いです
877 :NAME IS NULL :2015/09/01(火) 22:55:55.37 ID:???.net update 〜 from構文は便利。そしてvaluesを使う。 update テーブルA set value = t1.value from ( values (2, 110), (3, 120) ) as t1(id, value) where テーブルA.id = t1.id どっか構文エラーあったらごめん。でもこういう感じ。
878 :NAME IS NULL :2015/09/06(日) 17:30:28.60 ID:???.net postgres知らないし横から申し訳ないけど疑問 そのvalues使った文だと更新用データの数だけupdate文書いて実行する必要があると思うんだけど、そういう認識でいい?
879 :NAME IS NULL :2015/09/06(日) 18:26:18.25 ID:???.net >>878 ダメ >>877 で2レコード分更新される
880 :NAME IS NULL :2015/09/06(日) 18:39:26.98 ID:???.net さんくす values句を更新したいレコードの数だけ記載すれば良いのか csvファイルあるならエディタとかに貼り付けて正規表現で置換してSQL文作るのが手軽なのかな
881 :NAME IS NULL :2015/09/06(日) 19:16:13.24 ID:???.net >>880 一回しかやらないならどんなやり方でもいいけど、何回も繰り返すなら copy で CSV ファイルをテーブルに読み込んでから update した方がいいと思う
882 :NAME IS NULL :2015/09/06(日) 21:02:40.93 ID:???.net >>880 valuesはその場で一時テーブルを作ってると思えば理解しやすいと思う。 つまり、>>881 が書いているような「テーブルに読み込んでから」の部分をクエリで解決できる
883 :NAME IS NULL :2015/09/06(日) 21:14:02.38 ID:???.net >>882 いや別に止めないけど > csvファイルあるならエディタとかに貼り付けて正規表現で置換してSQL文作る って毎回やるのか? って話
884 :NAME IS NULL :2015/09/06(日) 21:20:41.48 ID:???.net >>883 valuesの説明をしただけで、>>881 の手法を否定しちゃいないよ。心配しないで。
885 :NAME IS NULL :2015/09/06(日) 22:57:55.69 ID:???.net >>880 だけど 更新ってそう何回もかけないと思うし、csvファイルをテーブルに読み込む手間を考えたら(864はその読み込みの方法も知らないみたいだし)べた書きのが楽だろうと思ったんだ 普通一度更新かけたら終わりだよね? 更新用の一時的なデータテーブルだってすぐ消すでしょ? そりゃもっと複雑なテーブルの情報を元にupdateかけるなら>>877 のvalues部分をselectで更新かけるべきだろうと思うけど
886 :NAME IS NULL :2015/09/06(日) 23:08:26.54 ID:???.net CSVの中にエラーがあったときとか 一旦テーブルに格納する方が対処しやすくないかな?
887 :NAME IS NULL :2015/09/06(日) 23:26:24.75 ID:???.net なるほど ありがとうございました
888 :NAME IS NULL :2015/09/07(月) 00:26:26.07 ID:???.net >>886 ケースバイケースって言葉を覚えてはいかがか。 >>883 の言葉を借りるなら、CSVが1件や2件の場合でもそうするというのなら別に止めない 件数が多くて、データを信頼できないなら一旦型付の一時テーブルに格納するほうが楽なこともあるだろうね。
889 :NAME IS NULL :2015/09/07(月) 00:38:10.15 ID:???.net >>888 CSVファイルで、と言うからそれなりの量があると想定しました。 1,2件で作る物だとは思いませんでした。
890 :NAME IS NULL :2015/09/07(月) 00:41:33.28 ID:???.net 思い込みで仕様を決められてもなぁ。 俺は100件くらいならクエリで済ませるよ。 千や万オーダならそもそも別途アプリを作る
891 :NAME IS NULL :2015/09/07(月) 06:12:21.05 ID:???.net >>885 > 更新ってそう何回もかけないと思うし なんでそう思うんだろう...
892 :NAME IS NULL :2015/09/07(月) 06:44:13.93 ID:???.net 質問者から条件が完全に示されてなければ、 仮定した上で検討してもいんじゃないの?
893 :NAME IS NULL :2015/09/07(月) 08:25:39.31 ID:???.net 思い込みと受け取らないで、提案の前提条件と受け取ろうお
894 :NAME IS NULL :2015/09/07(月) 12:49:33.64 ID:???.net >>892 それなら、ある仮定に基づいた手法を、別の仮定に基づいた考えで否定しちゃあいけないよね
895 :NAME IS NULL :2015/09/07(月) 13:39:42.37 ID:???.net そりゃあそうだ
896 :NAME IS NULL :2015/09/07(月) 13:58:22.77 ID:???.net 一杯蘊蓄を傾けたら良いでしょ。 誰も止めないから。 読んでくれると良いけどね。
897 :NAME IS NULL :2015/09/11(金) 23:17:52.99 ID:cnT3g/XI.net データベース関係について語り合うならBeLongs!がおすすめ。 よかったら、「BeLongs! - トップ」で検索してみて!
898 :NAME IS NULL :2015/09/14(月) 18:23:30.11 ID:???.net A列の集計結果を別のコラムで使いたいんですが、 SELECT SUM(A) AS hoge1, (hoge1 * 2) AS hoge2 FROM hoge; みたいな真似は無理なんでしょうか。実際はもっと式が複雑なので。
899 :NAME IS NULL :2015/09/14(月) 19:04:19.00 ID:???.net SELECT hoge1, hoge1 * 2 AS hoge2 FROM ( SELECT SUM(A) AS hoge1, (hoge1 * 2) AS hoge2 FROM hoge ) AS A
900 :NAME IS NULL :2015/09/14(月) 19:04:46.60 ID:???.net ミスった SELECT hoge1, hoge1 * 2 AS hoge2 FROM ( SELECT SUM(A) AS hoge1 FROM hoge ) AS A
901 :NAME IS NULL :2015/09/15(火) 19:53:12.33 ID:???.net セレクトリストに別名使えないかって話も定期的にでてくるよなぁ
902 :NAME IS NULL :2015/09/15(火) 20:13:45.71 ID:???.net 不定期だけどよく見る話題だね
903 :NAME IS NULL :2015/09/15(火) 21:02:38.40 ID:???.net 確かに良く見る話題だね。 不定期だけど。
904 :NAME IS NULL :2015/09/15(火) 21:17:22.03 ID:???.net そこそこ需要あるから実装されてもよさげなのになんで実装されないんだろう?
905 :NAME IS NULL :2015/09/16(水) 11:47:50.60 ID:???.net 2パスになるからとかそういうことじゃないかなあ
906 :NAME IS NULL :2015/09/16(水) 12:57:59.42 ID:???.net SQL 解釈する時間なんてたいていゴミなんだから2パスでも10パスでもいいと思うんだけどね
907 :NAME IS NULL :2015/09/16(水) 15:17:27.08 ID:???.net 本気でそう思ってるんならお花畑だな
908 :NAME IS NULL :2015/09/16(水) 21:13:19.96 ID:???.net 俺本気でそう思うけど、どうお花畑なのかな?「自分で調べろ」ってのは無しね。
909 :NAME IS NULL :2015/09/16(水) 23:29:28.22 ID:???.net >>898 みたいなのはウィンドウ関数じゃだめ? ウィンドウ関数は数回しか使ったことないからよく理解してないんだけど
910 :NAME IS NULL :2015/09/16(水) 23:54:01.00 ID:???.net >>908 解釈の時間がゴミだと思えるのには二通りある ・クエリが遅すぎて気にならない ・解釈にどれくらいコストがかかっているか気づいていない
911 :NAME IS NULL :2015/09/17(木) 00:27:25.20 ID:???.net 応答時間にシビアなものだったら時間がゴミだからどうでもいいなんて発言は出てこない バカなのか?
912 :NAME IS NULL :2015/09/17(木) 03:04:07.43 ID:???.net ん? 僕は応答時間にシビアなものを作らないので、 そういうのを作る人が犠牲になってもいいから2パスでも10パスでもやってよお願い! っていうわがままを通そうとしてるだけ?
913 :NAME IS NULL :2015/09/17(木) 07:41:14.66 ID:???.net ここで言って通る通らないもないが、構文解釈のコストが無視できないほど実行計画や 実行そのものが軽いクエリを大量に発行するような状況ならまずステートメントキャッシュが 効くように設計するのが筋だろう。 また、わがままというなら、構文解釈のコストが上がるから機能向上は許さんというのも ある意味わがままなわけで、どっちもどっちだと思うが。
914 :NAME IS NULL :2015/09/17(木) 08:21:42.85 ID:???.net >>910 > ・解釈にどれくらいコストがかかっているか気づいていない どれぐらいかかってるんだ? w
915 :NAME IS NULL :2015/09/17(木) 09:32:34.46 ID:hS9olpTr.net >>914 今時殆どのDBで見れるだろ
916 :NAME IS NULL :2015/09/17(木) 10:35:00.20 ID:???.net 機能向上なのかなあ、曖昧なケースが出てきちゃうから公文が大きく変わる、とかじゃないのかなあ
917 :NAME IS NULL :2015/09/17(木) 12:17:28.60 ID:???.net >>915 で、気になるほどかかってたのか? って話
918 :NAME IS NULL :2015/09/17(木) 12:24:45.22 ID:???.net こういうシンタックスシュガーレベルの話が好きな人って大体スキル:が低い
919 :NAME IS NULL :2015/09/17(木) 12:56:51.87 ID:???.net >>913 > 構文解釈のコストが無視できないほど実行計画や > 実行そのものが軽いクエリを大量に発行するような状況ならまずステートメントキャッシュが > 効くように設計するのが筋だろう。 そうだね、ゴミじゃないからちゃんと意識していかないといけない。
920 :NAME IS NULL :2015/09/17(木) 18:24:05.57 ID:???.net しかし、自分が使ってるRDBMSで、プレースホルダーを使ったクエリのとき、 いつどういう条件でparseされるのか自信を持って答えられる奴は何%くらい いるのだろうか。
921 :NAME IS NULL :2015/09/17(木) 19:00:45.75 ID:???.net >>918 ついていけないからって泣くなよ w
922 :NAME IS NULL :2015/09/17(木) 20:01:07.27 ID:???.net >>920 prepareが発行されるかどうかではなく、parseされるかどうか?
923 :NAME IS NULL :2015/09/18(金) 00:21:56.44 ID:???.net >>916 >>898 みたいな仕様が導入されない理由はむしろそっちだろうね。 共通表式だの何だの構文を拡張し続けているのに、そこだけパースのコストを気にして 躊躇するとは思えない。
924 :NAME IS NULL :2015/09/18(金) 00:28:19.80 ID:???.net 共通表式ってパースコストあまり増やさないで解決できるいい方法だなぁと思ってるんだけど、 同じことやるにあたってコスト増えたの?
925 :NAME IS NULL :2015/09/18(金) 00:40:45.88 ID:???.net SQLServer ならパースのコストなんざ関係ねーとか言いそう。
926 :NAME IS NULL :2015/09/18(金) 10:25:09.46 ID:???.net >>922 そうだよ。 そもそも構文解析と実行計画作成は別物。 全てのRDBMSで、PREPARE時に構文解析が行われるだろうけど、実行計画作成は PREPARE時に行われる場合とEXECUTE時に行われる場合がある。 また、構文解析結果はキャッシュされるだろうが、実行計画はキャッシュされる場合と されない場合がある。 自分が使っているRDBMSで、以上の挙動を完全に押さえてる人はどれくらいいるんだ ろうね?知っといたほうが良い情報だよ。
927 :NAME IS NULL :2015/09/18(金) 16:58:53.59 ID:???.net 最近は構文解析じゃなくてパースって言うのが流行りなのか
928 :NAME IS NULL :2015/09/18(金) 17:39:59.12 ID:???.net >>927 正確には、ParserとAnalyzerは別
929 :NAME IS NULL :2015/09/18(金) 19:29:55.35 ID:???.net 上でパースのコストうんぬんって言ってる人は、どこまでをパースのコストって言ってるんだ
930 :NAME IS NULL :2015/09/18(金) 22:28:30.82 ID:???.net 最近はパースじゃなくてパーズって言うのが流行りらしい。
931 :NAME IS NULL :2015/09/18(金) 22:51:43.34 ID:???.net オヤカータ、ソラカラオンナノコーガ
932 :NAME IS NULL :2015/09/19(土) 01:39:57.43 ID:8OEtVGXT.net >>928 それは全然違うことだろw
933 :NAME IS NULL :2015/09/19(土) 09:34:07.24 ID:???.net >>927 何となくだけどパースって言うと構文解析だけじゃなくて字句解析まで含んでるって感じ
934 :NAME IS NULL :2015/09/19(土) 11:08:47.44 ID:???.net >>933 そりゃ構文解析より前に字句解析するんだから含んでるだろ 問題は実行計画の生成まで含んでるのかどうか、って話だが
935 :NAME IS NULL :2015/09/19(土) 20:27:54.06 ID:IiYbpDOn.net 実行計画はSQLの実行時には作成しませんよ?
936 :NAME IS NULL :2015/09/19(土) 20:53:10.96 ID:???.net じゃあいつ作成するんだ
937 :NAME IS NULL :2015/09/20(日) 01:19:22.02 ID:lAj1Zh68.net Oracleだとデフォルトでは夜中に作成される。
938 :NAME IS NULL :2015/09/20(日) 03:30:52.89 ID:???.net 統計情報と実行計画の区別がついてない?
939 :NAME IS NULL :2015/09/20(日) 13:36:43.88 ID:???.net オラクルなら未来予知もしてくれるってことだよきっと。
940 :NAME IS NULL :2015/09/20(日) 13:50:24.27 ID:???.net クエリ投げたら夜中に実行計画作成して翌日結果が返ってくるのかも。
941 :NAME IS NULL :2015/09/20(日) 17:15:05.84 ID:5kbJqSTC.net >>938 そもそも実行計画は作るものではなく選択するもの。
942 :NAME IS NULL :2015/09/20(日) 18:14:17.11 ID:???.net で、その実行計画とやらは、いつどうやって選択されるの?
943 :NAME IS NULL :2015/09/20(日) 19:16:35.08 ID:???.net 夜中にDBAが選択肢をせっせとクリックしていくんじゃない?
944 :NAME IS NULL :2015/09/20(日) 19:44:03.57 ID:???.net 夜中と言っていたから俺も統計情報と勘違いしているんだと思ったが、違うのか。 一体何と勘違いしているんだろう。
945 :NAME IS NULL :2015/09/20(日) 22:00:45.30 ID:???.net 単に引っ込みつかなくなって話そらすために選択とか言い出してると予想
946 :NAME IS NULL :2015/10/03(土) 08:13:23.87 ID:???.net なんだこの流れ >>918 の正しさが証明されてしまった訳やね
947 :NAME IS NULL :2015/10/03(土) 16:02:06.63 ID:???.net >>918 =>>946 2週間近くも前の話にまだ粘着してるのか… どんだけ悔しかったんだよ w
948 :NAME IS NULL :2015/10/07(水) 20:15:53.76 ID:???.net VS2013 C#+SQLite+dapper.Net AV Table Id Title GenreId 1 巨乳専科 1 2 巨乳専科 2 3 熟女誘惑 3 Genre Table Id Name 1 美少女 2 巨乳 3 熟女 上記のようなテーブルがあって最終的にDataGridに Title Genre 巨乳専科 美少女,巨乳 熟女誘惑 熟女 という風に表示したいんですけど SQLで同じタイトルを重複して取得 select * from AV inner join Genre on AV.GenreIid = Genre.Id; その後コードでごりごりと同じタイトルだけどカラム内の項目が違う部分を 例えばコンマ区切りで文字列を連結して表示するしかないんでしょうか? 正規化するとタイトルが重複してしまうので これをどう扱っていいのかよくわからない状態です コードでごりごりの部分はできますが、SQL分でもっと良いデータの取得方法があるのでしょうか?
949 :NAME IS NULL :2015/10/07(水) 21:37:44.23 ID:???.net SQLiteならgroup_concatがあるだろう
950 :NAME IS NULL :2015/10/07(水) 23:48:53.77 ID:???.net >>949 できましたー ずっと悩んでたので助かりました
951 :NAME IS NULL :2015/10/11(日) 11:28:42.12 ID:???.net sqlやdbプログラミングをある程度出来るように成りたいのですが皆さんどれ位の期間で基礎を習得しました?
952 :NAME IS NULL :2015/10/11(日) 13:25:35.53 ID:???.net 必要に迫られれば必要な分だけ覚えていく感じ 正規表現より簡単だよ
953 :NAME IS NULL :2015/10/11(日) 14:03:40.66 ID:???.net >>951 そんなことを聞いてどうするんだ? お前の能力やある程度のレベルもわからんからなんの参考にもならんと思うぞ
954 :NAME IS NULL :2015/10/11(日) 14:38:47.01 ID:???.net >>952 本当ですか! 自分は正規表現ならかなりのレベルだと自負しています。とりあえずやってみます。有難うございました。
955 :NAME IS NULL :2015/10/11(日) 20:05:58.26 ID:R4q1a/Li.net 正規表現と比較してもな。
956 :NAME IS NULL :2015/10/12(月) 00:36:04.54 ID:???.net 正規表現でかなりのレベルだと自負できるぐらいの技術があるなら屁でもないと思うよ。 正規表現がそこまで複雑怪奇なものだという意味ではなく、何らかの技術を高レベルに習得できるという人間力の点で。
957 :NAME IS NULL :2015/10/12(月) 11:03:34.54 ID:???.net まあ正規表現を組み立てるのとSQLを組み立てるのは手法に似た部分があるとは思う 内容はおもいっきり違うけどさ
958 :NAME IS NULL :2015/10/12(月) 14:02:07.95 ID:???.net >>957 / ̄ ̄ヽ ┏┓ / (●) ..(● ┏┛ | 'ー=‐' i ・ > く _/ ,/⌒)、,ヽ_ ヽ、_/~ヽ、__) \
959 :NAME IS NULL :2015/10/12(月) 16:10:51.32 ID:???.net 数千件位の単純な名簿データ 名前 住所 をc++で検索する場合、ローカルなDBを使う場合と、DBつかわずにc++の配列などで実装する場合とで、速度的にはどちらがどれ位速いですか?
960 :NAME IS NULL :2015/10/12(月) 17:14:36.47 ID:???.net 2倍くらいじゃね?
961 :NAME IS NULL :2015/10/12(月) 18:53:45.76 ID:???.net >>960 経験値ですか?
962 :NAME IS NULL :2015/10/12(月) 19:27:03.17 ID:5QQ971OL.net >>959 なんでそんな比較をしているのかが分からない。 要件は?
963 :NAME IS NULL :2015/10/12(月) 19:50:56.92 ID:???.net >>962 簡単なプログラムを組んでみようと思うのですがDBプログラミング 未経験なのでどれくらいの差があるのか目安を事前に知りたかったのです。
964 :NAME IS NULL :2015/10/12(月) 20:04:23.95 ID:5QQ971OL.net >>963 何がやりたいの? 検索ってどういう条件?
965 :NAME IS NULL :2015/10/12(月) 20:18:07.51 ID:???.net >>963 その比較はお前が書くプログラムのレベルを考慮しないと意味が無い 数千件程度なら、C++で書く方が早いかもしれん 何件でも、データのあり場所次第では、C++で最適化されたプログラムが書ければそっちが早いかもしれん 今時のDBMSがオールアセンブラで書かれてるとは思えんしな そもそも、単純な「検索だけ」の速度なんて比較しても意味が無い DB使うなら、DBからC++のプログラムにデータを取り込む時間も込みで考えないと
966 :NAME IS NULL :2015/10/12(月) 20:24:02.87 ID:???.net >>965 >かもしれん >思えんしな 何の説明にもなっていないアホな回答の典型だな
967 :NAME IS NULL :2015/10/12(月) 20:58:43.29 ID:???.net >>963 DB無しで作る場合、 配列にセットするデータはどこから取ってくるつもり? 最初から配列が用意されてるならDB無しの方が早いだろうけど、数千件程度ならミリ秒レベルの差だよ。 名簿検索プログラムをDB無しで作る事は稀なので、 余計な事は気にせず勉強に取り掛かった方が良い。
968 :NAME IS NULL :2015/10/12(月) 21:14:41.69 ID:???.net ローカルDBって要するに開発用PCにインストールしたDBの事だろ それとオンメモリの配列じゃ話にならん。 圧倒的的に配列の方が早いわ
969 :NAME IS NULL :2015/10/12(月) 22:41:02.00 ID:???.net ま、2倍くらいでしょw
970 :NAME IS NULL :2015/10/12(月) 22:50:40.56 ID:???.net 要求されたコードを実装できる人がやるという前提なら、 特定の検索条件に特化して作るならC++の方が速いかも知れない。 ただ、検索条件を変えたいとなると、辛いことになるだろうな。
971 :NAME IS NULL :2015/10/12(月) 23:47:29.35 ID:???.net >>967 その程度にミリ秒もかからないで欲しい。 >>968 だね。
972 :NAME IS NULL :2015/10/20(火) 11:04:13.11 ID:???.net MySQLテーブルの設計についての質問です。 ひとつの製品が複数のカテゴリに属する可能性のある場合、TINYINT(1)を用いて id name cat1 cat2 cat3 …… ---------------------------------- 1 製品A 1 0 1 2 製品B 0 0 1 3 製品C 1 1 1 4 製品D 1 1 0 という形(0もしくはNULL)で作成しているのですが、 このcat1、cat2等のカテゴリ自身も、例えばcat4を新設したり削除したりなど 可変にする場合はどういう構造にするのが良いのでしょうか。 現状は、変更があった場合に直接DB構造やUI側を修正しています。 以下の様にテーブルを分け、コンマ区切りで取り出して スクリプト側で配列に分離するというのも考えたのですが、 これはやってはいけない方法だと聞きました。 id name cat --------------- 1 製品A 1,3 2 製品B 3 3 製品C 1,2,3 4 製品D 1,2 id name --------- 1 cat1 2 cat2 3 cat3 基本的なDBの設計思想をまだ理解しておらず見当外れだとは思いますがよろしくお願いします。
973 :NAME IS NULL :2015/10/20(火) 11:42:23.33 ID:???.net それで問題なく運用できてるならそれでもいいんじゃないのと思うけどね。 カテゴリが増えるたびに列を増やすのが手間、あるいは問題だと考えてるのならこうする。 id name -------- 1 製品A 2 製品B 3 製品C 4 製品D id name --------- 1 cat1 2 cat2 3 cat3 id1 id2 ←名前は適宜変えて。product_id category_id とか。 ------ 1 1 1 3 2 3 3 1 3 2 3 3 4 1 4 2
974 :NAME IS NULL :2015/10/20(火) 21:39:39.43 ID:???.net 初歩的だし、何度も質問あるだろうけど inとexistsの違いを教えてください
975 :NAME IS NULL :2015/10/20(火) 22:23:37.39 ID:???.net 自分が考えていることが初歩的だと思い込むのはよくない。 それではいつまで経っても初心者のまま。 本当に初歩的であればいくらでもネットに情報はあるのでまずは検索すること。
976 :NAME IS NULL :2015/10/20(火) 23:05:23.09 ID:???.net >>973 ありがとうございます。 練習のためにも、そのやり方で作成してみます。
977 :NAME IS NULL :2015/10/20(火) 23:18:30.90 ID:???.net >>974 inは項目がリストに存在するかどうか existsは行がサブクエリに存在するかどうか
978 :862 :2015/10/20(火) 23:35:27.58 ID:???.net ありがとうございます。 調べてはいるんですが、 inは副問い合わせをした条件の属性?を探す なんとなくわかるんですが、 existsのサブクエリ存在するしないというのは 存在しないという時点で探すのをやめるということなんでしょうか
979 :NAME IS NULL :2015/10/21(水) 00:08:24.21 ID:???.net >>978 逆。EXISTSは存在した時点で探すのをやめることができる。 一個でもあれば、ある。NOT EXISTSは一個もないことを調べるために途中で打ち切ることができない。 まず検索しろと書いたものの、INよりEXISTSの方が速いからどんどん使うべきという情報が まだ多く残っていると思うので、その辺は鵜呑みにしないほうがよいかと。 んで、挙動的にはEXISTSのほうが多重ループをしている感じが強いと思っておけば何かの足しになるかも。
980 :NAME IS NULL :2015/10/21(水) 00:19:13.14 ID:???.net in と existis どっちが速いか inner join の方が速いよって話もあるし自分で書いて計ってみたほうがいいな
981 :NAME IS NULL :2015/10/21(水) 03:52:06.89 ID:???.net >>978 inと副問い合わせは直接関係ない inの対象にするリストを(副)問い合わせで作れるってだけ inとexistsでどちらが早いかという話は、そのクエリ全体から実行計画を見ないと無意味 状況によっては全く同じ実行計画になる可能性もある そもそもSQLは書いたとおり実行されるものではないから、どの命令が早いとか遅いとかはない
982 :NAME IS NULL :2015/10/21(水) 03:55:19.68 ID:NNtjMknF.net >挙動的にはEXISTSのほうが多重ループをしている感じが強いと思っておけば こういうのも鵜呑みにしちゃダメだぞ
983 :NAME IS NULL :2015/10/21(水) 19:10:19.27 ID:???.net >>982 すいません 情報処理試験とかで4たくで出られると 分けわかんなくなるんですよね 基本情報レベルなら大丈夫ですが こういうのって直接触ってみるのが 一番手っ取り早そう
984 :NAME IS NULL :2015/10/21(水) 19:14:47.36 ID:???.net 確かに早いのはexistsってのは聞きますね ケースバイケースなんでしょうけど 副問い合わせと相関副問い合わせってのがあるんですね そのあたりも見てみようと思います
985 :NAME IS NULL :2015/10/21(水) 22:26:00.56 ID:???.net dbからORDER BYを用いてソートした状態で取り出す際、行に対して「任意の順序」を定義することはできるのでしょうか? 例えば行構造が<id, state_A, state_B, state_C>となっていて、行をとるbinary predicateが 両辺共にstate_C==αのときにはidによる順序 両辺共にstate_C!=αのときにはstate_Bによる順序(state_Bには順序が定義されているとする) 両者が異なる場合には…… という具合です
986 :NAME IS NULL :2015/10/21(水) 22:51:22.14 ID:???.net order by case when left.state_C = α and right.state_C = α then id when 〜 then state_B when 複数カラムでソートする場合はソートできる状態の文字列にする+そういうインデックスを作るといいかも。
987 :NAME IS NULL :2015/10/21(水) 23:12:10.98 ID:???.net >>986 アドバイスも添えて下さりありがとうございます 明日試してみます
988 :NAME IS NULL :2015/11/07(土) 16:10:57.12 ID:+XbcKiq/.net >>985 SQLを分けるのが普通だと思う。 無理に一緒にしたら、あとのメンテナンスが面倒。
989 :NAME IS NULL :2015/11/08(日) 15:38:58.68 ID:???.net 分けてunionとかかな?
990 :NAME IS NULL :2015/11/08(日) 23:59:31.78 ID:a7cMoyHv.net >>989 やるとしたらunion allだけど、レコード順が保証されない気がする。 2回に分ける方が確実。
991 :NAME IS NULL :2015/11/09(月) 10:39:28.94 ID:???.net order by database_func() とかできたらいいのに。
992 :NAME IS NULL :2015/11/09(月) 10:51:22.91 ID:???.net え、それはできるっしょ
993 :NAME IS NULL :2015/11/09(月) 16:31:06.51 ID:???.net >>992 あ、書き方が悪かったかな。 一般的なプログラミング言語のソートにおける比較関数みたいなのが書ければなぁってこと。 function compare_func(rec1 as table1.recordtype, rec2 as table1.rectype) みたいな関数を定義して、 order by compare_func() って書けるといいなと妄想。
994 :NAME IS NULL :2015/11/09(月) 17:04:43.98 ID:???.net まあそれは手続き型言語の考え方だな SQLの思想には合わないだろう
995 :NAME IS NULL :2015/11/09(月) 19:01:33.56 ID:???.net 多くのDBMSではユーザ定義関数が作れるしorder byにも使える
996 :NAME IS NULL :2015/11/10(火) 22:24:19.13 ID:???.net 次スレ http://peace.2ch.net/test/read.cgi/db/1447160858/
997 :NAME IS NULL :2015/11/11(水) 15:23:07.11 ID:???.net >>994 ユーザ定義型についてはそれが行えてもさほど不自然じゃないと思う
998 :NAME IS NULL :2015/11/11(水) 18:56:41.55 ID:3mpv2MQg.net >>997 ユーザー定義型?
999 :NAME IS NULL :2015/11/11(水) 20:41:56.94 ID:???.net >>993 から話がおかしい
1000 :NAME IS NULL :2015/11/11(水) 23:19:10.04 ID:???.net >>999 一般的かどうかは知らんが、自作の比較関数を渡してソートできるプログラミング言語はある 多くのDBMSでユーザ定義関数は作れる ユーザ定義型をサポートしているメジャーなDBMSは存在している 個別に見れば、なにもおかしくないけど どこがどうおかしいと?
1001 :NAME IS NULL :2015/11/12(木) 00:28:30.86 ID:LOOLB3CF.net ユーザー定義型とユーザー定義関数は別物だろうが。
1002 :NAME IS NULL :2015/11/12(木) 03:29:27.86 ID:???.net マ板やム板じゃないからC知らない人がいてもおかしくないか。 そう考えれば合点のいくレスがちらほら。
1003 :NAME IS NULL :2015/11/12(木) 08:05:14.16 ID:???.net >>1000 ものすごく一般的なんだけど、SQLはORDER BY句でソートキー取得用関数を使ってソート出来るようになっている。 これでも分からんか?
1004 :NAME IS NULL :2015/11/12(木) 10:13:39.56 ID:???.net SQLでは、一般のプログラミング言語には良くある2レコードの比較関数を作って渡すことが できないってことで、言われてみて初めて気づいた。
1005 :NAME IS NULL :2015/11/12(木) 12:33:02.59 ID:???.net そもそもソートに比較関数を使うのは筋の悪い方法だから、むしろ使えない方が良い設計。 SQLで使えないのは理由が違うが。
1006 :NAME IS NULL :2015/11/12(木) 19:56:43.64 ID:???.net >>1003 は比較関数を理解してなかったってことでOK?
1007 :NAME IS NULL :2015/11/12(木) 20:37:20.84 ID:???.net 比較関数を使わずともソートはできるよということを言いたいんじゃない? 元も子もないなって思うけど。
1008 :NAME IS NULL :2015/11/12(木) 20:46:46.68 ID:???.net 「できるよ」じゃないんだよな。 >>1005 にも書いたけどより良い方法(>>1003 )が可能なのに あえて筋の悪い、具体的には遅い比較関数を使う必要がないということだ。
1009 :NAME IS NULL :2015/11/12(木) 20:58:20.72 ID:???.net 理解しているんだろうけど 比較関数はSQLとは関係ない話だろう
1010 :NAME IS NULL :2015/11/12(木) 22:14:48.10 ID:???.net 速いとかとか遅いとかどういう根拠なんだろうな
1011 :NAME IS NULL :2015/11/12(木) 22:15:25.84 ID:???.net 途中から入るけど SQLとプログラミングで作成するソートがごっちゃになってる って話でいいの?
1012 :NAME IS NULL :2015/11/12(木) 22:21:48.55 ID:???.net 話の途中で悪いが1000ゲト
1013 :2ch.net投稿限界 :Over 1000 Thread 2ch.netからのレス数が1000に到達しました。
301 KB
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★
本文 スレッドタイトル 投稿者