SQL質疑応答スレ 15問目
レス数が1000を超えています。これ以上書き込みはできません。
0001NAME IS NULL
2014/06/16(月) 20:52:29.14ID:???「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。
SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。
質問するときはDBMS名を必ず付記してください。
【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明
前スレ:
SQL質疑応答スレ 14問目
http://peace.2ch.net/test/read.cgi/db/1371476534/
0002NAME IS NULL
2014/06/16(月) 20:54:01.50ID:???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/
0003NAME IS NULL
2014/06/16(月) 20:55:26.32ID:???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/
0004NAME IS NULL
2014/06/16(月) 20:56:48.79ID:???(問)
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
;
0005NAME IS NULL
2014/06/16(月) 20:57:56.48ID:???(問)
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
;
0006NAME IS NULL
2014/06/16(月) 20:59:10.48ID:???(問)
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によって文法がかなり違うので注意
0007NAME IS NULL
2014/06/16(月) 21:00:24.63ID:???(問)
列の数が可変な問合せはどう書きますか?
(答)
標準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
0008NAME IS NULL
2014/06/16(月) 21:15:20.86ID:???(問)
年月(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ならこれを適当に改変すれば動きますが
どのみちお奨めしません。
0009NAME IS NULL
2014/06/16(月) 21:17:04.25ID:???0010NAME IS NULL
2014/06/18(水) 00:11:36.02ID:???・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人くらいになるととても遅くなってしまいます高速化する方法をアドバイス頂きたいです
0011NAME IS NULL
2014/06/18(水) 04:03:04.15ID:???0012NAME IS NULL
2014/06/18(水) 04:28:29.92ID:???そこにはインデックス貼ってますが、例えばフォロワーが1000人とかになるとインデックスを利用していてもやっぱり数が増えてしまいまして
0013NAME IS NULL
2014/06/18(水) 04:47:13.14ID:???0014NAME IS NULL
2014/06/18(水) 08:03:09.04ID:???それどこが遅いんだよ?
ホストアプリで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)で主キーにするか複合インデックス張ってみろ
0015NAME IS NULL
2014/06/18(水) 08:55:54.75ID:???主観が多い
何件のtweetに対して何msかかって遅いといっているのか?
Explainの結果を貼るのがより良い
SQLが汚い
きちんとログから貼りなさい
解答もその汚いSQLから作られるので、そのままでは動かなくて困るだけだ
速度の話をするなら利用しているIndexぐらいは貼ろうよ
0016NAME IS NULL
2014/06/18(水) 10:00:37.03ID:???0017NAME IS NULL
2014/06/18(水) 11:24:55.14ID:???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
0018NAME IS NULL
2014/06/18(水) 12:22:35.60ID:2As4GCOc★+ニュース板
・2NN (推奨サイト)
・2chTimes
★+ニュース板新着
・2NN新着
・Headline BBY
・unker Headline
★+ニュース板その他
・Desktop2ch
・記者別一覧
★全板
・全板縦断勢いランキング (推奨サイト)
・スレッドランキング総合ランキング
・ログ速
★全板実況込み
・2勢
・READ2CH
・i-ikioi
※ 要タイトル検索
※ 2chブラウザ併用推奨
0019NAME IS NULL
2014/06/18(水) 13:38:23.05ID:???よかよか。
んじゃ次は in を exists に置き換えて試してみよう。
サブクエリ内でusersを結合する理由がないなら外そう。
0020NAME IS NULL
2014/06/18(水) 20:43:31.32ID:???なんで>>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で書きなおした方が良いんじゃね
0021NAME IS NULL
2014/06/18(水) 20:49:53.47ID:???それはそうと、リプライ(reply) と リプレイ(replay) は違うよ。
>>20
joinでもいいと思う。
0022NAME IS NULL
2014/06/18(水) 21:08:16.67ID:???inとexistsはオプティマイザによる変換難しいけど
existsとjoinはオプティマイザが簡単に変換するから
読みやすいほうで良いでしょ
0023NAME IS NULL
2014/06/18(水) 22:29:34.81ID:???テンプレ入りするかも?しないかも?
0024NAME IS NULL
2014/06/18(水) 22:40:29.77ID:???mysqlのexplainを読めないなら黙ってても良いんだよ?
002517
2014/06/19(木) 05:02:55.31ID:???ご指摘どおり joinへの置換えを行った所
10000ms→4000ms→0.04msまで落ちました
本当にありがとうございました
0026NAME IS NULL
2014/06/19(木) 05:04:09.29ID:???じゃああなたが>>20の疑問点に解説を
0027NAME IS NULL
2014/06/19(木) 12:12:14.69ID:???0028NAME IS NULL
2014/06/19(木) 12:15:07.32ID:???468 名前:nobodyさん[sage] 投稿日:2014/06/19(木) 11:53:09.08 ID:???
彼は解決したって書いてるけどjoinを使うことでサブクエリが先に消化されてソート対象がメモリ上に乗るサイズになっただけで結局もっと数が増えたらメモリに乗らなくなってまた遅くなるよ
10万件程度のデータでもメモリに載り切らなくなるのはわかりきってるしTwitterみたいに大きくないから大丈夫なんて言える問題じゃない
みたいな書き込みがあったんだけどそうなの?
0029NAME IS NULL
2014/06/19(木) 12:25:50.89ID:???元スレどこなの?
0030NAME IS NULL
2014/06/19(木) 12:27:21.34ID:???やっぱレベル低い争いなのか
http://nozomi.2ch.net/test/read.cgi/php/1389438240/
0031NAME IS NULL
2014/06/19(木) 12:42:55.77ID:???INは全表をメモリに載せようとするけど
JOINやEXISTSはしないで(HASH) SEMI JOINやINDEXで精査しようとするから速いんだよ
ただ、JOINやEXISTSの方式でも件数が影響するので
桁がかなり増えれば、当然遅くなる
最近オプティマイザも賢くなったがな
0032NAME IS NULL
2014/06/19(木) 13:01:52.81ID:???INはORMで簡単に実装できるからよく使われるのに対して
テンプレに載せようかって話す位の常識を知らないやつが増えたね
0033NAME IS NULL
2014/06/19(木) 16:41:08.52ID:???それMySqlの話?
なんかググっても、MySqlにはネステッドループとその変形しか実装されてないって書いてあるんだが
一般論なら、今時はINもEXISTSと同様に展開するんじゃね
まあ、結局はオプティマイザの出来次第なんだが
0034NAME IS NULL
2014/06/19(木) 16:44:02.06ID:???数年分のログを2週間ずつページングして表示させたいです
取り敢えず最初のページのケツの日付を次ページの先頭条件としてみましたが、当然前ページのと被ってしまいます
各ページの先頭行を取得するにはどのようにすればよいでしょうか?
0035NAME IS NULL
2014/06/19(木) 16:56:24.54ID:TW0nEEQA0036NAME IS NULL
2014/06/19(木) 17:06:36.77ID:???existsはjoinの変形とできるけど、inは違うから一概には一緒にはできないよ
オプティマイザが賢ければやってくれるんだけどね
MYSQLは5.6.5からNEST以外のjoin方法が実装されたよ
0037NAME IS NULL
2014/06/19(木) 20:53:12.43ID:???検索しても2000を10000に置き換えるといった置換ばかりかヒットして思うように見つけられません
ご教示お願いいたします
0038NAME IS NULL
2014/06/19(木) 20:53:59.97ID:TW0nEEQA0039NAME IS NULL
2014/06/19(木) 21:04:07.09ID:???ありがとうございます!
たすかりました!
0040NAME IS NULL
2014/06/19(木) 21:29:26.50ID:???> 取り敢えず最初のページのケツの日付を次ページの先頭条件としてみましたが、当然前ページのと被ってしまいます
被るの嫌なら、ケツの次の日にすればいいだけじゃないのか?
そもそも要件が2週間毎なら、>>35 の言うようにページ番号から計算すればいいだけだろ。
0041NAME IS NULL
2014/06/19(木) 21:57:39.98ID:???開始を<=じゃなくて<にするとか、そんな程度の話じゃないの
0042マッチ棒
2014/06/24(火) 23:01:35.90ID:???mySQLとPHPで会社の案件管理をつくっています。
日付で抽出し、たとえば6月の案件一覧を見ているとします。
そこであるレコードを修正して戻ってくると、抽出が解除され全件表示になります。
こういうときに前の抽出状態を維持するいい方法はありませんけ
よろしくお願いします
0043NAME IS NULL
2014/06/24(火) 23:07:13.82ID:???なにで編集してるの?
0044NAME IS NULL
2014/06/24(火) 23:19:57.07ID:???0045NAME IS NULL
2014/06/24(火) 23:22:20.86ID:???0046NAME IS NULL
2014/06/24(火) 23:34:45.32ID:???0047マッチ棒
2014/06/24(火) 23:44:03.72ID:???DreamWeaverでハンドコーディングしています
IE上で動く案件管理DBです
0048NAME IS NULL
2014/06/25(水) 00:13:04.67ID:???内容的にmysqlスレかphpスレで聞くべき物だよ
ここはSQLに関するもの以外は答えない
http://peace.2ch.net/test/read.cgi/db/1376466127/
http://nozomi.2ch.net/test/read.cgi/php/1397862294/
どっちかにお行き
0049NAME IS NULL
2014/06/25(水) 00:15:28.96ID:Agv1+kTb0050マッチ棒
2014/06/25(水) 00:41:04.95ID:???0051NAME IS NULL
2014/06/25(水) 00:45:19.80ID:???ここでお前にマジ回答しても絶対に理解できない
スレ違いな上に分からせることが不可能という二重苦
0052マッチ棒
2014/06/25(水) 00:57:34.06ID:???0053マッチ棒
2014/06/25(水) 00:59:14.65ID:???それともわからないんですか?偉そうなこと言ってるのに口だけなんですね!
0054NAME IS NULL
2014/06/25(水) 01:00:20.65ID:???基本情報技術者とかゴミやん。アマの証だろ
0055マッチ棒
2014/06/25(水) 01:01:35.98ID:???0056NAME IS NULL
2014/06/25(水) 01:03:15.74ID:???初級かよ。最低中級とってこないと
0057NAME IS NULL
2014/06/25(水) 02:59:48.97ID:???大人しくphpスレいきゃよかったのにね
あっちとこっちと重複してる住人も多いかもしれんけど
0058NAME IS NULL
2014/06/26(木) 10:41:08.62ID:???コミットの最中にネットワーク障害などが起きてコミットが中断された場合、
更新系SQL1、2、3と実行していたもののうち、1だけがロールバック
され、残りはコミットされるということは起こりえますか?
0059NAME IS NULL
2014/06/26(木) 10:57:34.43ID:???http://peace.2ch.net/test/read.cgi/db/1385363382/
0060NAME IS NULL
2014/06/26(木) 11:50:08.28ID:???それ同一トランザクション前提だよな?
そんな事がおこったら、トランザクションの一貫性が保ててない欠陥DBMSです
0061NAME IS NULL
2014/06/26(木) 13:26:15.62ID:???もちろん同一トランザクションでのことです。
0062NAME IS NULL
2014/06/28(土) 20:55:24.29ID:???言い換えれば、"売上"表に存在していて"商品"表に存在しない商品コードを抽出している。
SQLを勉強していたらこういう記述を見かけたのですが、
どうしても理解できません。
前者の文と後者の文では結果が違うと思うのですが・・・
0063NAME IS NULL
2014/06/28(土) 21:20:46.91ID:???↓
言い換えれば、"商品"表に存在していて"売上"表に存在しない商品コードを抽出している
だね。技術書って専門家が書いている割にこういう誤植がよくある。
金出して買ったんなら、出版元にガンガン文句言ってやれ。
出版業なら校正に命賭けろってね。
0064NAME IS NULL
2014/06/28(土) 21:25:35.22ID:???本によっては誤植お知らせみたいなのが載ってるから調べてみるといいかもね。
0065NAME IS NULL
2014/06/28(土) 22:37:24.51ID:???真意は不明だけれど、国語の問題じゃあ無いんだからこういう発想で捉えれば、このSQLでも
同じ結果は得られるんだよ という解説にも読めるんだけどな。 おまえら、そういう発想でSQL
書いたりすること無いのか?
0066NAME IS NULL
2014/06/28(土) 23:53:45.86ID:WF1rplta>>62の前後で別のクエリが記載されてるのかなぁという気はしなくもないが、
それよりあなたの日本語。
0067NAME IS NULL
2014/06/29(日) 00:34:49.09ID:???[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 を識別できるようにしたいのです。
よろしくお願いします。
0068NAME IS NULL
2014/06/29(日) 04:25:55.41ID:???その日本語2文に対応して、同じ結果になるSQL二つ書いてみてくれ
0069NAME IS NULL
2014/06/29(日) 04:49:13.93ID:???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;
とかでどう?
0070NAME IS NULL
2014/06/29(日) 09:45:13.09ID:SPV+8b8/★+ニュース板
・ 2NN (推薦)
・ 2chTimes
★+ニュース板新着
・ 2NN新着
・ Headline BBY
・ unker Headline
★+ニュース板その他
・ Desktop2ch
・ 記者別一覧
★全板
・ 全板縦断勢いランキング (推薦)
・ スレッドランキング総合ランキング
・ ログ速
★全板実況込み
・ 2勢 (推薦)
・ READ2CH
・ i-ikioi
※ 要タイトル名検索
※ 2chブラウザ併用推奨
0071NAME IS NULL
2014/06/29(日) 11:58:37.45ID:v5cRsR0pこういうクエリを大量に投げてます。
tbl1のaだけじゃなくてbにもインデックス張った方が高速になりますか?
0072NAME IS NULL
2014/06/29(日) 12:01:59.30ID:???bが性別とかだったら張らないほうが早い
普通のデータのカラムなら張ったほうが良いけど
まあ試せばいいじゃん
トラン系だったらupdateとかinsert遅くなるのにも注意な
0073NAME IS NULL
2014/06/29(日) 14:54:15.91ID:v5cRsR0p0074NAME IS NULL
2014/06/29(日) 21:42:25.83ID:???そのクエリならおそらく(a,b)の複合インデックスで早くなるけど
bの単独インデックスは有っても使われない
まあ、DBMSによるし、試すしかないけど
0076NAME IS NULL
2014/06/30(月) 00:09:48.21ID:g9ImG6pVそれはなぜでしょうか
0077NAME IS NULL
2014/06/30(月) 00:26:52.33ID:???0078NAME IS NULL
2014/06/30(月) 01:04:09.83ID:g9ImG6pV成程!
ありがとうございます!
0079NAME IS NULL
2014/06/30(月) 05:46:09.41ID:???DBMSによると思うけどtruncateでリセットされるのもあるよ
0080NAME IS NULL
2014/07/04(金) 14:04:39.65ID:???それを新しい列を生成してそこに挿入することはできますか?
それとSQL文中では四則演算を行うのは変でしょうか?
0081NAME IS NULL
2014/07/04(金) 17:16:14.78ID:???四則演算を入れるのはおかしくないと思うよ
0082NAME IS NULL
2014/07/04(金) 18:48:14.49ID:+mQ6XEVA> SQL文中では四則演算を行うのは変でしょうか?
変じゃないよ。
こんな感じのクエリを書けるよ。
select 商品名, sum(数量), avg(単価) from table_1 group by 商品名
あと、挿入という言葉は insert の意味で使われるので、避けたほうがいいよ。
0083NAME IS NULL
2014/07/04(金) 19:34:04.43ID:ddlDmBgZ言葉不足ですみません
列Aと列Bを取り出して(列A+列B)を計算して
その結果を列Cとして新しく列を作りそこに表示させたいです
列A | 列B
↓
列A | 列B | 列C
のような感じです
関数としてsumやavgはありますが、それよりも自由な計算を行いたいです
0084NAME IS NULL
2014/07/04(金) 21:13:59.23ID:Skkvw/6Oその計算方法や列A(B)の値を変えた時なんかC列をupdateするわけ?
0085NAME IS NULL
2014/07/04(金) 21:28:33.75ID:+mQ6XEVA新しく作り、表示させたいというのは、テーブルに新しく列を作成し、そこに格納したいという話なの?
きっとそうではないだろうと思っているんだけど。
select 列A, 列B, 列A + 列B * 3 AS 列C
のような抽出をしたいだけなんじゃないかなと。
0086NAME IS NULL
2014/07/04(金) 21:36:06.82ID:ddlDmBgZそういうわけではないです
無理にSQLに組み込む必要はないですかね
>>85
SQLのテーブル自体は変えずに
抽出する結果として列Cを作りたいです
書いていただいたSQL文が自分の希望に近いです
0087NAME IS NULL
2014/07/04(金) 23:56:46.36ID:+mQ6XEVAテーブル構成も何も書かずに正解を出せるレベルにはなかなか達しないなぁ。
>>82がダメだったわけだから、こうかなぁ。
select 数量1 + 数量2 + ... + 数量n as 数量合計, (単価1 + 単価2 + ... + 単価n)/n as 単価平均 from あるテーブル
あと、言葉が不足しているのではなく、不適切な言葉が使われていることが問題です。
0088NAME IS NULL
2014/07/05(土) 00:01:30.38ID:???先ほど書いていただいた
select 列A, 列B, 列A + 列B * 3 AS 列Cで解決しました
「近い」という表現は変でした
ありがとうございました
0089NAME IS NULL
2014/07/05(土) 00:02:23.22ID:vKMEzrERがんばってね
0090NAME IS NULL
2014/07/05(土) 18:35:29.20ID:???グループ化してそこから抽出しなくてもwhereで事足りるのではないかと思います
0091NAME IS NULL
2014/07/05(土) 19:39:42.99ID:???id point
1 10
2 5
3 10
1 5
3 1
2 21
みたいなデータが収められているテーブルがあるとする。
これを
id point
1 15
2 26
3 11
みたいに、idごとにpointを合計するときなどに使える。
0092NAME IS NULL
2014/07/05(土) 19:56:19.38ID:???だからwhereとどう違うんだ
0093NAME IS NULL
2014/07/05(土) 20:04:05.23ID:???一々結果の行数見るのは面倒でしょ
特定の月ごとの総売上の推移を知りたい時
結果のレコードを自分で計算するの?
group byは集計に使うのであって、絞り込みに使うんじゃ無いんだよ
0095NAME IS NULL
2014/07/05(土) 20:24:51.32ID:???必要に駆られたときに覚えればいい
この先DB触っていくならwhereだけで対処出来ないことが出てくると思うし
0096NAME IS NULL
2014/07/05(土) 20:35:00.10ID:???ってか英単語の意味で普通わかる気がするけど。
0097マッチ棒
2014/07/05(土) 20:36:23.08ID:???画像のように、月ごとの小計つきの帳票を出したいのですが
SQLで一発でいい書き方ありますか
PHP側でやるべきですか
http://i.imgur.com/tnzkfBc.jpg
0098NAME IS NULL
2014/07/05(土) 21:07:45.40ID:???0099マッチ棒
2014/07/05(土) 21:33:11.68ID:???group by すると、各月に一件のレコードしか出なくなるんですけど
何がおかしいのでしょうけ?
0100NAME IS NULL
2014/07/05(土) 21:47:25.27ID:???0101NAME IS NULL
2014/07/05(土) 21:54:11.52ID:???0102NAME IS NULL
2014/07/05(土) 22:21:34.46ID:???0103NAME IS NULL
2014/07/05(土) 22:23:21.60ID:???Excel 使え
0105NAME IS NULL
2014/07/05(土) 22:55:32.08ID:???0106NAME IS NULL
2014/07/06(日) 00:05:16.21ID:???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,`仕入額`;
0107マッチ棒
2014/07/06(日) 01:06:27.48ID:qOfyYrO2うまくいった!さすが神!
大儀である
0108マッチ棒
2014/07/06(日) 09:37:36.15ID:qOfyYrO2やれたので問題ないですけんど
ORDER BY の前にある Dはどんな意味なんすか?
消すとエラー起こすので、意味あるみたいだけんど
調べてもそんな句はでてこないのである
0109NAME IS NULL
2014/07/06(日) 10:13:42.24ID:???fromの後ろ、カッコついて中で別のクエリが書かれてるでそ?
そういうのを副問い合わせっつって、識別のために名前をつけてやる必要があるのよ
0110NAME IS NULL
2014/07/06(日) 10:44:38.40ID:???0111マッチ棒
2014/07/06(日) 11:45:26.58ID:qOfyYrO2なんて為になるインタネッツなんだ
0112NAME IS NULL
2014/07/09(水) 08:15:00.48ID:???集計について質問です
果物が販売された日を格納したデータがあるとして
それぞれの果物が最後に販売された日を取得するのには
どういったSQLにすればよいでしょうか?
`種類` `日付`
りんご 2月4日
レモン 3月10日
りんご 5月8日
いちご 7月15日
レモン 10月3日
SELECT `種類`, `日付` FROM 販売日表 GROUP BY `種類` ORDER BY `日付` DESC
`種類`でGROUP BYにすると、りんごは最初に格納された「2月4日」が返されます
ほしい値は最後の日付なので「5月8日」になります
よろしくお願いします
0113NAME IS NULL
2014/07/09(水) 08:36:44.28ID:???そのSQLってエラーではないんだ
maxつかえばいいと思うよ
0114NAME IS NULL
2014/07/09(水) 09:15:46.23ID:???max()ですね ありがとうございます
SELECT `fruits`, max( `date` )
FROM `sale_by_date`
GROUP BY `fruits`
ORDER BY max( `date` ) DESC
LIMIT 0, 10
最近販売された物品の日付一覧がほしいのでこう作りました
ありがとうございました
0115NAME IS NULL
2014/07/09(水) 13:40:14.46ID:DTeLHLr1その場合、取得される値は候補のうちランダムでひとつが選ばれる。
だったと思う。最近postgresqlもその特殊仕様を取り込んだかもしれない。
0116NAME IS NULL
2014/07/09(水) 15:07:49.51ID:???0117NAME IS NULL
2014/07/10(木) 14:46:12.36ID:???0118NAME IS NULL
2014/07/10(木) 14:54:18.36ID:???>>1
0119NAME IS NULL
2014/07/10(木) 18:52:37.72ID:???失礼しました
・DBMS名とバージョン
MySQL
・テーブルデータ
特になし
・欲しい結果
画像登録
・説明
DBに画像を登録したいのですが、
どういう理論で保存できるのかよくわかりません
DBの中に保存できるのか、
DBにパスを入れると勝手に参照してくれるのかどちらでしょうか?
0120NAME IS NULL
2014/07/10(木) 19:08:48.91ID:???バイナリデータを扱う機能はDBMSごとにけっこう異なるので
0121NAME IS NULL
2014/07/10(木) 19:57:30.75ID:f6aU6xxZいずれにせよ、パスを入れると勝手に参照してくれるなんて機能はない。
バイナリデータを入れるか、パスを入れておいて、必要に応じて参照するようにするか。
そういや、前者が適している用途に遭遇したことないなぁ。
0122NAME IS NULL
2014/07/10(木) 20:44:10.53ID:???そうなんですか
ありがとうございます
>>121
>パスを入れておいて、必要に応じて参照するようにするか。
パスを登録したあとSELECT文で指定すれば画像を持ってきてくれるのでしょうか?
0123NAME IS NULL
2014/07/10(木) 21:13:13.81ID:f6aU6xxZいや、パスを持ってきてくれるだけだよ。
0124NAME IS NULL
2014/07/10(木) 21:28:54.43ID:???http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13106887083
お勧めはしない。
0125NAME IS NULL
2014/07/10(木) 21:52:44.29ID:???ただパスの文字列を持ってきてもしょうがないですよね・・・
>>124
参考にさせていただきます
ありがとうございます
0126NAME IS NULL
2014/07/10(木) 21:59:38.26ID:f6aU6xxZしょうがなくないんだけどね。
お勧めしないって言われてるのになぁ。
DBに直接画像ファイルを格納したい明確な理由があるんだろうね。
使い方によってはパフォーマンスががた落ちするけど、それに勝る理由だと信じて、がんばってね。
0127NAME IS NULL
2014/07/11(金) 09:31:25.13ID:???パスってDBに入らなくね?
入れようとしてもエラーで弾かれてしまう
0128NAME IS NULL
2014/07/11(金) 09:54:26.34ID:???0129NAME IS NULL
2014/07/11(金) 10:11:27.93ID:???フォルダの場所とか関係してくる?
DBのなかとか
0130NAME IS NULL
2014/07/11(金) 10:24:35.53ID:???0131NAME IS NULL
2014/07/11(金) 10:36:31.28ID:???Win系だと区切りが\だから、直書きならエスケープいるが。
0132NAME IS NULL
2014/07/11(金) 10:36:58.83ID:???0133NAME IS NULL
2014/07/11(金) 10:37:24.71ID:???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
0134NAME IS NULL
2014/07/11(金) 11:00:29.56ID:???0135NAME IS NULL
2014/07/11(金) 13:03:07.09ID:???http://www.slideshare.net/itabashimasayuki/sql-34381955
0136NAME IS NULL
2014/07/11(金) 13:03:09.62ID:???0137NAME IS NULL
2014/07/11(金) 13:05:49.25ID:???わざわざDBに登録する必要ないよな?
0138NAME IS NULL
2014/07/11(金) 13:31:12.27ID:???融通の効かない事を言ってくる輩は多い
0139NAME IS NULL
2014/07/11(金) 13:47:45.75ID:???> DBに直接画像ファイルを格納したい明確な理由があるんだろうね。
> 使い方によってはパフォーマンスががた落ちするけど、それに勝る理由だと信じて、がんばってね。
逆に言えば、パフォーマンスががた落ちするようなファイルサイズ・量の画像でないのなら、いつでもDBに登録した方が良いともいえる。
0140NAME IS NULL
2014/07/11(金) 13:52:22.12ID:???ままあるし、運用的には扱い辛い事この上ないけどなあ
0141NAME IS NULL
2014/07/11(金) 13:57:45.19ID:???0142NAME IS NULL
2014/07/11(金) 15:41:30.94ID:SfLsxBaOパフォーマンスが落ちるといっているのはサイズや量によるものじゃないよ。
静的コンテンツを静的コンテンツとして扱えなくなることの問題の話だよ。
もちろん、影響がないのならDBに登録しても(!= したほうが)いいよね。しなくてもいいよね。
0143NAME IS NULL
2014/07/11(金) 15:49:26.90ID:???> パフォーマンスが落ちるといっているのはサイズや量によるものじゃないよ。
いや、サイズや量によるよ。
> 静的コンテンツを静的コンテンツとして扱えなくなることの問題の話だよ。
それって、(ファイルを含めた)データベースやデータ、SQLに関する問題?
そうじゃないなら、スレ違いと思うけど。
> もちろん、影響がないのならDBに登録しても(!= したほうが)いいよね。しなくてもいいよね。
DBに登録したときのメリットとデメリットを天秤にかければいいよ。
0144NAME IS NULL
2014/07/11(金) 16:35:58.89ID:???ファイルの場合は置いたパスにしか存在しないが
DBに格納してどこからでも取り出せる方法はアリだと思う
web領域をリセットしても問題ないし
パスを変更したい時もファイル郡の移動がなくて短縮されるし
0145NAME IS NULL
2014/07/11(金) 16:41:34.08ID:???0146NAME IS NULL
2014/07/11(金) 16:45:56.27ID:SfLsxBaO>> 静的コンテンツを静的コンテンツとして扱えなくなることの問題の話だよ。
> それって、(ファイルを含めた)データベースやデータ、SQLに関する問題?
> そうじゃないなら、スレ違いと思うけど。
(ファイルを含めた)データベースやデータの話はスレ違いじゃないの?
>> もちろん、影響がないのならDBに登録しても(!= したほうが)いいよね。しなくてもいいよね。
> DBに登録したときのメリットとデメリットを天秤にかければいいよ。
そうだね。
だからこそ一概に「いつでもDBに登録した方が良い」なんて決めてはいけないね。
0147NAME IS NULL
2014/07/11(金) 17:19:08.84ID:???> (ファイルを含めた)データベースやデータの話はスレ違いじゃないの?
静的コンテンツかどうかみたいな話よりはスレの趣旨に近いと思うけど。
> だからこそ一概に「いつでもDBに登録した方が良い」なんて決めてはいけないね。
画像をDBに登録するのはお勧めしないとか、
> DBに直接画像ファイルを格納したい明確な理由があるんだろうね。
> 使い方によってはパフォーマンスががた落ちするけど、それに勝る理由だと信じて、がんばってね。
みたいな意見に対するカウンターだよ。
俺も本気でいつでもBLOB、なんて思ってないし。
何の考えもなく、ファイルとして画像を保存してDBにはパスだけ登録しときゃいいでしょ的な思考停止へのカウンター。
0148NAME IS NULL
2014/07/11(金) 17:24:08.67ID:???> (ファイルを含めた)データベースやデータの話はスレ違いじゃないの?
これは俺もスレ違いだと思うよ。
> 静的コンテンツを静的コンテンツとして扱えなくなることの問題
というのが、一体どういうことを言ってるのかがわからなかったから
> それって、(ファイルを含めた)データベースやデータ、SQLに関する問題?
と聞いただけ。
0149NAME IS NULL
2014/07/11(金) 17:24:51.72ID:???キミはWebサーバの仕組みから勉強しなおした方が良いかもな
リバースプロキシとかそこらへんを特にな
0150NAME IS NULL
2014/07/11(金) 17:50:18.68ID:???静的な方が動的より速度的に優位であるとしても
>静的コンテンツを静的コンテンツとして扱えなくなることの問題
と速度は関係ないんだが
そもそもパスのみをDBに格納するとしても、それをDBから取り出してる時点で静的コンテンツではないわけだが
バイナリデータの取り扱いはDBMSによりいろんな制約がかかったりするし
最終的にはファイルに落としたかったりすることも多い
(ファイルとセットで管理するような仕組みもってるDBMSもあるけど)
あまりDBMS側で扱いやすいものではないよ
0151マッチ棒
2014/07/13(日) 08:10:39.66ID:rJcU+XbIまた相談ですけんど
日付フォーマットはYYYY-MM-DDで固定なのでしょうか
表示するときに、日は省略で「2014年7月」と表示させたいのですけんど
PHPで文字列加工してやるものですけ
0152NAME IS NULL
2014/07/13(日) 08:12:17.23ID:???0153マッチ棒
2014/07/13(日) 10:38:56.06ID:rJcU+XbI0154NAME IS NULL
2014/07/13(日) 10:49:10.39ID:???0155マッチ棒
2014/07/13(日) 10:56:46.63ID:rJcU+XbI0156NAME IS NULL
2014/07/13(日) 11:10:51.92ID:???>>1読め
0157マッチ棒
2014/07/13(日) 11:16:39.20ID:rJcU+XbI0158NAME IS NULL
2014/07/13(日) 11:18:14.77ID:???0159マッチ棒
2014/07/13(日) 11:22:00.52ID:???0160マッチ棒
2014/07/13(日) 11:24:09.29ID:???0161マッチ棒
2014/07/13(日) 11:25:09.42ID:rJcU+XbI0162NAME IS NULL
2014/07/13(日) 11:30:05.28ID:???テンプレすらかけない奴に誰が答えるかって話だよ
0163NAME IS NULL
2014/07/13(日) 11:32:46.67ID:???0164NAME IS NULL
2014/07/13(日) 12:13:18.34ID:???ポスグレとかオラクルは別の関数だったのは覚えてるけどたまにしか使わないからいちいち覚えてないわ
0165NAME IS NULL
2014/07/13(日) 12:28:48.17ID:???0166NAME IS NULL
2014/07/13(日) 12:30:41.07ID:???0167NAME IS NULL
2014/07/14(月) 04:18:08.00ID:uL3aRoUgまあそう言わんと
0168NAME IS NULL
2014/07/14(月) 14:40:05.65ID:fCq7eZD90169NAME IS NULL
2014/07/14(月) 22:44:32.07ID:m5zGMQZ/前日07時からと当日07時までのデータ配信顧客数を知りたいのですが
前日も当日も配信した顧客の重複は1としての
累計顧客数をだすにはどうしたらいいでしょうか?
0170NAME IS NULL
2014/07/14(月) 23:47:55.34ID:???カラム名分からないんで適当に書くけど、こんな感じでできないかな?
select count(distinct `顧客ID`) from `配信LOG` where `配信TIME` between '前日日付 7:00' and '当日日付 7:00';
0171NAME IS NULL
2014/07/15(火) 07:03:38.38ID:Fpc5z+kr変数からの代入してると
betweenですると無効な構文になります
どう書けばいいのでしょうか…
a_dateはDBの日付
@date1は指定日の前日
@dateは指定日
between a_dte = @date1 and 7時
and a_dte = @date and 7時
はエラーになる
0172NAME IS NULL
2014/07/15(火) 09:05:42.78ID:???>>1くらい読めや
0173NAME IS NULL
2014/07/15(火) 12:20:03.32ID:???せめてSQLの構文ぐらい確認しろよ
0174NAME IS NULL
2014/07/15(火) 13:08:51.67ID:LzDuo0wisql between 使い方 でぐぐってみたら?
0175NAME IS NULL
2014/07/16(水) 12:14:52.45ID:JZzBhKA1postsにはcategory_idを持たせています。
カテゴリー一覧と各カテゴリーに属する記事数を取得するにはどういったsqlを書けばいいでしょうか。
ググったところ http://okwave.jp/qa/q2196405.html を見つけましたがカテゴリーごとに
DBにアクセスしててよろしくないのではないかと思いました。
よろしくお願いします。
0176NAME IS NULL
2014/07/16(水) 12:30:49.48ID:???LEFT JOIN (SELECT category_id, count(category_id) FROM posts GROUP BY category_id) A ON A.category_id = categoires.id
こんな感じを想定してる?
0177NAME IS NULL
2014/07/16(水) 13:31:11.87ID:???SELECT カテゴリ名, count(*) FROM posts INNER JOIN categories ON categories.category_id = posts.category_id
0178NAME IS NULL
2014/07/16(水) 14:14:37.55ID:4RZW5vEMこんな感じか
select
カテゴリ名,
(select count(*) from posts where category_id=t.id ) as cnt
from categoires t
オプティマイザが賢くないならjoinの方が早いかもしれんが
>>177
group byは?
0179NAME IS NULL
2014/07/16(水) 14:16:06.29ID:???後ろが落ちた
GROUP BY category_id
0180NAME IS NULL
2014/07/16(水) 15:24:31.80ID:JZzBhKA1>>176
最初no such column: count と出ましたがcount(category_id) as count としたところ動きました。
coalesce()とか初めて見たので勉強になりました。ありがとうございます!
>>177
属する記事があるカテゴリのみ取ってくることもできるんですね。ありがとうございます!
>>178
こちらも動きました。ありがとうございます!
困っていたので本当に助かりました。自分で書けるように>>2の参考リンクで勉強します。
ありがとうございました!
0181NAME IS NULL
2014/07/16(水) 19:29:13.96ID:???select c.name, count(*)
from posts p
left join categoires c
on p.category_id = c.id
group by c.name
0182NAME IS NULL
2014/07/16(水) 19:47:33.64ID:???0183NAME IS NULL
2014/07/16(水) 19:48:15.77ID:???0184NAME IS NULL
2014/07/17(木) 17:50:24.87ID:???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でやりたいです。
よろしくお願いします。
0185NAME IS NULL
2014/07/17(木) 18:14:16.52ID:???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
こういうこと?
0186NAME IS NULL
2014/07/17(木) 18:17:32.17ID:???ともあれ、image_counts には累計が入っているということなので、
当日の増分を得るためには昨日のデータと結合して引き算すればよいですよ。
0187NAME IS NULL
2014/07/17(木) 19:30:36.55ID:???0188NAME IS NULL
2014/07/17(木) 23:12:20.81ID:???小数点や整数の桁数を指定することはできますか?
(列Aと列Bを割った結果が0.25なら0.2として抽出のように)
0189NAME IS NULL
2014/07/17(木) 23:23:49.35ID:???>1
0190NAME IS NULL
2014/07/21(月) 17:22:28.57ID:???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のパスワードを切り替えて対応できれば・・・と思ったのですが
上記の通り、予想が外れて頓挫しております。
ソフトの作りの話になると思いますので、同じインスタンス名を共存させることはできないのではないかと思います。
こうした場合、どうするのが良いのでしょうか。一日半潰しましたがここまでやったものの分かりませんでした。
何卒お知恵をお貸し下さい。
0191NAME IS NULL
2014/07/21(月) 17:32:00.45ID:???こちらで聞いてみてはどうか
Microsoft SQL Server 総合スレ 10
http://peace.2ch.net/test/read.cgi/db/1385363382/
0192NAME IS NULL
2014/07/21(月) 18:37:02.48ID:???誘導ありがとうございます。向こうで聞いてみます。
0193NAME IS NULL
2014/08/14(木) 18:55:48.56ID:???0194NAME IS NULL
2014/08/14(木) 20:47:48.99ID:???人材派遣会社に頼む
赤い霊柩車の再放送でやってた
0195NAME IS NULL
2014/08/14(木) 21:58:41.11ID:???from 人材派遣会社
where の条件は?
0196NAME IS NULL
2014/08/14(木) 22:03:22.65ID:???0197NAME IS NULL
2014/08/16(土) 13:04:04.19ID:CDUM23fr・テーブルデータ (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以上あるので省略>
0198NAME IS NULL
2014/08/16(土) 13:04:52.61ID:CDUM23fr//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 |
+---------+--------+
0199NAME IS NULL
2014/08/16(土) 13:05:40.94ID:CDUM23fr得たい結果(↓のように、この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 |
+---------+------+--------+
どうか教えてください。よろしくお願い致します。
0200NAME IS NULL
2014/08/16(土) 13:45:35.23ID:???0201NAME IS NULL
2014/08/16(土) 14:07:49.99ID:???> //1つ目
と
> //2つ目
を
join するだけじゃないの?
0202NAME IS NULL
2014/08/16(土) 14:47:47.53ID:CDUM23fr先生たち!それが出来ないんですよ('_;)
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 |
0203NAME IS NULL
2014/08/16(土) 16:14:49.39ID:???0204NAME IS NULL
2014/08/16(土) 16:21:02.14ID:???select
*
from (
【一つ目のクエリ】
) t1
left join (
【二つ目のクエリ】
) t2 on t1.name_no = t2.name_no
こういうことしたいの?
0205NAME IS NULL
2014/08/16(土) 16:22:36.85ID:???調べてもわかんなくて時間ないから聞いたのに、出なおせとか、なんなんだよ!
どうせ、わからないんだろ? おまえなんか、死ね!
0206NAME IS NULL
2014/08/16(土) 16:23:58.15ID:???ありがとう。あんたは好きだ。
ちょっと試して見る。
>>203
死ね!!!
0207NAME IS NULL
2014/08/16(土) 16:31:37.44ID:???お前が氏ね
0208NAME IS NULL
2014/08/16(土) 16:33:14.90ID:???おまえなんか嫌いだ!!!
わからないんだろ?バカめ!!!
こっち見んな!
>>204
ありがとうございます。今、試しています。
恩にきります。
0209NAME IS NULL
2014/08/16(土) 16:43:38.36ID:???> 時間ないから
知らんがな
0210NAME IS NULL
2014/08/16(土) 17:07:33.76ID:???0211NAME IS NULL
2014/08/16(土) 17:13:10.68ID:???0212NAME IS NULL
2014/08/16(土) 18:12:29.32ID:???中学生のガキだと思えば可愛いだろ
0213NAME IS NULL
2014/08/16(土) 19:22:09.81ID:???出来ました。本当に助かりました。
心から感謝致します。ありがとうございました。
自分で調べても全然わからくて、他のみんなにも
乱暴な言葉づかいをしてしまって、申し訳ないと思っている。
どうせ、ググれカスって言われて終わりだと思っていて実際、そういうレスで涙出てきた。
何度やっても出来なくて、切羽詰まっていたんだけど、大人気なかった。
悪かった。教えてくれなかった人は、わかると思うんでこれ以上書きません。
204先生、本当にありがとうございました。
0214NAME IS NULL
2014/08/16(土) 19:42:17.87ID:???MySQLホントSQLの勉強に向いてないな
0215NAME IS NULL
2014/08/16(土) 21:49:17.62ID:ty/0qgaqしね
にどとくるな
しね
0216NAME IS NULL
2014/08/16(土) 22:40:25.63ID:???あらためて >>200-201 を読んだらどういう気持ちになるんだろう。
それと、結合しても出来ないんだと言わんばかりのレスをしている >>202 のクエリが
まるで結合になっていないことにも気づけるようになったんだろうか。
そうなれているなら成長してんだが。
0217NAME IS NULL
2014/08/17(日) 00:09:11.48ID:???SQLどころかプログラム初心者に結合しろって一言だけだと、サブクエリを使うっていうことが理解できんのだろうきっと。
つか理解できたらここには来ないレベルの質問だろうし。
0218NAME IS NULL
2014/08/17(日) 03:11:24.93ID:???どう見たって結合という概念すら理解していない超初心者なのは明白だろ
対応がまずいから怒らせることになる
相当怒ってたぞあれ
0219NAME IS NULL
2014/08/17(日) 07:48:50.97ID:???学校の宿題かなんかだったのかね・・・
0220NAME IS NULL
2014/08/17(日) 09:58:50.73ID:???ヒントだけでなんとかできないならそれまでの奴だろうし、俺には関係ないしな
0221NAME IS NULL
2014/08/17(日) 10:13:43.90ID:???joinでググれというのが適切なヒントかどうかは疑問だけどな
0222NAME IS NULL
2014/08/17(日) 10:23:10.33ID:???それ以外はスルー
0223NAME IS NULL
2014/08/17(日) 10:24:54.88ID:???上から目線で突き放して怒らせるくらいならスルーがいい
自分も今回はスルー組
回答するならば真摯な姿勢で頼む
下手に怒らせて殺伐としたレスを読まされるのは勘弁
0224NAME IS NULL
2014/08/17(日) 10:37:59.23ID:I2qPzeaHSELECT 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してる列の個数が違う意味と
、カッコの付き方で分からなくなっています。
�@�A�B�CのSELECTが互いにどう関係してるのか教えてください。
0225NAME IS NULL
2014/08/17(日) 10:46:39.85ID:???せめて 外部結合 とか sql join とかでググってから出直せ
0226NAME IS NULL
2014/08/17(日) 11:01:45.37ID:???ほーということは副問い合わせの問題じゃなくて結合の方に
私が知りたい答えがあるというお導きですね?
ちょっと考えてみますね
0227NAME IS NULL
2014/08/17(日) 11:30:06.56ID:???もし正解だった場合はさすがに意地悪して優越感ゲットとか抜きでそう言ってくださいね!w
()の内から外へドンドン、ってことですかね?
一番内側のカッコ�CのSELECTは、その外側のカッコ�Bの条件INNER JOINで使用するために用意した。
その二番目に内側のカッコ�BのSELECTは、その外側のカッコ�AのSELECTで使用するために用意した。
その三番目に内側のカッコ�AのSELECTは、その外側の LEFT JOIN〜〜以降ので使用するために用意した。
という感じで正しいでしょうか?
0228NAME IS NULL
2014/08/17(日) 11:59:13.64ID:???リファレンス全部 >>2 、目を通してるか?
通してないから正しいかどうかもわからない
ネタかガチかすら怪しいレベル
0229NAME IS NULL
2014/08/17(日) 12:02:41.81ID:???OK
SELECT4連発は、クエリの中にクエリがあるサブクエリというものだ
結合が絡んでいるのと、カッコで優先順位が指定されているので
複雑になっている
0230NAME IS NULL
2014/08/17(日) 12:03:35.75ID:???まず質問テンプレのルールを守れ。
・DBMS名とバージョンくらい書け。常識ないの?
【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明
0231NAME IS NULL
2014/08/17(日) 12:04:19.52ID:???OKもなにも、常識過ぎて話にならないわ
くだらない
0232NAME IS NULL
2014/08/17(日) 12:10:05.40ID:???このSQLは何をしているの、という質問に対しては
ここのテンプレは役に立たない
もっと柔軟に行こう
人に教えることで自分の知識も底上げされる
0233NAME IS NULL
2014/08/17(日) 12:22:17.87ID:???ありがとうございました。
0234NAME IS NULL
2014/08/17(日) 12:48:13.67ID:???ズバリの回答欲しいなら外注にでも頼みなよ
金は出したくないがズバリの回答ほしいとか、どんだけゆとりなんだよ
0235NAME IS NULL
2014/08/17(日) 12:56:55.55ID:???オマエには質問してないんじゃね?
>>233
がんばって!
0236NAME IS NULL
2014/08/17(日) 12:59:01.06ID:???その通りだがお前はそういう奴に答えなきゃ良いだけじゃね?
0237NAME IS NULL
2014/08/17(日) 13:22:40.40ID:???0238NAME IS NULL
2014/08/17(日) 13:33:19.85ID:???ネットの質問掲示板なんて
そのためにあるようなもんじゃないの?
ギブアンドテイクで済ますことで
互いにコストと時間を節約できる
0239NAME IS NULL
2014/08/17(日) 14:32:40.04ID:???回答者の適度な優越感の獲得
で成り立てばいいんだが、
なんせ人間は本来的ににのび太くんであり(質問者)
エゴの固まりである(回答者)からそうもいかない
0240NAME IS NULL
2014/08/20(水) 10:24:52.50ID:4cvw8JQq0241NAME IS NULL
2014/08/21(木) 21:59:10.67ID:???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が欲しいデータです
どのようにすれば取れるでしょうか
0242NAME IS NULL
2014/08/21(木) 22:42:23.80ID:???そもそもSQLは存在しないデータを生み出すためのものじゃない
カレンダーマスタみたいなものを用意するか再帰SQLかじゃないと出来ないんじゃない
MariaDBって再帰SQL使える?それかプロシジャ作るか
連続した空き日付は無いって前提なら標準的なSQLだけで出来なくはないかも
0243NAME IS NULL
2014/08/22(金) 00:30:39.41ID:???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
0244243
2014/08/22(金) 00:32:11.66ID:???ダメだったらいってください。
0245NAME IS NULL
2014/08/22(金) 06:45:09.44ID:???出来ました、ありがとうございます。
日付計算をdeny_day + INTERVAL 1 DAYにして、"2014/8/22"::dateの部分はDATE(NOW() + INTERVAL 1 DAY)にするとMySQLでも動きました。
0246NAME IS NULL
2014/08/23(土) 15:17:09.89ID:???詳しく無いけど
こういうトリッキーな技は業務でも使われてるの?
DB業界では可読性とか保守性とかは気にしないの?動けばいいの?
最適化されるのか知らないけど(内容の割りに)糞遅くなりそうだし。
このスレ的にはSQLだけで何とかするのが正解で回答者もパズル感覚で答えてるんだろうから、ここだけの話と信じたい。
0247NAME IS NULL
2014/08/23(土) 15:21:08.17ID:???日付だろ、100年分毎日入ってたとしても3万行だぞ
可読性もそんなに悪いと思わないし、わからなきゃサブクエリ1個ずつ実行してみて納得すればいい
0248NAME IS NULL
2014/08/23(土) 15:39:18.20ID:???要件が足りないなら改めて聞き直せばいい事だな
エスパーお節介もほどほどに
0249NAME IS NULL
2014/08/23(土) 16:03:36.59ID:???なに、その上から目線?
それなら、こうするべきだという、お手本を是非みせてくださいよ。
0250NAME IS NULL
2014/08/23(土) 16:07:24.24ID:???0251NAME IS NULL
2014/08/23(土) 16:20:11.77ID:???放置しとけ
人のコードを見ると頼みもしないのに身勝手な論評を
始める人って2ちゃんにはよくいるんだよ
0252NAME IS NULL
2014/08/23(土) 16:27:25.12ID:???内容の割りに遅そうだって言ってるじゃん
>>243をどういう場面で使うかによるでしょ
>>248はごもっとも
0253NAME IS NULL
2014/08/23(土) 16:58:49.29ID:???業務ならトリッキーだろうがなんだろうが、どうにかして求められる答えを出さないとならない
SQLがトリッキーになるのは大概設計が悪いんだが、設計段階終わってたら簡単には変えられん
速度に関して言えばホストアプリやプロシジャでやるより早いだろ
納得できないならあれ以上早くて綺麗な解決方法を提示したうえで反論してね
0254NAME IS NULL
2014/08/23(土) 17:07:47.51ID:???実務だったらホストアプリでやるのがベターだと思っただけなんだ
ホストアプリと>>243どっちが速いかは使い方次第だよね?
それ以外はあなたの言う通り
0255NAME IS NULL
2014/08/23(土) 17:56:10.60ID:???論じるべきは、トリッキーでもなんでもない>>243と
ホストアプリでループしながらクエリを発行することのどちらがよいかではないかな。
0256NAME IS NULL
2014/08/23(土) 18:05:45.89ID:???そういうのは、処理速度以外も含めて総合的な判断でするものだと思うよ
特にメンテナンス性の容易さは重要な要素だと思う
0257NAME IS NULL
2014/08/23(土) 18:18:01.11ID:???速度問題にしたのはお前じゃないのか?
使い方次第って、どういう使い方の想定かしらんが、ホストアプリで複数回のクエリ発行するなら
一般的なDBMSならまず間違いなく>>243の方が早いぞ。オプティマイザが腐ってなければ
>>255
SQLは存在しないデータを生成するためのものじゃない
そういう意味でもあれはトリッキーなのは間違いない
>>256
仕様書なりコメントなりがちゃんとしてればあれぐらいは許容範囲じゃね
0258NAME IS NULL
2014/08/23(土) 18:29:43.03ID:???うん、仕様書がきちんとしてあれば問題ない
0259NAME IS NULL
2014/08/23(土) 18:38:10.14ID:???>速度問題にしたのはお前じゃないのか?
うん。最初のレスからずっと一貫して速度はきにしてますよ。
ホストアプリの方が速い気がしてた
>使い方次第って、どういう使い方の想定かしらんが、
このクエリを更にサブクエリとして使うケースとか
>一般的なDBMSならまず間違いなく>>243の方が早いぞ。オプティマイザが腐ってなければ
そうなのか
ちなみに答えが見つからない場合は?
普通にタイムアウト?
0260NAME IS NULL
2014/08/23(土) 18:48:27.03ID:???相関サブクエリじゃない限り何回も実行されることはないよ
相関サブクエリだとしたら、それこそSQLで処理するしかなくなるよね?
0261NAME IS NULL
2014/08/23(土) 19:16:06.96ID:???>>260
なるほど。ありがとう
0262NAME IS NULL
2014/08/23(土) 20:25:24.07ID:???> そういう意味でもあれはトリッキーなのは間違いない
update t set c = c + 1 where ~
トリッキー?
0263NAME IS NULL
2014/08/23(土) 21:30:41.51ID:???今回の場合は存在しないデータを生成する行為に当たらないってことだよ。
存在しないデータを生成するためのものじゃないっていう知識を得てしまったばかりに
そこで思考停止しちゃってんだろうなぁ。
0264NAME IS NULL
2014/08/23(土) 22:08:00.04ID:???思考停止はどっちなんだか
0265NAME IS NULL
2014/08/23(土) 22:47:41.95ID:???>>262
データを生み出すための元ネタがある限り、
それは存在しないデータを生成する行為じゃないってことぐらいわからんかな
もっかい>>8でもよめば?
0266NAME IS NULL
2014/08/23(土) 22:50:03.22ID:???ホストアプリで解決を試みることがいかに本質から外れているか気づいてないんだなw
0267NAME IS NULL
2014/08/23(土) 23:11:01.86ID:???だから >>243 には、元データがあるって言ってるんだが、アホなの?
0268NAME IS NULL
2014/08/23(土) 23:41:47.06ID:???>>257みたいな勘違いさんは見事に思考停止してるでしょ?
てか、>>264は>>263への反論ではないってことか。
0269NAME IS NULL
2014/08/24(日) 00:14:57.02ID:???0270NAME IS NULL
2014/08/24(日) 05:23:24.43ID:???>>269
アホは、絡んで来るなよ...
0271NAME IS NULL
2014/08/24(日) 06:11:46.00ID:???あれは元テーブルに存在しない今日(+1)をunionしてるところがミソだぞ
計算で値を出すこと自体がデータ生成じゃないのなんて当たり前だぞ
今日(+1)をunionすることがデータ生成かそうじゃないかならまあ好きに議論してくれ
0272NAME IS NULL
2014/08/24(日) 15:28:14.32ID:???ひょっとしなくてもそうだろ。流れ的に。
0273272
2014/08/24(日) 15:33:33.43ID:???分かってる人同士で変なことになるのはよくあることだとは思うよ。
0274NAME IS NULL
2014/08/24(日) 15:52:57.85ID:tWIgsl3k【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
0275NAME IS NULL
2014/08/24(日) 16:05:50.95ID:???前日が存在しないものと翌日が存在しないもので末端は見つけられるけど、
それを横につなげるのが大変そうという点で。
0276NAME IS NULL
2014/08/24(日) 16:23:14.98ID:???前後が孤立している、前にも後ろにも間がある単独レコードは
START_YMD=END_YMDの1件という処理でいいの?
0277NAME IS NULL
2014/08/24(日) 16:43:15.06ID:???そうだと思う。
末端値に対して ID YMD の昇順で連番振ってそれをキーに結合すればよいだけだと思う。
0278NAME IS NULL
2014/08/24(日) 16:43:50.36ID:tWIgsl3k>>275
今のところLAG関数を使って前後のレコードを分析するのがいいのでは・・・と考えてます。
おっしゃるとおり、前日に存在しないもの、翌日に存在しないもの、というのは簡単でしたが、
それを横につなげるうまい方法がわかりません。。
>>276
はい。
テーブルデータ
1 20140101
1 20140103
1 20140105
上記の場合、欲しい結果は以下になります。
ID START_YMD END_YMD
1 20140101 20140101
1 20140103 20140103
1 20140105 20140105
0279NAME IS NULL
2014/08/24(日) 16:49:27.88ID:???横につなげるキーとして
row_number() over (order by id, ymd) as row_number
を作ったら素直にいけないかな。
0280274
2014/08/24(日) 17:01:53.27ID:???レスありがとうございます。
すみません。。ちょっとわからないです。
row_numberを使用して採番して、それをどう横に展開するのかイメージできません。
0281NAME IS NULL
2014/08/24(日) 17:11:59.32ID:???これに、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
これを横につなげればよいと思うよ。採番値をキーに。
0282274
2014/08/24(日) 17:30:39.66ID:???なるほど!でいそうですね。
ただ、WHERE句で日付を絞るとうまくいかないように思えます。
一度フルスキャンしてから、という方法しかないでしょうか?
0283NAME IS NULL
2014/08/24(日) 17:43:02.72ID:???> WHERE句で日付を絞るとうまくいかないように思えます。
1/2以降で取得したいってときにも20140101 - 20140103 と出したいなら、
指定日以前の開始末端値以降のデータを使えばいいよね。
20140102 - 20140103 と出てもいいのなら単に絞ればいいし。
前者の場合はwithを使ったほうがよさげ。
0285NAME IS NULL
2014/08/30(土) 21:11:15.39ID:enm/9WWz以下の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')
0286NAME IS NULL
2014/08/30(土) 21:30:25.35ID:???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 ...
ってことかなぁ
0287NAME IS NULL
2014/08/31(日) 10:17:18.52ID:???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')
)
0288NAME IS NULL
2014/09/01(月) 00:21:23.25ID:ufzSgRWSselect 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として計算する方法はないでしょうか?
0289NAME IS NULL
2014/09/01(月) 00:34:37.24ID:???0290NAME IS NULL
2014/09/01(月) 10:01:28.05ID:???できました! ありがとうございます
0291NAME IS NULL
2014/09/01(月) 13:25:34.56ID:???>>289の today.point - coalesce(yesterday.point) がマイナスのときは0にするということはできますか?
0292NAME IS NULL
2014/09/01(月) 13:42:48.70ID:???条件入れたければ CASE WHEN でどう?
0293NAME IS NULL
2014/09/01(月) 17:15:41.79ID:???できました! ありがとうございます
0294NAME IS NULL
2014/09/03(水) 20:37:45.24ID:0t9jRBQp(なお、どうしても急いでいるためSQLserverのスレにも
質問させていただきました連投すみません)
C#でストアドを呼び出します。
その後、Sqlserverのストアドの戻り値を
呼び出したC#で受け取る方法はありますでしょうか?
コーディングレベルで教えていただければと思います。
具体的に話しますと、
ストアドで複数テーブルをDELETEしたりINSERTしたりします。
どのテーブルでどのような処理(DELETE、又は、INSERT)で異常終了したかを知り
その情報をC#で受け取りたいです。
ただ、ストアドは正常系のリターン0、異常系のリターン1の2択しかなかったような気がして
無理なんでしょうか?
リターン値に値セットしても、C#では正常0、異常1しか戻らないし
困ってます
0295NAME IS NULL
2014/09/03(水) 20:52:02.18ID:???> ストアドは正常系のリターン0、異常系のリターン1の2択しかなかったような気がして
どこにそんなこと書いてあんの?
0296NAME IS NULL
2014/09/03(水) 20:52:14.43ID:???0297NAME IS NULL
2014/09/03(水) 20:55:59.23ID:???△C# と SQLServerスレにマルチポスト
○MSDN読む
0298NAME IS NULL
2014/09/03(水) 20:59:41.58ID:???15分レスがついてないこのスレにまだいるはずがないね。
0299NAME IS NULL
2014/09/03(水) 21:17:27.62ID:???0300NAME IS NULL
2014/09/04(木) 10:19:11.36ID:???同じ質問を何度も読まされればうんざりするでしょ
0301NAME IS NULL
2014/09/04(木) 15:12:28.31ID:???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'というエラーが出てしまいます。
どう書くべきですか?
0302NAME IS NULL
2014/09/04(木) 15:21:50.84ID:???0303NAME IS NULL
2014/09/04(木) 16:40:34.12ID:???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列込みのサブクエリを挟むなど。
0304NAME IS NULL
2014/09/04(木) 16:56:15.48ID:???「where句に select句で作成した列は使えない」知りませんでした・・・
勉強になりました。ありがとうございます
0305NAME IS NULL
2014/09/04(木) 18:28:46.71ID:???> where句に select句で作成した列は使えない。
これなんでできるようにならないんだろう。
>>301 じゃないけど、select に書いた式を where とか、group by にコピペする度になんとかならないものかと思う。
実行時に展開してくれればいいだけだから、実装が難しいとは思えないんだが...
0306NAME IS NULL
2014/09/04(木) 23:21:45.23ID:???偶に巡回するスレ全部にそいつが居た・・・
死ねばいいのにと思っちゃった
0307NAME IS NULL
2014/09/05(金) 04:15:16.91ID:???havingじゃダメか?
0308NAME IS NULL
2014/09/05(金) 06:07:11.82ID:???ん?
ちょっと意味わからん。
0309NAME IS NULL
2014/09/16(火) 09:28:13.48ID:f4Wsk25Vhttp://know-how-tree.com/archives/644
0310NAME IS NULL
2014/09/30(火) 14:51:02.00ID:???日々の売上の合計が一定額を越えた日を知るにはどうすればいいでしょうか?
10/1 |\100
10/2 |\200
10/3 |\300
10/4 |\200
10/5 |\400
10/6 |\100
上記で\1000を越えた日=10/5と出したいです
0311NAME IS NULL
2014/09/30(火) 17:05:29.85ID:???WHERE t1.date >= t2.date ) AS sum_price FROM table t1 ORDER BY date) a
WHERE sum_price > 1000;
とか、、、Window関数あるならそれ使ったほうが簡潔
0312NAME IS NULL
2014/09/30(火) 17:17:45.63ID:???ありがとうございます
やってみます
0313NAME IS NULL
2014/10/01(水) 00:02:45.65ID:???サブクエリのORDER BYは(TOPとか無いと)意味ないし、SQL Serverならエラー出るぞ
>>310
select top 1 日付 from
(select 日付,(select sum(売上) from テーブル where 日付<=t.日付) as 売上累計 from テーブル t ) t2
where 売上累計>1000
order by 日付
とか
やってることは>>311と大差ないけど、サブクエリ増やしてminとるぐらいなら並べ直して先頭行取る方がわかりやすい気が
0314NAME IS NULL
2014/10/01(水) 05:55:07.34ID:???311はSQL serverで動くでしょ
0315NAME IS NULL
2014/10/01(水) 15:29:44.48ID:???>メッセージ 1033、(略
>TOP、OFFSET、または FOR XML が指定されていない場合、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では ORDER BY 句は無効です。
ORDER BY削らないと動きません
2012EXPRESSで確認してるけど、それ以降のバージョンで動くようになってたらしらん
0316NAME IS NULL
2014/10/02(木) 09:32:51.93ID:???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
のところでどう書けば良いのでしょうか?
0317NAME IS NULL
2014/10/02(木) 15:15:58.64ID:???UPDATEはDBMSごとの差が大きいんだよなぁ
MySQLはUPDATEにJOIN使えるっぽいから
update datatbl join master using (code)
set datatbl.sname=master.sname,
...
とかで行けるんじゃね?試してないけど
0318NAME IS NULL
2014/10/02(木) 15:44:02.51ID:???へぇぇ。なんかケチだなぁと思っちゃう。
無効です→無視されますにして、警告どまりでいいような気がするんだけどね。
0319NAME IS NULL
2014/10/02(木) 15:50:30.61ID:???ところで、datatbl.kbn1 がすでに設定されている場合にも更新するの?
つまり、datatbl.kbn1 kbn2 を削除して、参照時にmasterと結合するのを提案したい。
0320NAME IS NULL
2014/10/02(木) 16:26:12.44ID:???こういう書き方ができるの初めて知りました。感謝
>>319
そうです。masterに登録されていたらそちらの情報優先という事です。
0321NAME IS NULL
2014/10/02(木) 17:39:01.34ID:???master優先なら datatbl に持つ必要がないという話です。
単に正規化という言葉でもいいけど。
0322NAME IS NULL
2014/10/02(木) 17:56:57.09ID:???masterにないcodeも持つ必要があり、そういうcodeのためにそうしているんですよ。
masterにないcodeとは何ぞやってな話にもなってしまうんですが、ま、そこら辺は
都合上ってことで^^;;
0323NAME IS NULL
2014/10/02(木) 18:00:50.10ID:???0324NAME IS NULL
2014/10/16(木) 17:47:14.74ID:uSecLKVYMySQL5.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
0325NAME IS NULL
2014/10/16(木) 17:53:57.98ID:???0326NAME IS NULL
2014/10/16(木) 20:03:11.92ID:???どうしても本当に「カラム名」でなければならないならinformation_schema使う
0327NAME IS NULL
2014/10/16(木) 20:18:46.27ID:???問題はinformation_schemaとどうJOINさせるかだと思うが
なぜそんな事をやりたいのかわからんが
ホストアプリある前提ならホストアプリで列名みるのが手っ取り早そうだ
0328NAME IS NULL
2014/10/16(木) 20:38:09.60ID:???(
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
0329NAME IS NULL
2014/10/16(木) 20:55:01.34ID:???0330NAME IS NULL
2014/10/16(木) 21:02:53.49ID:???concat_ws(',',
if(aa = 1, 'aa', null),
if(bb = 1, 'bb', null),
if(cc = 1, 'cc', null))
from test_test
0331NAME IS NULL
2014/10/16(木) 21:03:46.65ID:???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
0332NAME IS NULL
2014/10/16(木) 21:04:48.27ID:???0333NAME IS NULL
2014/10/30(木) 10:29:02.45ID:???その結果(テーブル)を作業テーブルに入れたいです。
別ストアドが返すテーブルのレイアウトに従って
事前に create table #tmp 〜 しておいて
insert into #tmp exec 別ストアド〜 したら出来るのは分かるんですが
select into ぽくやることできないですか。
別ストアドが返すテーブルレイアウトが変更されるたびに(項目が追加されるたびに)
呼ぶ側のストアドが影響を受けたくありません。
0334NAME IS NULL
2014/10/30(木) 14:10:35.44ID:???0335NAME IS NULL
2014/10/30(木) 19:41:19.15ID:???http://msdn.microsoft.com/ja-jp/library/ms188029.aspx
0336NAME IS NULL
2014/10/31(金) 16:27:26.79ID:???0337NAME IS NULL
2014/11/03(月) 21:58:24.62ID:???0338NAME IS NULL
2014/11/08(土) 10:06:39.97ID:???・テーブルデータ
+--------+--------+---------+
| 部品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で
違う製品をつくったりもするので、製品が増えるたびに
テーブルが増えるのも大変かなと思って
質問してみることにしました。
初心者なのでヒントだけでもいただければ
幸いと考えいます。
0339NAME IS NULL
2014/11/08(土) 11:56:25.20ID:???>>7 参照のこと
アプリケーションでやった方がいい
0340>>338
2014/11/08(土) 12:40:26.91ID:???固定したいのですが、無理でしょうか?
見かけはクロス集計の変形みたいな感じです。
こんな感じの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 |
+---------+-------+
0341NAME IS NULL
2014/11/08(土) 13:35:48.89ID:???0342NAME IS NULL
2014/11/08(土) 13:53:19.40ID:???質問は、既存の生産管理記録テーブルに対する問い合わせではなく、
生産管理記録のテーブル設計方法なのかな?
それならば、ここではなく「DB設計」で質問するのが適切だと思う
DB設計としては >>338 で間違っていないので、以下のように考えよう:
・製品テーブル、部品テーブル、製品構成テーブルがある
・製品テーブルは (製造番号, .....) というカラムを持ち、製造番号 が PK である
・部品テーブルは (部品ID, 部品名, .....) というカラムを持ち、部品ID が PK である
・製品構成テーブルは製品テーブルと部品テーブルを結合するテーブルであり、
(製造番号, 部品ID, 部品名) というカラムを持つ
・製品構成テーブルのタプル (部品ID, 部品名) に対してユニーク制約をかける
この制約により、ある製品が複数の同じ部品から構成されることを防ぐ
また >>340 について、表を分離する必要は無いし NULL を認めるカラムを設計すべきではない
ある製品である部品が使われていないことは、製品構成テーブルにロウが存在しないことで表せるのだから
あとこのDB設計における製品製造ルールでは、
ある製品を製造するたびに(=製品番号ごとに)部品構成が変わることを認めている
けれども一般的には製品仕様によって部品構成が決定され、それに従って製品は大量生産される
(オブジェクト指向であれば、製品仕様がクラスに、製造した製品がインスタンスに相当する)
これをどうDB設計するのかを検討することも良い演習になると思う
0343NAME IS NULL
2014/11/08(土) 14:06:50.16ID:???X:それならば、ここではなく「DB設計」で
O:それならば、ここではなく「DB設計」スレで
0344NAME IS NULL
2014/11/08(土) 14:07:21.73ID:???>>338の元テーブルから>>340の上3つの
テーブルを作り出すSQLを知りたいのでしょう
それは無理と言っているのだけどね
0345NAME IS NULL
2014/11/08(土) 14:13:15.48ID:???製造番号のユニーク列と>>340の各部品毎のクエリを外部結合するだけ。
0346338,340
2014/11/08(土) 14:33:12.65ID:???まだ全部は理解していないのですが、
製品αは部品A,部品B,部品Cで構成
製品ベータは部品C,部品D,部品F,で構成
・・・
っとどこかで定義しないとまずいですね。。。
今回は製品は一種類、部品A,部品B,部品Cの3種類という想定でした。
また、NULLがあるのは生産途中とか部品入荷まちみたいな状態を
考えていました。
DB設計も見直してみます。アドバイスありがとうございました。
0347338,340
2014/11/08(土) 14:45:01.46ID:???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)製造番号で外部結合
で、>>340の3つの表が得られ、最終的に>>338の表ができました。
しかし、Serect分を合計で8回(サブクエリを3層?)は、馬鹿みたいに長い
SQL分になりそうなのでちょっと中断して、>341ご指摘のCASEからの
アプローチしてみようと思います。
0348NAME IS NULL
2014/11/08(土) 16:36:04.34ID:???自分の考察では、クエリを18個作って横に連結するという
非現実的なやり方しか浮かばなかったので…正直スマンカッタ
一回のみの臨時作業ならこれでいいんじゃない?
0349NAME IS NULL
2014/11/08(土) 18:39:36.82ID:???サブクエリ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だといいかげんな結果出力するかもしれん
0350349
2014/11/08(土) 18:46:19.66ID:???○部品A,B,Cに対する部品IDが一意に決まらんと
に修正しとく
0351NAME IS NULL
2014/11/09(日) 01:23:14.29ID:???無い
0352347
2014/11/09(日) 09:41:29.15ID:???>>349 こんな感じで元になるテーブルが二つある感じでしょうか?
・データ
+--------+--------+---------+
| 部品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.`製造番号`
0353347
2014/11/09(日) 09:49:36.92ID:???ちなみに 当初の目的であるデータ のテーブルからだけでもできました。
今のところと使いどころがないですが(笑)
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.製造番号
スレを下さった方々とは違う形ではありますが、おかげさまで一先ず目的は達成できました。
(ホントは、もっとスマートにできそうですね。)
ありがとうございました。
0354NAME IS NULL
2014/11/09(日) 09:56:26.43ID:???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.`製造番号` = `データ`.`製造番号`
0355NAME IS NULL
2014/11/09(日) 10:42:26.99ID:???それ微妙ですね
コード読むしかないのか
0356NAME IS NULL
2014/11/09(日) 10:50:47.62ID:???>>338が期待したものとぜんぜん違う歯抜けの結果が返ってきそうだが。
ひょっとしてSQLServerはこれでいけるのか?
0357NAME IS NULL
2014/11/09(日) 11:01:59.80ID:???世界標準が無いだけで、会社の示した標準はあるでしょ
シーケンス図=ER図、プログラムソース=SQLソースはコーディング規約とヘッダ情報書
プログラムソースのドキュメント=SQLソースのドキュメント
0358NAME IS NULL
2014/11/09(日) 11:21:51.57ID:???ああ、済まん
製造番号は重複しないと思ってたわ
0359NAME IS NULL
2014/11/09(日) 12:06:02.46ID:???製造番号,
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 製造番号
0360NAME IS NULL
2014/11/09(日) 12:10:40.53ID:???0361NAME IS NULL
2014/11/09(日) 12:16:52.66ID:???あと、それだとnull上書きになるかもなのでmaxはcase内が良い
0362338
2014/11/09(日) 14:55:48.28ID:???すごい、すっきりしてます!
それにクロス集計っぽいのがいいです!
>>361
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 製造番号
0363NAME IS NULL
2014/11/09(日) 16:47:31.95ID:???0364NAME IS NULL
2014/11/10(月) 00:42:53.19ID:???359で上手くいくなら、それで完結でいいかと
0365NAME IS NULL
2014/11/10(月) 13:56:29.54ID:???この2行で終わる話じゃないのかい。
>>338
>>5
0366NAME IS NULL
2014/11/10(月) 22:23:42.07ID:???0367NAME IS NULL
2014/11/10(月) 23:30:02.89ID:???0368NAME IS NULL
2014/11/11(火) 00:33:34.11ID:???0369NAME IS NULL
2014/11/11(火) 14:45:51.02ID:c2NG27AU■受注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文は使えないです。
0370NAME IS NULL
2014/11/11(火) 14:51:30.20ID:???0371NAME IS NULL
2014/11/11(火) 16:07:30.52ID:???0372NAME IS NULL
2014/11/11(火) 16:14:41.50ID:???やりたい事がいまいちわからん
>AND i.アイテムNum = 1; --で、果物の件数、2で野菜の件数
>と2回問い合わせればできるようなのですが
アイテムNum=3の果物はどうするんだよ
受注件数ってのは受注Num単位でってことか?
明細とアイテムjoinしたものを種別でグループ化して、受注Numのcount(distinct) で出来る気がするが
SQLがどこまでサポートされてるかは知らん
0373NAME IS NULL
2014/11/11(火) 16:38:50.19ID:???そうしたいです。
>>371
使えるのですが使い方がわかりません。
>>372
種別ごとなので、例で言えば 果物と野菜の2種類です。
果物と野菜の受注(注文)がそれぞれ何件あるかということです。
ここでいう受注というのは、注文回数のことで、1回の注文で
果物が5つ注文されていても、1件とカウントします。
果物を2つと野菜を4つ1回の注文でなされていたら
果物1件、野菜1件とカウントします。
説明が下手ですみません。
0374NAME IS NULL
2014/11/11(火) 17:05:36.91ID:???こういうことじゃないの?
"果物 2件 野菜 1件"という文字列が欲しいのなら、それはクエリでやることじゃない。
どうしてもというならできるが非効率だ。
0375NAME IS NULL
2014/11/11(火) 17:26:09.21ID:???> "果物 2件 野菜 1件"という文字列が欲しいのなら、それはクエリでやることじゃない。
> どうしてもというならできるが非効率だ。
select 種別, 種別 + to_char(count(*))
ってやるのが非効率?
0376NAME IS NULL
2014/11/11(火) 17:52:58.30ID:???1回の注文とかいっても、お前が知ってても通じないんだよ
1回の注文ってのは受注Numが同じものは1回の注文でいいのか?
アイテムNum=3も1も同じ果物としてカウントしていいのか?
>>372のやり方のSQL書いて思う結果と違ったのか?
それとも、そもそもそのSQLが書けなかったのか?
>>375
"果物 2件","野菜 1件"(という2行)ではなく、"果物 2件 野菜 1件"の1行が欲しいなら、ってことかと
0377NAME IS NULL
2014/11/11(火) 17:57:42.91ID:???え、そこ?
group_concat使えばいいじゃんっていう特定RDBMS脳ですらないことに感動した
0378NAME IS NULL
2014/11/11(火) 18:16:13.37ID:???> ■欲しい結果
> 果物 2件 野菜 1件
で、"果物 2件 野菜 1件"が欲しいと判断する人のが多数なのか。
0379NAME IS NULL
2014/11/11(火) 18:21:05.39ID:???これをセットで持ってる人多いからね
0380NAME IS NULL
2014/11/11(火) 18:47:07.34ID:???0381NAME IS NULL
2014/11/11(火) 19:13:31.94ID:???それも可能性としてはそう高くないと感じてるような言い方だが
まあ>>374の本意が>>376に沿ってるのかどうかも解らんが
0382NAME IS NULL
2014/11/12(水) 10:19:47.65ID:???0383369
2014/11/12(水) 15:36:57.42ID:???>>376
受注Numが同じものは、1回の注文です。
アイテムNumの3も1も果物としてカウントします。
372のSQLは書けません。
>>374
それだと、明細の種別の集計となると思います。(果物3 野菜1)
欲しい結果は種別毎の受注Numの数なので
種別 数量
果物 2
野菜 1
です。(という書き方をしないといけなかったですね)
0384NAME IS NULL
2014/11/12(水) 15:44:23.26ID:???select 種別, count(distinct 受注Num) from 明細table join アイテムtable using (アイテムNum) group by 種別
じゃあこれでいいんじゃないの?
count(distinct 〜が使えないならサブクエリ使って工夫すればよいと思うよ
0385NAME IS NULL
2014/11/12(水) 15:46:50.22ID:???0386NAME IS NULL
2014/11/12(水) 17:14:38.93ID:???質問者が試して結果を書いてもらうしか無い
0387NAME IS NULL
2014/11/12(水) 17:27:42.45ID:???0388NAME IS NULL
2014/11/12(水) 18:19:03.82ID:???select 種別, count(distinct 受注Num) from 明細table join アイテムtable on 明細table.アイテムNum=アイテムtable.アイテムNum group by 種別
このSQLでエラーがでるなら、出たエラーの内容正確に書いて
0389369
2014/11/13(木) 18:44:31.83ID:???あはは、受注table必要なかったですね。なんで思い込んでたんだろう。
>>388
丁寧にありがとうございます。そのSQLでばっちりでした。
0390NAME IS NULL
2014/11/14(金) 14:28:00.13ID:???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
;
0391NAME IS NULL
2014/11/14(金) 14:29:58.41ID:???staff(社員テーブル)
┏━━━━━━┯━━━━━┯━━━━━━━┓
┃staff_id │name │email ┃
┃0000001 │田中 │[email protected] ┃
┃0000002 │佐藤 │[email protected] ┃
┃0000003 │鈴木 │[email protected] ┃
┗━━━━━━┷━━━━━┷━━━━━━━┛
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 ┃
┗━━━┷━━━━━━┷━━━━┷━━━━━┛
0392NAME IS NULL
2014/11/14(金) 14:41:19.39ID:???各テーブルの内容は以下の通りです。
staff(社員テーブル)
┏━━━━┯━━━┯━━━━━━━┓
┃staff_id │name │email ┃
┃0000001 │田中 │[email protected] ┃
┃0000002 │佐藤 │[email protected] ┃
┃0000003 │鈴木 │[email protected] ┃
┗━━━━┷━━━┷━━━━━━━┛
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 ┃
┗━┷━━━┷━━━━┷━━━┛
0393NAME IS NULL
2014/11/14(金) 14:56:11.85ID:???┏━━━━┯━━┯━━━━━┯━━━┯━━━┓
┃0000001 │田中│[email protected] │A部 │部長 ┃
┃0000002 │佐藤│[email protected] │B部 │部長 ┃
┃0000003 │鈴木│[email protected] │B部 │部次長┃
┗━━━━┷━━┷━━━━━┷━━━┷━━━┛
説明
・staffテーブルの内容を重複させずに表示。
・それぞれのstaff_idに対してpostテーブルのcodeカラムの値が最小のレコードを取得。値が同一の場合はsectionテーブルのcodeが最小のレコードを取得。
どなたか教えてください。よろしくお願いします。
0394NAME IS NULL
2014/11/14(金) 15:34:37.52ID:q7nye6cvunixtimeのような数値ではなく、2014-11-14 15:30:00のような文字列が入っています。
なんとなくそのまま select * from t where created > '2014-11-14 15:30:00'
といった感じにしたところ通りました。
動作も期待通りになっているようですが、
何かこういうものを入れたら通らないみたいな、まずいところはありますでしょうか?
0395NAME IS NULL
2014/11/14(金) 17:11:51.13ID:???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でいけるんじゃね
効率とか保守性とかしらね
0396NAME IS NULL
2014/11/14(金) 21:51:02.85ID:???そういう文字列が入っているんじゃなく、あなたが使っているクライアントがそういう形式で表示しているだけ。
その書き方でいいけど、心配なら case('2014-11-14 15:30:00' as timestamp) って明示する
女神転生シリーズと錯覚の科学がコラボして欲しい
女神転生シリーズと錯覚の科学がコラボレーションして欲しい
女神転生シリーズと錯覚の科学がクロスオーバーして欲しい
女神転生シリーズと錯覚の科学が共演して欲しい
女神転生シリーズと錯覚の科学が協力して欲しい
0398NAME IS NULL
2014/11/22(土) 19:26:50.98ID:???asで別名をつけたカラムもconcatに組み込みたい場合はどうすればいいのでしょうか?
dが認識されずエラーになってしまいます
0399NAME IS NULL
2014/11/22(土) 20:00:05.35ID:???concat(a,b,c,a/c)ってする
0400NAME IS NULL
2014/11/22(土) 20:06:32.46ID:???0401NAME IS NULL
2014/11/22(土) 20:53:29.34ID:???これなんでできるようにしないのかすごく疑問
a/c ぐらいならまだいいけど、ちょっと長めの式書いたときとか、あとから見ても分かりにくいし
$つけたら、alias の名前と解釈するとかして、式を展開するだけでいいと思うんだけど
0402NAME IS NULL
2014/11/22(土) 21:19:07.48ID:???ありがとうございます、助かりました
0403NAME IS NULL
2014/11/23(日) 00:11:12.86ID:???0404NAME IS NULL
2014/11/23(日) 08:51:49.98ID:???SELECT a,b,c FROM table ORDER BY d
ができるのは疑問に思わないぜ?
0405NAME IS NULL
2014/11/23(日) 09:31:05.95ID:???ごめん、何を言いたいのかさっぱりわからん
0406NAME IS NULL
2014/11/24(月) 23:09:28.31ID:???朝鮮人?
0407NAME IS NULL
2014/11/25(火) 00:05:07.47ID:???>>404の解説をお願いします
0408NAME IS NULL
2014/11/25(火) 04:25:50.27ID:???俺は>>406じゃないけど
selectに別名が使えないのに、order byだと使えるのは疑問に思わないのか?
って事だと思う
>>404の書きかたで普通に通じると思ってるやつは日本語能力に問題があると思うわ
0409NAME IS NULL
2014/11/25(火) 04:54:28.18ID:???0410NAME IS NULL
2014/11/25(火) 15:20:03.07ID:???from table
where b = c
order b
こんなクエリ流すと
aでorderされんの?bでされんの?
0411NAME IS NULL
2014/11/25(火) 15:57:12.21ID:???質問というより、>>398への回答?
0412NAME IS NULL
2014/11/25(火) 15:58:10.98ID:???0413NAME IS NULL
2014/11/25(火) 16:05:25.11ID:???手元のDBだと動いてるなw
order byされるのは結果セットで、結果セットではb=実項目aなので
aでorder byされてるっぽいけど
これが規定された動作なのかたまたまなのかはしらん
0414NAME IS NULL
2014/11/25(火) 18:25:53.22ID:???sql標準でどう規定されているかわからないけど、処理の順番的に自然な流れだと思う。
>>411-412
は?
>>401は多義性を解決するための手法を提示しているので、結構納得いく内容に見えるよ
0415NAME IS NULL
2014/11/25(火) 18:38:14.30ID:???0416NAME IS NULL
2014/11/25(火) 18:40:56.96ID:???0417NAME IS NULL
2014/11/25(火) 18:42:21.76ID:???いろいろ欠落してないか
0418NAME IS NULL
2014/11/26(水) 00:12:11.67ID:???SQL SERVER2005 2008はエラーやね
0419413
2014/11/26(水) 05:01:12.25ID:???単にorder byのby抜けてるだけじゃないのか?それかテーブル名か
今確認したけどそこ直せば2008でも動いたぞ
俺SQL Server2000で確認したんたが
仕様変更でもあったのかと思ったぜ
0420NAME IS NULL
2014/11/26(水) 05:18:32.28ID:???http://msdn.microsoft.com/ja-jp/library/ee240807.aspx
0421NAME IS NULL
2014/11/26(水) 08:26:16.51ID:???エイリアス名でソートできた?
0422NAME IS NULL
2014/11/26(水) 13:00:31.97ID:???それはorder by に .(ドット)でつないだ名前はダメって話
>>421
されてるっぽいが、たまたまの可能性は否定できん
一応調べた限りでは
asで指定した名前でソートされるのがSQL規格に沿ってるように思うけど
それぞれのDBMSでそう実装されてるかどうかもわからんし
0423NAME IS NULL
2014/11/26(水) 15:45:17.11ID:???> それはorder by に .(ドット)でつないだ名前はダメって話
ぶっ
0424NAME IS NULL
2014/11/26(水) 15:57:31.53ID:???0425NAME IS NULL
2014/11/26(水) 20:12:00.70ID:iKNX8LUiid │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つけても変わりません・・・・
0426NAME IS NULL
2014/11/26(水) 20:38:58.52ID:???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
0427NAME IS NULL
2014/11/26(水) 22:08:30.01ID:???ありがとうございます
質問に曖昧なところがあり申し訳ありまんでした
実際の要件がもう少し複雑だったため、質問に落としこむところで不手際があったようです
ただ、各コメントをSELECTで更に取ってくればいいとうのはわかりました
これでなんとかなりそうで
0428NAME IS NULL
2014/11/26(水) 22:48:55.55ID:???それはきっと変えてはいけない(というか、変えさせてくれない)んだろうと思った。
0429NAME IS NULL
2014/11/28(金) 12:21:36.50ID:???group by 使う時って、集計関数外のカラムを
全部指定しなくていいの?
0430NAME IS NULL
2014/11/28(金) 14:05:58.50ID:???対象がMySQLだからできるんじゃないかと思って。
0431NAME IS NULL
2014/11/28(金) 16:43:43.35ID:???でも、その場合の値って不定だよね
たとえば>>426の下のクエリなら
最低限session に対応するposted_date拾ってくれるっていう「保障」はあるのかな?
全行で2014/10/31になったりすることはないの?
そこまで意識してMySQLの仕様を理解した上でのクエリならいいけど
素直にグループ化項目に追加しとく方が良いんじゃないかな
0432NAME IS NULL
2014/11/28(金) 18:28:28.72ID:???ノイズはいらん
0433NAME IS NULL
2014/11/28(金) 20:32:57.43ID:???group化された中で不定なだけだよ。それは保障されてる。
MySQLメインで使ったことないけどこれ有名な仕様だと思う。
ちなみにPostgreSQLも9.1から似たようなことができるようになった。
https://www.postgresql.jp/document/9.1/html/sql-select.html#SQL-GROUPBY
ただし、MySQLのそれよりは厳密。
0434NAME IS NULL
2014/11/28(金) 20:33:53.29ID:???SQLServerのバージョン依存の話には何も言わないのにMySQLだと途端に噛み付くのはノイズではないの?
0435NAME IS NULL
2014/11/28(金) 20:52:29.47ID:???そういう意味で、ノイズはいらないから捨てる
0436NAME IS NULL
2014/12/01(月) 05:08:30.06ID:???わがままな御仁だ。
0437NAME IS NULL
2014/12/01(月) 11:12:16.80ID:???0438NAME IS NULL
2014/12/01(月) 14:38:38.23ID:???0439NAME IS NULL
2014/12/01(月) 15:16:02.89ID:???0440NAME IS NULL
2014/12/01(月) 15:19:14.81ID:???0441NAME IS NULL
2014/12/02(火) 00:19:56.16ID:???0442NAME IS NULL
2014/12/04(木) 20:23:50.35ID:???0444NAME IS NULL
2014/12/08(月) 18:52:47.27ID:slTxxYTB0445NAME IS NULL
2014/12/11(木) 11:03:57.75ID:48xV1tZI/ / / | \ ヽ
/ / / / / || | 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、___-、 /ー_ {( '´>、! /ヽ/ |\ \
0446NAME IS NULL
2014/12/11(木) 20:02:20.51ID:???列Aの合計がほしいんですけど、一回のSQL文では無理ですか?
0447NAME IS NULL
2014/12/11(木) 20:08:11.52ID:???0448NAME IS NULL
2014/12/11(木) 20:23:39.22ID:???BがNULLじゃない行の列Aの合計の
二つを一回でだから、駄目だろ
0449NAME IS NULL
2014/12/11(木) 20:23:43.09ID:???sum(case when b is null then 0 eles a end)
from table
sql server 以外で動くは知らんし
そも sql serverで動くかもわからんが
こんなんだろ多分
0450NAME IS NULL
2014/12/11(木) 20:23:43.82ID:???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)
とかかな
0451NAME IS NULL
2014/12/11(木) 20:24:07.10ID:???select sum(A), sum(case when B is null then 0 else A end) from table
>>447
全行の合計は?
0452NAME IS NULL
2014/12/11(木) 20:24:57.51ID:???0453NAME IS NULL
2014/12/11(木) 20:26:53.47ID:???リロードし忘れたかと思ったら、なんか書き込みが次々と w
0454NAME IS NULL
2014/12/11(木) 20:34:07.45ID:???バージョンによるだろうけど、今時は使えるみたいよ
http://www.sqlite.org/syntax/expr.html
知らん間に、再起とかもできるみようになってる
0455NAME IS NULL
2014/12/11(木) 20:49:44.74ID:???ありがとうございました。
0456NAME IS NULL
2014/12/11(木) 22:05:07.25ID:SJi4cj2wやりたいこと:3つ以上のテーブルにわたる、同一名項目の結合
[項目名]と[個数]からなるテーブルがA〜Jまで10個あり(年度ごとにテーブルが
新設されてた)、これを[項目名]で結合して[個数]の変化履歴を作りたいと
考えています。
テーブルの[項目名]は、[個数]が1個以上のものだけが入っているため、
起点となるテーブルで項目が無い場合に、[項目名]すべてが表示されません。
最大で10個のテーブルを結合する時、A〜Jまでの全ての[項目名]を表示させる
には、どのようなクエリにすれば良いでしょうか?
0457NAME IS NULL
2014/12/11(木) 22:18:30.70ID:???0458NAME IS NULL
2014/12/11(木) 22:46:49.32ID:???0459NAME IS NULL
2014/12/11(木) 23:08:28.48ID:???full outer join でやりたいことが出来ました!
[left|right] outer joinは試してたのですが、full outer join はしらんかった……どうもありがとうございます
0460NAME IS NULL
2014/12/12(金) 05:19:00.82ID:???(
select 項目名 from A
union
select 項目名 from B
union
...
union
select 項目名 from J
)
left join A using (項目名)
left join ...
ってやれば実現できるけどね。パフォーマンスは悪いが、使い方次第で実現はできるってことで。
0461名無しさん@そうだ選挙に行こう
2014/12/13(土) 16:22:18.34ID:???Oracleですが
あるSQLで結果が0件の場合0を表示
結果がある場合(その場合は必ず結果は1件のみ)はその結果を表示したいのですが
やり方がわかりません
NVL(結果,0)でやっても結果が無い状態だと0にならないし
カウントを駆使しようとしてもなかなか思うようにはなりません
教えてください
0462名無しさん@そうだ選挙に行こう
2014/12/13(土) 17:35:51.09ID:???それ以外の条件がよくわからんが
count(*)で良い気がするが
0463名無しさん@そうだ選挙に行こう
2014/12/13(土) 17:49:12.44ID:???たとえば
select nubmer from table1 where emp_no=?
というSQLでemp_noを可変にして
emp_noがDBに存在していたら、そのemp_noにひもづくnumberも存在しているのでそのnumberを返す
存在していなかったら結果が返ってこないので結果の欄に0をだす
みたいなことをしたいです
0464名無しさん@そうだ選挙に行こう
2014/12/13(土) 19:11:28.51ID:???select case when exists (select nubmer from table1 where emp_no=4) then 4 else 0 end case from dual;
4のところを可変にして
0465名無しさん@そうだ選挙に行こう
2014/12/13(土) 19:23:30.45ID:???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;
0466名無しさん@そうだ選挙に行こう
2014/12/13(土) 20:07:59.09ID:???0467名無しさん@そうだ選挙に行こう
2014/12/13(土) 21:48:47.12ID:???from
(
select number from table1 where emp_no = 4
union
select 0 from dual
)
0468名無しさん@そうだ選挙に行こう
2014/12/13(土) 21:50:59.85ID:???select number from
(select 0 from dual) left join table1 on (true)
where emp_no = 4
0469名無しさん@そうだ選挙に行こう
2014/12/13(土) 21:51:45.04ID:???select nvl(number, 0) from
(select 0 from dual) left join table1 on (true)
where emp_no = 4
0470名無しさん@そうだ選挙に行こう
2014/12/13(土) 23:47:03.27ID:???0471NAME IS NULL
2014/12/14(日) 02:10:01.43ID:???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
0472NAME IS NULL
2014/12/14(日) 02:11:09.71ID:???0473名無しさん@そうだ選挙に行こう
2014/12/14(日) 02:24:21.60ID:???select nvl(max(nubmer),0) from table1 where emp_no=?
が一番単純だろ
0474名無しさん@そうだ選挙に行こう
2014/12/14(日) 02:58:22.64ID:???ああ、今読み返したら最大一行なのか。
マッチした時は複数行返ってくるとおもってたわ。
0475名無しさん@そうだ選挙に行こう
2014/12/14(日) 18:08:42.98ID:???0476NAME IS NULL
2014/12/14(日) 21:01:04.78ID:???むしろあらぬ方向に突き進んでいるが大丈夫か?
0477NAME IS NULL
2014/12/15(月) 10:36:21.42ID:???「having count(*)=0」は戻り行がないとき「だけ」行を返す常套句だが、なんか変か?
0478NAME IS NULL
2014/12/15(月) 11:11:28.78ID:???select nvl(number, 0)
from (select number from table1 where emp_no = ?)
right outer join
dual
on 1=1
;
where emp_no=?の結果が最大1行だと分かっていれば>>473でもいいと思うが
0479NAME IS NULL
2014/12/15(月) 12:24:21.96ID:???>>469書いたものだけど、dualって1行1列のデータなんだね。ありがとう。
0480NAME IS NULL
2014/12/15(月) 12:26:00.78ID:???0481NAME IS NULL
2014/12/16(火) 21:23:26.87ID:???(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'の時だけ結果の二倍にしています
0482NAME IS NULL
2014/12/16(火) 21:35:05.65ID:???>>5の応用でいける
0483NAME IS NULL
2014/12/18(木) 14:42:35.75ID:N3vS6BKW接続方法:ADO(VC++)
やりたいこと:フィールドのプロパティに設定されている「インデックス」の設定を変更したい
詳細:
AccessのmdbファイルにADOをつかって接続しているのですが、テーブルAのフィールドXに
設定されているプロパティ「インデックス」の設定値を、「はい(重複なし)」から「いいえ」
に変更したいとかんがえています。
Accessでやれば一発なのは全くその通りなのですが、実運用にすでに入っている関係で、
プログラムでこっそり直せないかとかんがえています。
直書きSQLでフィールドのプロパティの設定値を変更するには、どのようにすればよいでしょうか?
0484NAME IS NULL
2014/12/18(木) 21:30:38.63ID:???一般的なSQLでやるならDROP INDEXだろうけど
ちゃんとした環境書かんと何とも言えんが、ADOでは無理だからADOX使え
これ以上はどっかADOのスレでも探して聞け
0485NAME IS NULL
2014/12/22(月) 23:17:24.90ID:l3MlvLHhEmployeeテーブルがあります。
カラムは共通項目com_01~10
user_name
user_id
user_org
user_age
user_payment
等です。
select
*
from
Employeeで指定したとき、共通項目cm_01~10を除く全てのカラム情報が欲しい時、
どうやって指定すればいいですか?
ちなみに他にもいくつかそういうテーブルがあって、
1個1個まじめに指定するとかなりの量になってしまうので、何か良い取り出し方があれば
教えて欲しいです。
0486NAME IS NULL
2014/12/22(月) 23:25:59.40ID:???view作るのは駄目なの?
0487NAME IS NULL
2014/12/23(火) 04:05:57.10ID:???テーブル名 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ではどのように記述すればよろしいでしょうか?よろしくお願いします。
0488NAME IS NULL
2014/12/23(火) 06:03:13.77ID:???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
0489NAME IS NULL
2014/12/23(火) 19:34:18.89ID:???日付
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が出ないのですが
何か間違っている箇所とかあるのでしょうか?
0490NAME IS NULL
2014/12/23(火) 20:07:19.50ID:???FULL OUTER JOIN
0491NAME IS NULL
2014/12/23(火) 23:10:17.03ID:???SELECTのTYPOは置いといて
普通に考えてそれで行けるはずだけど
日付の比較でちゃんと出来てないのかも
DBMS何か知らんが、実際の日付カラムの型と入ってるデータ確認してみれば?
0492NAME IS NULL
2014/12/24(水) 22:10:20.39ID:???うーん
Oracle、比較するカラムは両方とも日付型
それでFULL OUTER JOINでやっても
RIGHT JOINにしても
TO_CHARにしても
なにをどうやってもINNER JOINと同じ形になってしまい
1/1 山田
1/2 田中
1/4 佐藤
になってしまいます
もうお手上げです。
0493NAME IS NULL
2014/12/24(水) 22:54:57.74ID:???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;
どちらかでうまく行きませんか?
0494NAME IS NULL
2014/12/24(水) 23:07:59.12ID:???on 1=1 にしたらどうなる?
0495NAME IS NULL
2014/12/24(水) 23:34:23.58ID:???Accessに>>489のSQLをそのまま打ち込んでも
ちゃんと1月3日の行は出る
Oracleに特有の落とし穴でもあるのかな?
(外部結合が内部結合に格下げされてしまうような)
0496NAME IS NULL
2014/12/24(水) 23:36:39.82ID:???あとはLEFT OUTER JOINと書いてみるぐらいしか思いつかんな
0497NAME IS NULL
2014/12/25(木) 02:55:50.26ID:???DDL貼るぐらいの努力もしないあなたにはお手上げです
0498あ
2014/12/25(木) 19:36:29.49ID:???/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://ヽ:::::::::::::::|
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
0499NAME IS NULL
2014/12/27(土) 03:59:20.56ID:???SQLServerに入ってるDate型のデータをExcelにインポートしたところ、形式が yyyy-mm-dd でした。mm/ddになるようにExcel側で表示形式を選んでも変わりません。
そこでクエリにCAST()を使ってDate型のデータをDateTime型にしてインポートたところ mm/dd表示にできました。
これの原因は何なのでしょうか?
よろしくお願いします。
0500NAME IS NULL
2014/12/27(土) 18:28:35.40ID:???どうやってインポートしたか知らんが、スレ違いだ
ExcelかSQLServerのスレ行って聞け
0501NAME IS NULL
2014/12/27(土) 18:56:39.63ID:???0502NAME IS NULL
2014/12/29(月) 15:07:26.87ID:???・DBMS名とバージョン
10.0.15-MariaDB
・テーブルデータ
+--------------------------------------------------------------------+---------------------+
| mailaddr | insert_dt |
+--------------------------------------------------------------------+---------------------+
メールアドレス 日付
・説明
受け取ったメールアドレスを格納しているのですが、署名の削除のプログラムに不備があり、一部のアドレスがおかしくなっています。
%k<[email protected]
B<[email protected]
y <[email protected]
など・・・
"<"が入るとおかしくなるようなので、"<"含む左側を全て削除したいのですがSQLで可能でしょうか?
0503NAME IS NULL
2014/12/29(月) 16:45:51.07ID:???dateだからミリ秒まで一緒にならないとか?
to_charでYYYYMMDDにしてLEFT JOINすればいいよ。
0504NAME IS NULL
2014/12/29(月) 16:47:35.88ID:???update テーブル set mailaddr = substring_index('<', mailaddr, -1) where mailaddr like '%<%'
かなぁ。使ったことないけど。
(参考) https://mariadb.com/kb/en/mariadb/documentation/functions-and-operators/string-functions/substring_index/
0505NAME IS NULL
2014/12/29(月) 16:50:50.62ID:???あー。なるほどね。
それなら別案として ON (trunc(A.日付) = trunc(B.日付)) も提案しておく >>492
0506NAME IS NULL
2014/12/29(月) 16:52:41.89ID:???署名のほうに < が入ってるとそこで切っちゃうんじゃないのかな?
ISO-2022?のマルチバイトに混じってるのかな、、、
どっちにしても複数の<が混ざるなら正規表現使ったほうが良さげ
0507NAME IS NULL
2014/12/29(月) 17:40:26.57ID:???ありがとうございます、参考にし以下で解決しました。
update mailaddr_new set mailaddr = substring_index('mailaddr', '<', -1) where mailaddr like '%<%';
0508NAME IS NULL
2014/12/29(月) 18:54:43.32ID:???外部結合なんだから、onで一致しなくても出力されないとおかしいだろ
whereでなんかしてない限り
0509NAME IS NULL
2014/12/31(水) 08:57:44.22ID:???FULL OUTER JOIN ならそうだね
0510NAME IS NULL
2014/12/31(水) 17:34:33.93ID:???FULLじゃなくても、どちらかのテーブルは全行出力されるはずだが?
0511NAME IS NULL
2015/01/01(木) 02:47:12.39ID:???なぜかでないって話からはじまってるので、出なきゃおかしいっていわれてもw
0512NAME IS NULL
2015/01/01(木) 06:09:54.33ID:???このケース、基準となるテーブルAが左なのだから
LEFT JOINでAのレコードは全部抽出されるわけで
>>509のレスは的外れだと言いたいのでしょ
0513NAME IS NULL
2015/01/13(火) 13:31:43.45ID:???1億レコードのうち3000万レコードほどをdeleteしようとしてますが
24時間たっても終わりません。
ちなみに同じwhere条件で、select into で別テーブルに吐き出してみると
数分で完了します。
delete時に削除されるレコードを一旦トランザクションログに吐き出しているせいだとは分かりますが
どうにかなりませんか?
0514NAME IS NULL
2015/01/13(火) 13:40:33.86ID:???テーブルごと削除しちまえば?
0515NAME IS NULL
2015/01/13(火) 13:42:15.73ID:???消さないほうの7000万件を別テーブルにselect intoしてから
元テーブルをdrop、別テーブルを元の名前にリネームってのはどうだろう
0516NAME IS NULL
2015/01/13(火) 13:54:35.84ID:???truncate table ぽく、トランザクションログに落とさず削除してくれる with オプションがあるといいのですがー
>>514-515
やっぱそれしかないですか・・・
0517NAME IS NULL
2015/01/13(火) 14:11:52.10ID:???insert直後にwith updlockしても別スレッドのselectでデッドロック発生してしまう…
0518517
2015/01/13(火) 14:12:27.95ID:???0519NAME IS NULL
2015/01/13(火) 14:25:08.00ID:???0520NAME IS NULL
2015/01/13(火) 15:03:13.67ID:???どう解決したか書けよ
0521NAME IS NULL
2015/01/13(火) 18:33:44.99ID:???そもそも反復読み取り可能な分離レベルより低いなら
insert前にロックしてからinsertしないと、insert直後に範囲ロックしてもダメだと思うが
単なるロック待ちとデッドロックが区別できてない気もする
0522NAME IS NULL
2015/01/14(水) 21:40:19.74ID:???論理削除
0523NAME IS NULL
2015/01/21(水) 19:46:07.15ID:???comment_text varchar(50) default null
null
xxxx yyyy-mm-dd
eee yyyy-mm-dd
ggggggg yyyy-mm-dd
となっているところから日付だけを抜き出すにはどうすれば良いでしょうか?
0524NAME IS NULL
2015/01/21(水) 20:10:07.14ID:???これを見てサッパリ理解できないヴァカは俺だけ?
0525NAME IS NULL
2015/01/21(水) 20:28:50.45ID:???substring(comment_text, -10) でいいと思うけど
0526NAME IS NULL
2015/01/21(水) 20:34:16.39ID:???正規表現使えばいいんじゃね?
0527NAME IS NULL
2015/01/21(水) 20:44:23.91ID:???ありがとうございます。それでなんとかやれそうです。
>>526
正規表現は、、、いずれ勉強しますw
0528NAME IS NULL
2015/01/21(水) 20:54:51.51ID:???0529NAME IS NULL
2015/01/23(金) 13:33:07.63ID:???そうじゃないかな
0530NAME IS NULL
2015/01/24(土) 00:55:28.84ID:Vm6DGlpD-------------
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
もっと早くできないでしょうか?よろしくお願いします。
0531NAME IS NULL
2015/01/24(土) 01:43:19.27ID:???これじゃだめなのか?
select count(id),a,b from table group by a,b;
0532NAME IS NULL
2015/01/24(土) 02:04:23.21ID:???select count(distinct a),b from table group by b;
0533NAME IS NULL
2015/01/24(土) 02:50:20.77ID:???早さはあまり変わりませんでした。
sqlがシンプルなので使わせていただきます。
遅いのは件数が膨大なためでしょうね。
早さは諦めました。
ありがとうございました。
0534NAME IS NULL
2015/01/24(土) 04:07:38.18ID:???SQLは書き方では単純に速度はきまらない
とりあえずbか(b,a)でインデックス張れ
0535NAME IS NULL
2015/01/24(土) 13:58:07.92ID:EzqNjDLs!インデックスが効くのは行を選択するカラムだけ。
ま、クエリに現れるすべてのカラムを
一つのコンポジットインデックスに叩き込めば
テーブルにアクセスしなくなるので早くなるけどな。
0536NAME IS NULL
2015/01/24(土) 16:29:43.23ID:???一般的なRDBMSならソートにも効く
group by は実質ソートなんでgroup by にも効く
0537NAME IS NULL
2015/01/24(土) 23:38:19.67ID:yNKl6pEn!インデックスがソートに効くっていうのは、
「インデックスを使ってテーブルにアクセスしたため、結果的にソートが不要になった」場合だけ。
ソートする目的でわざわざインデックスにアクセスするわけではない。
メモリソートのほうが、比べ物にならないくらい早いからね。
ただ、目的のソートと同じ並びのインデックスをもつテーブルへのアクセスを
実行計画の最後にもってきて、意図的にソートを不要にするテクニックもあることはある。
0538NAME IS NULL
2015/01/25(日) 00:37:45.29ID:???腐ったオプティマイザじゃなければ、それが結果的に速いと判断すれば
ソートを不要にするためにわざわざインデックスを使うんじゃないかな
たまたま不要になったとか、今のオプティマイザそんなにアホじゃないよ
インメモリだとしてもソートのコストは馬鹿にならん
0539NAME IS NULL
2015/01/25(日) 00:43:54.95ID:f9eyxImL0540NAME IS NULL
2015/01/25(日) 00:44:58.17ID:f9eyxImLそれはそれとして「インデックスにアクセスする」行為よりもメモリソートのほうが比較にならないほど早いっていうのは
インデックスがメモリに乗っかってない前提の話なのかな
0541NAME IS NULL
2015/01/25(日) 01:26:43.52ID:iuYSGmrF!データブロックの物理読み込みと比べれば、インメモリのソートは無視できるくらい早い。
従ってソートのコストを考慮したとしても、オプティマイザがソートエリミネーションを選択するのは、
たまたまソートオペレーションが不要になったとかクエリとか、そうなるよう意図的書いたクエリとかがほとんど。
ただし、クエリ実行中にユーザメモリ領域に読み込んでるデータが多すぎて、
ソートするのに中間データを一時領域に退避しないとならない場合は、
ダイレクトに物理書き込みと物理読み込みが発生するので非常に高コスト。
オプティマイザがそれを認識すれば、ソートの無いパスを選択する可能性はあるが、
それにしても、目的のソートと同じ並びのインデックスが存在して、
そのインデックスでテーブルにアクセスするパスがあって、、
さらにそのテーブルにクエリの最後の最後にアクセスしなければならない。
しかも、ORDER句のカラムが複数のテーブルから来ていればお手上げ。
可能性は、めちゃくちゃ低い。
0542NAME IS NULL
2015/01/25(日) 05:49:29.89ID:???で、>>532のクエリに対して>>534ってのは
その条件に合致するのしないの?
0543NAME IS NULL
2015/01/25(日) 10:35:22.37ID:???0544NAME IS NULL
2015/01/27(火) 22:59:12.70ID:???FULL OUTER JOINって使えないんでしたっけ?
そんな語句ね−よと怒られるんですが……
0545NAME IS NULL
2015/01/27(火) 23:04:37.62ID:???T-SQL使いたいならパススルークエリ使わないとだめ
リンクテーブルでやるなら
JOINを書かないでFROM句に
FROM table1,table2とか書いて直積を
0546NAME IS NULL
2015/01/28(水) 00:16:05.57ID:???JETはFull Outer Joinサポートしてないぽいな
左右の外部結合をunionするとか、SQL Server側でビュー作ってそれにリンク張るとか
0547NAME IS NULL
2015/01/28(水) 23:40:21.92ID:???あ、そうだった。
LET JOINしたビュー
UNION
RIGHT JOINしたビュー
か
0548NAME IS NULL
2015/01/29(木) 00:10:25.25ID:???0549NAME IS NULL
2015/01/29(木) 00:11:09.71ID:???0550NAME IS NULL
2015/01/29(木) 06:16:54.18ID:???手元の「SQLポケットリファレンス」て本で調べてみたら
MySQLとAccessではサポートしていない命令で
左にのみ存在する行と右にのみ存在する行の両方を取得する、とあるな
こんなややこしい命令、増やして欲しくないものだなあ
やりたければ>>547でできるのだし
0551NAME IS NULL
2015/01/29(木) 15:44:24.44ID:???0552NAME IS NULL
2015/01/29(木) 15:46:39.28ID:???0554NAME IS NULL
2015/01/29(木) 16:22:42.90ID:???mysqlで
User(id int, name varchar)
Follow(to int, from int)
の時に、to,fromにidの外部参照整合性つけるにはどうすればよいですか
0555NAME IS NULL
2015/01/29(木) 16:42:01.98ID:???java persistence api を使ってデータベースを利用する場合、どの程度正規化すべきですか?
0556NAME IS NULL
2015/01/29(木) 17:57:38.87ID:???後藤さんを救うSQL教えてください
0557NAME IS NULL
2015/01/31(土) 09:56:49.07ID:VUE6c9hh削除したいです。
頭良い人!
SQL文を教えてください。
0558NAME IS NULL
2015/01/31(土) 10:19:54.11ID:???0559靖国参拝、皇族、国旗国歌、神社神道を異常に嫌うカルト
2015/02/05(木) 10:08:29.69ID:P8frCpjL・沢山の人が偏った意見を一貫して支持する
偏った意見でも、集団の中でその意見が信じられていれば、自分の考え方は間違っているのか、等と思わせる手法
・不利な質問をさせなくしたり、不利な質問には答えない、スルーする
誰にも質問や反論をさせないことにより、誰もが皆、疑いなど無いんだと信じ込ませる手法
偏った思想や考え方に染まっていたり、常識が通じない人間は、頭が悪いフリをしているカルト工作員の可能性が高い
10人に一人はカルトか外国人
「ガスライティング」で検索を!
...
0560NAME IS NULL
2015/02/08(日) 03:36:02.40ID:ut3aJyT0前日分のAの合計と当日分のAの合計をだす
綺麗な書き方教えて下さい
0561NAME IS NULL
2015/02/08(日) 04:32:45.29ID:???0562NAME IS NULL
2015/02/09(月) 00:53:29.30ID:3M/msCTPA店 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時売上が来てないのを
抽出するにはどうすればいいのでしょうか?
店名、ファイル名テーブルが残念な仕様で
リストがなく来たものは制限なく追記されます
0563NAME IS NULL
2015/02/09(月) 01:25:55.33ID:???10時売上がある店名 - 11時売上がある店名 = 10時売上があったが11時売上がなかった店名
0564NAME IS NULL
2015/02/09(月) 01:50:27.78ID:eZmoEYfMありがとうございます
考え方はわかりましたが
どういう式にすればいいかが
わかりません(^_^;)
0565NAME IS NULL
2015/02/09(月) 02:32:50.21ID:???0566NAME IS NULL
2015/02/10(火) 00:10:37.20ID:???0567NAME IS NULL
2015/02/10(火) 06:53:09.04ID:???・10時売上がある店名
・11時売上がある店名
・引き算
どれがわからんの?
0568NAME IS NULL
2015/02/10(火) 11:37:16.66ID:???あるお店で商品を売っています。システムで用意しているテーブルは以下です。
売上データの商品コードは外部キーです。
・売上データ(列は、商品コード、売上数量)
・商品マスタ(列は、商品コード、商品名)
それで商品別の売上数量の合計を見ます。その際、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で、どちらを使うのがいいとかいうのはあるのでしょうか?
どちらでも、気にすることはないでしょうか?
0569NAME IS NULL
2015/02/10(火) 14:02:50.30ID:???0570NAME IS NULL
2015/02/10(火) 15:03:03.44ID:???レコード数やインデックスの具合にもよるけど、実行計画が違う可能性がある。確認してみたら?
なんとなくだけど、1の方が速い気がする。
0571NAME IS NULL
2015/02/10(火) 15:20:13.53ID:???mysqlとかpgsqlがやってるあれのことなら
むしろgroup by削るだけで済む�@の方が楽じゃないだろうか。
0572NAME IS NULL
2015/02/10(火) 21:07:14.18ID:qNvKu1yt店名はテーブルだせばいいのでしょうが
引き算や使う構文がわかりません
0573NAME IS NULL
2015/02/10(火) 21:11:14.92ID:???基礎からやり直し。というか、たぶん始めてすらいないよね。
年貢の納め時は近いぞ。
0574NAME IS NULL
2015/02/10(火) 21:19:13.78ID:???> 店名はテーブルだせばいいのでしょうが
まずこの SQL は書けるのか?
書けないんだったら、SQL のお勉強からやりなよ
0575NAME IS NULL
2015/02/10(火) 23:41:26.22ID:8M1v3r1O店名は出せます。
0576NAME IS NULL
2015/02/10(火) 23:57:03.20ID:???0577NAME IS NULL
2015/02/11(水) 00:06:03.09ID:???だから、その SQL 書いてみてよ
0578NAME IS NULL
2015/02/11(水) 01:09:33.77ID:sDJiZbD10579NAME IS NULL
2015/02/11(水) 02:51:44.56ID:???他の人が言ってるマイナス処理はDBMSによって差があるから
とりあえずDBMS明記しろ
マイナス以外の考え方としては、素直に 10時売上がある かつ 11時売上がない
っていうWhere条件書く方法もあるけど
11時売上がないっていう条件は
相関サブクエリを(not)existsでチェックするか
11時売上がある店名に含まれているかを(not)inでチェックするか
この方法ならほほとんどのDBMSでそのまま動く
0580NAME IS NULL
2015/02/11(水) 09:30:57.30ID:???教えるの下手すぎ。
0581NAME IS NULL
2015/02/11(水) 09:48:40.98ID:???0582NAME IS NULL
2015/02/11(水) 09:56:57.08ID:???単に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時売上'
を追加
0583NAME IS NULL
2015/02/11(水) 10:50:15.00ID:???0584NAME IS NULL
2015/02/11(水) 11:44:34.21ID:???普通は店名マスターぐらいは持つからなぁ
0585NAME IS NULL
2015/02/11(水) 19:50:15.95ID:???集合理論における引き算だけど何かおかしな点でも
0586NAME IS NULL
2015/02/12(木) 01:10:16.71ID:???DBMSによってはMINUS使えるじゃん
0587NAME IS NULL
2015/02/13(金) 15:19:09.63ID:???mysqlです
0588NAME IS NULL
2015/02/13(金) 17:03:15.37ID:???最低限
・検索対象のデータ
・どのように検索したか
0589NAME IS NULL
2015/02/13(金) 17:13:49.67ID:???適当な日本語を2gramに分けました。
日本 本語 語で であ あそ そぼ ぼう
みたいに
検索は
select * from hage where match(words) against('+日本 +本語' in boolean mode);
とやりました
英語も検索できないです
0590NAME IS NULL
2015/02/13(金) 19:42:19.41ID:???ft_min_word_len で調べるといいかもしんない
0591NAME IS NULL
2015/02/13(金) 23:09:55.18ID:???それっぽいです
ありがとうございます
0592NAME IS NULL
2015/02/14(土) 03:46:01.22ID:???ところで >>580 の疑問は解決したんだろうか。
0593NAME IS NULL
2015/02/14(土) 19:28:35.09ID:???select * from hage order by ts desc limit 0, 15
だとデータが増えると遅くてダメらしいのですが
0594NAME IS NULL
2015/02/14(土) 20:34:38.19ID:???どうしてもSQLにしたいならインデックスとかで頑張るしかない
0595NAME IS NULL
2015/02/14(土) 21:15:23.37ID:???ページネーションなんてアホな単語覚える前にインデックス覚えろよ
0596NAME IS NULL
2015/02/14(土) 21:32:01.30ID:???wehre句でそのページに当たる部分を抜き出すとかそういった処理が必要。
0597NAME IS NULL
2015/02/14(土) 21:33:06.46ID:???英語だから読めないけど、このページに書いてありました
http://www.xarg.org/2011/10/optimized-pagination-using-mysql/
0598NAME IS NULL
2015/02/14(土) 21:45:05.22ID:???0599NAME IS NULL
2015/02/14(土) 23:13:25.65ID:???>質問するときはDBMS名を必ず付記してください。
情報の後出し乙
0600NAME IS NULL
2015/02/14(土) 23:36:57.03ID:???すみませんでした
テンプレ読んでなかったです
mysql5.6です
0601NAME IS NULL
2015/02/14(土) 23:44:42.99ID:???0602NAME IS NULL
2015/02/14(土) 23:45:18.50ID:???0603NAME IS NULL
2015/02/19(木) 03:36:48.52ID:???・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
・・・
どうすればスマートに検索できますでしょうか
検索クエリや、そもそもデータも持ち方がおかしいのかと思ってますが、方法が浮かびません
よろしくお願い致します。
0604NAME IS NULL
2015/02/19(木) 05:52:56.34ID:???>>6
0605NAME IS NULL
2015/02/19(木) 10:49:17.00ID:???10回くらい読んでようやく理解できました
ありがとうございます
0606NAME IS NULL
2015/02/19(木) 13:08:52.35ID:???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)
0607NAME IS NULL
2015/02/19(木) 17:20:08.37ID:???トランザクションが自動ロールバックされたのに、それをアプリ側で
検出できず、トランザクションが終了したまま次のSQL2,3が自動コミット
で実行され、最後にコミットしようとしたところでトランザクションが
終了しているので例外になって終わっていたようです。
おそらく、↓のページの事象によるものだと思われます。
ttp://support.microsoft.com/kb/315662/ja
0608NAME IS NULL
2015/02/19(木) 20:52:50.12ID:???>>それをアプリ側で検出できず
ほんとに検出できないならそれは問題だが
たんにお前のアプリが検出してないだけだろ
普通デッドロックはDBMS側で検知してアプリにエラーを戻す
リンク先みたけど、2000のSP3で修正されてるような大昔のバージョンだし
その記事の内容みるに、ロック開放待ちでずっと待ってる(=デッドロックが発生してる)のに
DBMS側で検知できない=当然アプリにも通知されない
って内容に見えるが
だったら後続のSQLはそもそも実行されない
0609NAME IS NULL
2015/02/20(金) 00:47:06.66ID:???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
文法に間違いがあるらしいのですが、どこにあるのかわかりません
0610NAME IS NULL
2015/02/20(金) 00:53:45.96ID:???最後に;をつけたのですが文法エラーでした
レスに書き忘れました。
0611NAME IS NULL
2015/02/20(金) 14:51:08.38ID:???自己解決しました
変数、カーソル、例外ハンドラの順に宣言しないといけなかったようです
0612NAME IS NULL
2015/02/20(金) 15:55:38.37ID:???item(id,name)
sim(id1,id2,sim default 0)
insert into sim(id1,id2) values(新しいid,itemの今までのすべてのid)
をやりたいのですがどういうふうに書けばよいですか
0613NAME IS NULL
2015/02/20(金) 18:05:30.57ID:???ってこと?
0614NAME IS NULL
2015/02/20(金) 18:11:25.39ID:???新しいidは誰がどうやって決めるんだ?
0615NAME IS NULL
2015/02/20(金) 18:54:12.30ID:???0616NAME IS NULL
2015/02/20(金) 23:09:00.17ID:???です。
新しいidはクエリーの呼び出し側でせっていして、古い方のidをitem tabl
eからとってきて、挿入したかったのですが、ストアドプロシージャで作れました
0617NAME IS NULL
2015/02/20(金) 23:16:33.00ID:???sim(id1,id2,sim,ts)
でタイムスタンプの最も古いものを最新のsimを持ったものに更新するストアドプロシージャを作ったのですが、290万回実行したいのに1800回実行したあたりで実行結果が反映されなくなってしまいます。
どうしたらよいですか?
0618NAME IS NULL
2015/02/21(土) 00:01:15.38ID:???誰に安価つけてんのかわからんがストアドいらんよ
>>617
何をしたいのか具体的に書いてくれ
0619NAME IS NULL
2015/02/21(土) 00:12:49.55ID:???最初はうまく行ったのに、作ったストアドプロシージャを呼び出しても0 rows affectedになってしまうんです。
ストアドプロシージャの中身はreviewテーブルのデータから相関係数を求めて、それをsimに入れるだけです
0620NAME IS NULL
2015/02/21(土) 02:04:50.37ID:???0621NAME IS NULL
2015/02/21(土) 11:11:02.04ID:brE3by3lCREATE 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回程度実行して以降テーブルに結果が反映されなくなりました。
0622NAME IS NULL
2015/02/21(土) 11:47:13.79ID:brE3by3lでした
書き間違えました
0623NAME IS NULL
2015/02/21(土) 13:46:07.12ID:???show warnings;やshow errors; でメッセージとか出てないの?
0624NAME IS NULL
2015/02/21(土) 18:34:26.25ID:???けいこくもがエラーもないです
mysqlスレでも聞いてみます
0625NAME IS NULL
2015/02/21(土) 19:17:01.44ID:brE3by3l類似度が0の場合、updateされた時にタイムスタンプが更新されないためでした。
ご迷惑をお掛けしました
0626NAME IS NULL
2015/02/23(月) 19:57:45.96ID:???いくつかのテーブルからフィールドを選んで結合したクエリがあって、
そのクエリの日付型フィールドから、既に開いてるフォームのテキストボックスに入力された日付に合致したレコードのみを取り出し、
Aフィールドの文字列によって、AフィールドとBフィールドのどちらかの値を取り出し、
新しいテーブルに書き込むということをしたいと考えてます
さしあたって日付に一致したレコードを取り出すとこからやりたいのですが
クエリの抽出条件に[forms]![フォーム名]![テキストボックス名]と書いて、
SQLで
OpenRecordset("クエリ名",dbopendynaset)
とするとパラメーターが足りないとエラーが返されます
次に、
OpenRecordset("SELECT * FROM クエリ名 where フィールド名 = # & [forms]![フォーム名]![テキストボックス名] & #, dbOpenDynaset,)
としてみると日付型が一致しないとエラーが出てしまいます
どー直せば期待する結果を得られるでしょうか
0627NAME IS NULL
2015/02/23(月) 23:32:37.22ID:???クエリ定義をSQLビューで表示して全部書いてみて
下のOpenRecordsetは"が閉じてないけど、ちゃんとプログラム通りに書いて
0628NAME IS NULL
2015/02/25(水) 13:31:45.28ID:67mWbYxhあるテーブルに、ふりがな列と生年月日の列があります。
これを歳の若い順に50件出力したいのですが、
出力の順番はふりがな順(あいうえお順)にしたいのです。
こういうのってSQLだけでできますか?
(PostgreSQLです)
0629NAME IS NULL
2015/02/25(水) 13:33:32.44ID:67mWbYxhあ、すいません、もちろん副問い合わせとかなしでの話です。
0630NAME IS NULL
2015/02/25(水) 13:41:11.21ID:???0631NAME IS NULL
2015/02/25(水) 13:48:53.25ID:???に変わった瞬間を見た
0632NAME IS NULL
2015/02/25(水) 13:59:59.31ID:???select * from ユーザ order by 生年月日 desc, ふりがな limit 50;
0633NAME IS NULL
2015/02/25(水) 14:05:25.24ID:???0634NAME IS NULL
2015/02/25(水) 15:31:27.88ID:???select * from ユーザ order by date_part('years', age(生年月日)) desc, ふりがな limit 50;
0635NAME IS NULL
2015/02/25(水) 15:39:51.76ID:???ポスグレのorder byってこれでふりがな順になるの?逆におかしくね?
0636NAME IS NULL
2015/02/25(水) 15:47:57.32ID:???何がおかしいのか理解できない
0637NAME IS NULL
2015/02/25(水) 15:48:25.79ID:???通るか知らんがこんなイメージ
select * from (select * from ユーザ order by 生年月日 desc limit 50 ) order by ふりがな
0638NAME IS NULL
2015/02/25(水) 15:48:50.95ID:???0639NAME IS NULL
2015/02/25(水) 15:51:54.46ID:???なんだそのアホクエリーは
0640NAME IS NULL
2015/02/25(水) 15:58:38.49ID:???0641NAME IS NULL
2015/02/25(水) 16:04:01.95ID:???descが余分なのは置いといて、俺も>>634の何がおかしいのかわからんぞ。
年齢順・フリガナ順に並べて先頭50件だろ?
0642NAME IS NULL
2015/02/25(水) 16:05:08.07ID:???0643NAME IS NULL
2015/02/25(水) 16:06:15.59ID:???・年齢順に並べて
・その先頭50件を
・フリガナ順で並べる
ってことか?結果として年齢順にならないソート。
0644NAME IS NULL
2015/02/25(水) 16:07:22.18ID:???生年月日順に若い方50件抜き出した上で、それを名前順にソート
>>637 は別名必須
0645NAME IS NULL
2015/02/25(水) 16:08:36.73ID:???50件以降はいらないのだよね?
0646NAME IS NULL
2015/02/25(水) 16:13:09.78ID:???そういう要件なのか−。
でも、それって年齢順に並べたときに50件目と51件目が同じ年齢だったら破綻するんじゃないか?
50件目が、20歳、サイトウ
51件目が、20歳、アベ
で、アベが最終的に表示されなくていいのかって問題がある。
0647NAME IS NULL
2015/02/25(水) 16:18:39.65ID:???その場合は、19歳まで全部と、20歳をふりがな順にソートした(50-19歳までのレコード数)を抜き出して、
さらに全体をふりがな順に並べる、というのが要件なのか?
0648NAME IS NULL
2015/02/25(水) 16:19:52.65ID:???副問い合わせの意味わかって書いてるのかなあこれ、、、
SQL一発で済ませろ的な意味なんじゃないかと、、それじゃなきゃ無理だろw
0649NAME IS NULL
2015/02/25(水) 16:22:45.54ID:???をもっと正しく表して欲さないと終わらない話だなこれ
0650NAME IS NULL
2015/02/25(水) 17:09:28.38ID:???まあ副問い合わせ禁止する理由がわからんが
>>637
それも普通は副問い合わせに入るんじゃね
0651NAME IS NULL
2015/02/25(水) 18:43:39.80ID:???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
動作確認はしてないが同姓同名、同年齢なら一意キーで若い方
という想定で作ってみたが、こんなんでどうだ?
0652NAME IS NULL
2015/02/25(水) 18:47:47.34ID:???0653NAME IS NULL
2015/02/26(木) 03:05:55.44ID:???0654NAME IS NULL
2015/02/27(金) 17:00:21.61ID:oUXcvWpV・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つのテーブルだけで実装するという仕様があるものの、
データの持ち方がそもそもおかしいかもしれませんが、いい方法あったら教えて下さい。
0655NAME IS NULL
2015/02/27(金) 17:04:53.95ID:???0656NAME IS NULL
2015/02/28(土) 01:44:52.06ID:???WHERE concat(',',カラム,',') regexp '\\,(1|6)\\,'
WHERE concat(',',カラム,',') regexp '\\,(5)\\,'
WHERE concat(',',カラム,',') regexp '\\,(6)\\,'
正規表現で出来るんじゃないかと始めて見たものの
結局俺には出来なくてカラムにカンマ付け足した。
0657NAME IS NULL
2015/02/28(土) 02:58:09.92ID:???0658NAME IS NULL
2015/02/28(土) 03:01:31.77ID:???http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set
0659NAME IS NULL
2015/03/01(日) 03:55:58.57ID:???レス遅くなりましたが、回答ありがとうございます。
>>658
こちらが自分のイメージにぴったりでした!
ありがとうございましたー
0660NAME IS NULL
2015/03/03(火) 17:00:11.79ID:???checksum は稀にコリジョン起きるという話ですが
select checksum('ab'),checksum('a-b')
これが同じ値を示します。
「-」の有無だけなのですが・・・
0661NAME IS NULL
2015/03/03(火) 17:05:47.46ID:???binary_checksumを使って解消しました
0662NAME IS NULL
2015/03/03(火) 20:16:04.97ID:???コリジョン(偶然の一致)じゃなくて一致する値を返してるだけだろ
'ab'と'a-b'が同じと判定される照合順序なら同じ値返してくれないと困るじゃないか
0663NAME IS NULL
2015/03/03(火) 20:52:09.81ID:???どうもすみません。。
0664NAME IS NULL
2015/03/04(水) 10:07:21.72ID:???0665NAME IS NULL
2015/03/06(金) 19:19:46.23ID:???0666NAME IS NULL
2015/03/06(金) 19:25:47.59ID:???0667NAME IS NULL
2015/03/06(金) 19:48:34.08ID:???0668NAME IS NULL
2015/03/06(金) 22:28:55.36ID:???http://stackoverflow.com/questions/1831186/many-to-many-on-the-same-table-with-additional-columns
保守とかよくわからないのですが、なぜダメなんでしょうか
0669NAME IS NULL
2015/03/07(土) 00:22:12.01ID:???>>668
OR/Mでクラス作成がめんどいよって話であって、SQLの話じゃないと思うんだけど、どうなの
0670NAME IS NULL
2015/03/07(土) 00:31:44.35ID:???内部処理の話です
sql書くときにどっちを使うか参考にしようと思たんです
0671NAME IS NULL
2015/03/07(土) 04:22:49.09ID:???やりたいこと書いたほうがはやいと思うわ
0672NAME IS NULL
2015/03/07(土) 07:06:29.30ID:???簡単に説明できるほど単順な処理はしてないよ
使ってるDBMSの実行計画について勉強して下さい
0673NAME IS NULL
2015/03/07(土) 07:46:15.23ID:???0674NAME IS NULL
2015/03/09(月) 10:12:53.76ID:???0675NAME IS NULL
2015/03/09(月) 11:29:46.08ID:???0676NAME IS NULL
2015/03/09(月) 12:39:41.38ID:???インターフェースだけ知ってりゃ問題ない。
調子悪いときや壊れたときは内部構造知ってれば役立つけども。
0677NAME IS NULL
2015/03/09(月) 14:23:40.89ID:???日本で整備された道路だけで運転するかどうかだね
0678NAME IS NULL
2015/03/09(月) 14:35:29.33ID:???パワステ入ってても、やっぱ据え切り控える俺
0679NAME IS NULL
2015/03/09(月) 15:50:45.77ID:???結局は整備屋呼ぶ羽目になるだけの話
どうせパンクかチェーンベルト切れてパンスト使う程度だろw
0680NAME IS NULL
2015/03/09(月) 15:52:46.99ID:???0681NAME IS NULL
2015/03/09(月) 16:36:09.84ID:Hti+99XLPerson 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欄を込める、簡便な手段はないでしょうか?
0682NAME IS NULL
2015/03/09(月) 16:51:42.41ID:???0683NAME IS NULL
2015/03/09(月) 16:54:34.61ID:???0684NAME IS NULL
2015/03/09(月) 16:59:06.63ID:???0685NAME IS NULL
2015/03/09(月) 17:04:56.32ID:???FOR XML PATH を組み合わせればいけそうかな
0686681
2015/03/09(月) 21:28:14.46ID:???見ないで書いたので間違っちゃってましたが、意図を読んでくれて助かりました。
しかし……ちょっと難しそうですね(死
0687NAME IS NULL
2015/03/10(火) 21:57:31.79ID:???よくある質問3に似た質問になります。
環境:Oracle
ほしい結果:
1レコード目のカラムA,カラムBと同一の値ならば、
他のレコードからも抽出する
GROUP BY A,B HAVING
HAVING以下についてご教授願えませんでしょうか。
0688NAME IS NULL
2015/03/10(火) 22:24:18.00ID:???0689NAME IS NULL
2015/03/11(水) 04:07:43.88ID:???having count(*)>=2とかじゃないかと予想
順序指定しないと、テーブルの行に1レコード目とか2レコード目とかはないよ
0690NAME IS NULL
2015/03/11(水) 04:29:41.01ID:???0691NAME IS NULL
2015/03/12(木) 15:15:25.05ID:IyShe7pY・テーブルデータ:
ID 姓 名 住所
1 田中 一郎 東京都
2 田中 二郎 大阪府
3 田中 一郎 京都府
・欲しい結果
ID 姓 名 住所
1 田中 一郎 東京都
・説明:
姓と名で重複のデータが欲しいです。
重複をチェックする列が姓だけなら
SELECT * FROM 名簿
GROUP BY 姓 HAVING COUNT(姓)>1
で良いと思うのですが、
チェックする列が2つの場合はどうしたらよいでしょうか。
0692NAME IS NULL
2015/03/12(木) 15:35:07.44ID:???でいいと思うけど、ACCESSは * で出るのか、、、
そのへんどうなるのかはわからない。
0693NAME IS NULL
2015/03/12(木) 15:39:32.88ID:???本題と関係ないけど、その「重複チェック後の結果」って意味あるの?
ID=1,3は別人じゃないの?
0694NAME IS NULL
2015/03/12(木) 16:13:44.16ID:???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
0695691
2015/03/12(木) 18:28:12.13ID:???>>692
GROUPに姓、名を指定すれば、HAVING は姓だけでも良いのですか?
>>693
例としては1,3は別人の可能性が高いです。が、姓と名だけでチェックの説明として挙げました。
>>694
ウィザード見てみますが、すみません、そのSQLが何をやっているのかわからんです。
0696691
2015/03/12(木) 18:30:20.16ID:???姓 名
田中 一郎
だけです。IDや住所は不要です。ごめんなさい。
0697NAME IS NULL
2015/03/12(木) 18:32:42.77ID:???IDと住所の表示は仕様が不明だから重複姓名だけで
SELECT T.姓, T.名, Count(*)
FROM 名簿 AS T
GROUP BY T.姓, T.名
HAVING Count(*)>1;
0698NAME IS NULL
2015/03/12(木) 20:40:09.12ID:???・テーブルデータ:
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の値ならば抽出する判定がしたいです。
よろしくお願いします。
0699NAME IS NULL
2015/03/12(木) 23:37:16.06ID:???想定データは以下のような感じです。
[データテーブル]
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 とかで連結すれば出来ると思うのですが、
グループの数が増えた場合に大変そうなので、より簡潔に書く方法がないものかと。
お知恵をお貸しください。
0700699
2015/03/12(木) 23:38:22.59ID:???環境を書き忘れました。
DB は SQL Server 2014 です。
0701NAME IS NULL
2015/03/12(木) 23:58:41.22ID:???joinしてgroupでgroup byしてsum(value)
グループの数増えても変わらないよ
0703691
2015/03/13(金) 17:31:49.47ID:???ありがとうございました。
できました。
COUNT(*)ってグループ化したものにも使えるんですね。
勉強になりました。
0704NAME IS NULL
2015/03/13(金) 19:40:09.62ID:???> COUNT(*)ってグループ化したものにも使える
むしろそれが本懐だと思っていただければと。
sumやmaxなんかもね
0705NAME IS NULL
2015/03/15(日) 21:51:49.80ID:???[環境]
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 だけで対処するとして、皆さんならどうするでしょうか。
お知恵をお借りできると幸いです。
0706NAME IS NULL
2015/03/16(月) 12:19:02.62ID:???0707NAME IS NULL
2015/03/16(月) 12:19:56.22ID:???現状を読んでpostgresqlと勘違いしたごめんごめん
0708NAME IS NULL
2015/03/16(月) 23:31:12.26ID:???やりたいこと
出荷数をカウントして在庫を調べる
商品(商品id,名前,総数)
出荷(出荷id,数量)
欲しいデータ
商品id,名前,在庫
0709NAME IS NULL
2015/03/16(月) 23:40:32.06ID:???よろしくお願いいたします
0710NAME IS NULL
2015/03/17(火) 00:51:24.30ID:???0711NAME IS NULL
2015/03/17(火) 21:00:40.62ID:???0712NAME IS NULL
2015/03/19(木) 12:53:00.23ID:???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 とかで連結すれば出来ると思うのですが、
>グループの数が増えた場合に大変そうなので、より簡潔に書く方法がないものかと。
>お知恵をお貸しください。
0713NAME IS NULL
2015/03/19(木) 13:38:01.96ID:???・外部結合
・isnull
0714NAME IS NULL
2015/03/19(木) 14:07:29.99ID:???佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦
佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦
佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦
佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦
佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦 佐藤伸弦
0715NAME IS NULL
2015/03/19(木) 17:23:41.78ID:???1レコードずつ抽出して、
A=Cのとき出力させるなら↓でいけるんじゃない?
IF カーソル.A = カーソル.C THEN
dbms_output.put_line(カーソル.AからD);
END IF;
0716NAME IS NULL
2015/03/19(木) 21:34:08.57ID:???0717NAME IS NULL
2015/04/14(火) 23:15:06.11ID:???コントロールファイル(sql loder )
テーブルの該当項目 NULL許可項目
ローディングファイルに格納されている半角スペースの項目は、
コントロールファイル(sql loder) を使用した場合、
テーブルにNULLか半角スペースが入るかは、コントロールファイル次第でしょうか。
0718NAME IS NULL
2015/04/15(水) 09:03:19.33ID:hzCuAyDj0719NAME IS NULL
2015/04/15(水) 15:47:22.88ID:???半角カナの濁音を区別して検索する方法はないのでしょうか。
「マゼラン」という項目があるのですが
Like 'マゼ%' だけでなく、Like 'マセ%' でも対象にしたいのですが、なにか方法ありませんか。
0720NAME IS NULL
2015/04/15(水) 15:53:37.59ID:???0721NAME IS NULL
2015/04/15(水) 16:09:24.34ID:???ユーザーが「マセ」と入力して検索させたとき、「マゼラン」が出ないのはおかしいと言ってきてまして・・・
ちなみに「ハ」と「パ」でも同様のことをしたいです。LIKE 'ハ%' で「パリ」も対象に
0722NAME IS NULL
2015/04/15(水) 16:09:32.87ID:???> Like 'マセ%' でも対象にしたいのですが
対象にならないんだっけ?
0723NAME IS NULL
2015/04/15(水) 16:15:56.82ID:???改修ならAP側で濁点なり取ってwhere工夫かねえ
0724NAME IS NULL
2015/04/15(水) 17:48:37.50ID:???でいけるんじゃね?
0725NAME IS NULL
2015/04/15(水) 18:05:33.69ID:???ありがとうございます。
それで完璧でした!
0726NAME IS NULL
2015/04/15(水) 18:08:25.91ID:???0727NAME IS NULL
2015/04/15(水) 20:06:40.17ID:???お疲れ、解決してなにより
ちょっと前に照合順序でトラブって、色々調べた時に where にまで書けるのかよ、ってビックリしたのが記憶の片隅に残ってた
役立って嬉しいよ
0728NAME IS NULL
2015/04/16(木) 21:26:21.55ID:OSjNoEwY0729NAME IS NULL
2015/04/16(木) 23:27:28.62ID:???それと分からないように質問すればOKだろう
試験対策に何をすればよいか?みたいな質問はダメだろう
0730NAME IS NULL
2015/04/17(金) 01:33:00.29ID:???0731NAME IS NULL
2015/04/17(金) 06:54:43.73ID:???0732NAME IS NULL
2015/04/17(金) 06:54:52.00ID:???0733NAME IS NULL
2015/04/17(金) 07:52:18.67ID:s+fo38NZ0734NAME IS NULL
2015/04/22(水) 14:52:31.65ID:???tableは以下のようなもの
番号,単品管理番号,複数個組管理番号,名前
1111,12345678,0987654321234,NAME
SELECT * FROM table WHERE `単品管理番号` = "12345678" OR `複数個組管理番号` = "12345678"
SELECT * FROM table WHERE `単品管理番号` = "0987654321234" OR `複数個組管理番号` = "0987654321234"
のようにした時にマッチしたカラム全てとどちらのカラムにマッチしたかを知りたいです
0735NAME IS NULL
2015/04/22(水) 16:00:40.78ID:???イメージわかないなあ、ストアドかプログラム判断にした方がいいんじゃ?
無理やり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.複数個組管理番号)
やっぱわからん、、、
0736NAME IS NULL
2015/04/22(水) 16:10:39.49ID:???SELECT *,
単品管理番号 = '12345678',
複数個組管理番号 = '12345678'
FROM table WHERE '12345678' in (単品管理番号, 複数個組管理番号)
両方にマッチしたときのレコードのハンドリングさえ間違えなければ、
union all → group by でもいいかも。
0737NAME IS NULL
2015/04/22(水) 19:11:27.90ID:???select *,
case '検索条件' when 単品管理番号 then 1 else 0 end as 単品,
case '検索条件' when 複数個組管理番号 then 1 else 0 end as 複数
以下略てなもんで?
0738NAME IS NULL
2015/04/22(水) 20:56:45.10ID:???両方にマッチしたときどうしたいのかしらんが
SELECT *,'単品管理番号' as マッチカラム WHERE 単品管理番号 = "12345678"
UNION ALL
SELECT *,'複数個組管理番号' as マッチカラム WHERE 複数個組管理番号 = "12345678"
こんな感じじゃね
0739NAME IS NULL
2015/04/22(水) 22:51:01.37ID:???0740NAME IS NULL
2015/04/26(日) 23:50:16.86ID:???あ 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とか使うのか良く分からないので
ご教授お願いいたします
0741NAME IS NULL
2015/04/27(月) 20:27:20.29ID:???やりたい事がいまいちよくわからんが
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)
こういう事?
まずは本屋で入門書探して読んだ方がいいんじゃね
0742NAME IS NULL
2015/04/27(月) 22:33:59.48ID:???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がどうなるのかわからなくなり。
ご教示お願いします。
0743NAME IS NULL
2015/04/27(月) 23:21:40.58ID:???ためしてないけど
select groupID,count(ID),sum(param) from
(select groupID,ID,sum(param) as param from table group by groupID,ID) t
group by groupID
かな
0744NAME IS NULL
2015/04/27(月) 23:36:02.54ID:???サブクエリのIDにはdistinctは不要ですか?
0745NAME IS NULL
2015/04/28(火) 00:40:13.43ID:???テーブル 地球
フラグ 名前 コード名 グループ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だけを選び
名前を表示するにはどうしたらいいのでしょうか?
0746NAME IS NULL
2015/04/28(火) 10:31:39.30ID:???具体例を出してくれ。
0747NAME IS NULL
2015/04/28(火) 19:57:55.53ID:???select 名前 from 地球 where フラグ = (select フラグ from 地球 where コード名 = 'teki.') and グループNo between 110 and 119
0748NAME IS NULL
2015/04/28(火) 20:16:34.18ID:???Drop Table 地球;
0749NAME IS NULL
2015/04/29(水) 09:13:59.22ID:???フラグにピリオドついたりついてなかったりしてるが、ないとすれば
select [名前]
from [地球]
where
[フラグ] in (
select [フラグ]
from [地球]
where [コード名] = 'teki.')
and [グループNo] like '11%';
で、どうかな
試してないけど
0750NAME IS NULL
2015/06/11(木) 15:11:27.18ID:???テーブル変数を JOIN に使ったら、死ぬほど遅くなりやがった
0751NAME IS NULL
2015/06/20(土) 10:57:20.48ID:lz2tDsvxid,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
0752751
2015/06/20(土) 11:28:23.81ID:???つかったらできますた
すみませんでした
0753NAME IS NULL
2015/06/22(月) 19:44:25.44ID:+SZ+E64m(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 = ''
0754753
2015/06/22(月) 21:30:01.14ID:???0755NAME IS NULL
2015/06/22(月) 21:40:01.06ID:???制限がなければ再帰を使わざるを得ない
0756NAME IS NULL
2015/06/23(火) 08:10:35.04ID:???0757NAME IS NULL
2015/06/23(火) 15:21:32.91ID:???0758NAME IS NULL
2015/06/24(水) 21:38:26.99ID:pEAa+us3INSERT 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の結果になってしまって困っています。
どなたか「こう書くんだぜ!」っていうのご存知であればお助けください。
宜しくお願いします。
0759NAME IS NULL
2015/06/24(水) 21:56:03.15ID:???>>1
テンプレも読まないような宿題野郎奴多すぎだろ
0760NAME IS NULL
2015/06/24(水) 21:58:02.52ID:???0761758
2015/06/24(水) 22:10:56.88ID:???テーブル名だけ適せん使えるテーブル名に変えないと予約語なのでダメですけれど。
INSERT INTO table1 (col1,col2,col3) とかにすれば実行できまする。
0762NAME IS NULL
2015/06/24(水) 22:17:13.98ID:???0763758
2015/06/24(水) 22:20:11.51ID:???0764NAME IS NULL
2015/06/24(水) 22:21:04.77ID:???おまえすげーな
0766NAME IS NULL
2015/06/24(水) 23:50:11.66ID:???0767758
2015/06/25(木) 00:31:10.69ID:???そうです。
col1がキーとして
|val1|1|null|
|val3|0|null|
というデータがあった場合
|val1|1|hoge|
|val3|0|gahu|
となって欲しいのですが実際には
|val1|1|huga|
|val3|0|gahu|
になってしまいます。
最初からここまで書いておけばよかったですね、すみません。
0768NAME IS NULL
2015/06/25(木) 11:14:11.04ID:???ON DUPLICATE KEY UPDATE
col3 = VALUES(col3) ← ここで条件判断してやるもんだったりはしないの
0769NAME IS NULL
2015/06/28(日) 12:35:07.25ID:???一括取得するにはどう書けばいいですか?
0770NAME IS NULL
2015/06/28(日) 13:39:35.03ID:???>>1
0771NAME IS NULL
2015/06/28(日) 19:27:43.26ID:???(select max(データ) from テーブル where データ<指定日付)
とかかな
0772NAME IS NULL
2015/06/29(月) 21:30:36.54ID:???いやいや。
select * from テーブル where 日付 = (select (max(日付)〜
でしょうよ
0773NAME IS NULL
2015/07/02(木) 23:00:14.87ID:???指定日時の前または後の一個目のデータって言ってるじゃん、これだと前後にならなくね
0774NAME IS NULL
2015/07/03(金) 01:43:07.56ID:???飲食店の売上実績から、材料をどれだけ使用したかを
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
のような使用した材料の合計数が出るようにしたいです。
恐れ入りますが、
ご教授願います。
0775NAME IS NULL
2015/07/03(金) 08:46:40.07ID:???0776NAME IS NULL
2015/07/03(金) 09:55:58.63ID:???ここに突っ込んじゃダメ?
設計の話になっちゃうかw
0777NAME IS NULL
2015/07/03(金) 10:22:07.56ID:???まず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;
という手順を踏めば、テーブル構成変わっても対処できると思う。
0778NAME IS NULL
2015/07/03(金) 10:23:55.62ID:???0779NAME IS NULL
2015/07/03(金) 10:25:34.87ID:???質問の欲しい結果のIDが何を指してるのか混乱してつい書いてしまった
0780NAME IS NULL
2015/07/03(金) 10:27:22.31ID:???0781NAME IS NULL
2015/07/03(金) 10:40:38.97ID:???突っ込みたいところだな
0782NAME IS NULL
2015/07/03(金) 14:24:47.87ID:???突っ込みたくなるよね、つか釣りじゃないのかと疑いたくなるわ w
> ID | メニュー名 | ハンバーグ(枚)|鶏肉(枚)|玉子
> --+----------+-----
> 7 | スパイシーチキン | |1 |
>
> ID | DATE |メニューID |メニュー名 |売上数量
> --+----------+-----
> 1 | 2007-11-12 | 6 |スパイシーチキン|4
0783NAME IS NULL
2015/07/05(日) 17:19:45.03ID:???具体的には
CAST(Year AS INT) > 2000
みたいなことをやりたいけど、これじゃできなかった
0784NAME IS NULL
2015/07/05(日) 17:37:40.22ID:EFnjyGIJキャストも変換関数もそれぞれのシステムであると思うけど
0785NAME IS NULL
2015/07/05(日) 17:39:17.56ID:???MySQLです
0786NAME IS NULL
2015/07/05(日) 17:54:08.94ID:???Yearには具体的に何が入っているの
0787NAME IS NULL
2015/07/05(日) 18:33:17.40ID:???'2001'
'2002'
…
みたいに年が文字列で入ってる
それをSELECTで取り出したい
0788NAME IS NULL
2015/07/05(日) 19:37:22.34ID:???それなら上記のでよさそうだけどね。
単に select cast(Year as int) from 〜ってやってみたら。
0789NAME IS NULL
2015/07/05(日) 19:40:59.46ID:???ではなく
SELECT Year FROM テーブル WHERE CAST(Year AS INT) > 2000
とする必要があるよ。
馬鹿にするなと思われるかもしれないけど、質問からは上のクエリの可能性を除去しきれないので。
0790NAME IS NULL
2015/07/05(日) 19:42:02.77ID:???CAST(year AS SIGNED)
でできない?
0791NAME IS NULL
2015/07/05(日) 19:45:26.15ID:???http://mysql.stu.edu.tw/doc/refman/5.1-olh/ja/cast-functions.html#function_convert
0793NAME IS NULL
2015/07/05(日) 21:08:44.89ID:???case when テーブル.性別=男 then inner join 男マスタ on 結合条件
else inner join 女マスタ on 結合条件 end としようとするのですが、
inner joinは使うとダメですか?
0794NAME IS NULL
2015/07/06(月) 01:04:42.02ID:???0795NAME IS NULL
2015/07/06(月) 01:25:52.71ID:???> else inner join 女マスタ on 結合条件 end
sql serverってこんなことできるんだ?
0796NAME IS NULL
2015/07/06(月) 18:13:02.95ID:???0797NAME IS NULL
2015/07/06(月) 18:45:35.57ID:???試せる環境じゃないんだよ。
0798NAME IS NULL
2015/07/07(火) 10:52:43.36ID:Bl1g/stpwhere HOGE in ('うんこ', 'ちんこ', 'しっこ', 'ちゅー')
の各項目を安全に増やしたり減らしたりする方法って
どんな方法があるの?
クエリ文字列を動的に作って ? を増やすしかない?
0799NAME IS NULL
2015/07/07(火) 11:17:24.94ID:???>>1
0800NAME IS NULL
2015/07/22(水) 14:44:37.51ID:UWYfbRq0SQLでどう書くのか教えてエロい人!
0801NAME IS NULL
2015/07/22(水) 15:17:18.34ID:???0802NAME IS NULL
2015/07/22(水) 15:35:39.62ID:???諸君、私はSybaseが大好きだ【ASE】
http://peace.2ch.net/test/read.cgi/db/1080536260/
0803800
2015/07/22(水) 15:36:48.67ID:UWYfbRq0where o.id = c.id and o.type ='U'
みたいな感じかなあ
おせーてください
0804NAME IS NULL
2015/07/22(水) 18:27:21.63ID:???sybase table definition extract
でググったら結構ヒットするんだけど、これ参考になるのでは?
0805NAME IS NULL
2015/07/22(水) 18:37:09.01ID:???sybase table export
とググった
0806NAME IS NULL
2015/07/25(土) 18:21:30.55ID:fl7A9m+Eselect
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どうするのかともおもいます。
他に方法とかあるのでしょうか。
0807NAME IS NULL
2015/07/25(土) 19:44:14.17ID:???まずDBMS何なのか書け
まあその出鱈目なSQLが通るんならたぶんMySQLだろうけど
having が複数になった時 って言うのが意味不明だが
そもそもグループ化しないんならwhereで良いんじゃないかね
0808NAME IS NULL
2015/07/25(土) 21:49:48.95ID:???0809NAME IS NULL
2015/07/26(日) 10:57:37.81ID:???0810NAME IS NULL
2015/07/26(日) 13:20:56.39ID:???group byなしでhaving使えるの?
0811NAME IS NULL
2015/07/26(日) 13:35:16.16ID:???普通はセットで使うが、group byなしだと全レコードを1グループとみなす。
0812NAME IS NULL
2015/07/27(月) 12:52:29.34ID:???price *1.08 as tax_price
略
where
price *1.08 > 4000
とするところをMySQLだと
price *1.08 as tax_price
略
having
tax_price > 4000
みたいに書けるのか
0813NAME IS NULL
2015/07/29(水) 02:44:19.39ID:???簡単に実装する方法はないでしょうか。
よろしくお願いいたします。
・DBMS名とバージョン
Oracle 11g
・テーブルデータ
�@1.00015
�A1.00025
�B5.0
・欲しい結果
�@1.0002
�A1.0002
�B5.0
※�Bは値が常に下5桁以上あるわけではないことを表しています、
・説明
Oracle標準のRoundでRound(値,4)をすると、四捨五入になってしまって困っています。
0814NAME IS NULL
2015/07/29(水) 05:57:32.56ID:???10000倍してfloorしてから奇数偶数を判定
五捨五超入は10000倍して0.5を引いてceilして10000で割る
0815NAME IS NULL
2015/07/29(水) 13:06:42.97ID:oVM1baXa0816NAME IS NULL
2015/07/30(木) 00:17:18.17ID:???0817NAME IS NULL
2015/07/30(木) 06:51:31.40ID:???特定のDBMSの話題はそのDBMSのスレで聞く方が適切だと思うが
ORACLEのRoundは
>BINARY_FLOAT値およびBINARY_DOUBLE値の場合、最も近い偶数値に丸められます。
らしい
桁数指定するとダメとか言う話もあるみたいだから
10000倍してBINARY_DOUBLEにキャストしてRoundしてから10000で割ればいいんじゃね
0818NAME IS NULL
2015/08/01(土) 02:28:09.30ID:???MySQLでone or zero to one or zeroの関係を作りたいのですが、どのようにすればよいでしょうか
よろしくおねがいします
0819NAME IS NULL
2015/08/01(土) 03:54:51.58ID:???0820NAME IS NULL
2015/08/01(土) 17:15:30.93ID:???0821NAME IS NULL
2015/08/01(土) 17:51:29.63ID:???Oracle11gで好きな子と相思相愛関係を作りたいのですが、どのようにすればよいでしょうか
0822NAME IS NULL
2015/08/01(土) 23:47:00.53ID:???0823NAME IS NULL
2015/08/02(日) 18:46:02.44ID:???0824NAME IS NULL
2015/08/04(火) 12:23:47.77ID:PykgGvaD初心者でっす!
LEFT JOINでテーブルを7個くっつけようとしてる中学生でっす!
4個目で頭が破裂して詰んだのだがこういうのってJOINでやるべきじゃないの?
何か凄いおまじないとかある??
マヂMySQLウルトラCたが優Cおぢさん達が教えてくれると僕うれC
0825NAME IS NULL
2015/08/04(火) 13:50:50.12ID:???適時VIEWを作るとか
0826NAME IS NULL
2015/08/04(火) 14:35:32.78ID:???2個だろうが4個だろうが7個だろうが100個だろうが、記述の難易はかわらんだろ
0827NAME IS NULL
2015/08/04(火) 14:38:30.11ID:???0828NAME IS NULL
2015/08/04(火) 15:15:10.97ID:???サブクエリーの中に再帰クエリーを記述しようが問題ないよ
0829NAME IS NULL
2015/08/04(火) 15:37:07.93ID:Qk98A0jW何個ネストしようが遅くならないの?
6個繋げようとしたら頭がこんがらがらがらったから3個LEFT JOINしたクエリーを2個用意した!!
6個x1と3個x2だとどっちが速いの?
どうせWHEREで1個か多くても5個くらいまでしか取り出さないからあんまり関係ないが後学のために
0830NAME IS NULL
2015/08/04(火) 15:52:43.56ID:???遅くなるかどうかの話をする前に、なぜ頭がこんがらがるのかを教えてくれ。
設計がおかしいのか、よほど複雑なことをしているのか
0831NAME IS NULL
2015/08/04(火) 16:17:18.42ID:???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しようと、同じなんだが。
0832NAME IS NULL
2015/08/04(火) 16:21:51.17ID:???0833NAME IS NULL
2015/08/04(火) 17:22:15.22ID:???オリビアニュートンジョンが歌ってたよな
0834NAME IS NULL
2015/08/04(火) 18:19:12.03ID:???笑ってしまった(歳がばれそう)
0835NAME IS NULL
2015/08/05(水) 00:26:56.78ID:???0836NAME IS NULL
2015/08/05(水) 16:41:15.50ID:SshmOuQHマヂかよ改行できるのかよ。。。
しかも()無くても良いんだな、めっちゃ簡単だったはwwwww
お前らトンくす!!
0837NAME IS NULL
2015/08/05(水) 16:41:29.56ID:SshmOuQH重ね重ねありがとう!!
0838NAME IS NULL
2015/08/05(水) 16:56:14.97ID:???早く困ってることの詳細を人に説明できるようになるといいな。
0839NAME IS NULL
2015/08/05(水) 17:24:30.84ID:???0840NAME IS NULL
2015/08/06(木) 03:36:52.02ID:RECedlTbHTML5, PHP, JS, CSS入門みたいなやつ読んでるは
0841NAME IS NULL
2015/08/08(土) 23:23:14.59ID:???0842NAME IS NULL
2015/08/09(日) 01:01:14.10ID:???http://okwakatta.net/code/ado03.html
続きはC#スレで。
0843NAME IS NULL
2015/08/09(日) 18:43:50.77ID:???0844NAME IS NULL
2015/08/24(月) 17:26:19.16ID:???・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を以下のように修正すると想定通り取得できます。
理由を教えて頂けないでしょうか?
(改行が多いと怒られたので分割。)
0845NAME IS NULL
2015/08/24(月) 17:27:11.68ID:???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
0846NAME IS NULL
2015/08/24(月) 18:56:41.89ID:???■想定通り取れない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
0847NAME IS NULL
2015/08/24(月) 19:20:59.55ID:???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の意味がなくなるはず。
0848NAME IS NULL
2015/08/24(月) 22:53:07.27ID:???ありがとうございます。
理解出来ました。
と、同時にSQLで実施するのが間違えているような気がしてきました。
ぱっとロジック出てきませんが、工夫出来そうですね。
ついでと言ってはなんですが、紐解くヒントを頂けたらと・・・
追伸.
ボカしたら結果を間違えました。
うまくいく方も実はうまく行かないですね。
エスパーして頂き、重ねて感謝します。
0849NAME IS NULL
2015/08/31(月) 19:31:55.28ID:???where
yesterday_t.price is null or
today_t.price <> yesterday_t.price
ってすればよさそうに見える
0850NAME IS NULL
2015/08/31(月) 19:46:40.24ID:s1diMrwgTABLE1の各レコードに対し、条件に該当したら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
・・・
0851NAME IS NULL
2015/08/31(月) 20:08:16.24ID:???条件がDB管理されていないという意味がよく分からないが。
実行時にはDBに格納してないとSQLは実行できないよね?
条件を格納するテーブルをあらかじめ作っておいて良いと言うことだよね?
0852NAME IS NULL
2015/08/31(月) 22:20:39.96ID:???0853NAME IS NULL
2015/08/31(月) 23:07:17.49ID:???条件が複雑なので、マスタ化せずにCASEを100条件分つなげる予定です。
0854NAME IS NULL
2015/08/31(月) 23:09:50.11ID:???条件が100程度あるため、UNION ALLで100個繋げることになるのですが、パフォーマンスが心配です
0855NAME IS NULL
2015/09/01(火) 02:40:53.28ID:???0856NAME IS NULL
2015/09/01(火) 02:41:31.93ID:???0857NAME IS NULL
2015/09/01(火) 06:56:17.74ID:???簡単な条件(例に挙げた程度)だったら、マスタ化して、CASEやUNIONを100個つなげたりしなくても実現可能なのでしょうか?
条件部をマスタ化したsqlを実行したことがないため、sqlをどうかいていいかわかりません。
0858NAME IS NULL
2015/09/01(火) 10:24:03.53ID:???0859NAME IS NULL
2015/09/01(火) 12:30:15.43ID:???0860NAME IS NULL
2015/09/01(火) 13:43:51.32ID:???0861NAME IS NULL
2015/09/01(火) 16:23:08.21ID:???条件を固定化して条件テーブルを工夫すればある程度は何とかなるかもしれんが
最終的な結果をどうしたいのかしらんが
素直にホストアプリで100回クエリ流せばいいんじゃね
0862NAME IS NULL
2015/09/01(火) 16:29:50.64ID:???> 簡単な条件(例に挙げた程度)だったら、マスタ化して、CASEやUNIONを100個つなげたりしなくても実現可能なのでしょうか?
条件によっては、はい。
0863NAME IS NULL
2015/09/01(火) 19:18:08.05ID:???0864NAME IS NULL
2015/09/01(火) 22:16:06.13ID:bbewiwaq・データ
【テーブル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ファイルを読み込み、テーブルを更新する手法についても教えていただけると幸いです
0865NAME IS NULL
2015/09/01(火) 22:55:55.37ID:???update テーブルA set value = t1.value
from
( values (2, 110), (3, 120) ) as t1(id, value)
where テーブルA.id = t1.id
どっか構文エラーあったらごめん。でもこういう感じ。
0866NAME IS NULL
2015/09/06(日) 17:30:28.60ID:???そのvalues使った文だと更新用データの数だけupdate文書いて実行する必要があると思うんだけど、そういう認識でいい?
0867NAME IS NULL
2015/09/06(日) 18:26:18.25ID:???ダメ
>>865 で2レコード分更新される
0868NAME IS NULL
2015/09/06(日) 18:39:26.98ID:???values句を更新したいレコードの数だけ記載すれば良いのか
csvファイルあるならエディタとかに貼り付けて正規表現で置換してSQL文作るのが手軽なのかな
0869NAME IS NULL
2015/09/06(日) 19:16:13.24ID:???一回しかやらないならどんなやり方でもいいけど、何回も繰り返すなら copy で CSV ファイルをテーブルに読み込んでから update した方がいいと思う
0870NAME IS NULL
2015/09/06(日) 21:02:40.93ID:???valuesはその場で一時テーブルを作ってると思えば理解しやすいと思う。
つまり、>>869が書いているような「テーブルに読み込んでから」の部分をクエリで解決できる
0871NAME IS NULL
2015/09/06(日) 21:14:02.38ID:???いや別に止めないけど
> csvファイルあるならエディタとかに貼り付けて正規表現で置換してSQL文作る
って毎回やるのか?
って話
0872NAME IS NULL
2015/09/06(日) 21:20:41.48ID:???valuesの説明をしただけで、>>869の手法を否定しちゃいないよ。心配しないで。
0873NAME IS NULL
2015/09/06(日) 22:57:55.69ID:???更新ってそう何回もかけないと思うし、csvファイルをテーブルに読み込む手間を考えたら(864はその読み込みの方法も知らないみたいだし)べた書きのが楽だろうと思ったんだ
普通一度更新かけたら終わりだよね?
更新用の一時的なデータテーブルだってすぐ消すでしょ?
そりゃもっと複雑なテーブルの情報を元にupdateかけるなら>>865のvalues部分をselectで更新かけるべきだろうと思うけど
0874NAME IS NULL
2015/09/06(日) 23:08:26.54ID:???一旦テーブルに格納する方が対処しやすくないかな?
0875NAME IS NULL
2015/09/06(日) 23:26:24.75ID:???ありがとうございました
0876NAME IS NULL
2015/09/07(月) 00:26:26.07ID:???ケースバイケースって言葉を覚えてはいかがか。
>>871の言葉を借りるなら、CSVが1件や2件の場合でもそうするというのなら別に止めない
件数が多くて、データを信頼できないなら一旦型付の一時テーブルに格納するほうが楽なこともあるだろうね。
0877NAME IS NULL
2015/09/07(月) 00:38:10.15ID:???CSVファイルで、と言うからそれなりの量があると想定しました。
1,2件で作る物だとは思いませんでした。
0878NAME IS NULL
2015/09/07(月) 00:41:33.28ID:???俺は100件くらいならクエリで済ませるよ。
千や万オーダならそもそも別途アプリを作る
0879NAME IS NULL
2015/09/07(月) 06:12:21.05ID:???> 更新ってそう何回もかけないと思うし
なんでそう思うんだろう...
0880NAME IS NULL
2015/09/07(月) 06:44:13.93ID:???仮定した上で検討してもいんじゃないの?
0881NAME IS NULL
2015/09/07(月) 08:25:39.31ID:???0882NAME IS NULL
2015/09/07(月) 12:49:33.64ID:???それなら、ある仮定に基づいた手法を、別の仮定に基づいた考えで否定しちゃあいけないよね
0883NAME IS NULL
2015/09/07(月) 13:39:42.37ID:???0884NAME IS NULL
2015/09/07(月) 13:58:22.77ID:???誰も止めないから。
読んでくれると良いけどね。
0885NAME IS NULL
2015/09/11(金) 23:17:52.99ID:cnT3g/XIよかったら、「BeLongs! - トップ」で検索してみて!
0886NAME IS NULL
2015/09/14(月) 18:23:30.11ID:???SELECT SUM(A) AS hoge1, (hoge1 * 2) AS hoge2 FROM hoge;
みたいな真似は無理なんでしょうか。実際はもっと式が複雑なので。
0887NAME IS NULL
2015/09/14(月) 19:04:19.00ID:???FROM (
SELECT SUM(A) AS hoge1, (hoge1 * 2) AS hoge2 FROM hoge
) AS A
0888NAME IS NULL
2015/09/14(月) 19:04:46.60ID:???SELECT hoge1, hoge1 * 2 AS hoge2
FROM (
SELECT SUM(A) AS hoge1 FROM hoge
) AS A
0889NAME IS NULL
2015/09/15(火) 19:53:12.33ID:???0890NAME IS NULL
2015/09/15(火) 20:13:45.71ID:???0891NAME IS NULL
2015/09/15(火) 21:02:38.40ID:???0892NAME IS NULL
2015/09/15(火) 21:17:22.03ID:???0893NAME IS NULL
2015/09/16(水) 11:47:50.60ID:???0894NAME IS NULL
2015/09/16(水) 12:57:59.42ID:???0895NAME IS NULL
2015/09/16(水) 15:17:27.08ID:???0896NAME IS NULL
2015/09/16(水) 21:13:19.96ID:???0897NAME IS NULL
2015/09/16(水) 23:29:28.22ID:???ウィンドウ関数は数回しか使ったことないからよく理解してないんだけど
0898NAME IS NULL
2015/09/16(水) 23:54:01.00ID:???解釈の時間がゴミだと思えるのには二通りある
・クエリが遅すぎて気にならない
・解釈にどれくらいコストがかかっているか気づいていない
0899NAME IS NULL
2015/09/17(木) 00:27:25.20ID:???バカなのか?
0900NAME IS NULL
2015/09/17(木) 03:04:07.43ID:???僕は応答時間にシビアなものを作らないので、
そういうのを作る人が犠牲になってもいいから2パスでも10パスでもやってよお願い!
っていうわがままを通そうとしてるだけ?
0901NAME IS NULL
2015/09/17(木) 07:41:14.66ID:???実行そのものが軽いクエリを大量に発行するような状況ならまずステートメントキャッシュが
効くように設計するのが筋だろう。
また、わがままというなら、構文解釈のコストが上がるから機能向上は許さんというのも
ある意味わがままなわけで、どっちもどっちだと思うが。
0902NAME IS NULL
2015/09/17(木) 08:21:42.85ID:???> ・解釈にどれくらいコストがかかっているか気づいていない
どれぐらいかかってるんだ? w
0903NAME IS NULL
2015/09/17(木) 09:32:34.46ID:hS9olpTr今時殆どのDBで見れるだろ
0904NAME IS NULL
2015/09/17(木) 10:35:00.20ID:???0905NAME IS NULL
2015/09/17(木) 12:17:28.60ID:???で、気になるほどかかってたのか?
って話
0906NAME IS NULL
2015/09/17(木) 12:24:45.22ID:???0907NAME IS NULL
2015/09/17(木) 12:56:51.87ID:???> 構文解釈のコストが無視できないほど実行計画や
> 実行そのものが軽いクエリを大量に発行するような状況ならまずステートメントキャッシュが
> 効くように設計するのが筋だろう。
そうだね、ゴミじゃないからちゃんと意識していかないといけない。
0908NAME IS NULL
2015/09/17(木) 18:24:05.57ID:???いつどういう条件でparseされるのか自信を持って答えられる奴は何%くらい
いるのだろうか。
0909NAME IS NULL
2015/09/17(木) 19:00:45.75ID:???ついていけないからって泣くなよ w
0910NAME IS NULL
2015/09/17(木) 20:01:07.27ID:???prepareが発行されるかどうかではなく、parseされるかどうか?
0911NAME IS NULL
2015/09/18(金) 00:21:56.44ID:???>>886みたいな仕様が導入されない理由はむしろそっちだろうね。
共通表式だの何だの構文を拡張し続けているのに、そこだけパースのコストを気にして
躊躇するとは思えない。
0912NAME IS NULL
2015/09/18(金) 00:28:19.80ID:???同じことやるにあたってコスト増えたの?
0913NAME IS NULL
2015/09/18(金) 00:40:45.88ID:???0914NAME IS NULL
2015/09/18(金) 10:25:09.46ID:???そうだよ。
そもそも構文解析と実行計画作成は別物。
全てのRDBMSで、PREPARE時に構文解析が行われるだろうけど、実行計画作成は
PREPARE時に行われる場合とEXECUTE時に行われる場合がある。
また、構文解析結果はキャッシュされるだろうが、実行計画はキャッシュされる場合と
されない場合がある。
自分が使っているRDBMSで、以上の挙動を完全に押さえてる人はどれくらいいるんだ
ろうね?知っといたほうが良い情報だよ。
0915NAME IS NULL
2015/09/18(金) 16:58:53.59ID:???0916NAME IS NULL
2015/09/18(金) 17:39:59.12ID:???正確には、ParserとAnalyzerは別
0917NAME IS NULL
2015/09/18(金) 19:29:55.35ID:???0918NAME IS NULL
2015/09/18(金) 22:28:30.82ID:???0919NAME IS NULL
2015/09/18(金) 22:51:43.34ID:???0920NAME IS NULL
2015/09/19(土) 01:39:57.43ID:8OEtVGXTそれは全然違うことだろw
0921NAME IS NULL
2015/09/19(土) 09:34:07.24ID:???何となくだけどパースって言うと構文解析だけじゃなくて字句解析まで含んでるって感じ
0922NAME IS NULL
2015/09/19(土) 11:08:47.44ID:???そりゃ構文解析より前に字句解析するんだから含んでるだろ
問題は実行計画の生成まで含んでるのかどうか、って話だが
0923NAME IS NULL
2015/09/19(土) 20:27:54.06ID:IiYbpDOn0924NAME IS NULL
2015/09/19(土) 20:53:10.96ID:???0925NAME IS NULL
2015/09/20(日) 01:19:22.02ID:lAj1Zh680926NAME IS NULL
2015/09/20(日) 03:30:52.89ID:???0927NAME IS NULL
2015/09/20(日) 13:36:43.88ID:???0928NAME IS NULL
2015/09/20(日) 13:50:24.27ID:???0929NAME IS NULL
2015/09/20(日) 17:15:05.84ID:5kbJqSTCそもそも実行計画は作るものではなく選択するもの。
0930NAME IS NULL
2015/09/20(日) 18:14:17.11ID:???0931NAME IS NULL
2015/09/20(日) 19:16:35.08ID:???0932NAME IS NULL
2015/09/20(日) 19:44:03.57ID:???一体何と勘違いしているんだろう。
0933NAME IS NULL
2015/09/20(日) 22:00:45.30ID:???0934NAME IS NULL
2015/10/03(土) 08:13:23.87ID:???>>906の正しさが証明されてしまった訳やね
0935NAME IS NULL
2015/10/03(土) 16:02:06.63ID:???2週間近くも前の話にまだ粘着してるのか…
どんだけ悔しかったんだよ w
0936NAME IS NULL
2015/10/07(水) 20:15:53.76ID:???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分でもっと良いデータの取得方法があるのでしょうか?
0937NAME IS NULL
2015/10/07(水) 21:37:44.23ID:???0938NAME IS NULL
2015/10/07(水) 23:48:53.77ID:???できましたー
ずっと悩んでたので助かりました
0939NAME IS NULL
2015/10/11(日) 11:28:42.12ID:???0940NAME IS NULL
2015/10/11(日) 13:25:35.53ID:???正規表現より簡単だよ
0941NAME IS NULL
2015/10/11(日) 14:03:40.66ID:???そんなことを聞いてどうするんだ?
お前の能力やある程度のレベルもわからんからなんの参考にもならんと思うぞ
0942NAME IS NULL
2015/10/11(日) 14:38:47.01ID:???本当ですか!
自分は正規表現ならかなりのレベルだと自負しています。とりあえずやってみます。有難うございました。
0943NAME IS NULL
2015/10/11(日) 20:05:58.26ID:R4q1a/Li0944NAME IS NULL
2015/10/12(月) 00:36:04.54ID:???正規表現がそこまで複雑怪奇なものだという意味ではなく、何らかの技術を高レベルに習得できるという人間力の点で。
0945NAME IS NULL
2015/10/12(月) 11:03:34.54ID:???内容はおもいっきり違うけどさ
0946NAME IS NULL
2015/10/12(月) 14:02:07.95ID:???/ ̄ ̄ヽ ┏┓
/ (●) ..(● ┏┛
| 'ー=‐' i ・
> く
_/ ,/⌒)、,ヽ_
ヽ、_/~ヽ、__) \
0947NAME IS NULL
2015/10/12(月) 16:10:51.32ID:???名前 住所
をc++で検索する場合、ローカルなDBを使う場合と、DBつかわずにc++の配列などで実装する場合とで、速度的にはどちらがどれ位速いですか?
0948NAME IS NULL
2015/10/12(月) 17:14:36.47ID:???0949NAME IS NULL
2015/10/12(月) 18:53:45.76ID:???経験値ですか?
0950NAME IS NULL
2015/10/12(月) 19:27:03.17ID:5QQ971OLなんでそんな比較をしているのかが分からない。
要件は?
0951NAME IS NULL
2015/10/12(月) 19:50:56.92ID:???簡単なプログラムを組んでみようと思うのですがDBプログラミング
未経験なのでどれくらいの差があるのか目安を事前に知りたかったのです。
0952NAME IS NULL
2015/10/12(月) 20:04:23.95ID:5QQ971OL何がやりたいの?
検索ってどういう条件?
0953NAME IS NULL
2015/10/12(月) 20:18:07.51ID:???その比較はお前が書くプログラムのレベルを考慮しないと意味が無い
数千件程度なら、C++で書く方が早いかもしれん
何件でも、データのあり場所次第では、C++で最適化されたプログラムが書ければそっちが早いかもしれん
今時のDBMSがオールアセンブラで書かれてるとは思えんしな
そもそも、単純な「検索だけ」の速度なんて比較しても意味が無い
DB使うなら、DBからC++のプログラムにデータを取り込む時間も込みで考えないと
0954NAME IS NULL
2015/10/12(月) 20:24:02.87ID:???>かもしれん
>思えんしな
何の説明にもなっていないアホな回答の典型だな
0955NAME IS NULL
2015/10/12(月) 20:58:43.29ID:???DB無しで作る場合、
配列にセットするデータはどこから取ってくるつもり?
最初から配列が用意されてるならDB無しの方が早いだろうけど、数千件程度ならミリ秒レベルの差だよ。
名簿検索プログラムをDB無しで作る事は稀なので、
余計な事は気にせず勉強に取り掛かった方が良い。
0956NAME IS NULL
2015/10/12(月) 21:14:41.69ID:???それとオンメモリの配列じゃ話にならん。
圧倒的的に配列の方が早いわ
0957NAME IS NULL
2015/10/12(月) 22:41:02.00ID:???0958NAME IS NULL
2015/10/12(月) 22:50:40.56ID:???特定の検索条件に特化して作るならC++の方が速いかも知れない。
ただ、検索条件を変えたいとなると、辛いことになるだろうな。
0959NAME IS NULL
2015/10/12(月) 23:47:29.35ID:???その程度にミリ秒もかからないで欲しい。
>>956
だね。
0960NAME IS NULL
2015/10/20(火) 11:04:13.11ID:???ひとつの製品が複数のカテゴリに属する可能性のある場合、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の設計思想をまだ理解しておらず見当外れだとは思いますがよろしくお願いします。
0961NAME IS NULL
2015/10/20(火) 11:42:23.33ID:???カテゴリが増えるたびに列を増やすのが手間、あるいは問題だと考えてるのならこうする。
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
0962NAME IS NULL
2015/10/20(火) 21:39:39.43ID:???inとexistsの違いを教えてください
0963NAME IS NULL
2015/10/20(火) 22:23:37.39ID:???それではいつまで経っても初心者のまま。
本当に初歩的であればいくらでもネットに情報はあるのでまずは検索すること。
0964NAME IS NULL
2015/10/20(火) 23:05:23.09ID:???ありがとうございます。
練習のためにも、そのやり方で作成してみます。
0965NAME IS NULL
2015/10/20(火) 23:18:30.90ID:???inは項目がリストに存在するかどうか
existsは行がサブクエリに存在するかどうか
0966862
2015/10/20(火) 23:35:27.58ID:???調べてはいるんですが、
inは副問い合わせをした条件の属性?を探す
なんとなくわかるんですが、
existsのサブクエリ存在するしないというのは
存在しないという時点で探すのをやめるということなんでしょうか
0967NAME IS NULL
2015/10/21(水) 00:08:24.21ID:???逆。EXISTSは存在した時点で探すのをやめることができる。
一個でもあれば、ある。NOT EXISTSは一個もないことを調べるために途中で打ち切ることができない。
まず検索しろと書いたものの、INよりEXISTSの方が速いからどんどん使うべきという情報が
まだ多く残っていると思うので、その辺は鵜呑みにしないほうがよいかと。
んで、挙動的にはEXISTSのほうが多重ループをしている感じが強いと思っておけば何かの足しになるかも。
0968NAME IS NULL
2015/10/21(水) 00:19:13.14ID:???inner join の方が速いよって話もあるし自分で書いて計ってみたほうがいいな
0969NAME IS NULL
2015/10/21(水) 03:52:06.89ID:???inと副問い合わせは直接関係ない
inの対象にするリストを(副)問い合わせで作れるってだけ
inとexistsでどちらが早いかという話は、そのクエリ全体から実行計画を見ないと無意味
状況によっては全く同じ実行計画になる可能性もある
そもそもSQLは書いたとおり実行されるものではないから、どの命令が早いとか遅いとかはない
0970NAME IS NULL
2015/10/21(水) 03:55:19.68ID:NNtjMknFこういうのも鵜呑みにしちゃダメだぞ
0971NAME IS NULL
2015/10/21(水) 19:10:19.27ID:???すいません
情報処理試験とかで4たくで出られると
分けわかんなくなるんですよね
基本情報レベルなら大丈夫ですが
こういうのって直接触ってみるのが
一番手っ取り早そう
0972NAME IS NULL
2015/10/21(水) 19:14:47.36ID:???ケースバイケースなんでしょうけど
副問い合わせと相関副問い合わせってのがあるんですね
そのあたりも見てみようと思います
0973NAME IS NULL
2015/10/21(水) 22:26:00.56ID:???例えば行構造が<id, state_A, state_B, state_C>となっていて、行をとるbinary predicateが
両辺共にstate_C==αのときにはidによる順序
両辺共にstate_C!=αのときにはstate_Bによる順序(state_Bには順序が定義されているとする)
両者が異なる場合には……
という具合です
0974NAME IS NULL
2015/10/21(水) 22:51:22.14ID:???case
when left.state_C = α and right.state_C = α then id
when 〜 then state_B
when
複数カラムでソートする場合はソートできる状態の文字列にする+そういうインデックスを作るといいかも。
0975NAME IS NULL
2015/10/21(水) 23:12:10.98ID:???アドバイスも添えて下さりありがとうございます
明日試してみます
0976NAME IS NULL
2015/11/07(土) 16:10:57.12ID:+XbcKiq/SQLを分けるのが普通だと思う。
無理に一緒にしたら、あとのメンテナンスが面倒。
0977NAME IS NULL
2015/11/08(日) 15:38:58.68ID:???0978NAME IS NULL
2015/11/08(日) 23:59:31.78ID:a7cMoyHvやるとしたらunion allだけど、レコード順が保証されない気がする。
2回に分ける方が確実。
0979NAME IS NULL
2015/11/09(月) 10:39:28.94ID:???とかできたらいいのに。
0980NAME IS NULL
2015/11/09(月) 10:51:22.91ID:???0981NAME IS NULL
2015/11/09(月) 16:31:06.51ID:???あ、書き方が悪かったかな。
一般的なプログラミング言語のソートにおける比較関数みたいなのが書ければなぁってこと。
function compare_func(rec1 as table1.recordtype, rec2 as table1.rectype)
みたいな関数を定義して、
order by compare_func()
って書けるといいなと妄想。
0982NAME IS NULL
2015/11/09(月) 17:04:43.98ID:???SQLの思想には合わないだろう
0983NAME IS NULL
2015/11/09(月) 19:01:33.56ID:???0984NAME IS NULL
2015/11/10(火) 22:24:19.13ID:???http://peace.2ch.net/test/read.cgi/db/1447160858/
0985NAME IS NULL
2015/11/11(水) 15:23:07.11ID:???ユーザ定義型についてはそれが行えてもさほど不自然じゃないと思う
0986NAME IS NULL
2015/11/11(水) 18:56:41.55ID:3mpv2MQgユーザー定義型?
0987NAME IS NULL
2015/11/11(水) 20:41:56.94ID:???0988NAME IS NULL
2015/11/11(水) 23:19:10.04ID:???一般的かどうかは知らんが、自作の比較関数を渡してソートできるプログラミング言語はある
多くのDBMSでユーザ定義関数は作れる
ユーザ定義型をサポートしているメジャーなDBMSは存在している
個別に見れば、なにもおかしくないけど
どこがどうおかしいと?
0989NAME IS NULL
2015/11/12(木) 00:28:30.86ID:LOOLB3CF0990NAME IS NULL
2015/11/12(木) 03:29:27.86ID:???そう考えれば合点のいくレスがちらほら。
0991NAME IS NULL
2015/11/12(木) 08:05:14.16ID:???ものすごく一般的なんだけど、SQLはORDER BY句でソートキー取得用関数を使ってソート出来るようになっている。
これでも分からんか?
0992NAME IS NULL
2015/11/12(木) 10:13:39.56ID:???できないってことで、言われてみて初めて気づいた。
0993NAME IS NULL
2015/11/12(木) 12:33:02.59ID:???SQLで使えないのは理由が違うが。
0994NAME IS NULL
2015/11/12(木) 19:56:43.64ID:???0995NAME IS NULL
2015/11/12(木) 20:37:20.84ID:???元も子もないなって思うけど。
0996NAME IS NULL
2015/11/12(木) 20:46:46.68ID:???>>993にも書いたけどより良い方法(>>991)が可能なのに
あえて筋の悪い、具体的には遅い比較関数を使う必要がないということだ。
0997NAME IS NULL
2015/11/12(木) 20:58:20.72ID:???比較関数はSQLとは関係ない話だろう
0998NAME IS NULL
2015/11/12(木) 22:14:48.10ID:???0999NAME IS NULL
2015/11/12(木) 22:15:25.84ID:???SQLとプログラミングで作成するソートがごっちゃになってる
って話でいいの?
1000NAME IS NULL
2015/11/12(木) 22:21:48.55ID:???10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
10021002
Over 1000Thread運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。