SQL質疑応答スレ 15問目

このエントリーをはてなブックマークに追加
1NAME IS NULL
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

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

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

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

前スレ:
SQL質疑応答スレ 14問目
http://peace.2ch.net/test/read.cgi/db/1371476534/
2NAME IS NULL:2014/06/16(月) 20:54:01.50 ID:???
3NAME IS NULL:2014/06/16(月) 20:55:26.32 ID:???
4NAME IS NULL:2014/06/16(月) 20:56:48.79 ID:???
よくある質問1

(問)
ID | DATE     | DATA
--+----------+-----
1 | 2007-11-11 | aaa
2 | 2007-11-11 | bbb
1 | 2007-11-10 | ccc
3 | 2007-11-12 | ddd
3 | 2007-11-11 | eee
4 | 2007-11-10 | fff
1 | 2007-11-12 | ggg

このようなテーブルから、下記のように

1 | 2007-11-12 | ggg
3 | 2007-11-12 | ddd
2 | 2007-11-11 | bbb
4 | 2007-11-10 | fff

各idに対して最新の1件だけ抽出するSQLの書き方を教えてください。

(答)
select A.ID,
    A.DATE,
    A.DATA
from TableName A
   inner join
   (select ID, max(DATE) as MAX_DATE
    from TableName
    group by ID
   ) B
   on A.ID = B.ID
   and A.DATE = B.MAX_DATE
;
5NAME IS NULL:2014/06/16(月) 20:57:56.48 ID:???
よくある質問2

(問)
key   data
----------------
1     a
1     a
1     b
1     b
1     a
2     b
2     a
2     a

というテーブルから

key   a   b
--------------------
1    3   2
2    2   1

というExcelのピボットの様なデータを取得したいのですが、どういうSQLになりますか?
a,bというのは固定なので、仮にcというデータがあっても無視して構いません。

(答)
SELECT key,
    SUM(CASE data WHEN 'a' THEN 1 END) AS a,
    SUM(CASE data WHEN 'b' THEN 1 END) AS b
FROM table
GROUP BY key
ORDER BY key
;
6NAME IS NULL:2014/06/16(月) 20:59:10.48 ID:???
よくある質問3

(問)
ID HOGE
01 A
01 B
01 C
02 A
03 B

HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか

(答1)
SELECT id
FROM TableName
WHERE hoge in ('A','B','C')
GROUP BY id
HAVING count(DISTINCT hoge) = 3
;

(答2)
select *
from TableName T1
where not exists (select *
         from (values 'A', 'B', 'C') T2 (HOGE)
         where not exists (select *
                  from TableName T3
                  where T1.ID = T3.ID
                  and T2.HOGE = T3.HOGE
                  )
         )
;
※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意
7NAME IS NULL:2014/06/16(月) 21:00:24.63 ID:???
よくある質問4

(問)
列の数が可変な問合せはどう書きますか?

(答)
標準SQLでは書けません。
pivotという機能を搭載したDBMSなら一見書けそうですが実はやっぱり書けません。
Oracle 11g以降でpivot xmlというキーワードを使用すれば一応可変っぽくはなります。
が、素直にプロシージャを書くかアプリケーションで処理したほうが良いでしょう。

SQL Serverのpivot(2005以降)
http://msdn.microsoft.com/ja-jp/library/ms177410.aspx
http://www.sqlprof.com/blogs/sqldev/archive/2008/04/12/pivots-with-dynamic-columns-in-sql-server-2005-2008.aspx

Oracleのpivot(11g以降)
http://download.oracle.com/docs/cd/E16338_01/server.112/b56299/statements_10002.htm#CHDCEJJE
http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html
8NAME IS NULL:2014/06/16(月) 21:15:20.86 ID:???
よくある質問5

(問)
年月(YYYYMM)を指定し、その年月に対応する年月日を取得したい

 例:201006を指定したら、以下の結果を得たい

   20100601
   20100602
    ・
    ・
    ・
   20100630

(答)
SQLでは存在しないデータを生成することはできません。
この問いの場合は素直にカレンダーテーブルを用意しましょう。

どうしてもやりたければ以下のような方法もなくはないですが、
再帰問合せの本来の使い方ではありません。
やめておくことを強くお奨めします。
(PostgreSQLのgenerate_series()関数なら辛うじてセーフかもしれませんが
 賛否の分かれるところでしょう。)

with TEMP (NUM) as (
    select 1 from dual
    union all
    select NUM + 1 from TEMP where NUM < 31
)
select to_char(to_date('201006', 'YYYYMM') + NUM - 1, 'YYYYMMDD')
from TEMP
where to_date('201006', 'YYYYMM') + NUM - 1 < add_months(to_date('201006', 'YYYYMM'), 1)
;

※上記はOracleの場合です。(11gR2以降)
※再帰問合せをサポートするDBMSならこれを適当に改変すれば動きますが
 どのみちお奨めしません。
9NAME IS NULL:2014/06/16(月) 21:17:04.25 ID:???
以上、テンプレ終わり
10NAME IS NULL:2014/06/18(水) 00:11:36.02 ID:???
誘導されて来ました

・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人くらいになるととても遅くなってしまいます高速化する方法をアドバイス頂きたいです
11NAME IS NULL:2014/06/18(水) 04:03:04.15 ID:???
tweet.user_id にインデックスを貼る。mysql の挙動しらないけど、まずは。
12NAME IS NULL:2014/06/18(水) 04:28:29.92 ID:???
>>11
そこにはインデックス貼ってますが、例えばフォロワーが1000人とかになるとインデックスを利用していてもやっぱり数が増えてしまいまして
13NAME IS NULL:2014/06/18(水) 04:47:13.14 ID:???
じゃあ次はその無駄に分かれているクエリをひとまとめにして、プランナに優しくする。
14NAME IS NULL:2014/06/18(水) 08:03:09.04 ID:???
>>10
それどこが遅いんだよ?
ホストアプリでINのリスト作るところかSQL発行するのが遅いんじゃないのか?
素直にINをサブクエリにしてSQL発行1回で済ましてみろよ
SELECT * FROM tweet WHERE user_id IN ( SELECT follow_id FROM follow WHER user_id: 自分のid ) AND is_replay = 1 AND is_delete = 0
このクエリで実行計画みて、話はそれからだな

まさかと思うがFollowはuser_idにインデックスがないって事はないだろうな
(user_id,follow_id)で主キーにするか複合インデックス張ってみろ
15NAME IS NULL:2014/06/18(水) 08:55:54.75 ID:???
>>10
主観が多い
何件のtweetに対して何msかかって遅いといっているのか?
Explainの結果を貼るのがより良い

SQLが汚い
きちんとログから貼りなさい
解答もその汚いSQLから作られるので、そのままでは動かなくて困るだけだ

速度の話をするなら利用しているIndexぐらいは貼ろうよ
16NAME IS NULL:2014/06/18(水) 10:00:37.03 ID:???
ログのSQLを直打ちで速度見てみることとついでにEXPLAINだな
17NAME IS NULL:2014/06/18(水) 11:24:55.14 ID:???
>>13-14
INのリストを作るところは殆ど時間かかっていませんでした(10ms程度)
フレームワークを使っていてラップされているのでSQLの発行が遅いってのも多分無いと思います


SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`is_deleted` = 0 AND `tweets`.`is_replay` = 0 AND
(user_id IN (SELECT follow_id FROM `users` INNER JOIN `follows` ON `users`.`id` = `follows`.`user_id` WHERE `folllows`.`user_id` = *user_id*)) ORDER BY tweets.updated_at DESC

ご指摘頂いたとおりこんな感じで取得した場合、INで並べるよりは多少早くなりました!ありがとうございます
10000ms -> 4000ms

Indexに関しては
>>15
Follow
-user_id index_user_id
-folloe_id index_follow_id
-複合 index_user_id_and_follow_id

Tweet
- user_id index_user_id
- 複合 index_user_id_and_is_replay

こんな感じで貼ってます
>主観〜
申し訳ありません気をつけます

テストデータとして以下のとおり挿入されています
Tweet数が50万件
User数が5万件
Followが10万件

今回テストケースに利用したユーザーはこうなっています
Follow 5000件
Tweet 5件
Tweet(Follow) 25000件

>>16
EXPLAINをしたところフォロー一覧の取得、つぶやきの取得共にindexは適切に使われていました
1 PRIMARY tweets ref user,index_user_and_is_replay index_user_and_is_replay 32 const 25000 Using where
1 PRIMARY users eq_ref PRIMARY PRIMARY 4 twitter.tweets.user_id 1 Using index
2 DEPENDENT SUBQUERY follows ref user,index_user_id_and_follow_id index_user_id_and_follow_id 10 const,func 1 Using where; Using index
2 DEPENDENT SUBQUERY users eq_ref PRIMARY PRIMARY 4 func 1 Using where
18NAME IS NULL:2014/06/18(水) 12:22:35.60 ID:2As4GCOc
【2chスレッド勢いランキングサイトリスト】

★+ニュース板
・2NN (推奨サイト)
・2chTimes
★+ニュース板新着
・2NN新着
・Headline BBY
・unker Headline
★+ニュース板その他
・Desktop2ch
・記者別一覧
★全板
・全板縦断勢いランキング (推奨サイト)
・スレッドランキング総合ランキング
・ログ速
★全板実況込み
・2勢
・READ2CH
・i-ikioi

※ 要タイトル検索
※ 2chブラウザ併用推奨
19NAME IS NULL:2014/06/18(水) 13:38:23.05 ID:???
>>17
よかよか。
んじゃ次は in を exists に置き換えて試してみよう。
サブクエリ内でusersを結合する理由がないなら外そう。
20NAME IS NULL:2014/06/18(水) 20:43:31.32 ID:???
>>17
なんで>>10のSQLから>>17のSQLになるんだ?
usresなんてどっからでてきたんだよ
>フレームワークを使っていてラップされているのでSQLの発行が遅いってのも多分無いと
多分とかじゃなくてフレームワークつかわずSQL直接発行して試せよ

あとMySqlの実行計画の見方は詳しくないんだが
followsのindex_user_id_and_follow_idでキー長が10
usersのPRIMARYでキー長が4
だよな
おそらくusersのPRIMARY=user_idで4だから
index_user_id_and_follow_idでからuser_idひいたらfollow_idは長さ6?
index_user_id_and_follow_idのredがconst,funcって、funcは桁数変換?

正確な情報が少なすぎる

>>19
inをexistsにするぐらいなら、joinで書きなおした方が良いんじゃね
21NAME IS NULL:2014/06/18(水) 20:49:53.47 ID:???
>>17
それはそうと、リプライ(reply) と リプレイ(replay) は違うよ。

>>20
joinでもいいと思う。
22NAME IS NULL:2014/06/18(水) 21:08:16.67 ID:???
>>20
inとexistsはオプティマイザによる変換難しいけど
existsとjoinはオプティマイザが簡単に変換するから

読みやすいほうで良いでしょ
23NAME IS NULL:2014/06/18(水) 22:29:34.81 ID:???
なんか、in exists join 関連の話よくループするね。
テンプレ入りするかも?しないかも?
24NAME IS NULL:2014/06/18(水) 22:40:29.77 ID:???
>>20
mysqlのexplainを読めないなら黙ってても良いんだよ?
2517:2014/06/19(木) 05:02:55.31 ID:???
不手際が多く色々と混乱させてしまったみたいで申し訳ありません

ご指摘どおり joinへの置換えを行った所
10000ms→4000ms→0.04msまで落ちました
本当にありがとうございました
26NAME IS NULL:2014/06/19(木) 05:04:09.29 ID:???
>>24
じゃああなたが>>20の疑問点に解説を
27NAME IS NULL:2014/06/19(木) 12:12:14.69 ID:???
おめでとー
28NAME IS NULL:2014/06/19(木) 12:15:07.32 ID:???
>>17が最初に質問した元スレで話題になってたんだけど

468 名前:nobodyさん[sage] 投稿日:2014/06/19(木) 11:53:09.08 ID:???
彼は解決したって書いてるけどjoinを使うことでサブクエリが先に消化されてソート対象がメモリ上に乗るサイズになっただけで結局もっと数が増えたらメモリに乗らなくなってまた遅くなるよ

10万件程度のデータでもメモリに載り切らなくなるのはわかりきってるしTwitterみたいに大きくないから大丈夫なんて言える問題じゃない

みたいな書き込みがあったんだけどそうなの?
29NAME IS NULL:2014/06/19(木) 12:25:50.89 ID:???
お察しレベル。
元スレどこなの?
30NAME IS NULL:2014/06/19(木) 12:27:21.34 ID:???
>>29
やっぱレベル低い争いなのか
http://nozomi.2ch.net/test/read.cgi/php/1389438240/
31NAME IS NULL:2014/06/19(木) 12:42:55.77 ID:???
>>28
INは全表をメモリに載せようとするけど
JOINやEXISTSはしないで(HASH) SEMI JOINやINDEXで精査しようとするから速いんだよ

ただ、JOINやEXISTSの方式でも件数が影響するので
桁がかなり増えれば、当然遅くなる

最近オプティマイザも賢くなったがな
32NAME IS NULL:2014/06/19(木) 13:01:52.81 ID:???
あんまりORM批判はしたくはないが
INはORMで簡単に実装できるからよく使われるのに対して
テンプレに載せようかって話す位の常識を知らないやつが増えたね
33NAME IS NULL:2014/06/19(木) 16:41:08.52 ID:???
>>31
それMySqlの話?
なんかググっても、MySqlにはネステッドループとその変形しか実装されてないって書いてあるんだが

一般論なら、今時はINもEXISTSと同様に展開するんじゃね
まあ、結局はオプティマイザの出来次第なんだが
34NAME IS NULL:2014/06/19(木) 16:44:02.06 ID:???
SQLServer2005です
数年分のログを2週間ずつページングして表示させたいです
取り敢えず最初のページのケツの日付を次ページの先頭条件としてみましたが、当然前ページのと被ってしまいます
各ページの先頭行を取得するにはどのようにすればよいでしょうか?
35NAME IS NULL:2014/06/19(木) 16:56:24.54 ID:TW0nEEQA
ページ番号から計算すればよさそうなもんだけど。
36NAME IS NULL:2014/06/19(木) 17:06:36.77 ID:???
>>33
existsはjoinの変形とできるけど、inは違うから一概には一緒にはできないよ
オプティマイザが賢ければやってくれるんだけどね

MYSQLは5.6.5からNEST以外のjoin方法が実装されたよ
37NAME IS NULL:2014/06/19(木) 20:53:12.43 ID:???
カラムの値を11倍にして格納したいんですが、どう書けばよろしいでしょうか?
検索しても2000を10000に置き換えるといった置換ばかりかヒットして思うように見つけられません
ご教示お願いいたします
38NAME IS NULL:2014/06/19(木) 20:53:59.97 ID:TW0nEEQA
update tbl set col = col * 11where 〜
39NAME IS NULL:2014/06/19(木) 21:04:07.09 ID:???
>>38
ありがとうございます!
たすかりました!
40NAME IS NULL:2014/06/19(木) 21:29:26.50 ID:???
>>34
> 取り敢えず最初のページのケツの日付を次ページの先頭条件としてみましたが、当然前ページのと被ってしまいます

被るの嫌なら、ケツの次の日にすればいいだけじゃないのか?
そもそも要件が2週間毎なら、>>35 の言うようにページ番号から計算すればいいだけだろ。
41NAME IS NULL:2014/06/19(木) 21:57:39.98 ID:???
日付に時間が含まれてるかどうかとかいろいろ細かい考慮点はあるにはあるけど
開始を<=じゃなくて<にするとか、そんな程度の話じゃないの
42マッチ棒:2014/06/24(火) 23:01:35.90 ID:???
こんにちはいつもお世話になります。
mySQLとPHPで会社の案件管理をつくっています。
日付で抽出し、たとえば6月の案件一覧を見ているとします。
そこであるレコードを修正して戻ってくると、抽出が解除され全件表示になります。
こういうときに前の抽出状態を維持するいい方法はありませんけ
よろしくお願いします
43NAME IS NULL:2014/06/24(火) 23:07:13.82 ID:???
>>42
なにで編集してるの?
44NAME IS NULL:2014/06/24(火) 23:19:57.07 ID:???
どうせ phpMyAdmin の話だろ・・・
45NAME IS NULL:2014/06/24(火) 23:22:20.86 ID:???
phpmyadminって条件維持されなかった?
46NAME IS NULL:2014/06/24(火) 23:34:45.32 ID:???
mysqlスレに帰れよ
47マッチ棒:2014/06/24(火) 23:44:03.72 ID:???
こんばんは。
DreamWeaverでハンドコーディングしています
IE上で動く案件管理DBです
48NAME IS NULL:2014/06/25(水) 00:13:04.67 ID:???
>>42
内容的にmysqlスレかphpスレで聞くべき物だよ
ここはSQLに関するもの以外は答えない

http://peace.2ch.net/test/read.cgi/db/1376466127/
http://nozomi.2ch.net/test/read.cgi/php/1397862294/
どっちかにお行き
49NAME IS NULL:2014/06/25(水) 00:15:28.96 ID:Agv1+kTb
フレームワークでもなく自作なんだし、間違いなくPHPスレ。
50マッチ棒:2014/06/25(水) 00:41:04.95 ID:???
まあそう言わんと
51NAME IS NULL:2014/06/25(水) 00:45:19.80 ID:???
マジレスすると、
ここでお前にマジ回答しても絶対に理解できない
スレ違いな上に分からせることが不可能という二重苦
52マッチ棒:2014/06/25(水) 00:57:34.06 ID:???
こう見えても基本情報技術者や電気工事士もってるプロですよ!
53マッチ棒:2014/06/25(水) 00:59:14.65 ID:???
私が優秀で嫉妬してるから教えたくないんですね
それともわからないんですか?偉そうなこと言ってるのに口だけなんですね!
54NAME IS NULL:2014/06/25(水) 01:00:20.65 ID:???
電気工事士はいいけど
基本情報技術者とかゴミやん。アマの証だろ
55マッチ棒:2014/06/25(水) 01:01:35.98 ID:???
ちなCADトレース技師初級もあります
56NAME IS NULL:2014/06/25(水) 01:03:15.74 ID:???
>>55
初級かよ。最低中級とってこないと
57NAME IS NULL:2014/06/25(水) 02:59:48.97 ID:???
よそなら挑発して回答もらえるだろうけど、ここでは無理だな
大人しくphpスレいきゃよかったのにね
あっちとこっちと重複してる住人も多いかもしれんけど
58NAME IS NULL:2014/06/26(木) 10:41:08.62 ID:???
SQLServer2008です。
コミットの最中にネットワーク障害などが起きてコミットが中断された場合、
更新系SQL1、2、3と実行していたもののうち、1だけがロールバック
され、残りはコミットされるということは起こりえますか?
59NAME IS NULL:2014/06/26(木) 10:57:34.43 ID:???
Microsoft SQL Server 総合スレ 10
http://peace.2ch.net/test/read.cgi/db/1385363382/
60NAME IS NULL:2014/06/26(木) 11:50:08.28 ID:???
>>58
それ同一トランザクション前提だよな?
そんな事がおこったら、トランザクションの一貫性が保ててない欠陥DBMSです
61NAME IS NULL:2014/06/26(木) 13:26:15.62 ID:???
>>60
もちろん同一トランザクションでのことです。
62NAME IS NULL:2014/06/28(土) 20:55:24.29 ID:???
"売上"表に含まれない商品コードを"商品"表から抽出している。
言い換えれば、"売上"表に存在していて"商品"表に存在しない商品コードを抽出している。

SQLを勉強していたらこういう記述を見かけたのですが、
どうしても理解できません。
前者の文と後者の文では結果が違うと思うのですが・・・
63NAME IS NULL:2014/06/28(土) 21:20:46.91 ID:???
言い換えれば、"売上"表に存在していて"商品"表に存在しない商品コードを抽出している

言い換えれば、"商品"表に存在していて"売上"表に存在しない商品コードを抽出している

だね。技術書って専門家が書いている割にこういう誤植がよくある。
金出して買ったんなら、出版元にガンガン文句言ってやれ。
出版業なら校正に命賭けろってね。
64NAME IS NULL:2014/06/28(土) 21:25:35.22 ID:???
>>62
本によっては誤植お知らせみたいなのが載ってるから調べてみるといいかもね。
65NAME IS NULL:2014/06/28(土) 22:37:24.51 ID:???
なんで? なぜわざわざ「言い換えれば、」と前置きしてるのか、このSQLが例示されてないから
真意は不明だけれど、国語の問題じゃあ無いんだからこういう発想で捉えれば、このSQLでも
同じ結果は得られるんだよ  という解説にも読めるんだけどな。 おまえら、そういう発想でSQL
書いたりすること無いのか?
66NAME IS NULL:2014/06/28(土) 23:53:45.86 ID:WF1rplta
>>65
>>62の前後で別のクエリが記載されてるのかなぁという気はしなくもないが、
それよりあなたの日本語。
67NAME IS NULL:2014/06/29(日) 00:34:49.09 ID:???
空気を読まずに、教えてください。

[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 を識別できるようにしたいのです。

よろしくお願いします。
68NAME IS NULL:2014/06/29(日) 04:25:55.41 ID:???
>>65
その日本語2文に対応して、同じ結果になるSQL二つ書いてみてくれ
69NAME IS NULL:2014/06/29(日) 04:49:13.93 ID:???
>>67
WITH RECURSIVE r AS (
SELECT *,id as root_id FROM test_table WHERE id = 1 UNION ALL SELECT test_table.*,r.root_id FROM test_table, r WHERE test_table..parent = r.id
)
SELECT * FROM r ORDER BY id;
とかでどう?
70NAME IS NULL:2014/06/29(日) 09:45:13.09 ID:SPV+8b8/
◎2chスレッド勢いランキングサイトリスト◎

★+ニュース板
・ 2NN (推薦)
・ 2chTimes
★+ニュース板新着
・ 2NN新着
・ Headline BBY
・ unker Headline
★+ニュース板その他
・ Desktop2ch
・ 記者別一覧
★全板
・ 全板縦断勢いランキング (推薦)
・ スレッドランキング総合ランキング
・ ログ速
★全板実況込み
・ 2勢 (推薦)
・ READ2CH
・ i-ikioi

※ 要タイトル名検索
※ 2chブラウザ併用推奨
71NAME IS NULL:2014/06/29(日) 11:58:37.45 ID:v5cRsR0p
select * from tbl1 where a = 100 order by b;
こういうクエリを大量に投げてます。
tbl1のaだけじゃなくてbにもインデックス張った方が高速になりますか?
72NAME IS NULL:2014/06/29(日) 12:01:59.30 ID:???
構成による
bが性別とかだったら張らないほうが早い
普通のデータのカラムなら張ったほうが良いけど
まあ試せばいいじゃん
トラン系だったらupdateとかinsert遅くなるのにも注意な
73NAME IS NULL:2014/06/29(日) 14:54:15.91 ID:v5cRsR0p
ありがとうございましたm(_ _)m
74NAME IS NULL:2014/06/29(日) 21:42:25.83 ID:???
>>71
そのクエリならおそらく(a,b)の複合インデックスで早くなるけど
bの単独インデックスは有っても使われない
まあ、DBMSによるし、試すしかないけど
7567:2014/06/29(日) 22:13:15.00 ID:???
>>69
ありがとうございます。
助かりました。

もっとお勉強しないとダメですね。。がんばります。
76NAME IS NULL:2014/06/30(月) 00:09:48.21 ID:g9ImG6pV
データ消去後カラムidを指定せずデータを追加するとIDを飛ばし追加されますが
それはなぜでしょうか
77NAME IS NULL:2014/06/30(月) 00:26:52.33 ID:???
autoincrement指定の場合、番号はテーブル外で記録しているから。
78NAME IS NULL:2014/06/30(月) 01:04:09.83 ID:g9ImG6pV
>>77
成程!
ありがとうございます!
79NAME IS NULL:2014/06/30(月) 05:46:09.41 ID:???
truncateしてる?
DBMSによると思うけどtruncateでリセットされるのもあるよ
80NAME IS NULL:2014/07/04(金) 14:04:39.65 ID:???
あるテーブルに対して数量の合計と単価の平均を取得して、
それを新しい列を生成してそこに挿入することはできますか?

それとSQL文中では四則演算を行うのは変でしょうか?
81NAME IS NULL:2014/07/04(金) 17:16:14.78 ID:???
計算するタイミングをいつにするかで変わってくるのでもうちょっと詳しく
四則演算を入れるのはおかしくないと思うよ
82NAME IS NULL:2014/07/04(金) 18:48:14.49 ID:+mQ6XEVA
>>80
> SQL文中では四則演算を行うのは変でしょうか?
変じゃないよ。

こんな感じのクエリを書けるよ。
select 商品名, sum(数量), avg(単価) from table_1 group by 商品名

あと、挿入という言葉は insert の意味で使われるので、避けたほうがいいよ。
83NAME IS NULL:2014/07/04(金) 19:34:04.43 ID:ddlDmBgZ
>>81>>82
言葉不足ですみません

列Aと列Bを取り出して(列A+列B)を計算して
その結果を列Cとして新しく列を作りそこに表示させたいです

列A | 列B

列A | 列B | 列C

のような感じです

関数としてsumやavgはありますが、それよりも自由な計算を行いたいです
84NAME IS NULL:2014/07/04(金) 21:13:59.23 ID:Skkvw/6O
値をいちいちフィールドに埋め込んでしまうより計算した方が融通きくと思うんだけど。
その計算方法や列A(B)の値を変えた時なんかC列をupdateするわけ?
85NAME IS NULL:2014/07/04(金) 21:28:33.75 ID:+mQ6XEVA
>>83
新しく作り、表示させたいというのは、テーブルに新しく列を作成し、そこに格納したいという話なの?
きっとそうではないだろうと思っているんだけど。

select 列A, 列B, 列A + 列B * 3 AS 列C
のような抽出をしたいだけなんじゃないかなと。
86NAME IS NULL:2014/07/04(金) 21:36:06.82 ID:ddlDmBgZ
>>84
そういうわけではないです
無理にSQLに組み込む必要はないですかね

>>85
SQLのテーブル自体は変えずに
抽出する結果として列Cを作りたいです

書いていただいたSQL文が自分の希望に近いです
87NAME IS NULL:2014/07/04(金) 23:56:46.36 ID:+mQ6XEVA
近いですワロタ。
テーブル構成も何も書かずに正解を出せるレベルにはなかなか達しないなぁ。

>>82がダメだったわけだから、こうかなぁ。
select 数量1 + 数量2 + ... + 数量n as 数量合計, (単価1 + 単価2 + ... + 単価n)/n as 単価平均 from あるテーブル

あと、言葉が不足しているのではなく、不適切な言葉が使われていることが問題です。
88NAME IS NULL:2014/07/05(土) 00:01:30.38 ID:???
>>87
先ほど書いていただいた
select 列A, 列B, 列A + 列B * 3 AS 列Cで解決しました
「近い」という表現は変でした

ありがとうございました
89NAME IS NULL:2014/07/05(土) 00:02:23.22 ID:vKMEzrER
あ、解決したならよかった。
がんばってね
90NAME IS NULL:2014/07/05(土) 18:35:29.20 ID:???
group byの使い方がいまいちわからんとです
グループ化してそこから抽出しなくてもwhereで事足りるのではないかと思います
91NAME IS NULL:2014/07/05(土) 19:39:42.99 ID:???
一例として、

id point
1 10
2 5
3 10
1 5
3 1
2 21

みたいなデータが収められているテーブルがあるとする。
これを

id point
1 15
2 26
3 11

みたいに、idごとにpointを合計するときなどに使える。
92NAME IS NULL:2014/07/05(土) 19:56:19.38 ID:???
>>91
だからwhereとどう違うんだ
93NAME IS NULL:2014/07/05(土) 20:04:05.23 ID:???
例えばwhereの条件にあうレコードの件数を知りたい時
一々結果の行数見るのは面倒でしょ
特定の月ごとの総売上の推移を知りたい時
結果のレコードを自分で計算するの?
group byは集計に使うのであって、絞り込みに使うんじゃ無いんだよ
9491:2014/07/05(土) 20:20:26.30 ID:???
>>92
試しにwhereで書いてみ?
ただしidは1〜3までとは『限らない』ことが仮定で。
95NAME IS NULL:2014/07/05(土) 20:24:51.32 ID:???
必要ないなら無理に使わなくていいよ
必要に駆られたときに覚えればいい
この先DB触っていくならwhereだけで対処出来ないことが出てくると思うし
96NAME IS NULL:2014/07/05(土) 20:35:00.10 ID:???
わからないなら使わなければいいだけのこと。
ってか英単語の意味で普通わかる気がするけど。
97マッチ棒:2014/07/05(土) 20:36:23.08 ID:???
こんにちは質問です
画像のように、月ごとの小計つきの帳票を出したいのですが
SQLで一発でいい書き方ありますか
PHP側でやるべきですか

http://i.imgur.com/tnzkfBc.jpg
98NAME IS NULL:2014/07/05(土) 21:07:45.40 ID:???
group by使え
99マッチ棒:2014/07/05(土) 21:33:11.68 ID:???
こんにちは。
group by すると、各月に一件のレコードしか出なくなるんですけど
何がおかしいのでしょうけ?
100NAME IS NULL:2014/07/05(土) 21:47:25.27 ID:???
日本語も英語も不自由なマッチ棒君キテンネ
101NAME IS NULL:2014/07/05(土) 21:54:11.52 ID:???
書いてやろうか?
102NAME IS NULL:2014/07/05(土) 22:21:34.46 ID:???
頭がおかしい
103NAME IS NULL:2014/07/05(土) 22:23:21.60 ID:???
>>97
Excel 使え
104マッチ棒:2014/07/05(土) 22:29:55.12 ID:???
>>101
よろしくお願いします
105NAME IS NULL:2014/07/05(土) 22:55:32.08 ID:???
with rollup
106NAME IS NULL:2014/07/06(日) 00:05:16.21 ID:???
SELECT
CONCAT(`支払月`, '月') AS `支払月`,
CASE WHEN `仕入額` IS NULL THEN NULL ELSE `仕入先` END AS `仕入先`,
`仕入額`, `合計`
FROM
(SELECT
`支払月`, `仕入先`,NULL AS `仕入額`,SUM(`仕入額`) AS `合計`
FROM `仕入` GROUP BY `支払月` WITH ROLLUP
UNION ALL
SELECT `支払月`, `仕入先`,`仕入額`,NULL AS `合計`FROM `仕入`
) D
ORDER BY
`支払月` IS NULL,`支払月`,`仕入額` IS NULL,`仕入額`;
107マッチ棒:2014/07/06(日) 01:06:27.48 ID:qOfyYrO2
>>106
うまくいった!さすが神!
大儀である
108マッチ棒:2014/07/06(日) 09:37:36.15 ID:qOfyYrO2
>>106
やれたので問題ないですけんど
ORDER BY の前にある Dはどんな意味なんすか?
消すとエラー起こすので、意味あるみたいだけんど
調べてもそんな句はでてこないのである
109NAME IS NULL:2014/07/06(日) 10:13:42.24 ID:???
>>108
fromの後ろ、カッコついて中で別のクエリが書かれてるでそ?
そういうのを副問い合わせっつって、識別のために名前をつけてやる必要があるのよ
110NAME IS NULL:2014/07/06(日) 10:44:38.40 ID:???
AS D のASが省略されてると思えば
111マッチ棒:2014/07/06(日) 11:45:26.58 ID:qOfyYrO2
なるほど
なんて為になるインタネッツなんだ
112NAME IS NULL:2014/07/09(水) 08:15:00.48 ID:???
・MySQL5.5.38

集計について質問です
果物が販売された日を格納したデータがあるとして
それぞれの果物が最後に販売された日を取得するのには
どういったSQLにすればよいでしょうか?

`種類` `日付`
りんご 2月4日
レモン 3月10日
りんご 5月8日
いちご 7月15日
レモン 10月3日

SELECT `種類`, `日付` FROM 販売日表 GROUP BY `種類` ORDER BY `日付` DESC
`種類`でGROUP BYにすると、りんごは最初に格納された「2月4日」が返されます
ほしい値は最後の日付なので「5月8日」になります

よろしくお願いします
113NAME IS NULL:2014/07/09(水) 08:36:44.28 ID:???
>>112
そのSQLってエラーではないんだ

maxつかえばいいと思うよ
114NAME IS NULL:2014/07/09(水) 09:15:46.23 ID:???
>>113
max()ですね ありがとうございます

SELECT `fruits`, max( `date` )
FROM `sale_by_date`
GROUP BY `fruits`
ORDER BY max( `date` ) DESC
LIMIT 0, 10

最近販売された物品の日付一覧がほしいのでこう作りました

ありがとうございました
115NAME IS NULL:2014/07/09(水) 13:40:14.46 ID:DTeLHLr1
mysqlは特殊仕様によって group by に指定されていない項目を取得することができるけど、
その場合、取得される値は候補のうちランダムでひとつが選ばれる。

だったと思う。最近postgresqlもその特殊仕様を取り込んだかもしれない。
116NAME IS NULL:2014/07/09(水) 15:07:49.51 ID:???
ランダムじゃなくてどれか。
117NAME IS NULL:2014/07/10(木) 14:46:12.36 ID:???
DBに画像を登録するときはINSERT文で画像のパスを入力すればそのまま保存されるのでしょうか?
118NAME IS NULL:2014/07/10(木) 14:54:18.36 ID:???
119NAME IS NULL:2014/07/10(木) 18:52:37.72 ID:???
>>118
失礼しました

・DBMS名とバージョン
MySQL

・テーブルデータ
特になし

・欲しい結果
画像登録

・説明
DBに画像を登録したいのですが、
どういう理論で保存できるのかよくわかりません

DBの中に保存できるのか、
DBにパスを入れると勝手に参照してくれるのかどちらでしょうか?
120NAME IS NULL:2014/07/10(木) 19:08:48.91 ID:???
MySQLの質問スレに行った方がいいと思う
バイナリデータを扱う機能はDBMSごとにけっこう異なるので
121NAME IS NULL:2014/07/10(木) 19:57:30.75 ID:f6aU6xxZ
>>119
いずれにせよ、パスを入れると勝手に参照してくれるなんて機能はない。
バイナリデータを入れるか、パスを入れておいて、必要に応じて参照するようにするか。

そういや、前者が適している用途に遭遇したことないなぁ。
122NAME IS NULL:2014/07/10(木) 20:44:10.53 ID:???
>>120
そうなんですか
ありがとうございます

>>121
>パスを入れておいて、必要に応じて参照するようにするか。
パスを登録したあとSELECT文で指定すれば画像を持ってきてくれるのでしょうか?
123NAME IS NULL:2014/07/10(木) 21:13:13.81 ID:f6aU6xxZ
>>122
いや、パスを持ってきてくれるだけだよ。
124NAME IS NULL:2014/07/10(木) 21:28:54.43 ID:???
125NAME IS NULL:2014/07/10(木) 21:52:44.29 ID:???
>>123
ただパスの文字列を持ってきてもしょうがないですよね・・・


>>124
参考にさせていただきます
ありがとうございます
126NAME IS NULL:2014/07/10(木) 21:59:38.26 ID:f6aU6xxZ
>>125
しょうがなくないんだけどね。

お勧めしないって言われてるのになぁ。
DBに直接画像ファイルを格納したい明確な理由があるんだろうね。
使い方によってはパフォーマンスががた落ちするけど、それに勝る理由だと信じて、がんばってね。
127NAME IS NULL:2014/07/11(金) 09:31:25.13 ID:???
>>121
パスってDBに入らなくね?
入れようとしてもエラーで弾かれてしまう
128NAME IS NULL:2014/07/11(金) 09:54:26.34 ID:???
んなわきゃない
129NAME IS NULL:2014/07/11(金) 10:11:27.93 ID:???
>>128
フォルダの場所とか関係してくる?
DBのなかとか
130NAME IS NULL:2014/07/11(金) 10:24:35.53 ID:???
パスって、ファイルの格納位置を示す文字列だよね?
131NAME IS NULL:2014/07/11(金) 10:36:31.28 ID:???
パスはただの文字列だし入らないわけない
Win系だと区切りが\だから、直書きならエスケープいるが。
132NAME IS NULL:2014/07/11(金) 10:36:58.83 ID:???
ただの文字列じゃねーの?
133NAME IS NULL:2014/07/11(金) 10:37:24.71 ID:???
win mysqlでは \ をエスケープしないといけない

mysql> desc testpath;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| folder | varchar(30) | NO | | NULL | |
+--------+-------------+------+-----+---------+-------+
2 rows in set

mysql> insert into testpath
-> values(1,"c:\\");
Query OK, 1 row affected

mysql> select * from testpath;
+----+--------+
| id | folder |
+----+--------+
| 1 | c:\ |
+----+--------+
1 row in set
134NAME IS NULL:2014/07/11(金) 11:00:29.56 ID:???
小学生かよ
135NAME IS NULL:2014/07/11(金) 13:03:07.09 ID:???
ここまでSQLアンチパターンのファントムファイルの言及なし
http://www.slideshare.net/itabashimasayuki/sql-34381955
136NAME IS NULL:2014/07/11(金) 13:03:09.62 ID:???
どっかで中継あるの?
137NAME IS NULL:2014/07/11(金) 13:05:49.25 ID:???
SQLでidだけ持ってきてそれを画像名にしといて呼び出せば簡単だよな
わざわざDBに登録する必要ないよな?
138NAME IS NULL:2014/07/11(金) 13:31:12.27 ID:???
無いが、コロっとDBファイルだけで移動したいとかいう
融通の効かない事を言ってくる輩は多い
139NAME IS NULL:2014/07/11(金) 13:47:45.75 ID:???
>>126
> DBに直接画像ファイルを格納したい明確な理由があるんだろうね。
> 使い方によってはパフォーマンスががた落ちするけど、それに勝る理由だと信じて、がんばってね。

逆に言えば、パフォーマンスががた落ちするようなファイルサイズ・量の画像でないのなら、いつでもDBに登録した方が良いともいえる。
140NAME IS NULL:2014/07/11(金) 13:52:22.12 ID:???
ちょろっと差し替えたいとか、実ファイル開いて中身確認死体とか
ままあるし、運用的には扱い辛い事この上ないけどなあ
141NAME IS NULL:2014/07/11(金) 13:57:45.19 ID:???
そうしたいならそういうシステムを作れば良いだけじゃん
142NAME IS NULL:2014/07/11(金) 15:41:30.94 ID:SfLsxBaO
>>139
パフォーマンスが落ちるといっているのはサイズや量によるものじゃないよ。
静的コンテンツを静的コンテンツとして扱えなくなることの問題の話だよ。

もちろん、影響がないのならDBに登録しても(!= したほうが)いいよね。しなくてもいいよね。
143NAME IS NULL:2014/07/11(金) 15:49:26.90 ID:???
>>142
> パフォーマンスが落ちるといっているのはサイズや量によるものじゃないよ。
いや、サイズや量によるよ。

> 静的コンテンツを静的コンテンツとして扱えなくなることの問題の話だよ。
それって、(ファイルを含めた)データベースやデータ、SQLに関する問題?
そうじゃないなら、スレ違いと思うけど。

> もちろん、影響がないのならDBに登録しても(!= したほうが)いいよね。しなくてもいいよね。
DBに登録したときのメリットとデメリットを天秤にかければいいよ。
144NAME IS NULL:2014/07/11(金) 16:35:58.89 ID:???
アクセスが多くて数もあるサムネイルとかはどうかと思うけど
ファイルの場合は置いたパスにしか存在しないが
DBに格納してどこからでも取り出せる方法はアリだと思う
web領域をリセットしても問題ないし
パスを変更したい時もファイル郡の移動がなくて短縮されるし
145NAME IS NULL:2014/07/11(金) 16:41:34.08 ID:???
いいから>>135よめ
146NAME IS NULL:2014/07/11(金) 16:45:56.27 ID:SfLsxBaO
>>143
>> 静的コンテンツを静的コンテンツとして扱えなくなることの問題の話だよ。
> それって、(ファイルを含めた)データベースやデータ、SQLに関する問題?
> そうじゃないなら、スレ違いと思うけど。
(ファイルを含めた)データベースやデータの話はスレ違いじゃないの?

>> もちろん、影響がないのならDBに登録しても(!= したほうが)いいよね。しなくてもいいよね。
> DBに登録したときのメリットとデメリットを天秤にかければいいよ。
そうだね。
だからこそ一概に「いつでもDBに登録した方が良い」なんて決めてはいけないね。
147NAME IS NULL:2014/07/11(金) 17:19:08.84 ID:???
>>146
> (ファイルを含めた)データベースやデータの話はスレ違いじゃないの?

静的コンテンツかどうかみたいな話よりはスレの趣旨に近いと思うけど。

> だからこそ一概に「いつでもDBに登録した方が良い」なんて決めてはいけないね。

画像をDBに登録するのはお勧めしないとか、
> DBに直接画像ファイルを格納したい明確な理由があるんだろうね。
> 使い方によってはパフォーマンスががた落ちするけど、それに勝る理由だと信じて、がんばってね。
みたいな意見に対するカウンターだよ。
俺も本気でいつでもBLOB、なんて思ってないし。

何の考えもなく、ファイルとして画像を保存してDBにはパスだけ登録しときゃいいでしょ的な思考停止へのカウンター。
148NAME IS NULL:2014/07/11(金) 17:24:08.67 ID:???
あ、付けくわとくけど、
> (ファイルを含めた)データベースやデータの話はスレ違いじゃないの?
これは俺もスレ違いだと思うよ。

> 静的コンテンツを静的コンテンツとして扱えなくなることの問題
というのが、一体どういうことを言ってるのかがわからなかったから

> それって、(ファイルを含めた)データベースやデータ、SQLに関する問題?
と聞いただけ。
149NAME IS NULL:2014/07/11(金) 17:24:51.72 ID:???
>>142
キミはWebサーバの仕組みから勉強しなおした方が良いかもな
リバースプロキシとかそこらへんを特にな
150NAME IS NULL:2014/07/11(金) 17:50:18.68 ID:???
>>142
静的な方が動的より速度的に優位であるとしても
>静的コンテンツを静的コンテンツとして扱えなくなることの問題
と速度は関係ないんだが
そもそもパスのみをDBに格納するとしても、それをDBから取り出してる時点で静的コンテンツではないわけだが

バイナリデータの取り扱いはDBMSによりいろんな制約がかかったりするし
最終的にはファイルに落としたかったりすることも多い
(ファイルとセットで管理するような仕組みもってるDBMSもあるけど)
あまりDBMS側で扱いやすいものではないよ
151マッチ棒:2014/07/13(日) 08:10:39.66 ID:rJcU+XbI
おはようございますいつもお世話になりますマッチ棒です
また相談ですけんど
日付フォーマットはYYYY-MM-DDで固定なのでしょうか
表示するときに、日は省略で「2014年7月」と表示させたいのですけんど
PHPで文字列加工してやるものですけ
152NAME IS NULL:2014/07/13(日) 08:12:17.23 ID:???
調べたら一発で出るんだけどなあ
153マッチ棒:2014/07/13(日) 10:38:56.06 ID:rJcU+XbI
まあそう言わんと
154NAME IS NULL:2014/07/13(日) 10:49:10.39 ID:???
それでも自分で調べる気はないんだ。。。
155マッチ棒:2014/07/13(日) 10:56:46.63 ID:rJcU+XbI
人生はみじかいんですよ
156NAME IS NULL:2014/07/13(日) 11:10:51.92 ID:???
>>155
>>1読め
157マッチ棒:2014/07/13(日) 11:16:39.20 ID:rJcU+XbI
テンプレ書いても答えれんくせに
158NAME IS NULL:2014/07/13(日) 11:18:14.77 ID:???
そういう口答えしてると回答する奴がいなくなるよ
159マッチ棒:2014/07/13(日) 11:22:00.52 ID:???
こう見えても基本情報技術者や電気工事士もってるプロですよ!
160マッチ棒:2014/07/13(日) 11:24:09.29 ID:???
ちなCADトレース技師初級もあります
161マッチ棒:2014/07/13(日) 11:25:09.42 ID:rJcU+XbI
DBMSってなんぞ?
162NAME IS NULL:2014/07/13(日) 11:30:05.28 ID:???
>>161
テンプレすらかけない奴に誰が答えるかって話だよ
163NAME IS NULL:2014/07/13(日) 11:32:46.67 ID:???
マッチ野朗はテンプレの埋め方もわからんのだよ
164NAME IS NULL:2014/07/13(日) 12:13:18.34 ID:???
mysqlだとdate_formatみたいなのがあった気がする
ポスグレとかオラクルは別の関数だったのは覚えてるけどたまにしか使わないからいちいち覚えてないわ
165NAME IS NULL:2014/07/13(日) 12:28:48.17 ID:???
底辺はphpでmysqlと決まってるから大丈夫じゃねぇか
166NAME IS NULL:2014/07/13(日) 12:30:41.07 ID:???
この際、ポスグレかオラクルを例に回答してみたら
167NAME IS NULL:2014/07/14(月) 04:18:08.00 ID:uL3aRoUg
>>151
まあそう言わんと
168NAME IS NULL:2014/07/14(月) 14:40:05.65 ID:fCq7eZD9
select to_char(date '14 Jul 2014', 'YYYY年MM月');
169NAME IS NULL:2014/07/14(月) 22:44:32.07 ID:m5zGMQZ/
t-sqlなんですが素人なんで悩んでます

前日07時からと当日07時までのデータ配信顧客数を知りたいのですが
前日も当日も配信した顧客の重複は1としての
累計顧客数をだすにはどうしたらいいでしょうか?
170NAME IS NULL:2014/07/14(月) 23:47:55.34 ID:???
>>169
カラム名分からないんで適当に書くけど、こんな感じでできないかな?

select count(distinct `顧客ID`) from `配信LOG` where `配信TIME` between '前日日付 7:00' and '当日日付 7:00';
171NAME IS NULL:2014/07/15(火) 07:03:38.38 ID:Fpc5z+kr
前日日付は指定日の前日になるので
変数からの代入してると
betweenですると無効な構文になります
どう書けばいいのでしょうか…
a_dateはDBの日付
@date1は指定日の前日
@dateは指定日

between a_dte = @date1 and 7時
and a_dte = @date and 7時
はエラーになる
172NAME IS NULL:2014/07/15(火) 09:05:42.78 ID:???
ストアドプロシジャとかストアドファンクションとかの話だろうけど
>>1くらい読めや
173NAME IS NULL:2014/07/15(火) 12:20:03.32 ID:???
まあ引き続きT-SQLだろうからSQL Serverなんだろうけど
せめてSQLの構文ぐらい確認しろよ
174NAME IS NULL:2014/07/15(火) 13:08:51.67 ID:LzDuo0wi
変数使う以前にbetween知らないんじゃん。
sql between 使い方 でぐぐってみたら?
175NAME IS NULL:2014/07/16(水) 12:14:52.45 ID:JZzBhKA1
postsテーブル(ブログ記事)とcategoiresテーブル(カテゴリー)とがあり、
postsにはcategory_idを持たせています。
カテゴリー一覧と各カテゴリーに属する記事数を取得するにはどういったsqlを書けばいいでしょうか。
ググったところ http://okwave.jp/qa/q2196405.html を見つけましたがカテゴリーごとに
DBにアクセスしててよろしくないのではないかと思いました。
よろしくお願いします。
176NAME IS NULL:2014/07/16(水) 12:30:49.48 ID:???
SELECT カテゴリ名,coalesce(count,0) FROM categoires
LEFT JOIN (SELECT category_id, count(category_id) FROM posts GROUP BY category_id) A ON A.category_id = categoires.id

こんな感じを想定してる?
177NAME IS NULL:2014/07/16(水) 13:31:11.87 ID:???
SELECT カテゴリ名, count(*) FROM categories INNER JOIN posts ON categories.category_id = posts.category_id
SELECT カテゴリ名, count(*) FROM posts INNER JOIN categories ON categories.category_id = posts.category_id
178NAME IS NULL:2014/07/16(水) 14:14:37.55 ID:4RZW5vEM
>>175
こんな感じか
select
カテゴリ名,
(select count(*) from posts where category_id=t.id ) as cnt
from categoires t

オプティマイザが賢くないならjoinの方が早いかもしれんが

>>177
group byは?
179NAME IS NULL:2014/07/16(水) 14:16:06.29 ID:???
>>178
後ろが落ちた
GROUP BY category_id
180NAME IS NULL:2014/07/16(水) 15:24:31.80 ID:JZzBhKA1
categoiresは自分のタイポでした。すみません。

>>176
最初no such column: count と出ましたがcount(category_id) as count としたところ動きました。
coalesce()とか初めて見たので勉強になりました。ありがとうございます!
>>177
属する記事があるカテゴリのみ取ってくることもできるんですね。ありがとうございます!
>>178
こちらも動きました。ありがとうございます!

困っていたので本当に助かりました。自分で書けるように>>2の参考リンクで勉強します。
ありがとうございました!
181NAME IS NULL:2014/07/16(水) 19:29:13.96 ID:???
>>175
select c.name, count(*)
from posts p
left join categoires c
on p.category_id = c.id
group by c.name
182NAME IS NULL:2014/07/16(水) 19:47:33.64 ID:???
今あえて書いたってことは、カテゴリ名でグループ化することが大事だって言いたいのかな。
183NAME IS NULL:2014/07/16(水) 19:48:15.77 ID:???
と思ったけど、 post left join category だと… o_O
184NAME IS NULL:2014/07/17(木) 17:50:24.87 ID:???
画像投稿サービスに日ごとのランキング機能を付けたいです。
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でやりたいです。
よろしくお願いします。
185NAME IS NULL:2014/07/17(木) 18:14:16.52 ID:???
insert into ranks
select t.image_id, t.view - y.view + (t.like - y.like) * 10, t.view - y.view, t.like - y.like, t.created_at
from (select * from image_counts where created_at = 今日) as t join (select * from image_counts where created_at = 昨日) as y using (image_id)
order by t.view - y.view + (t.like - y.like) * 10
limit 100

こういうこと?
186NAME IS NULL:2014/07/17(木) 18:17:32.17 ID:???
あ、order by は desc が必要だった。
ともあれ、image_counts には累計が入っているということなので、
当日の増分を得るためには昨日のデータと結合して引き算すればよいですよ。
187NAME IS NULL:2014/07/17(木) 19:30:36.55 ID:???
image_countsを累計じゃなくてその日のカウントにしとけばいいのに
188NAME IS NULL:2014/07/17(木) 23:12:20.81 ID:???
例えば列Aと列Bを割った結果を出すときに
小数点や整数の桁数を指定することはできますか?
(列Aと列Bを割った結果が0.25なら0.2として抽出のように)
189NAME IS NULL:2014/07/17(木) 23:23:49.35 ID:???
>>188
>1
190NAME IS NULL:2014/07/21(月) 17:22:28.57 ID:???
SQL Server2008R2 Expressの質問です。
SQLの知識が全く無く、物凄く曖昧な内容になりますがすみません。

おそらく、「インスタンスを追加する場合にはどうすればよいか」といった質問になるのだと思いますが
なにぶん知識が無いものでして、以下に状況を記載しますので問題点・解決策を汲んでは頂けないでしょうか・・・



あるソフトA、そして別のソフトBを1台のPC(Windows7 64bit)で動かそうとしています。
ソフトA,Bは共にSQL Server2008 R2を使用しています。インスタンス名は共に"MSSQLSERVER"です。

このPCは既にソフトAでセットアップされています。
ここにソフトBをインストールしようとしているのですが、ソフトBはSQLのインストール時にsaのパスワードを
「bbbb」(仮)に変更しろと記載されています。
ですが上記の通り、このPCのSQLはソフトAインストール時に設定されているのでsaのパスワードは
「aaaa」(仮)に設定されており、変えられません。

もちろん、そのままソフトBのインストールを試すと、ソフトBはインストール時に失敗してしまいます。
厳密には、本来インストール時に作成されるはずのデータベースが作れないようです。
そこで、色々調べてsaのパスワードを「bbbb」へ変更してSQLを再起動した上でソフトBのインストールを
試行してみました。これでも現象は変わりませんでした。

検索して調べた範囲では、
・SQLは複数のインスタンスを持てる。
・同じインスタンス名(MSSQLSERVER等)は持てない
とのことなので、インスタンスを分けることも出来ず、幸いにもソフトA,Bを同時に使用することはないため
どちらかのソフトを起動する際にsaのパスワードを切り替えて対応できれば・・・と思ったのですが
上記の通り、予想が外れて頓挫しております。

ソフトの作りの話になると思いますので、同じインスタンス名を共存させることはできないのではないかと思います。
こうした場合、どうするのが良いのでしょうか。一日半潰しましたがここまでやったものの分かりませんでした。
何卒お知恵をお貸し下さい。
191NAME IS NULL:2014/07/21(月) 17:32:00.45 ID:???
>>190
こちらで聞いてみてはどうか
Microsoft SQL Server 総合スレ 10
http://peace.2ch.net/test/read.cgi/db/1385363382/
192NAME IS NULL:2014/07/21(月) 18:37:02.48 ID:???
>>191
誘導ありがとうございます。向こうで聞いてみます。
193NAME IS NULL:2014/08/14(木) 18:55:48.56 ID:???
結婚披露宴に呼ぶ友達がいないときはどうしてる?
194NAME IS NULL:2014/08/14(木) 20:47:48.99 ID:???
>>193
人材派遣会社に頼む
赤い霊柩車の再放送でやってた
195NAME IS NULL:2014/08/14(木) 21:58:41.11 ID:???
select 友人
from 人材派遣会社

where の条件は?
196NAME IS NULL:2014/08/14(木) 22:03:22.65 ID:???
IS NULL
197NAME IS NULL:2014/08/16(土) 13:04:04.19 ID:CDUM23fr
・DBMS名とバージョン(MySQL= 5.1.41)

・テーブルデータ (rating_tb)

mysql> select name_no,rating_point,date from rating_tb;
+---------+--------------+---------------------+
| name_no | rating_point | date |
+---------+--------------+---------------------+
| 1   | 1 | 2014-08-13 01:36:29 |
| 2   | 10 | 2014-08-13 01:36:31 |
| 6   | 1 | 2014-08-13 01:36:32 |
| 9   | 10 | 2014-08-13 01:36:34 |
| 10   | 1 | 2014-08-13 01:36:35 |
| 1   | 4 | 2014-08-13 01:37:46 |
| 1   | 8 | 2014-08-13 01:37:47 |
| 1   | 8 | 2014-08-13 01:37:57 |
| 6   | 10 | 2014-08-13 01:38:05 |
| 2   | 9 | 2014-08-13 01:40:19 |
<以下略 ※数が100以上あるので省略>
198NAME IS NULL:2014/08/16(土) 13:04:52.61 ID: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 |
+---------+--------+
199NAME IS NULL:2014/08/16(土) 13:05:40.94 ID: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 |
+---------+------+--------+

どうか教えてください。よろしくお願い致します。
200NAME IS NULL:2014/08/16(土) 13:45:35.23 ID:???
外部結合するだけちゃうんか
201NAME IS NULL:2014/08/16(土) 14:07:49.99 ID:???
>>199
> //1つ目

> //2つ目

join するだけじゃないの?
202NAME IS NULL:2014/08/16(土) 14:47:47.53 ID:CDUM23fr
>>200 >>201
先生たち!それが出来ないんですよ('_;)

select name_no,sum(rating_point)as vote,
(select sum(rating_point) from rating_tb WHERE DATE_ADD(date, INTERVAL 5 HOUR) > NOW())as active
from
rating_tb
group by name_no;

上のようにやってみたら、activeが合計値が出て個別にならなくて、初心者で全然ここから打開出来ないです;;
↓こんな風にしか出来ない初心者です。お助けください。お願い致します。
+---------+------+--------+
| name_no | vote | active |
+---------+------+--------+
| 1 | 232 | 47 |
| 2 | 199 | 47 |
| 6 | 107 | 47 |
| 9 | 87 | 47 |
| 10 | 89 | 47 |
| 11 | 95 | 47 |
| 12 | 46 | 47 |
| 13 | 42 | 47 |
| 14 | 27 | 47 |
| 15 | 26 | 47 |
| 16 | 17 | 47 |
| 17 | 19 | 47 |
| 19 | 6 | 47 |
| 20 | 12 | 47 |
| 23 | 6 | 47 |
| 24 | 8 | 47 |
| 25 | 7 | 47 |
| 27 | 9 | 47 |
| 34 | 1 | 47 |
| 35 | 7 | 47 |
| 45 | 3 | 47 |
203NAME IS NULL:2014/08/16(土) 16:14:49.39 ID:???
せめて 外部結合 とか sql join とかでググってから出直せ
204NAME IS NULL:2014/08/16(土) 16:21:02.14 ID:???
よく分からんが、

select
*
from (
【一つ目のクエリ】
) t1
left join (
【二つ目のクエリ】
) t2 on t1.name_no = t2.name_no

こういうことしたいの?
205NAME IS NULL:2014/08/16(土) 16:22:36.85 ID:???
>>203
調べてもわかんなくて時間ないから聞いたのに、出なおせとか、なんなんだよ!
どうせ、わからないんだろ? おまえなんか、死ね!
206NAME IS NULL:2014/08/16(土) 16:23:58.15 ID:???
>>204
ありがとう。あんたは好きだ。
ちょっと試して見る。

>>203
死ね!!!
207NAME IS NULL:2014/08/16(土) 16:31:37.44 ID:???
>>206
お前が氏ね
208NAME IS NULL:2014/08/16(土) 16:33:14.90 ID:???
>>207
おまえなんか嫌いだ!!!
わからないんだろ?バカめ!!!
こっち見んな!

>>204
ありがとうございます。今、試しています。
恩にきります。
209NAME IS NULL:2014/08/16(土) 16:43:38.36 ID:???
>>205
> 時間ないから

知らんがな
210NAME IS NULL:2014/08/16(土) 17:07:33.76 ID:???
時間ないなら札束でオラクルのDBエンジニアの頬をたたけばいい
211NAME IS NULL:2014/08/16(土) 17:13:10.68 ID:???
分かんないんだろうって煽って教えて貰えたのは十年前まで
212NAME IS NULL:2014/08/16(土) 18:12:29.32 ID:???
お前らも向きになるなよ
中学生のガキだと思えば可愛いだろ
213NAME IS NULL:2014/08/16(土) 19:22:09.81 ID:???
>>204
出来ました。本当に助かりました。
心から感謝致します。ありがとうございました。

自分で調べても全然わからくて、他のみんなにも
乱暴な言葉づかいをしてしまって、申し訳ないと思っている。
どうせ、ググれカスって言われて終わりだと思っていて実際、そういうレスで涙出てきた。

何度やっても出来なくて、切羽詰まっていたんだけど、大人気なかった。
悪かった。教えてくれなかった人は、わかると思うんでこれ以上書きません。

204先生、本当にありがとうございました。
214NAME IS NULL:2014/08/16(土) 19:42:17.87 ID:???
>>202のクエリ、エラーにならずに実行できるのか
MySQLホントSQLの勉強に向いてないな
215NAME IS NULL:2014/08/16(土) 21:49:17.62 ID:ty/0qgaq
>>213
しね
にどとくるな
しね
216NAME IS NULL:2014/08/16(土) 22:40:25.63 ID:???
>>213
あらためて >>200-201 を読んだらどういう気持ちになるんだろう。
それと、結合しても出来ないんだと言わんばかりのレスをしている >>202 のクエリが
まるで結合になっていないことにも気づけるようになったんだろうか。

そうなれているなら成長してんだが。
217NAME IS NULL:2014/08/17(日) 00:09:11.48 ID:???
>>216
SQLどころかプログラム初心者に結合しろって一言だけだと、サブクエリを使うっていうことが理解できんのだろうきっと。
つか理解できたらここには来ないレベルの質問だろうし。
218NAME IS NULL:2014/08/17(日) 03:11:24.93 ID:???
>>216
どう見たって結合という概念すら理解していない超初心者なのは明白だろ
対応がまずいから怒らせることになる
相当怒ってたぞあれ
219NAME IS NULL:2014/08/17(日) 07:48:50.97 ID:???
釣りだと思ってたらガチだったのか?
学校の宿題かなんかだったのかね・・・
220NAME IS NULL:2014/08/17(日) 09:58:50.73 ID:???
別に釣りでもガチでもいいよ
ヒントだけでなんとかできないならそれまでの奴だろうし、俺には関係ないしな
221NAME IS NULL:2014/08/17(日) 10:13:43.90 ID:???
深くSQLを学ぶつもりはなく、ズバリの回答を求めている人に
joinでググれというのが適切なヒントかどうかは疑問だけどな
222NAME IS NULL:2014/08/17(日) 10:23:10.33 ID:???
質問の態度がよく、問題が面白そうなら回答する
それ以外はスルー
223NAME IS NULL:2014/08/17(日) 10:24:54.88 ID:???
そうだな
上から目線で突き放して怒らせるくらいならスルーがいい
自分も今回はスルー組
回答するならば真摯な姿勢で頼む
下手に怒らせて殺伐としたレスを読まされるのは勘弁
224NAME IS NULL:2014/08/17(日) 10:37:59.23 ID:I2qPzeaH
CURSOR 〜(〜 IN CHAR, 〜 IN CHAR, 〜 IN CHAR) IS
SELECT SUB1.〜,SUB1.〜,SUB1.〜 --@
FROM (
SELECT ,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜,〜 --A
FROM (
SELECT MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜,MR.〜 --B
FROM (
SELECT MR.〜,MR.〜,MR.〜,MR.〜,MR.〜 --C
FROM テーブル名 MR

WHERE 〜 GROUP BY 〜
) MRK
INNER JOIN テーブル名 MR ON 〜
INNER JOIN テーブル名 MGR ON 〜
)
WHERE 〜
) SUB1 LEFT JOIN 〜〜以下省略

これはどういうものなのでしょうか?
SELECT FROMが4連発してるのと、SELECTしてる列の個数が違う意味と
、カッコの付き方で分からなくなっています。
@ABCのSELECTが互いにどう関係してるのか教えてください。
225NAME IS NULL:2014/08/17(日) 10:46:39.85 ID:???
>>224
せめて 外部結合 とか sql join とかでググってから出直せ
226NAME IS NULL:2014/08/17(日) 11:01:45.37 ID:???
>>225 
ほーということは副問い合わせの問題じゃなくて結合の方に
私が知りたい答えがあるというお導きですね?
ちょっと考えてみますね
227NAME IS NULL:2014/08/17(日) 11:30:06.56 ID:???
あー分かったかもしれません。 何も調べずに考えただけなのでアレですが・・・
もし正解だった場合はさすがに意地悪して優越感ゲットとか抜きでそう言ってくださいね!w

()の内から外へドンドン、ってことですかね?

一番内側のカッコCのSELECTは、その外側のカッコBの条件INNER JOINで使用するために用意した。
その二番目に内側のカッコBのSELECTは、その外側のカッコAのSELECTで使用するために用意した。
その三番目に内側のカッコAのSELECTは、その外側の LEFT JOIN〜〜以降ので使用するために用意した。

という感じで正しいでしょうか?
228NAME IS NULL:2014/08/17(日) 11:59:13.64 ID:???
>>227
リファレンス全部 >>2 、目を通してるか?
通してないから正しいかどうかもわからない
ネタかガチかすら怪しいレベル
229NAME IS NULL:2014/08/17(日) 12:02:41.81 ID:???
>>227
OK
SELECT4連発は、クエリの中にクエリがあるサブクエリというものだ
結合が絡んでいるのと、カッコで優先順位が指定されているので
複雑になっている
230NAME IS NULL:2014/08/17(日) 12:03:35.75 ID:???
>>227

まず質問テンプレのルールを守れ。
・DBMS名とバージョンくらい書け。常識ないの?

【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明
231NAME IS NULL:2014/08/17(日) 12:04:19.52 ID:???
>>229
OKもなにも、常識過ぎて話にならないわ
くだらない
232NAME IS NULL:2014/08/17(日) 12:10:05.40 ID:???
こういうことをするSQLはどう書くの、ではなく
このSQLは何をしているの、という質問に対しては
ここのテンプレは役に立たない
もっと柔軟に行こう
人に教えることで自分の知識も底上げされる
233NAME IS NULL:2014/08/17(日) 12:22:17.87 ID:???
>>229
ありがとうございました。
234NAME IS NULL:2014/08/17(日) 12:48:13.67 ID:???
>>221
ズバリの回答欲しいなら外注にでも頼みなよ
金は出したくないがズバリの回答ほしいとか、どんだけゆとりなんだよ
235NAME IS NULL:2014/08/17(日) 12:56:55.55 ID:???
>>234
オマエには質問してないんじゃね?

>>233
がんばって!
236NAME IS NULL:2014/08/17(日) 12:59:01.06 ID:???
>>234
その通りだがお前はそういう奴に答えなきゃ良いだけじゃね?
237NAME IS NULL:2014/08/17(日) 13:22:40.40 ID:???
タダで教えられると都合が悪いというのでなければ、放っておいてくれw
238NAME IS NULL:2014/08/17(日) 13:33:19.85 ID:???
>>234
ネットの質問掲示板なんて
そのためにあるようなもんじゃないの?
ギブアンドテイクで済ますことで
互いにコストと時間を節約できる
239NAME IS NULL:2014/08/17(日) 14:32:40.04 ID:???
質問者の適度な礼節と
回答者の適度な優越感の獲得
で成り立てばいいんだが、

なんせ人間は本来的ににのび太くんであり(質問者)
エゴの固まりである(回答者)からそうもいかない
240NAME IS NULL:2014/08/20(水) 10:24:52.50 ID:4cvw8JQq
保守
241NAME IS NULL:2014/08/21(木) 21:59:10.67 ID:???
MariaDB 10.0.13です
MySQLと思って答えて頂いて結構です

CREATE TABLE deny_days (
`id` int(11) NOT NULL AUTO_INCREMENT,
deny_day date NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY uk (denyday)
);

こんなテーブルがありまして、これは連番と日付だけが入っていく単純なテーブルです。
欲しいデータは明日以降で、且つこのテーブルに入っていない直近の日付です。
このテーブル内のデータが
(1,2014-08-22),
(2,2014-08-24),
(3,2014-08-26)
だとしたら、
2014-08-23が欲しいデータです
どのようにすれば取れるでしょうか
242NAME IS NULL:2014/08/21(木) 22:42:23.80 ID:???
>>241
そもそもSQLは存在しないデータを生み出すためのものじゃない

カレンダーマスタみたいなものを用意するか再帰SQLかじゃないと出来ないんじゃない
MariaDBって再帰SQL使える?それかプロシジャ作るか

連続した空き日付は無いって前提なら標準的なSQLだけで出来なくはないかも
243NAME IS NULL:2014/08/22(金) 00:30:39.41 ID:???
>>241
select min(t1.deny_day)
from
(select deny_day + 1 as deny_day from deny_days union all select '2014/8/22'::date + 1) t1
left join
(select deny_day from deny_days) t2 using (deny_day)
where
t2.deny_day is null
and t1.deny_day > '2014/8/22'::date
244243:2014/08/22(金) 00:32:11.66 ID:???
あ、mysqlで試してないけど、おかしなことはしてないから大丈夫と思ってそのまま書いた。
ダメだったらいってください。
245NAME IS NULL:2014/08/22(金) 06:45:09.44 ID:???
>>243
出来ました、ありがとうございます。
日付計算をdeny_day + INTERVAL 1 DAYにして、"2014/8/22"::dateの部分はDATE(NOW() + INTERVAL 1 DAY)にするとMySQLでも動きました。
246NAME IS NULL:2014/08/23(土) 15:17:09.89 ID:???
>>243
詳しく無いけど
こういうトリッキーな技は業務でも使われてるの?
DB業界では可読性とか保守性とかは気にしないの?動けばいいの?
最適化されるのか知らないけど(内容の割りに)糞遅くなりそうだし。

このスレ的にはSQLだけで何とかするのが正解で回答者もパズル感覚で答えてるんだろうから、ここだけの話と信じたい。
247NAME IS NULL:2014/08/23(土) 15:21:08.17 ID:???
今回の場合速度って問題になるか?
日付だろ、100年分毎日入ってたとしても3万行だぞ
可読性もそんなに悪いと思わないし、わからなきゃサブクエリ1個ずつ実行してみて納得すればいい
248NAME IS NULL:2014/08/23(土) 15:39:18.20 ID:???
>>243で目的は達成できてるようだし
要件が足りないなら改めて聞き直せばいい事だな
エスパーお節介もほどほどに
249NAME IS NULL:2014/08/23(土) 16:03:36.59 ID:???
>>246
なに、その上から目線?
それなら、こうするべきだという、お手本を是非みせてくださいよ。
250NAME IS NULL:2014/08/23(土) 16:07:24.24 ID:???
ドキュメントに >>241 の内容書いときゃ大丈夫だぁ
251NAME IS NULL:2014/08/23(土) 16:20:11.77 ID:???
>>249
放置しとけ
人のコードを見ると頼みもしないのに身勝手な論評を
始める人って2ちゃんにはよくいるんだよ
252NAME IS NULL:2014/08/23(土) 16:27:25.12 ID:???
>>247
内容の割りに遅そうだって言ってるじゃん
>>243をどういう場面で使うかによるでしょ
>>248はごもっとも
253NAME IS NULL:2014/08/23(土) 16:58:49.29 ID:???
>>246
業務ならトリッキーだろうがなんだろうが、どうにかして求められる答えを出さないとならない
SQLがトリッキーになるのは大概設計が悪いんだが、設計段階終わってたら簡単には変えられん

速度に関して言えばホストアプリやプロシジャでやるより早いだろ

納得できないならあれ以上早くて綺麗な解決方法を提示したうえで反論してね
254NAME IS NULL:2014/08/23(土) 17:07:47.51 ID:???
>>253
実務だったらホストアプリでやるのがベターだと思っただけなんだ
ホストアプリと>>243どっちが速いかは使い方次第だよね?
それ以外はあなたの言う通り
255NAME IS NULL:2014/08/23(土) 17:56:10.60 ID:???
>>243がトリッキーだと思う人は集合論的な考えができない人だけだと信じたい。

論じるべきは、トリッキーでもなんでもない>>243
ホストアプリでループしながらクエリを発行することのどちらがよいかではないかな。
256NAME IS NULL:2014/08/23(土) 18:05:45.89 ID:???
>>255
そういうのは、処理速度以外も含めて総合的な判断でするものだと思うよ
特にメンテナンス性の容易さは重要な要素だと思う
257NAME IS NULL:2014/08/23(土) 18:18:01.11 ID:???
>>254
速度問題にしたのはお前じゃないのか?
使い方次第って、どういう使い方の想定かしらんが、ホストアプリで複数回のクエリ発行するなら
一般的なDBMSならまず間違いなく>>243の方が早いぞ。オプティマイザが腐ってなければ

>>255
SQLは存在しないデータを生成するためのものじゃない
そういう意味でもあれはトリッキーなのは間違いない

>>256
仕様書なりコメントなりがちゃんとしてればあれぐらいは許容範囲じゃね
258NAME IS NULL:2014/08/23(土) 18:29:43.03 ID:???
>>257
うん、仕様書がきちんとしてあれば問題ない
259NAME IS NULL:2014/08/23(土) 18:38:10.14 ID:???
>>254
>速度問題にしたのはお前じゃないのか?
うん。最初のレスからずっと一貫して速度はきにしてますよ。
ホストアプリの方が速い気がしてた

>使い方次第って、どういう使い方の想定かしらんが、
このクエリを更にサブクエリとして使うケースとか

>一般的なDBMSならまず間違いなく>>243の方が早いぞ。オプティマイザが腐ってなければ
そうなのか
ちなみに答えが見つからない場合は?
普通にタイムアウト?
260NAME IS NULL:2014/08/23(土) 18:48:27.03 ID:???
>>259
相関サブクエリじゃない限り何回も実行されることはないよ
相関サブクエリだとしたら、それこそSQLで処理するしかなくなるよね?
261NAME IS NULL:2014/08/23(土) 19:16:06.96 ID:???
>>259だけど今更ちゃんとクエリよんだらタイムアウトとか頓珍漢なこと言ってたね。
>>260
なるほど。ありがとう
262NAME IS NULL:2014/08/23(土) 20:25:24.07 ID:???
>>257
> そういう意味でもあれはトリッキーなのは間違いない

update t set c = c + 1 where ~

トリッキー?
263NAME IS NULL:2014/08/23(土) 21:30:41.51 ID:???
>>257
今回の場合は存在しないデータを生成する行為に当たらないってことだよ。

存在しないデータを生成するためのものじゃないっていう知識を得てしまったばかりに
そこで思考停止しちゃってんだろうなぁ。
264NAME IS NULL:2014/08/23(土) 22:08:00.04 ID:???
なまじ結果がでてるだけに、本質が見えなくなってるのね
思考停止はどっちなんだか
265NAME IS NULL:2014/08/23(土) 22:47:41.95 ID:???
>>264
>>262

データを生み出すための元ネタがある限り、
それは存在しないデータを生成する行為じゃないってことぐらいわからんかな
もっかい>>8でもよめば?
266NAME IS NULL:2014/08/23(土) 22:50:03.22 ID:???
本質ってw
ホストアプリで解決を試みることがいかに本質から外れているか気づいてないんだなw
267NAME IS NULL:2014/08/23(土) 23:11:01.86 ID:???
>>265
だから >>243 には、元データがあるって言ってるんだが、アホなの?
268NAME IS NULL:2014/08/23(土) 23:41:47.06 ID:???
え?だから>>263>>265を書いたんだけど。
>>257みたいな勘違いさんは見事に思考停止してるでしょ?

てか、>>264>>263への反論ではないってことか。
269NAME IS NULL:2014/08/24(日) 00:14:57.02 ID:???
>>262が勘違いした可能性があるな。
270NAME IS NULL:2014/08/24(日) 05:23:24.43 ID:???
ひょっとして >>265 では、>>264>>262 を見ろって言う意味で書いてる?

>>269
アホは、絡んで来るなよ...
271NAME IS NULL:2014/08/24(日) 06:11:46.00 ID:???
>>262
あれは元テーブルに存在しない今日(+1)をunionしてるところがミソだぞ
計算で値を出すこと自体がデータ生成じゃないのなんて当たり前だぞ

今日(+1)をunionすることがデータ生成かそうじゃないかならまあ好きに議論してくれ
272NAME IS NULL:2014/08/24(日) 15:28:14.32 ID:???
>>270
ひょっとしなくてもそうだろ。流れ的に。
273272:2014/08/24(日) 15:33:33.43 ID:???
IDがないから、分かってる人と分かってない人の区別がつかなくなって
分かってる人同士で変なことになるのはよくあることだとは思うよ。
274NAME IS NULL:2014/08/24(日) 15:52:57.85 ID: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
275NAME IS NULL:2014/08/24(日) 16:05:50.95 ID:???
あらあら、これこそトリッキーな何かを仕込まないと無理そうな気がする。
前日が存在しないものと翌日が存在しないもので末端は見つけられるけど、
それを横につなげるのが大変そうという点で。
276NAME IS NULL:2014/08/24(日) 16:23:14.98 ID:???
>>274
前後が孤立している、前にも後ろにも間がある単独レコードは
START_YMD=END_YMDの1件という処理でいいの?
277NAME IS NULL:2014/08/24(日) 16:43:15.06 ID:???
>>276
そうだと思う。
末端値に対して ID YMD の昇順で連番振ってそれをキーに結合すればよいだけだと思う。
278NAME IS NULL:2014/08/24(日) 16:43:50.36 ID:tWIgsl3k
レスありがとうございます。

>>275
今のところLAG関数を使って前後のレコードを分析するのがいいのでは・・・と考えてます。
おっしゃるとおり、前日に存在しないもの、翌日に存在しないもの、というのは簡単でしたが、
それを横につなげるうまい方法がわかりません。。

>>276
はい。
テーブルデータ
1 20140101
1 20140103
1 20140105
上記の場合、欲しい結果は以下になります。
ID START_YMD END_YMD
1 20140101 20140101
1 20140103 20140103
1 20140105 20140105
279NAME IS NULL:2014/08/24(日) 16:49:27.88 ID:???
>>278
横につなげるキーとして
row_number() over (order by id, ymd) as row_number
を作ったら素直にいけないかな。
280274:2014/08/24(日) 17:01:53.27 ID:???
>>279
レスありがとうございます。
すみません。。ちょっとわからないです。
row_numberを使用して採番して、それをどう横に展開するのかイメージできません。
281NAME IS NULL:2014/08/24(日) 17:11:59.32 ID:???
> 前日に存在しないもの、翌日に存在しないもの、というのは簡単

これに、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

これを横につなげればよいと思うよ。採番値をキーに。
282274:2014/08/24(日) 17:30:39.66 ID:???
>>284
なるほど!でいそうですね。

ただ、WHERE句で日付を絞るとうまくいかないように思えます。
一度フルスキャンしてから、という方法しかないでしょうか?
283NAME IS NULL:2014/08/24(日) 17:43:02.72 ID:???
>>282
> WHERE句で日付を絞るとうまくいかないように思えます。

1/2以降で取得したいってときにも20140101 - 20140103 と出したいなら、
指定日以前の開始末端値以降のデータを使えばいいよね。
20140102 - 20140103 と出てもいいのなら単に絞ればいいし。
前者の場合はwithを使ったほうがよさげ。
284274:2014/08/24(日) 17:50:23.77 ID:???
>>283
レスありがとうございます!
なんとかなりそうです!感謝!!
285NAME IS NULL:2014/08/30(土) 21:11:15.39 ID:enm/9WWz
Oracle 10g

以下のSQLを実行すると、OR内で外部結合するなとエラーになります。
unionを使用しないで実現する方法はありますでしょうか?
よろしくお願いします。

select * from tableA A,tableB B
where
(A.ID = B.ID(+) and A.Type = 'A' and B.No(+) = '001' and B.VER(+) = '1')
OR (A.ID = B.ID(+) and A.Type = 'B' and B.No(+) = '002' and B.VER(+) = '1')
OR (A.ID = B.ID(+) and A.Type = 'C' and B.No(+) = '003' and B.VER(+) = '1')
286NAME IS NULL:2014/08/30(土) 21:30:25.35 ID:???
tableA A left join tableB B using (ID)
where
(A.Type = 'A' and (B.ID is null or B.No = '001' and B.VER = '1'))
or (A.Type = 'B' and (B.ID is null or B.No = '002' and B.VER = '1'))
or ...

ってことかなぁ
287NAME IS NULL:2014/08/31(日) 10:17:18.52 ID:???
select * from tableA A,tableB B
where
A.ID = B.ID(+)
and B.ID not is null
and B.VER(+) = '1'
and (
(A.Type = 'A' and B.No(+) = '001' )
OR (A.Type = 'B' and B.No(+) = '002')
OR (A.Type = 'C' and B.No(+) = '003')
)
288NAME IS NULL:2014/09/01(月) 00:21:23.25 ID:ufzSgRWS
mysql5.5を使っています。

select today.point - yesterday.point
from (select point from points where date = '2014-08-31') as today
left join (select point from points where date = '2014-08-30') as yesterday
on today.user_id = yesterday.user_id

このSQLを実行すると、todayのデータはあってもyesterdayのデータがないとき
nullになってしまうのですが、yesterdayのデータがないときは
yesterday.pointを0として計算する方法はないでしょうか?
289NAME IS NULL:2014/09/01(月) 00:34:37.24 ID:???
select today.point - coalesce(yesterday.point, 0)
290NAME IS NULL:2014/09/01(月) 10:01:28.05 ID:???
>>289
できました! ありがとうございます
291NAME IS NULL:2014/09/01(月) 13:25:34.56 ID:???
何度も質問すみません
>>289の today.point - coalesce(yesterday.point) がマイナスのときは0にするということはできますか?
292NAME IS NULL:2014/09/01(月) 13:42:48.70 ID:???
coalesce はNULLの時に次のパラメタを返す関数
条件入れたければ CASE WHEN でどう?
293NAME IS NULL:2014/09/01(月) 17:15:41.79 ID:???
>>292
できました! ありがとうございます
294NAME IS NULL:2014/09/03(水) 20:37:45.24 ID:0t9jRBQp
仕事で詰まっているので質問させてください
(なお、どうしても急いでいるためSQLserverのスレにも
質問させていただきました連投すみません)

C#でストアドを呼び出します。
その後、Sqlserverのストアドの戻り値を
呼び出したC#で受け取る方法はありますでしょうか?

コーディングレベルで教えていただければと思います。


具体的に話しますと、
ストアドで複数テーブルをDELETEしたりINSERTしたりします。
どのテーブルでどのような処理(DELETE、又は、INSERT)で異常終了したかを知り
その情報をC#で受け取りたいです。

ただ、ストアドは正常系のリターン0、異常系のリターン1の2択しかなかったような気がして
無理なんでしょうか?
リターン値に値セットしても、C#では正常0、異常1しか戻らないし
困ってます
295NAME IS NULL:2014/09/03(水) 20:52:02.18 ID:???
>>294
> ストアドは正常系のリターン0、異常系のリターン1の2択しかなかったような気がして
どこにそんなこと書いてあんの?
296NAME IS NULL:2014/09/03(水) 20:52:14.43 ID:???
知らないしお前の態度も気に入らない
297NAME IS NULL:2014/09/03(水) 20:55:59.23 ID:???
×SQLServer と SQLスレにマルチポスト
△C# と SQLServerスレにマルチポスト
○MSDN読む
298NAME IS NULL:2014/09/03(水) 20:59:41.58 ID:???
SQLServerスレで5分レスがつかなかっただけでマルチポストするような人が
15分レスがついてないこのスレにまだいるはずがないね。
299NAME IS NULL:2014/09/03(水) 21:17:27.62 ID:???
マルチポストのチェックって、何分間隔でしているんですか?
300NAME IS NULL:2014/09/04(木) 10:19:11.36 ID:???
基本的に関連するスレを巡回してるんだから
同じ質問を何度も読まされればうんざりするでしょ
301NAME IS NULL:2014/09/04(木) 15:12:28.31 ID:???
mysql5.5を使用しています。
SELECT id, a, b, c, (a + b + c) / 3 as heikin, (SELECT count(id)+1, (a + b + c) / 3 as heikin FROM points b WHERE b.heikin > a.heikin) as ranking
FROM points a
ORDER BY ranking DESC;

こう書くとUnknown column 'b.heikin' in 'where clause'というエラーが出てしまいます。
どう書くべきですか?
302NAME IS NULL:2014/09/04(木) 15:21:50.84 ID:???
テーブル「a」fromに無くね?
303NAME IS NULL:2014/09/04(木) 16:40:34.12 ID:???
>>301
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列込みのサブクエリを挟むなど。
304NAME IS NULL:2014/09/04(木) 16:56:15.48 ID:???
>>303
「where句に select句で作成した列は使えない」知りませんでした・・・
勉強になりました。ありがとうございます
305NAME IS NULL:2014/09/04(木) 18:28:46.71 ID:???
>>303
> where句に select句で作成した列は使えない。

これなんでできるようにならないんだろう。
>>301 じゃないけど、select に書いた式を where とか、group by にコピペする度になんとかならないものかと思う。
実行時に展開してくれればいいだけだから、実装が難しいとは思えないんだが...
306NAME IS NULL:2014/09/04(木) 23:21:45.23 ID:???
>>300
偶に巡回するスレ全部にそいつが居た・・・
死ねばいいのにと思っちゃった
307NAME IS NULL:2014/09/05(金) 04:15:16.91 ID:???
>>305
havingじゃダメか?
308NAME IS NULL:2014/09/05(金) 06:07:11.82 ID:???
>>307
ん?
ちょっと意味わからん。
309NAME IS NULL:2014/09/16(火) 09:28:13.48 ID:f4Wsk25V
MYSQL MYSQL-5.5.39-WINX64.MSI をインストールする

http://know-how-tree.com/archives/644
310NAME IS NULL:2014/09/30(火) 14:51:02.00 ID:???
SQLServer2012です
日々の売上の合計が一定額を越えた日を知るにはどうすればいいでしょうか?

10/1 |\100
10/2 |\200
10/3 |\300
10/4 |\200
10/5 |\400
10/6 |\100

上記で\1000を越えた日=10/5と出したいです
311NAME IS NULL:2014/09/30(火) 17:05:29.85 ID:???
SELECT min(date) FROM (SELECT date, t1.price, (SELECT SUM(price) FROM table t2
WHERE t1.date >= t2.date ) AS sum_price FROM table t1 ORDER BY date) a
WHERE sum_price > 1000;

とか、、、Window関数あるならそれ使ったほうが簡潔
312NAME IS NULL:2014/09/30(火) 17:17:45.63 ID:???
>>311
ありがとうございます
やってみます
313NAME IS NULL:2014/10/01(水) 00:02:45.65 ID:???
>>311
サブクエリの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とるぐらいなら並べ直して先頭行取る方がわかりやすい気が
314NAME IS NULL:2014/10/01(水) 05:55:07.34 ID:???
>>313
311はSQL serverで動くでしょ
315NAME IS NULL:2014/10/01(水) 15:29:44.48 ID:???
>>314
>メッセージ 1033、(略
>TOP、OFFSET、または FOR XML が指定されていない場合、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では ORDER BY 句は無効です。
ORDER BY削らないと動きません
2012EXPRESSで確認してるけど、それ以降のバージョンで動くようになってたらしらん
316NAME IS NULL:2014/10/02(木) 09:32:51.93 ID:???
mysql 5.6.20

master
code (pk)
sname
kbn1
kbn2


datatbl
code
month
sname
kbn1
kbn2

(pkは code+mnonth)

とあります。
datatblは都合上masterにないcodeも存在しています。
(だから外部制約は掛けていません)
で、datatblのsname,kbn1,kbn2について
masterに存在するなら
一括で更新したいのですが、
update datatbl
set

のところでどう書けば良いのでしょうか?
317NAME IS NULL:2014/10/02(木) 15:15:58.64 ID:???
>>316
UPDATEはDBMSごとの差が大きいんだよなぁ
MySQLはUPDATEにJOIN使えるっぽいから

update datatbl join master using (code)
set datatbl.sname=master.sname,
...

とかで行けるんじゃね?試してないけど
318NAME IS NULL:2014/10/02(木) 15:44:02.51 ID:???
>>315
へぇぇ。なんかケチだなぁと思っちゃう。
無効です→無視されますにして、警告どまりでいいような気がするんだけどね。
319NAME IS NULL:2014/10/02(木) 15:50:30.61 ID:???
>>316
ところで、datatbl.kbn1 がすでに設定されている場合にも更新するの?

つまり、datatbl.kbn1 kbn2 を削除して、参照時にmasterと結合するのを提案したい。
320NAME IS NULL:2014/10/02(木) 16:26:12.44 ID:???
>>317
こういう書き方ができるの初めて知りました。感謝

>>319
そうです。masterに登録されていたらそちらの情報優先という事です。
321NAME IS NULL:2014/10/02(木) 17:39:01.34 ID:???
>>320
master優先なら datatbl に持つ必要がないという話です。
単に正規化という言葉でもいいけど。
322NAME IS NULL:2014/10/02(木) 17:56:57.09 ID:???
あぁそういう事ですか。そうすべきなんでしょうが、316にもちょろっと書きましたが、
masterにないcodeも持つ必要があり、そういうcodeのためにそうしているんですよ。

masterにないcodeとは何ぞやってな話にもなってしまうんですが、ま、そこら辺は
都合上ってことで^^;;
323NAME IS NULL:2014/10/02(木) 18:00:50.10 ID:???
datatblの更新と同時にmasterのレコード追加がめんどくさいからそうなってしまったというのが、ありがちな流れかなぁ。
324NAME IS NULL:2014/10/16(木) 17:47:14.74 ID:uSecLKVY
scはミス、再度質問失礼します

MySQL5.5

id aa bb cc
1 1 1 0
2 0 0 1
3 1 0 1

というテーブルから値が1のカラム名を取得できないでしょうか?

1 aa,bb
2 cc
3 aa,cc
325NAME IS NULL:2014/10/16(木) 17:53:57.98 ID:???
aa,bbみたいに文字で取りたいならIFで書くしか無いんじゃね
326NAME IS NULL:2014/10/16(木) 20:03:11.92 ID:???
取得したカラム名の用途次第だと思うけれど、
どうしても本当に「カラム名」でなければならないならinformation_schema使う
327NAME IS NULL:2014/10/16(木) 20:18:46.27 ID:???
列数可変は置いといて
問題はinformation_schemaとどうJOINさせるかだと思うが

なぜそんな事をやりたいのかわからんが
ホストアプリある前提ならホストアプリで列名みるのが手っ取り早そうだ
328NAME IS NULL:2014/10/16(木) 20:38:09.60 ID:???
select id, group_concat(col) from
(
select id, 'aa' as col
from test_test
where aa = 1
union all
select id, 'bb' as col
from test_test
where bb = 1
union all
select id, 'cc' as col
from test_test
where cc = 1
) as a
group by id
order by id
329NAME IS NULL:2014/10/16(木) 20:55:01.34 ID:???
group_concatなんて始めて知ったわ…あまり使いたくないなw
330NAME IS NULL:2014/10/16(木) 21:02:53.49 ID:???
select id,
concat_ws(',',
if(aa = 1, 'aa', null),
if(bb = 1, 'bb', null),
if(cc = 1, 'cc', null))
from test_test
331NAME IS NULL:2014/10/16(木) 21:03:46.65 ID:???
じゃあこうかな。

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
332NAME IS NULL:2014/10/16(木) 21:04:48.27 ID:???
おおう、concat_wsしらなかった。>>330で。
333NAME IS NULL:2014/10/30(木) 10:29:02.45 ID:???
SQLServerでストアド内で別のストアドを呼び出して
その結果(テーブル)を作業テーブルに入れたいです。

別ストアドが返すテーブルのレイアウトに従って
事前に create table #tmp 〜 しておいて
insert into #tmp exec 別ストアド〜 したら出来るのは分かるんですが
select into ぽくやることできないですか。

別ストアドが返すテーブルレイアウトが変更されるたびに(項目が追加されるたびに)
呼ぶ側のストアドが影響を受けたくありません。
334NAME IS NULL:2014/10/30(木) 14:10:35.44 ID:???
select intoでもinsert selectでも列名書いてやれば良いんじゃないのか
335NAME IS NULL:2014/10/30(木) 19:41:19.15 ID:???
「sqlserverの」select into 使えばいいんじゃない
http://msdn.microsoft.com/ja-jp/library/ms188029.aspx
336NAME IS NULL:2014/10/31(金) 16:27:26.79 ID:???
別ストアドの名前をどこに書くんだ?
337NAME IS NULL:2014/11/03(月) 21:58:24.62 ID:???
プログラムをシーケンス図、データベースをER図などでドキュメント化するように、SQLをドキュメント化する場合に標準の形式ってありますか?
338NAME IS NULL:2014/11/08(土) 10:06:39.97 ID:???
・DBMS Mysql Verは5.5.36

・テーブルデータ
+--------+--------+---------+
| 部品ID | 部品名 |製造番号 |
+--------+--------+---------+
| B1  | 部品A | No001  |
| B2  | 部品A | No002  |
| B3  | 部品B | No001  |
| B4  | 部品B | No002  |
| B5  | 部品C | No001  |
| B6  | 部品C | No002  |
| B7  | 部品A | No003  |
| B8  | 部品A | No004  |
| B9  | 部品B | No005  |
| B10  | 部品B | No006  |
+--------+--------+---------+


・テーブルほしい結果
+---------+-------+-------+-------+
|製造番号 | 部品A | 部品B | 部品C |
+---------+-------+-------+-------+
| No001  | B1  | B3  |  B5 |
| No002  | B2  | B4  |  B6 |
| No003  | B7  | NULL | NULL |
| No004  | B8  | NULL | NULL |
| No005  | NULL | B9  | NULL |
| No006  | NULL | B10  | NULL |
+---------+-------+-------+-------+

生産管理記録です。
製品は部品A 、 部品B 、 部品Cで構成され
各製品にどのIDの部品が使用されたかを記録
したいです。

当該部品が無い箇所はNULLにすることで、
生産途中の状態もある程度把握できるように
したいと考えています。


最初から結果に相当するテーブル作れと
突っ込みが入りそうですが、部品DEFGで
違う製品をつくったりもするので、製品が増えるたびに
テーブルが増えるのも大変かなと思って
質問してみることにしました。


初心者なのでヒントだけでもいただければ
幸いと考えいます。
339NAME IS NULL:2014/11/08(土) 11:56:25.20 ID:???
>>338
>>7 参照のこと
アプリケーションでやった方がいい
340>>338:2014/11/08(土) 12:40:26.91 ID:???
今回、出力する列は製造番号,部品A , 部品B , 部品C の4つで
固定したいのですが、無理でしょうか?

見かけはクロス集計の変形みたいな感じです。

こんな感じの3つの表をつくって最後に製造番号で結合すれば
いいかなっと思っているのですが、SQL的にどんな手順を踏めば
いいのかがわかりません。。。


+---------+-------+
|製造番号 | 部品A |
+---------+-------+
| No001  | B1  |
| No002  | B2  |
| No003  | B7  |
| No004  | B8  |
| No005  | NULL |
| No006  | NULL |
+---------+-------+


+---------+-------+
|製造番号 | 部品B |
+---------+-------+
| No001  | B3  |
| No002  | B4  |
| No003  | NULL |
| No004  | NULL |
| No005  | B9  |
| No006  | B10  |
+---------+-------+


+---------+-------+
|製造番号 | 部品C |
+---------+-------+
| No001  |  B5 |
| No002  |  B6 |
| No003  | NULL |
| No004  | NULL |
| No005  | NULL |
| No006  | NULL |
+---------+-------+
341NAME IS NULL:2014/11/08(土) 13:35:48.89 ID:???
CASE
342NAME IS NULL:2014/11/08(土) 13:53:19.40 ID:???
>>338
質問は、既存の生産管理記録テーブルに対する問い合わせではなく、
生産管理記録のテーブル設計方法なのかな?
それならば、ここではなく「DB設計」で質問するのが適切だと思う

DB設計としては >>338 で間違っていないので、以下のように考えよう:
・製品テーブル、部品テーブル、製品構成テーブルがある
・製品テーブルは (製造番号, .....) というカラムを持ち、製造番号 が PK である
・部品テーブルは (部品ID, 部品名, .....) というカラムを持ち、部品ID が PK である
・製品構成テーブルは製品テーブルと部品テーブルを結合するテーブルであり、
 (製造番号, 部品ID, 部品名) というカラムを持つ
・製品構成テーブルのタプル (部品ID, 部品名) に対してユニーク制約をかける
 この制約により、ある製品が複数の同じ部品から構成されることを防ぐ

また >>340 について、表を分離する必要は無いし NULL を認めるカラムを設計すべきではない
ある製品である部品が使われていないことは、製品構成テーブルにロウが存在しないことで表せるのだから

あとこのDB設計における製品製造ルールでは、
ある製品を製造するたびに(=製品番号ごとに)部品構成が変わることを認めている
けれども一般的には製品仕様によって部品構成が決定され、それに従って製品は大量生産される
(オブジェクト指向であれば、製品仕様がクラスに、製造した製品がインスタンスに相当する)
これをどうDB設計するのかを検討することも良い演習になると思う
343NAME IS NULL:2014/11/08(土) 14:06:50.16 ID:???
>>342 を訂正
X:それならば、ここではなく「DB設計」で
O:それならば、ここではなく「DB設計」スレで
344NAME IS NULL:2014/11/08(土) 14:07:21.73 ID:???
設計方法ではなく
>>338の元テーブルから>>340の上3つの
テーブルを作り出すSQLを知りたいのでしょう
それは無理と言っているのだけどね
345NAME IS NULL:2014/11/08(土) 14:13:15.48 ID:???
列が可変じゃなけりゃ別におかしいことはなかろう。
製造番号のユニーク列と>>340の各部品毎のクエリを外部結合するだけ。
346338,340:2014/11/08(土) 14:33:12.65 ID:???
>>342

まだ全部は理解していないのですが、

製品αは部品A,部品B,部品Cで構成
製品ベータは部品C,部品D,部品F,で構成
  ・・・

っとどこかで定義しないとまずいですね。。。
今回は製品は一種類、部品A,部品B,部品Cの3種類という想定でした。
また、NULLがあるのは生産途中とか部品入荷まちみたいな状態を
考えていました。

DB設計も見直してみます。アドバイスありがとうございました。
347338,340:2014/11/08(土) 14:45:01.46 ID:???
>>344,354

Baseでは一応できました。

(1)製造番号をgroubp By
+---------+
|製造番号 |
+---------+
| No001  |
| No002  |
| No003  |
| No004  |
| No005  |
| No006  |
+---------+

(2-1) 部品A抽出
+---------+-------+
|製造番号 | 部品A |
+---------+-------+
| No001  | B1  |
| No002  | B2  |
| No003  | B7  |
| No004  | B8  |
+---------+-------+

(2-2) 部品B抽出
+---------+-------+
|製造番号 | 部品B |
+---------+-------+
| No001  | B3  |
| No002  | B4  |
| No005  | B9  |
| No006  | B10  |
+---------+-------+

(2-3) 部品B抽出
+---------+-------+
|製造番号 | 部品C |
+---------+-------+
| No001  |  B5 |
| No002  |  B6 |
+---------+-------+

(1)と(2-1)製造番号で外部結合
(1)と(2-2)製造番号で外部結合
(1)と(2-3)製造番号で外部結合


で、>>340の3つの表が得られ、最終的に>>338の表ができました。

しかし、Serect分を合計で8回(サブクエリを3層?)は、馬鹿みたいに長い
SQL分になりそうなのでちょっと中断して、>341ご指摘のCASEからの
アプローチしてみようと思います。
348NAME IS NULL:2014/11/08(土) 16:36:04.34 ID:???
あれ、案外あっさりできちゃったのね>>347
自分の考察では、クエリを18個作って横に連結するという
非現実的なやり方しか浮かばなかったので…正直スマンカッタ
一回のみの臨時作業ならこれでいいんじゃない?
349NAME IS NULL:2014/11/08(土) 18:39:36.82 ID:???
>>347
サブクエリ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だといいかげんな結果出力するかもしれん
350349:2014/11/08(土) 18:46:19.66 ID:???
×部品名が一意に決まらんと
○部品A,B,Cに対する部品IDが一意に決まらんと
に修正しとく
351NAME IS NULL:2014/11/09(日) 01:23:14.29 ID:???
>>337
無い
352347:2014/11/09(日) 09:41:29.15 ID:???
>>347,340です

>>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.`製造番号`
353347:2014/11/09(日) 09:49:36.92 ID:???
おっと>>524は``のつけ方間違っていました``とれば大丈夫だと思います。


ちなみに 当初の目的であるデータ のテーブルからだけでもできました。
今のところと使いどころがないですが(笑)

SELECT DISTINCT データs.製造番号,
データs.製造番号 as '製造番号S',
データA.部品ID as '部品A',
データB.部品ID as '部品B',
データC.部品ID as '部品C'
FROM データ ss

Right JOIN (SELECT データ.製造番号 From データ GROUP BY データ.製造番号) as データs
ON ss.製造番号 = データs.製造番号

LEFT JOIN ( SELECT データ.製造番号, データ.部品ID From データ WHERE 部品名='部品A' ) as データA
ON ss.製造番号 = データA.製造番号

LEFT JOIN ( SELECT データ.製造番号, データ.部品ID From データ WHERE 部品名='部品B' ) as データB
ON ss.製造番号 = データB.製造番号

LEFT JOIN ( SELECT データ.製造番号, データ.部品ID From データ WHERE 部品名='部品C' ) as データC
ON ss.製造番号 = データC.製造番号


スレを下さった方々とは違う形ではありますが、おかげさまで一先ず目的は達成できました。
(ホントは、もっとスマートにできそうですね。)

ありがとうございました。
354NAME IS NULL:2014/11/09(日) 09:56:26.43 ID:???
case文がsqlserverなのでアレンジして試して

SELECT
製品No.`製造番号` as '製造番号',
case `部品名` when `部品A` else null then `部品ID` end as '部品A',
case `部品名` when `部品B` then `部品ID` end as '部品B',
case `部品名` when `部品C` then `部品ID` end as '部品C',
FROM 製品 製品No
inner JOIN `データ`
ON 製品No.`製造番号` = `データ`.`製造番号`
355NAME IS NULL:2014/11/09(日) 10:42:26.99 ID:???
>>351
それ微妙ですね
コード読むしかないのか
356NAME IS NULL:2014/11/09(日) 10:50:47.62 ID:???
>>354
>>338が期待したものとぜんぜん違う歯抜けの結果が返ってきそうだが。
ひょっとしてSQLServerはこれでいけるのか?
357NAME IS NULL:2014/11/09(日) 11:01:59.80 ID:???
>>355
世界標準が無いだけで、会社の示した標準はあるでしょ

シーケンス図=ER図、プログラムソース=SQLソースはコーディング規約とヘッダ情報書
プログラムソースのドキュメント=SQLソースのドキュメント
358NAME IS NULL:2014/11/09(日) 11:21:51.57 ID:???
>>356
ああ、済まん
製造番号は重複しないと思ってたわ
359NAME IS NULL:2014/11/09(日) 12:06:02.46 ID:???
select
製造番号,
max(case when 部品名 = '部品A' then 部品ID else null end) as "部品A",
max(case when 部品名 = '部品B' then 部品ID else null end) as "部品B",
max(case when 部品名 = '部品C' then 部品ID else null end) as "部品C"
from テーブルデータ
group by 製造番号
order by 製造番号
360NAME IS NULL:2014/11/09(日) 12:10:40.53 ID:???
名前てmaxいけるんだっけ
361NAME IS NULL:2014/11/09(日) 12:16:52.66 ID:???
>>359
あと、それだとnull上書きになるかもなのでmaxはcase内が良い
362338:2014/11/09(日) 14:55:48.28 ID:???
>>356

すごい、すっきりしてます!
それにクロス集計っぽいのがいいです!



>>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 製造番号
363NAME IS NULL:2014/11/09(日) 16:47:31.95 ID:???
max(null)はnullのはずだが、MySQLでは違うのか?
364NAME IS NULL:2014/11/10(月) 00:42:53.19 ID:???
>>362
359で上手くいくなら、それで完結でいいかと
365NAME IS NULL:2014/11/10(月) 13:56:29.54 ID:???
なんだこの流れは。

この2行で終わる話じゃないのかい。
>>338
>>5
366NAME IS NULL:2014/11/10(月) 22:23:42.07 ID:???
WITH RECURSIVEとCASEはどのDBでもSQL99互換にして欲しいわ
367NAME IS NULL:2014/11/10(月) 23:30:02.89 ID:???
caseってそんなに違う?
368NAME IS NULL:2014/11/11(火) 00:33:34.11 ID:???
違いを気にしたことはなかったけど、なんか変わってんのかな?
369NAME IS NULL:2014/11/11(火) 14:45:51.02 ID:c2NG27AU
■使用DB firebird 1.03
■受注table
受注Num 顧客名
1    A社
2    B社

■明細table
受注Num アイテムNum 数量
1    1      100
1    2      10
1    3      20
2    1      50


■アイテムtable
アイテムNum 種別 名前
1      果物 りんご
2      野菜 だいこん
3      果物 みかん

■欲しい結果
果物 2件 野菜 1件

種別ごとの受注件数を出したいです。なので果物の受注件数は3でなく2です。
SELECT COUNT(DISTINCT 受注Num) FROM 受注table j, 明細table m, アイテムtable i
WHERE j.受注Num = m.受注Num AND m.アイテムNum = i.アイテムNum
AND i.アイテムNum = 1; --で、果物の件数、2で野菜の件数
と2回問い合わせればできるようなのですが、1回でできないでしょうか。
※DBの都合でCASE文は使えないです。
370NAME IS NULL:2014/11/11(火) 14:51:30.20 ID:???
1.0とか投げ捨てようぜ
371NAME IS NULL:2014/11/11(火) 16:07:30.52 ID:???
group by をしらないのか、使えないDBなのかしらんが
372NAME IS NULL:2014/11/11(火) 16:14:41.50 ID:???
>>369
やりたい事がいまいちわからん
>AND i.アイテムNum = 1; --で、果物の件数、2で野菜の件数
>と2回問い合わせればできるようなのですが
アイテムNum=3の果物はどうするんだよ

受注件数ってのは受注Num単位でってことか?
明細とアイテムjoinしたものを種別でグループ化して、受注Numのcount(distinct) で出来る気がするが

SQLがどこまでサポートされてるかは知らん
373NAME IS NULL:2014/11/11(火) 16:38:50.19 ID:???
>>370
そうしたいです。
>>371
使えるのですが使い方がわかりません。
>>372
種別ごとなので、例で言えば 果物と野菜の2種類です。
果物と野菜の受注(注文)がそれぞれ何件あるかということです。
ここでいう受注というのは、注文回数のことで、1回の注文で
果物が5つ注文されていても、1件とカウントします。
果物を2つと野菜を4つ1回の注文でなされていたら
果物1件、野菜1件とカウントします。
説明が下手ですみません。
374NAME IS NULL:2014/11/11(火) 17:05:36.91 ID:???
select 種別, count(*) from 明細table join アイテムtable using (アイテムNum) group by 種別

こういうことじゃないの?
"果物 2件 野菜 1件"という文字列が欲しいのなら、それはクエリでやることじゃない。
どうしてもというならできるが非効率だ。
375NAME IS NULL:2014/11/11(火) 17:26:09.21 ID:???
>>374
> "果物 2件 野菜 1件"という文字列が欲しいのなら、それはクエリでやることじゃない。
> どうしてもというならできるが非効率だ。

select 種別, 種別 + to_char(count(*))
ってやるのが非効率?
376NAME IS NULL:2014/11/11(火) 17:52:58.30 ID:???
>>373
1回の注文とかいっても、お前が知ってても通じないんだよ
1回の注文ってのは受注Numが同じものは1回の注文でいいのか?
アイテムNum=3も1も同じ果物としてカウントしていいのか?
>>372のやり方のSQL書いて思う結果と違ったのか?
それとも、そもそもそのSQLが書けなかったのか?

>>375
"果物 2件","野菜 1件"(という2行)ではなく、"果物 2件 野菜 1件"の1行が欲しいなら、ってことかと
377NAME IS NULL:2014/11/11(火) 17:57:42.91 ID:???
>>375
え、そこ?
group_concat使えばいいじゃんっていう特定RDBMS脳ですらないことに感動した
378NAME IS NULL:2014/11/11(火) 18:16:13.37 ID:???
うーむ、
> ■欲しい結果
> 果物 2件 野菜 1件
で、"果物 2件 野菜 1件"が欲しいと判断する人のが多数なのか。
379NAME IS NULL:2014/11/11(火) 18:21:05.39 ID:???
神経質、早とちり、小さな親切大きなお世話
これをセットで持ってる人多いからね
380NAME IS NULL:2014/11/11(火) 18:47:07.34 ID:???
質問者の様子を見ればそれを欲しがっていてもおかしくないと判断するわな
381NAME IS NULL:2014/11/11(火) 19:13:31.94 ID:???
そう判断したのは>>374だけじゃないのか
それも可能性としてはそう高くないと感じてるような言い方だが
まあ>>374の本意が>>376に沿ってるのかどうかも解らんが
382NAME IS NULL:2014/11/12(水) 10:19:47.65 ID:???
普通に入力と出力例書けばいいだけなのに、文章で説明しようとするからややこしくなるw
383369:2014/11/12(水) 15:36:57.42 ID:???
ええと、説明下手ですみません。どこからどなたに返答していいものやら・・・
>>376
受注Numが同じものは、1回の注文です。
アイテムNumの3も1も果物としてカウントします。
372のSQLは書けません。
>>374
それだと、明細の種別の集計となると思います。(果物3 野菜1)
欲しい結果は種別毎の受注Numの数なので
種別 数量
果物 2
野菜 1
です。(という書き方をしないといけなかったですね)
384NAME IS NULL:2014/11/12(水) 15:44:23.26 ID:???
>>383
select 種別, count(distinct 受注Num) from 明細table join アイテムtable using (アイテムNum) group by 種別

じゃあこれでいいんじゃないの?
count(distinct 〜が使えないならサブクエリ使って工夫すればよいと思うよ
385NAME IS NULL:2014/11/12(水) 15:46:50.22 ID:???
それでいいなら、>>372はなぜだめだったのかという話にもなるか。
386NAME IS NULL:2014/11/12(水) 17:14:38.93 ID:???
firebird 1.03 がどこまでサポートしてるのかみんなわからないからな
質問者が試して結果を書いてもらうしか無い
387NAME IS NULL:2014/11/12(水) 17:27:42.45 ID:???
ぶっちゃけ1.5か2にアプデ出来ないんだろうか
388NAME IS NULL:2014/11/12(水) 18:19:03.82 ID:???
>>383
select 種別, count(distinct 受注Num) from 明細table join アイテムtable on 明細table.アイテムNum=アイテムtable.アイテムNum group by 種別
このSQLでエラーがでるなら、出たエラーの内容正確に書いて
389369:2014/11/13(木) 18:44:31.83 ID:???
>>384
あはは、受注table必要なかったですね。なんで思い込んでたんだろう。
>>388
丁寧にありがとうございます。そのSQLでばっちりでした。
390NAME IS NULL:2014/11/14(金) 14:28:00.13 ID:???
SQL Server2012を使用し、以下のようなテーブルを作成しています。

CREATE TABLE staff
(
staff_id nvarchar(7) NOT NULL UNIQUE,
name nvarchar(100),
email nvarchar(100),
PRIMARY KEY (staff_id)
);

CREATE TABLE section
(
section_id int NOT NULL IDENTITY ,
name nvarchar(100),
code nvarchar(4),
PRIMARY KEY (section_id)
);

CREATE TABLE post
(
post_id int NOT NULL UNIQUE IDENTITY ,
name nvarchar(100),
code nvarchar(4),
PRIMARY KEY (post_id)
);

CREATE TABLE department
(
id int NOT NULL IDENTITY ,
staff_id nvarchar(7) NOT NULL UNIQUE,
section_id int NOT NULL,
post_id int NOT NULL UNIQUE,
PRIMARY KEY (id)
);

ALTER TABLE department
ADD CONSTRAINT FK01 FOREIGN KEY (staff_id)
REFERENCES staff (staff_id)
ON UPDATE CASCADE
ON DELETE CASCADE
;

ALTER TABLE department
ADD CONSTRAINT FK02 FOREIGN KEY (section_id)
REFERENCES section (section_id)
ON UPDATE CASCADE
ON DELETE CASCADE
;

ALTER TABLE department
ADD CONSTRAINT FK03 FOREIGN KEY (post_id)
REFERENCES post (post_id)
ON UPDATE CASCADE
ON DELETE CASCADE
;
391NAME IS NULL:2014/11/14(金) 14:29:58.41 ID:???
各テーブルの内容は以下の通りです。

staff(社員テーブル)
┏━━━━━━┯━━━━━┯━━━━━━━┓
┃staff_id     │name    │email         ┃
┃0000001&nbsp; &nbsp; &nbsp; &nbsp; │田中      │[email protected]    ┃
┃0000002&nbsp; &nbsp; &nbsp; &nbsp; │佐藤      │[email protected]   ┃
┃0000003&nbsp; &nbsp; &nbsp; &nbsp; │鈴木      │[email protected]    ┃
┗━━━━━━┷━━━━━┷━━━━━━━┛

section(部署テーブル)
┏━━━━┯━━━━━┯━━┓
┃section_id│name    │code┃
┃1  &nbsp; &nbsp; &nbsp; &nbsp; │A部      │0010┃
┃2  &nbsp; &nbsp; &nbsp; &nbsp; │B部      │0020┃
┃3  &nbsp; &nbsp; &nbsp; &nbsp; │B部a課&nbsp; &nbsp; &nbsp; │0021┃
┗━━━━┷━━━━━┷━━┛

post(役職テーブル)
┏━━━━━┯━━━━━┯━━┓
┃post_id&nbsp; &nbsp; &nbsp; &nbsp;│name    │code┃
┃1    &nbsp; &nbsp; &nbsp; &nbsp; │部長      │0010┃
┃2    &nbsp; &nbsp; &nbsp; &nbsp; │部次長    │0011┃
┃3    &nbsp; &nbsp; &nbsp; &nbsp; │課長      │0020┃
┃4    &nbsp; &nbsp; &nbsp; &nbsp; │主任      │0030┃
┗━━━━━┷━━━━━┷━━┛

department(所属テーブル)
┏━━━┯━━━━━━┯━━━━┯━━━━━┓
┃id    &nbsp;│staff_id&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; │section_id│post_id&nbsp; &nbsp; &nbsp; &nbsp;┃
┃1&nbsp; &nbsp; &nbsp; &nbsp; │0000001&nbsp; &nbsp; &nbsp; &nbsp; │1  &nbsp; &nbsp; &nbsp; &nbsp; │1    &nbsp; &nbsp; &nbsp; &nbsp; ┃
┃2&nbsp; &nbsp; &nbsp; &nbsp; │0000002&nbsp; &nbsp; &nbsp; &nbsp; │2  &nbsp; &nbsp; &nbsp; &nbsp; │1    &nbsp; &nbsp; &nbsp; &nbsp; ┃
┃3&nbsp; &nbsp; &nbsp; &nbsp; │0000003&nbsp; &nbsp; &nbsp; &nbsp; │2  &nbsp; &nbsp; &nbsp; &nbsp; │2    &nbsp; &nbsp; &nbsp; &nbsp; ┃
┃4&nbsp; &nbsp; &nbsp; &nbsp; │0000003&nbsp; &nbsp; &nbsp; &nbsp; │3  &nbsp; &nbsp; &nbsp; &nbsp; │3    &nbsp; &nbsp; &nbsp; &nbsp; ┃
┗━━━┷━━━━━━┷━━━━┷━━━━━┛
392NAME IS NULL:2014/11/14(金) 14:41:19.39 ID:???
すみません化けました。
各テーブルの内容は以下の通りです。

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    ┃
┗━┷━━━┷━━━━┷━━━┛
393NAME IS NULL:2014/11/14(金) 14:56:11.85 ID:???
欲しい結果は以下のような表です。

┏━━━━┯━━┯━━━━━┯━━━┯━━━┓
┃0000001 │田中│[email protected] │A部  │部長  ┃
┃0000002 │佐藤│[email protected] │B部  │部長  ┃
┃0000003 │鈴木│[email protected] │B部  │部次長┃
┗━━━━┷━━┷━━━━━┷━━━┷━━━┛

説明
・staffテーブルの内容を重複させずに表示。
・それぞれのstaff_idに対してpostテーブルのcodeカラムの値が最小のレコードを取得。値が同一の場合はsectionテーブルのcodeが最小のレコードを取得。

どなたか教えてください。よろしくお願いします。
394NAME IS NULL:2014/11/14(金) 15:34:37.52 ID:q7nye6cv
SQLiteのtimestamp型に入れたものと比較したいのですが、
unixtimeのような数値ではなく、2014-11-14 15:30:00のような文字列が入っています。
なんとなくそのまま select * from t where created > '2014-11-14 15:30:00'
といった感じにしたところ通りました。
動作も期待通りになっているようですが、
何かこういうものを入れたら通らないみたいな、まずいところはありますでしょうか?
395NAME IS NULL:2014/11/14(金) 17:11:51.13 ID:???
>>393
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でいけるんじゃね
効率とか保守性とかしらね
396NAME IS NULL:2014/11/14(金) 21:51:02.85 ID:???
>>394
そういう文字列が入っているんじゃなく、あなたが使っているクライアントがそういう形式で表示しているだけ。
その書き方でいいけど、心配なら case('2014-11-14 15:30:00' as timestamp) って明示する
397アヌビモン:2014/11/15(土) 08:36:12.99 ID:Um8yiYPe BE:272564363-2BP(0)

女神転生シリーズと錯覚の科学がコラボして欲しい
女神転生シリーズと錯覚の科学がコラボレーションして欲しい
女神転生シリーズと錯覚の科学がクロスオーバーして欲しい
女神転生シリーズと錯覚の科学が共演して欲しい
女神転生シリーズと錯覚の科学が協力して欲しい
398NAME IS NULL:2014/11/22(土) 19:26:50.98 ID:???
SELECT a, b, c, a/c as d WHERE concat(a,b,c,d) LIKE "%test%" ORDER BY a ASC

asで別名をつけたカラムもconcatに組み込みたい場合はどうすればいいのでしょうか?
dが認識されずエラーになってしまいます
399NAME IS NULL:2014/11/22(土) 20:00:05.35 ID:???
処理の順番的に無理なので
concat(a,b,c,a/c)ってする
400NAME IS NULL:2014/11/22(土) 20:06:32.46 ID:???
SELECT a,b,c,d FROM (SELECT a, b, c, a/c as d FROM TableName) WHERE concat(a,b,c,d) LIKE "%test%" ORDER BY a ASC
401NAME IS NULL:2014/11/22(土) 20:53:29.34 ID:???
>>398
これなんでできるようにしないのかすごく疑問
a/c ぐらいならまだいいけど、ちょっと長めの式書いたときとか、あとから見ても分かりにくいし
$つけたら、alias の名前と解釈するとかして、式を展開するだけでいいと思うんだけど
402NAME IS NULL:2014/11/22(土) 21:19:07.48 ID:???
>>399
ありがとうございます、助かりました
403NAME IS NULL:2014/11/23(日) 00:11:12.86 ID:???
>>398みたいなクエリが何に使われるのか知りたい
404NAME IS NULL:2014/11/23(日) 08:51:49.98 ID:???
>>401
SELECT a,b,c FROM table ORDER BY d
ができるのは疑問に思わないぜ?
405NAME IS NULL:2014/11/23(日) 09:31:05.95 ID:???
>>404
ごめん、何を言いたいのかさっぱりわからん
406NAME IS NULL:2014/11/24(月) 23:09:28.31 ID:???
>>405
朝鮮人?
407NAME IS NULL:2014/11/25(火) 00:05:07.47 ID:???
>>406
>>404の解説をお願いします
408NAME IS NULL:2014/11/25(火) 04:25:50.27 ID:???
>>407
俺は>>406じゃないけど
selectに別名が使えないのに、order byだと使えるのは疑問に思わないのか?
って事だと思う
>>404の書きかたで普通に通じると思ってるやつは日本語能力に問題があると思うわ
409NAME IS NULL:2014/11/25(火) 04:54:28.18 ID:???
いきなり朝鮮人とか言い出す人には触れない方がいい
410NAME IS NULL:2014/11/25(火) 15:20:03.07 ID:???
select a as b
from table
where b = c
order b

こんなクエリ流すと
aでorderされんの?bでされんの?
411NAME IS NULL:2014/11/25(火) 15:57:12.21 ID:???
>>410
質問というより、>>398への回答?
412NAME IS NULL:2014/11/25(火) 15:58:10.98 ID:???
398じゃなかった、>>401 への答えね
413NAME IS NULL:2014/11/25(火) 16:05:25.11 ID:???
bが実際にテーブルにある項目名ならエラーになるんじゃないかと思ったが
手元のDBだと動いてるなw
order byされるのは結果セットで、結果セットではb=実項目aなので
aでorder byされてるっぽいけど
これが規定された動作なのかたまたまなのかはしらん
414NAME IS NULL:2014/11/25(火) 18:25:53.22 ID:???
大抵別名優先で行われる。
sql標準でどう規定されているかわからないけど、処理の順番的に自然な流れだと思う。

>>411-412
は?
>>401は多義性を解決するための手法を提示しているので、結構納得いく内容に見えるよ
415NAME IS NULL:2014/11/25(火) 18:38:14.30 ID:???
疑問が内容なのかね?
416NAME IS NULL:2014/11/25(火) 18:40:56.96 ID:???
後段は提案でしょ
417NAME IS NULL:2014/11/25(火) 18:42:21.76 ID:???
つか、よりにもよって >>401 の疑問とするところについて、 >>410 が回答たりうると思っているのって
いろいろ欠落してないか
418NAME IS NULL:2014/11/26(水) 00:12:11.67 ID:???
>>413
SQL SERVER2005 2008はエラーやね
419413:2014/11/26(水) 05:01:12.25 ID:???
>>418
単にorder byのby抜けてるだけじゃないのか?それかテーブル名か
今確認したけどそこ直せば2008でも動いたぞ

俺SQL Server2000で確認したんたが
仕様変更でもあったのかと思ったぜ
420NAME IS NULL:2014/11/26(水) 05:18:32.28 ID:???
421NAME IS NULL:2014/11/26(水) 08:26:16.51 ID:???
>>419
エイリアス名でソートできた?
422NAME IS NULL:2014/11/26(水) 13:00:31.97 ID:???
>>420
それはorder by に .(ドット)でつないだ名前はダメって話

>>421
されてるっぽいが、たまたまの可能性は否定できん

一応調べた限りでは
asで指定した名前でソートされるのがSQL規格に沿ってるように思うけど
それぞれのDBMSでそう実装されてるかどうかもわからんし
423NAME IS NULL:2014/11/26(水) 15:45:17.11 ID:???
>>422
> それはorder by に .(ドット)でつないだ名前はダメって話
ぶっ
424NAME IS NULL:2014/11/26(水) 15:57:31.53 ID:???
別名テーブルで指定すんなって話だと思った
425NAME IS NULL:2014/11/26(水) 20:12:00.70 ID:iKNX8LUi
一人2つまでコメントができる掲示板のテーブルがあります。

id │user_id │session│posted_date  │comment│
─┼───┼───┼──────┼────┤
11│u11111│   1 │2014/10/31 │hoge   │
12│u11111│   1 │2014/10/31 │fuga    │
13│u21111│   2 │2014/11/31 │foo    │
14│u21111│   2 │2014/11/31 │bar    │
15│u31111│   3 │2014/12/31 │nullpo   │

これを下記のような形でデータとして抜き出して欲しいと言われました。

投稿日時  │ユーザーID │セッション番号│コメント1 │コメント2 │
2014/10/31 │u11111   │1        │hoge    │fuga    │
2014/11/31 │u21111   │2        │foo     │bar    │
2014/12/31 │u31111   │3        │nullpo   │      │


■前提
・DBはMySQL5.6
・コメントは同時投稿なので、投稿日(posted_date)やセッション(session)は常に一致


どんなSQLを書けばいいのかわからなくてつまりました。

SELECT
t1.posted_date
t1.user_id,
t1.session,
t1.comment,
t2.comment
FROM table t1, table t2
WHERE t1.user_id = t2.user_id AND t1.session = t2.session


これだと重複が出てしまい、DISTINCTつけても変わりません・・・・
426NAME IS NULL:2014/11/26(水) 20:38:58.52 ID:???
ユーザIDとセッションの関連があいまいなので2種類。なんとなく後者で満たせそうな気はする。

select posted_date, user_id, session
, (select comment from table t_sub where t_sub.user_id = t_main.user_id and t_sub.session = t_main.session order by id limit 1) as comment1
, (select comment from table t_sub where t_sub.user_id = t_main.user_id and t_sub.session = t_main.session order by id desc limit 1) as comment2
from table as t_main
group by user_id, session

select posted_date, user_id, session
, (select comment from table t_sub where t_sub.session = t_main.session order by id limit 1) as comment1
, (select comment from table t_sub where t_sub.session = t_main.session order by id desc limit 1) as comment2
from table as t_main
group by session
427NAME IS NULL:2014/11/26(水) 22:08:30.01 ID:???
>>426
ありがとうございます
質問に曖昧なところがあり申し訳ありまんでした
実際の要件がもう少し複雑だったため、質問に落としこむところで不手際があったようです

ただ、各コメントをSELECTで更に取ってくればいいとうのはわかりました
これでなんとかなりそうで
428NAME IS NULL:2014/11/26(水) 22:48:55.55 ID:???
テーブルが別れてればもっと効率よいクエリが書けただろうけどね。
それはきっと変えてはいけない(というか、変えさせてくれない)んだろうと思った。
429NAME IS NULL:2014/11/28(金) 12:21:36.50 ID:???
>>426
group by 使う時って、集計関数外のカラムを
全部指定しなくていいの?
430NAME IS NULL:2014/11/28(金) 14:05:58.50 ID:???
>>429
対象がMySQLだからできるんじゃないかと思って。
431NAME IS NULL:2014/11/28(金) 16:43:43.35 ID:???
>>430
でも、その場合の値って不定だよね
たとえば>>426の下のクエリなら
最低限session に対応するposted_date拾ってくれるっていう「保障」はあるのかな?
全行で2014/10/31になったりすることはないの?

そこまで意識してMySQLの仕様を理解した上でのクエリならいいけど
素直にグループ化項目に追加しとく方が良いんじゃないかな
432NAME IS NULL:2014/11/28(金) 18:28:28.72 ID:???
つか、MySQL知ってる同士で会話してくれ
ノイズはいらん
433NAME IS NULL:2014/11/28(金) 20:32:57.43 ID:???
>>431
group化された中で不定なだけだよ。それは保障されてる。
MySQLメインで使ったことないけどこれ有名な仕様だと思う。

ちなみにPostgreSQLも9.1から似たようなことができるようになった。
https://www.postgresql.jp/document/9.1/html/sql-select.html#SQL-GROUPBY
ただし、MySQLのそれよりは厳密。
434NAME IS NULL:2014/11/28(金) 20:33:53.29 ID:???
>>432
SQLServerのバージョン依存の話には何も言わないのにMySQLだと途端に噛み付くのはノイズではないの?
435NAME IS NULL:2014/11/28(金) 20:52:29.47 ID:???
それぞれが必要な情報を拾えばいいんだよ
そういう意味で、ノイズはいらないから捨てる
436NAME IS NULL:2014/12/01(月) 05:08:30.06 ID:???
それって要するに「俺の知らないDBMSの話はするな」ってことだよねぇ。
わがままな御仁だ。
437NAME IS NULL:2014/12/01(月) 11:12:16.80 ID:???
DBMS独自の関数でもない限り、考え方だけ伝われば良い場合も多いしな
438NAME IS NULL:2014/12/01(月) 14:38:38.23 ID:???
439NAME IS NULL:2014/12/01(月) 15:16:02.89 ID:???
440NAME IS NULL:2014/12/01(月) 15:19:14.81 ID:???
441NAME IS NULL:2014/12/02(火) 00:19:56.16 ID:???
442NAME IS NULL:2014/12/04(木) 20:23:50.35 ID:???
443 ◆XEt1nraFOcTd :2014/12/05(金) 21:46:10.94 ID:???
無から有が生まれた
これが全ての真理
444NAME IS NULL:2014/12/08(月) 18:52:47.27 ID:slTxxYTB
パスツールdisってんのか
445NAME IS NULL:2014/12/11(木) 11:03:57.75 ID: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、___-、    /ー_     {(   '´>、! /ヽ/       |\       \
446NAME IS NULL:2014/12/11(木) 20:02:20.51 ID:???
SQLite3で数値列A,Bで、列Aの全行合計→SUM(A)とBがNULLじゃない行の
列Aの合計がほしいんですけど、一回のSQL文では無理ですか?
447NAME IS NULL:2014/12/11(木) 20:08:11.52 ID:???
Select Sum(A) From Table Where B Is Not Null;じゃアカンの?
448NAME IS NULL:2014/12/11(木) 20:23:39.22 ID:???
列Aの全行合計→SUM(A)と
BがNULLじゃない行の列Aの合計の
二つを一回でだから、駄目だろ
449NAME IS NULL:2014/12/11(木) 20:23:43.09 ID:???
select sum(a),
sum(case when b is null then 0 eles a end)
from table

sql server 以外で動くは知らんし
そも sql serverで動くかもわからんが
こんなんだろ多分
450NAME IS NULL:2014/12/11(木) 20:23:43.82 ID:???
caseが使えるDBMSなら
 select sum(A), sum(case when B is not null then A end) from TableName
でいけるけどSQLiteだと
 select SUM1, SUM2
 from (select sum(A) as SUM1 from TableName),
    (select sum(A) as SUM2 from TableName where B is not null)
とかかな
451NAME IS NULL:2014/12/11(木) 20:24:07.10 ID:???
>>446
select sum(A), sum(case when B is null then 0 else A end) from table

>>447
全行の合計は?
452NAME IS NULL:2014/12/11(木) 20:24:57.51 ID:???
すまんsqlite っての見てなかった
453NAME IS NULL:2014/12/11(木) 20:26:53.47 ID:???
あれ?
リロードし忘れたかと思ったら、なんか書き込みが次々と w
454NAME IS NULL:2014/12/11(木) 20:34:07.45 ID:???
>>450, >>452
バージョンによるだろうけど、今時は使えるみたいよ
http://www.sqlite.org/syntax/expr.html
知らん間に、再起とかもできるみようになってる
455NAME IS NULL:2014/12/11(木) 20:49:44.74 ID:???
446です。CASE文とSELECTを複数使うやり方どちらもできました。
ありがとうございました。
456NAME IS NULL:2014/12/11(木) 22:05:07.25 ID:SJi4cj2w
環境:Access、ないしSQL Server(LocalDB)
やりたいこと:3つ以上のテーブルにわたる、同一名項目の結合

[項目名]と[個数]からなるテーブルがA〜Jまで10個あり(年度ごとにテーブルが
新設されてた)、これを[項目名]で結合して[個数]の変化履歴を作りたいと
考えています。
 テーブルの[項目名]は、[個数]が1個以上のものだけが入っているため、
起点となるテーブルで項目が無い場合に、[項目名]すべてが表示されません。
最大で10個のテーブルを結合する時、A〜Jまでの全ての[項目名]を表示させる
には、どのようなクエリにすれば良いでしょうか?
457NAME IS NULL:2014/12/11(木) 22:18:30.70 ID:???
OUTER JOIN でぐぐれ
458NAME IS NULL:2014/12/11(木) 22:46:49.32 ID:???
full outer join でぐぐってもらうのがよいのではないか。
459NAME IS NULL:2014/12/11(木) 23:08:28.48 ID:???
>>457,458
full outer join でやりたいことが出来ました!

 [left|right] outer joinは試してたのですが、full outer join はしらんかった……どうもありがとうございます
460NAME IS NULL:2014/12/12(金) 05:19:00.82 ID:???
まぁ、left/rightしかしらない、またはそれしか使えない環境でも
(
select 項目名 from A
union
select 項目名 from B
union
...
union
select 項目名 from J
)
left join A using (項目名)
left join ...
ってやれば実現できるけどね。パフォーマンスは悪いが、使い方次第で実現はできるってことで。
461名無しさん@そうだ選挙に行こう:2014/12/13(土) 16:22:18.34 ID:???
すみません
Oracleですが
あるSQLで結果が0件の場合0を表示
結果がある場合(その場合は必ず結果は1件のみ)はその結果を表示したいのですが
やり方がわかりません

NVL(結果,0)でやっても結果が無い状態だと0にならないし
カウントを駆使しようとしてもなかなか思うようにはなりません
教えてください
462名無しさん@そうだ選挙に行こう:2014/12/13(土) 17:35:51.09 ID:???
>>461
それ以外の条件がよくわからんが
count(*)で良い気がするが
463名無しさん@そうだ選挙に行こう:2014/12/13(土) 17:49:12.44 ID:???
カウントだと結果が1件だと1しか出ないんですが

たとえば
select nubmer from table1 where emp_no=?
というSQLでemp_noを可変にして
emp_noがDBに存在していたら、そのemp_noにひもづくnumberも存在しているのでそのnumberを返す
存在していなかったら結果が返ってこないので結果の欄に0をだす

みたいなことをしたいです
464名無しさん@そうだ選挙に行こう:2014/12/13(土) 19:11:28.51 ID:???
nubmerでいいのか?

select case when exists (select nubmer from table1 where emp_no=4) then 4 else 0 end case from dual;

4のところを可変にして
465名無しさん@そうだ選挙に行こう:2014/12/13(土) 19:23:30.45 ID:???
nubmerが必要なんだった、訂正

select case when exists (select nubmer from table1 where emp_no=4) then
(select nubmer from table1 where emp_no = 4) else 0 end case from dual;
466名無しさん@そうだ選挙に行こう:2014/12/13(土) 20:07:59.09 ID:???
nvl(max(nubmer),0)とかで行けるんじゃ
467名無しさん@そうだ選挙に行こう:2014/12/13(土) 21:48:47.12 ID:???
select sum(number)
from
(
select number from table1 where emp_no = 4
union
select 0 from dual
)
468名無しさん@そうだ選挙に行こう:2014/12/13(土) 21:50:59.85 ID:???
あ、これってできるのかな。

select number from
(select 0 from dual) left join table1 on (true)
where emp_no = 4
469名無しさん@そうだ選挙に行こう:2014/12/13(土) 21:51:45.04 ID:???
オゥ。。。

select nvl(number, 0) from
(select 0 from dual) left join table1 on (true)
where emp_no = 4
470名無しさん@そうだ選挙に行こう:2014/12/13(土) 23:47:03.27 ID:???
みんな親切にありがとうな
471NAME IS NULL:2014/12/14(日) 02:10:01.43 ID:???
すご〜く単純に考えて、行がない時だけ、0の行を追加する。

with as t (select nubmer from table1 where emp_no = 4)
select number from t
union
select 0 from t where rownum = 1 having count(*) = 0
472NAME IS NULL:2014/12/14(日) 02:11:09.71 ID:???
あ、with t as ね。
473名無しさん@そうだ選挙に行こう:2014/12/14(日) 02:24:21.60 ID:???
どう考えても>>466
select nvl(max(nubmer),0) from table1 where emp_no=?
が一番単純だろ
474名無しさん@そうだ選挙に行こう:2014/12/14(日) 02:58:22.64 ID:???
>>473
ああ、今読み返したら最大一行なのか。
マッチした時は複数行返ってくるとおもってたわ。
475名無しさん@そうだ選挙に行こう:2014/12/14(日) 18:08:42.98 ID:???
ふつうにselectしてホストアプリ側で件数チェックする方が楽だとは思うがな
476NAME IS NULL:2014/12/14(日) 21:01:04.78 ID:???
>>474
むしろあらぬ方向に突き進んでいるが大丈夫か?
477NAME IS NULL:2014/12/15(月) 10:36:21.42 ID:???
>>476
「having count(*)=0」は戻り行がないとき「だけ」行を返す常套句だが、なんか変か?
478NAME IS NULL:2014/12/15(月) 11:11:28.78 ID:???
俺ならその手のやつはOUTER JOINだな

select nvl(number, 0)
from  (select number from table1 where emp_no = ?)
    right outer join
    dual
    on 1=1
;

where emp_no=?の結果が最大1行だと分かっていれば>>473でもいいと思うが
479NAME IS NULL:2014/12/15(月) 12:24:21.96 ID:???
>>478
>>469書いたものだけど、dualって1行1列のデータなんだね。ありがとう。
480NAME IS NULL:2014/12/15(月) 12:26:00.78 ID:???
あ、しかも>>469だと結果でなかった。おはずかしい。
481NAME IS NULL:2014/12/16(火) 21:23:26.87 ID:???
SELECT SUM(a)
(SELECT a*2 as a from table1 where a='1111'
UNION
SELECT a from table1 where a='2222'
UNION
SELECT a from table1 where a='3333'
)

と合計値を出したいのですがもっと簡単な方とかありますでしょうか?
※a='1111'の時だけ結果の二倍にしています
482NAME IS NULL:2014/12/16(火) 21:35:05.65 ID:???
>>481
>>5の応用でいける
483NAME IS NULL:2014/12/18(木) 14:42:35.75 ID:N3vS6BKW
環境:Access
接続方法:ADO(VC++)
やりたいこと:フィールドのプロパティに設定されている「インデックス」の設定を変更したい

詳細:
 AccessのmdbファイルにADOをつかって接続しているのですが、テーブルAのフィールドXに
設定されているプロパティ「インデックス」の設定値を、「はい(重複なし)」から「いいえ」
に変更したいとかんがえています。

 Accessでやれば一発なのは全くその通りなのですが、実運用にすでに入っている関係で、
プログラムでこっそり直せないかとかんがえています。

 直書きSQLでフィールドのプロパティの設定値を変更するには、どのようにすればよいでしょうか?
484NAME IS NULL:2014/12/18(木) 21:30:38.63 ID:???
>>483
一般的なSQLでやるならDROP INDEXだろうけど
ちゃんとした環境書かんと何とも言えんが、ADOでは無理だからADOX使え
これ以上はどっかADOのスレでも探して聞け
485NAME IS NULL:2014/12/22(月) 23:17:24.90 ID:l3MlvLHh
・DB2
Employeeテーブルがあります。
カラムは共通項目com_01~10
user_name
user_id
user_org
user_age
user_payment
等です。
select
*
from
Employeeで指定したとき、共通項目cm_01~10を除く全てのカラム情報が欲しい時、
どうやって指定すればいいですか?
ちなみに他にもいくつかそういうテーブルがあって、
1個1個まじめに指定するとかなりの量になってしまうので、何か良い取り出し方があれば
教えて欲しいです。
486NAME IS NULL:2014/12/22(月) 23:25:59.40 ID:???
>>485
view作るのは駄目なの?
487NAME IS NULL:2014/12/23(火) 04:05:57.10 ID:???
環境:Oracle
テーブル名 D_EMP
   店コード゙部門コード 社員コード 
@ 1000   001      00001
A 1001   001      00002
B 1002   002      00003
C 1002   001      00001
(プライマリキーは店コード、部門コード、社員コード)

質問
D_EMPの中から同一の店コードがあればそれと同じ部門コード, 社員コードを持つレコードのみを取得したい

例えば検索キーを店コード=1002、部門コード=002、社員コード=00003とした場合、
まずBがヒットし、同一の店コードを持つCの部門コード、社員コードから@を取得したい
※ただし取得は@のみとし、BやCは除外させたい
SQLではどのように記述すればよろしいでしょうか?よろしくお願いします。
488NAME IS NULL:2014/12/23(火) 06:03:13.77 ID:???
試してないけどそのまま書いてみた

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
489NAME IS NULL:2014/12/23(火) 19:34:18.89 ID:???
・カレンダーテーブルA
日付
1/1
1/2
1/3
1/4

みたいなデータ

・テーブルB
名前 日付
山田 1/1
田中 1/2
佐藤 1/4
みたいなデータ

これをつなげて
日付 名前
1/1 山田
1/2 田中
1/3
1/4 佐藤
としたいのですが

SELCET A.日付 AS 日付, B.名前 AS 名前
FROM テーブルA A LEFT JOIN テーブルB B ON
(A.日付 = B.日付)

とすると
全部出ると思ってるのですが
どうしてもデータ行として1/3が出ないのですが
何か間違っている箇所とかあるのでしょうか?
490NAME IS NULL:2014/12/23(火) 20:07:19.50 ID:???
>>489
FULL OUTER JOIN
491NAME IS NULL:2014/12/23(火) 23:10:17.03 ID:???
>>489
SELECTのTYPOは置いといて
普通に考えてそれで行けるはずだけど
日付の比較でちゃんと出来てないのかも

DBMS何か知らんが、実際の日付カラムの型と入ってるデータ確認してみれば?
492NAME IS NULL:2014/12/24(水) 22:10:20.39 ID:???
>>491
うーん
Oracle、比較するカラムは両方とも日付型

それでFULL OUTER JOINでやっても
RIGHT JOINにしても
TO_CHARにしても
なにをどうやってもINNER JOINと同じ形になってしまい
1/1 山田
1/2 田中
1/4 佐藤
になってしまいます

もうお手上げです。
493NAME IS NULL:2014/12/24(水) 22:54:57.74 ID:???
create table t_date (day date);
insert into t_date values ('14/1/1');
insert into t_date values ('14/1/2');
insert into t_date values ('14/1/3');
insert into t_date values ('14/1/4');

create table t_member (name varchar(10), day date);
insert into t_member values ('山田', '14/1/1');
insert into t_member values ('田中', '14/1/2');
insert into t_member values ('佐藤', '14/1/4');


1 select t_date.day,t_member.name from t_date,t_member where t_date.day=t_member.day(+) order by t_date.day;

2 select t_date.day,t_member.name from t_date left join t_member on t_date.day=t_member.day order by t_date.day;

どちらかでうまく行きませんか?
494NAME IS NULL:2014/12/24(水) 23:07:59.12 ID:???
>>492
on 1=1 にしたらどうなる?
495NAME IS NULL:2014/12/24(水) 23:34:23.58 ID:???
明らかにおかしいね
Accessに>>489のSQLをそのまま打ち込んでも
ちゃんと1月3日の行は出る
Oracleに特有の落とし穴でもあるのかな?
(外部結合が内部結合に格下げされてしまうような)
496NAME IS NULL:2014/12/24(水) 23:36:39.82 ID:???
>>492
あとはLEFT OUTER JOINと書いてみるぐらいしか思いつかんな
497NAME IS NULL:2014/12/25(木) 02:55:50.26 ID:???
>>492
DDL貼るぐらいの努力もしないあなたにはお手上げです
498:2014/12/25(木) 19:36:29.49 ID:???
/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ヽ
    /:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://ヽ:::::::::::::::|
    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
499NAME IS NULL:2014/12/27(土) 03:59:20.56 ID:???
環境 Excel2010, SQLServer2012

SQLServerに入ってるDate型のデータをExcelにインポートしたところ、形式が yyyy-mm-dd でした。mm/ddになるようにExcel側で表示形式を選んでも変わりません。
そこでクエリにCAST()を使ってDate型のデータをDateTime型にしてインポートたところ mm/dd表示にできました。

これの原因は何なのでしょうか?
よろしくお願いします。
500NAME IS NULL:2014/12/27(土) 18:28:35.40 ID:???
>>499
どうやってインポートしたか知らんが、スレ違いだ
ExcelかSQLServerのスレ行って聞け
501NAME IS NULL:2014/12/27(土) 18:56:39.63 ID:???
スレチでしたか、失礼しました。
502NAME IS NULL:2014/12/29(月) 15:07:26.87 ID:???
【質問テンプレ】
・DBMS名とバージョン
10.0.15-MariaDB
・テーブルデータ
+--------------------------------------------------------------------+---------------------+
| mailaddr | insert_dt |
+--------------------------------------------------------------------+---------------------+
メールアドレス    日付

・説明

受け取ったメールアドレスを格納しているのですが、署名の削除のプログラムに不備があり、一部のアドレスがおかしくなっています。
%k<[email protected]
B<[email protected]
y <[email protected]
など・・・

"<"が入るとおかしくなるようなので、"<"含む左側を全て削除したいのですがSQLで可能でしょうか?
503NAME IS NULL:2014/12/29(月) 16:45:51.07 ID:???
>>492
dateだからミリ秒まで一緒にならないとか?
to_charでYYYYMMDDにしてLEFT JOINすればいいよ。
504NAME IS NULL:2014/12/29(月) 16:47:35.88 ID:???
>>502
update テーブル set mailaddr = substring_index('<', mailaddr, -1) where mailaddr like '%<%'
かなぁ。使ったことないけど。

(参考) https://mariadb.com/kb/en/mariadb/documentation/functions-and-operators/string-functions/substring_index/
505NAME IS NULL:2014/12/29(月) 16:50:50.62 ID:???
>>503
あー。なるほどね。
それなら別案として ON (trunc(A.日付) = trunc(B.日付)) も提案しておく >>492
506NAME IS NULL:2014/12/29(月) 16:52:41.89 ID:???
>>502
署名のほうに < が入ってるとそこで切っちゃうんじゃないのかな?
ISO-2022?のマルチバイトに混じってるのかな、、、
どっちにしても複数の<が混ざるなら正規表現使ったほうが良さげ
507NAME IS NULL:2014/12/29(月) 17:40:26.57 ID:???
>>504
ありがとうございます、参考にし以下で解決しました。
update mailaddr_new set mailaddr = substring_index('mailaddr', '<', -1) where mailaddr like '%<%';
508NAME IS NULL:2014/12/29(月) 18:54:43.32 ID:???
>>503,505
外部結合なんだから、onで一致しなくても出力されないとおかしいだろ
whereでなんかしてない限り
509NAME IS NULL:2014/12/31(水) 08:57:44.22 ID:???
>>508
FULL OUTER JOIN ならそうだね
510NAME IS NULL:2014/12/31(水) 17:34:33.93 ID:???
>>509
FULLじゃなくても、どちらかのテーブルは全行出力されるはずだが?
511NAME IS NULL:2015/01/01(木) 02:47:12.39 ID:???
>>510
なぜかでないって話からはじまってるので、出なきゃおかしいっていわれてもw
512NAME IS NULL:2015/01/01(木) 06:09:54.33 ID:???
>>511
このケース、基準となるテーブルAが左なのだから
LEFT JOINでAのレコードは全部抽出されるわけで
>>509のレスは的外れだと言いたいのでしょ
513NAME IS NULL:2015/01/13(火) 13:31:43.45 ID:???
SQLServerですが
1億レコードのうち3000万レコードほどをdeleteしようとしてますが
24時間たっても終わりません。

ちなみに同じwhere条件で、select into で別テーブルに吐き出してみると
数分で完了します。

delete時に削除されるレコードを一旦トランザクションログに吐き出しているせいだとは分かりますが
どうにかなりませんか?
514NAME IS NULL:2015/01/13(火) 13:40:33.86 ID:???
なら必要なレコードだけ別テーブルに吐き出して
テーブルごと削除しちまえば?
515NAME IS NULL:2015/01/13(火) 13:42:15.73 ID:???
インデックスとか参照整合性制約とかあると遅いかもね

消さないほうの7000万件を別テーブルにselect intoしてから
元テーブルをdrop、別テーブルを元の名前にリネームってのはどうだろう
516NAME IS NULL:2015/01/13(火) 13:54:35.84 ID:???
もし途中でコケても復元不能でいいから
truncate table ぽく、トランザクションログに落とさず削除してくれる with オプションがあるといいのですがー

>>514-515
やっぱそれしかないですか・・・
517NAME IS NULL:2015/01/13(火) 14:11:52.10 ID:???
insertしたレコードを含む一定範囲を安全にupdateするにはテーブルロックするっきゃないですか
insert直後にwith updlockしても別スレッドのselectでデッドロック発生してしまう…
518517:2015/01/13(火) 14:12:27.95 ID:???
あ、SQLServer2012です
519NAME IS NULL:2015/01/13(火) 14:25:08.00 ID:???
自己解決しました
520NAME IS NULL:2015/01/13(火) 15:03:13.67 ID:???
ここ技術板なんだから
どう解決したか書けよ
521NAME IS NULL:2015/01/13(火) 18:33:44.99 ID:???
自分でロックどうこうするより、まず分離レベル変えてダメか検討するべきだと思うが
そもそも反復読み取り可能な分離レベルより低いなら
insert前にロックしてからinsertしないと、insert直後に範囲ロックしてもダメだと思うが

単なるロック待ちとデッドロックが区別できてない気もする
522NAME IS NULL:2015/01/14(水) 21:40:19.74 ID:???
>>513
論理削除
523NAME IS NULL:2015/01/21(水) 19:46:07.15 ID:???
mysql 5.6.20
comment_text varchar(50) default null

null
xxxx yyyy-mm-dd
eee yyyy-mm-dd
ggggggg yyyy-mm-dd

となっているところから日付だけを抜き出すにはどうすれば良いでしょうか?
524NAME IS NULL:2015/01/21(水) 20:10:07.14 ID:???
>>523
これを見てサッパリ理解できないヴァカは俺だけ?
525NAME IS NULL:2015/01/21(水) 20:28:50.45 ID:???
日付が必ず文字列の最後にあり、yyyy-mm-ddという形式だと決まっているなら
substring(comment_text, -10) でいいと思うけど
526NAME IS NULL:2015/01/21(水) 20:34:16.39 ID:???
>>523
正規表現使えばいいんじゃね?
527NAME IS NULL:2015/01/21(水) 20:44:23.91 ID:???
>>525
ありがとうございます。それでなんとかやれそうです。
>>526
正規表現は、、、いずれ勉強しますw
528NAME IS NULL:2015/01/21(水) 20:54:51.51 ID:???
正規表現自体は使えるけどsedとかと違って一致部分だけ取り出すことはできんよ
529NAME IS NULL:2015/01/23(金) 13:33:07.63 ID:???
>>524
そうじゃないかな
530NAME IS NULL:2015/01/24(土) 00:55:28.84 ID:Vm6DGlpD
id   a   b
-------------
1   1   1
2   1   1
3   2   1
4   2   1
5   3   2
6   3   2

このようなテーブルがあって
まずaで group by してから bで group by して
idをカウントしたくてこんなSQLを書いたのですが遅いです。

select count(result.id)
from (select id, b from table goup by a) as result
goup by result.b

もっと早くできないでしょうか?よろしくお願いします。
531NAME IS NULL:2015/01/24(土) 01:43:19.27 ID:???
何をやりたいか今一わからないけど
これじゃだめなのか?

select count(id),a,b from table group by a,b;
532NAME IS NULL:2015/01/24(土) 02:04:23.21 ID:???
よくわからん。こうか?

select count(distinct a),b from table group by b;
533NAME IS NULL:2015/01/24(土) 02:50:20.77 ID:???
やりたかったのは >>532 でしたが
早さはあまり変わりませんでした。
sqlがシンプルなので使わせていただきます。
遅いのは件数が膨大なためでしょうね。
早さは諦めました。
ありがとうございました。
534NAME IS NULL:2015/01/24(土) 04:07:38.18 ID:???
>>533
SQLは書き方では単純に速度はきまらない
とりあえずbか(b,a)でインデックス張れ
535NAME IS NULL:2015/01/24(土) 13:58:07.92 ID:EzqNjDLs!
>>534
インデックスが効くのは行を選択するカラムだけ。

ま、クエリに現れるすべてのカラムを
一つのコンポジットインデックスに叩き込めば
テーブルにアクセスしなくなるので早くなるけどな。
536NAME IS NULL:2015/01/24(土) 16:29:43.23 ID:???
>>535
一般的なRDBMSならソートにも効く
group by は実質ソートなんでgroup by にも効く
537NAME IS NULL:2015/01/24(土) 23:38:19.67 ID:yNKl6pEn!
>>536
インデックスがソートに効くっていうのは、
「インデックスを使ってテーブルにアクセスしたため、結果的にソートが不要になった」場合だけ。
ソートする目的でわざわざインデックスにアクセスするわけではない。
メモリソートのほうが、比べ物にならないくらい早いからね。

ただ、目的のソートと同じ並びのインデックスをもつテーブルへのアクセスを
実行計画の最後にもってきて、意図的にソートを不要にするテクニックもあることはある。
538NAME IS NULL:2015/01/25(日) 00:37:45.29 ID:???
>>537
腐ったオプティマイザじゃなければ、それが結果的に速いと判断すれば
ソートを不要にするためにわざわざインデックスを使うんじゃないかな
たまたま不要になったとか、今のオプティマイザそんなにアホじゃないよ
インメモリだとしてもソートのコストは馬鹿にならん
539NAME IS NULL:2015/01/25(日) 00:43:54.95 ID:f9eyxImL
ID末尾が!ってどうやるんだろう。これで同じことになるかな
540NAME IS NULL:2015/01/25(日) 00:44:58.17 ID:f9eyxImL
ならなかった恥ずかしい

それはそれとして「インデックスにアクセスする」行為よりもメモリソートのほうが比較にならないほど早いっていうのは
インデックスがメモリに乗っかってない前提の話なのかな
541NAME IS NULL:2015/01/25(日) 01:26:43.52 ID:iuYSGmrF!
>>538
データブロックの物理読み込みと比べれば、インメモリのソートは無視できるくらい早い。
従ってソートのコストを考慮したとしても、オプティマイザがソートエリミネーションを選択するのは、
たまたまソートオペレーションが不要になったとかクエリとか、そうなるよう意図的書いたクエリとかがほとんど。

ただし、クエリ実行中にユーザメモリ領域に読み込んでるデータが多すぎて、
ソートするのに中間データを一時領域に退避しないとならない場合は、
ダイレクトに物理書き込みと物理読み込みが発生するので非常に高コスト。

オプティマイザがそれを認識すれば、ソートの無いパスを選択する可能性はあるが、
それにしても、目的のソートと同じ並びのインデックスが存在して、
そのインデックスでテーブルにアクセスするパスがあって、、
さらにそのテーブルにクエリの最後の最後にアクセスしなければならない。
しかも、ORDER句のカラムが複数のテーブルから来ていればお手上げ。
可能性は、めちゃくちゃ低い。
542NAME IS NULL:2015/01/25(日) 05:49:29.89 ID:???
>>541
で、>>532のクエリに対して>>534ってのは
その条件に合致するのしないの?
543NAME IS NULL:2015/01/25(日) 10:35:22.37 ID:???
そもそもどこからインメモリーなんて話が出てきたんだ?
544NAME IS NULL:2015/01/27(火) 22:59:12.70 ID:???
SQL ServerのテーブルにODBCでリンクしたAccess上でクエリを作る際、
FULL OUTER JOINって使えないんでしたっけ?
そんな語句ね−よと怒られるんですが……
545NAME IS NULL:2015/01/27(火) 23:04:37.62 ID:???
>>544
T-SQL使いたいならパススルークエリ使わないとだめ
リンクテーブルでやるなら
JOINを書かないでFROM句に
FROM table1,table2とか書いて直積を
546NAME IS NULL:2015/01/28(水) 00:16:05.57 ID:???
直積とFull Outer Joinは同じじゃないだろ
JETはFull Outer Joinサポートしてないぽいな
左右の外部結合をunionするとか、SQL Server側でビュー作ってそれにリンク張るとか
547NAME IS NULL:2015/01/28(水) 23:40:21.92 ID:???
>>546
あ、そうだった。
LET JOINしたビュー
UNION
RIGHT JOINしたビュー
548NAME IS NULL:2015/01/29(木) 00:10:25.25 ID:???
それと直積が常にイコールになるわけでもないけどな
549NAME IS NULL:2015/01/29(木) 00:11:09.71 ID:???
full outer joinだわ。すまん。
550NAME IS NULL:2015/01/29(木) 06:16:54.18 ID:???
FULL OUTER JOINって聞いたことないなあと思って
手元の「SQLポケットリファレンス」て本で調べてみたら
MySQLとAccessではサポートしていない命令で
左にのみ存在する行と右にのみ存在する行の両方を取得する、とあるな
こんなややこしい命令、増やして欲しくないものだなあ
やりたければ>>547でできるのだし
551NAME IS NULL:2015/01/29(木) 15:44:24.44 ID:???
そんなこと言ったら普通の外部結合も内部結合とunionで書けるわけだが
552NAME IS NULL:2015/01/29(木) 15:46:39.28 ID:???
釣りか何か?
553552:2015/01/29(木) 15:47:58.05 ID:???
ああ、もちろん>>550に対してね
554NAME IS NULL:2015/01/29(木) 16:22:42.90 ID:???
データベース初心者なのですが、
mysqlで
User(id int, name varchar)
Follow(to int, from int)
の時に、to,fromにidの外部参照整合性つけるにはどうすればよいですか
555NAME IS NULL:2015/01/29(木) 16:42:01.98 ID:???
データベース初心者なのですが、
java persistence api を使ってデータベースを利用する場合、どの程度正規化すべきですか?
556NAME IS NULL:2015/01/29(木) 17:57:38.87 ID:???
データベース初心者なのですが、
後藤さんを救うSQL教えてください
557NAME IS NULL:2015/01/31(土) 09:56:49.07 ID:VUE6c9hh
wp_postmetaテーブルのmeta_key(varchar(255))レコードの_thumbnail_idを全部
削除したいです。

頭良い人!
SQL文を教えてください。
558NAME IS NULL:2015/01/31(土) 10:19:54.11 ID:???
drop wp_postmeta;
559靖国参拝、皇族、国旗国歌、神社神道を異常に嫌うカルト:2015/02/05(木) 10:08:29.69 ID:P8frCpjL
★マインドコントロールの手法★

・沢山の人が偏った意見を一貫して支持する
 偏った意見でも、集団の中でその意見が信じられていれば、自分の考え方は間違っているのか、等と思わせる手法

・不利な質問をさせなくしたり、不利な質問には答えない、スルーする
 誰にも質問や反論をさせないことにより、誰もが皆、疑いなど無いんだと信じ込ませる手法


偏った思想や考え方に染まっていたり、常識が通じない人間は、頭が悪いフリをしているカルト工作員の可能性が高い


10人に一人はカルトか外国人

「ガスライティング」で検索を!
...
560NAME IS NULL:2015/02/08(日) 03:36:02.40 ID:ut3aJyT0
夜間から朝方にかけてあるデータAが複数の場所から送られてくるんだけど
前日分のAの合計と当日分のAの合計をだす
綺麗な書き方教えて下さい
561NAME IS NULL:2015/02/08(日) 04:32:45.29 ID:???
select sum(A) from テーブル where 日付 in (今日, 機能) group by 日付
562NAME IS NULL:2015/02/09(月) 00:53:29.30 ID:3M/msCTP
店名 ファイル名 時間
A店 10時売上 10:01
A店 11時売上 11:01
D店 10時売上 10:03
D店 11時売上 11:01
F店 10時売上 10:01
A店 従業員リスト 00:03
B店 ブラックリスト 02:05

こんな感じのテーブルで
F店が11時売上が来てないのを
抽出するにはどうすればいいのでしょうか?
店名、ファイル名テーブルが残念な仕様で
リストがなく来たものは制限なく追記されます
563NAME IS NULL:2015/02/09(月) 01:25:55.33 ID:???
>>562
10時売上がある店名 - 11時売上がある店名 = 10時売上があったが11時売上がなかった店名
564NAME IS NULL:2015/02/09(月) 01:50:27.78 ID:eZmoEYfM
>>563
ありがとうございます
考え方はわかりましたが
どういう式にすればいいかが
わかりません(^_^;)
565NAME IS NULL:2015/02/09(月) 02:32:50.21 ID:???
試したSQL書いてみ
566NAME IS NULL:2015/02/10(火) 00:10:37.20 ID:???
567NAME IS NULL:2015/02/10(火) 06:53:09.04 ID:???
>>564
・10時売上がある店名
・11時売上がある店名
・引き算
どれがわからんの?
568NAME IS NULL:2015/02/10(火) 11:37:16.66 ID:???
SQL Serverです。
あるお店で商品を売っています。システムで用意しているテーブルは以下です。
売上データの商品コードは外部キーです。
・売上データ(列は、商品コード、売上数量)
・商品マスタ(列は、商品コード、商品名)

それで商品別の売上数量の合計を見ます。その際、SQLの結果に商品名も出すことにします。
その場合、以下のどちらでも同じに結果になると思います。
@SELECT U.商品コード, S.商品名, SUM(U.売上数量) AS 数量
FROM 売上データ U INNER JOIN 商品マスタ S ON U.商品コード = S.商品コード
GROUP BY U.商品コード, S.商品名

ASELECT U.商品コード, MAX(S.商品名) AS 商品名, SUM(U.売上数量) AS 数量
FROM 売上データ U INNER JOIN 商品マスタ S ON U.商品コード = S.商品コード
GROUP BY U.商品コード

@とAで、どちらを使うのがいいとかいうのはあるのでしょうか?
どちらでも、気にすることはないでしょうか?
569NAME IS NULL:2015/02/10(火) 14:02:50.30 ID:???
後者のほうがSQL Serverが標準SQLに準拠したときにすっきりしやすくていいかもしんない
570NAME IS NULL:2015/02/10(火) 15:03:03.44 ID:???
>>568
レコード数やインデックスの具合にもよるけど、実行計画が違う可能性がある。確認してみたら?
なんとなくだけど、1の方が速い気がする。
571NAME IS NULL:2015/02/10(火) 15:20:13.53 ID:???
>>569
mysqlとかpgsqlがやってるあれのことなら
むしろgroup by削るだけで済む@の方が楽じゃないだろうか。
572NAME IS NULL:2015/02/10(火) 21:07:14.18 ID:qNvKu1yt
>>567
店名はテーブルだせばいいのでしょうが
引き算や使う構文がわかりません
573NAME IS NULL:2015/02/10(火) 21:11:14.92 ID:???
>>572
基礎からやり直し。というか、たぶん始めてすらいないよね。
年貢の納め時は近いぞ。
574NAME IS NULL:2015/02/10(火) 21:19:13.78 ID:???
>>572
> 店名はテーブルだせばいいのでしょうが
まずこの SQL は書けるのか?
書けないんだったら、SQL のお勉強からやりなよ
575NAME IS NULL:2015/02/10(火) 23:41:26.22 ID:8M1v3r1O
>>574
店名は出せます。
576NAME IS NULL:2015/02/10(火) 23:57:03.20 ID:???
それを条件に合わせて絞り込めば良いだけじゃないの?
577NAME IS NULL:2015/02/11(水) 00:06:03.09 ID:???
>>575
だから、その SQL 書いてみてよ
578NAME IS NULL:2015/02/11(水) 01:09:33.77 ID:sDJiZbD1
SELECT 店名 from データベース名 where ファイル名=10時売上
579NAME IS NULL:2015/02/11(水) 02:51:44.56 ID:???
>>578
他の人が言ってるマイナス処理はDBMSによって差があるから
とりあえずDBMS明記しろ

マイナス以外の考え方としては、素直に 10時売上がある かつ 11時売上がない
っていうWhere条件書く方法もあるけど

11時売上がないっていう条件は
相関サブクエリを(not)existsでチェックするか
11時売上がある店名に含まれているかを(not)inでチェックするか

この方法ならほほとんどのDBMSでそのまま動く
580NAME IS NULL:2015/02/11(水) 09:30:57.30 ID:???
傍観してるけど、引き算とかいうてる人たち、どう着地させるのかと思ってる。
教えるの下手すぎ。
581NAME IS NULL:2015/02/11(水) 09:48:40.98 ID:???
引き算ってEXCEPTのことかと思ったぜ・・
582NAME IS NULL:2015/02/11(水) 09:56:57.08 ID:???
>>562
単に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時売上'
を追加
583NAME IS NULL:2015/02/11(水) 10:50:15.00 ID:???
これ10時のが来てないと困るよね
584NAME IS NULL:2015/02/11(水) 11:44:34.21 ID:???
>>583
普通は店名マスターぐらいは持つからなぁ
585NAME IS NULL:2015/02/11(水) 19:50:15.95 ID:???
>>580
集合理論における引き算だけど何かおかしな点でも
586NAME IS NULL:2015/02/12(木) 01:10:16.71 ID:???
>>580
DBMSによってはMINUS使えるじゃん
587NAME IS NULL:2015/02/13(金) 15:19:09.63 ID:???
fulltextでインデックスを作った2gramのカラムを検索しても引っかかりません。どのような原因が考えられますか?
mysqlです
588NAME IS NULL:2015/02/13(金) 17:03:15.37 ID:???
>>587
最低限
・検索対象のデータ
・どのように検索したか
589NAME IS NULL:2015/02/13(金) 17:13:49.67 ID:???
>>588
適当な日本語を2gramに分けました。
日本 本語 語で であ あそ そぼ ぼう
みたいに
検索は
select * from hage where match(words) against('+日本 +本語' in boolean mode);
とやりました
英語も検索できないです
590NAME IS NULL:2015/02/13(金) 19:42:19.41 ID:???
>>589
ft_min_word_len で調べるといいかもしんない
591NAME IS NULL:2015/02/13(金) 23:09:55.18 ID:???
>>590
それっぽいです
ありがとうございます
592NAME IS NULL:2015/02/14(土) 03:46:01.22 ID:???
よかったよかった。

ところで >>580 の疑問は解決したんだろうか。
593NAME IS NULL:2015/02/14(土) 19:28:35.09 ID:???
効率的なページネーションの書き方ってどうやるんですか?
select * from hage order by ts desc limit 0, 15
だとデータが増えると遅くてダメらしいのですが
594NAME IS NULL:2015/02/14(土) 20:34:38.19 ID:???
すごい重いのは普通はプログラム側で処理してるよ
どうしてもSQLにしたいならインデックスとかで頑張るしかない
595NAME IS NULL:2015/02/14(土) 21:15:23.37 ID:???
>>593
ページネーションなんてアホな単語覚える前にインデックス覚えろよ
596NAME IS NULL:2015/02/14(土) 21:32:01.30 ID:???
MySQLだとoffsetに当たる部分が大きくなればなるほど遅くなっていくからダメ。
wehre句でそのページに当たる部分を抜き出すとかそういった処理が必要。
597NAME IS NULL:2015/02/14(土) 21:33:06.46 ID:???
mysqlだとインデックスだけだとダメらしいんですよ
英語だから読めないけど、このページに書いてありました
http://www.xarg.org/2011/10/optimized-pagination-using-mysql/
598NAME IS NULL:2015/02/14(土) 21:45:05.22 ID:???
お前らまとめてMySQLのスレ行けや
599NAME IS NULL:2015/02/14(土) 23:13:25.65 ID:???
>>597
>質問するときはDBMS名を必ず付記してください。
情報の後出し乙
600NAME IS NULL:2015/02/14(土) 23:36:57.03 ID:???
>>599
すみませんでした
テンプレ読んでなかったです
mysql5.6です
601NAME IS NULL:2015/02/14(土) 23:44:42.99 ID:???
602NAME IS NULL:2015/02/14(土) 23:45:18.50 ID:???
603NAME IS NULL:2015/02/19(木) 03:36:48.52 ID:???
失礼します。

・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
・・・

どうすればスマートに検索できますでしょうか
検索クエリや、そもそもデータも持ち方がおかしいのかと思ってますが、方法が浮かびません
よろしくお願い致します。
604NAME IS NULL:2015/02/19(木) 05:52:56.34 ID:???
605NAME IS NULL:2015/02/19(木) 10:49:17.00 ID:???
>>604
10回くらい読んでようやく理解できました
ありがとうございます
606NAME IS NULL:2015/02/19(木) 13:08:52.35 ID:???
>>603
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)
607NAME IS NULL:2015/02/19(木) 17:20:08.37 ID:???
>>58で質問したものですが、SQL1を実行時にデッドロックが発生し、
トランザクションが自動ロールバックされたのに、それをアプリ側で
検出できず、トランザクションが終了したまま次のSQL2,3が自動コミット
で実行され、最後にコミットしようとしたところでトランザクションが
終了しているので例外になって終わっていたようです。

おそらく、↓のページの事象によるものだと思われます。
ttp://support.microsoft.com/kb/315662/ja
608NAME IS NULL:2015/02/19(木) 20:52:50.12 ID:???
>>607
>>それをアプリ側で検出できず
ほんとに検出できないならそれは問題だが
たんにお前のアプリが検出してないだけだろ

普通デッドロックはDBMS側で検知してアプリにエラーを戻す
リンク先みたけど、2000のSP3で修正されてるような大昔のバージョンだし
その記事の内容みるに、ロック開放待ちでずっと待ってる(=デッドロックが発生してる)のに
DBMS側で検知できない=当然アプリにも通知されない
って内容に見えるが
だったら後続のSQLはそもそも実行されない
609NAME IS NULL:2015/02/20(金) 00:47:06.66 ID:???
dbms
mysql 5.6
data
review(item_id,user_id,rating)
query
DECLARE cur CURSOR FOR
SELECT x.rating,y.rating
FROM
(SELECT * FROM review WHERE item_id=id1) as x,
(SELECT * FROM review WHERE item_id=id2) as y
WHERE x.user_id = y.user_id

文法に間違いがあるらしいのですが、どこにあるのかわかりません
610NAME IS NULL:2015/02/20(金) 00:53:45.96 ID:???
>>609
最後に;をつけたのですが文法エラーでした
レスに書き忘れました。
611NAME IS NULL:2015/02/20(金) 14:51:08.38 ID:???
>>609
自己解決しました
変数、カーソル、例外ハンドラの順に宣言しないといけなかったようです
612NAME IS NULL:2015/02/20(金) 15:55:38.37 ID:???
mysqlで

item(id,name)
sim(id1,id2,sim default 0)

insert into sim(id1,id2) values(新しいid,itemの今までのすべてのid)
をやりたいのですがどういうふうに書けばよいですか
613NAME IS NULL:2015/02/20(金) 18:05:30.57 ID:???
select 新しいid as id1, id as id2 from item
ってこと?
614NAME IS NULL:2015/02/20(金) 18:11:25.39 ID:???
>>612
新しいidは誰がどうやって決めるんだ?
615NAME IS NULL:2015/02/20(金) 18:54:12.30 ID:???
idが数値だとして、その最大値 + 1 を返すストアドファンクションを作ってはいるけど
616NAME IS NULL:2015/02/20(金) 23:09:00.17 ID:???
>>612
です。
新しいidはクエリーの呼び出し側でせっていして、古い方のidをitem tabl
eからとってきて、挿入したかったのですが、ストアドプロシージャで作れました
617NAME IS NULL:2015/02/20(金) 23:16:33.00 ID:???
mysql5.6
sim(id1,id2,sim,ts)
でタイムスタンプの最も古いものを最新のsimを持ったものに更新するストアドプロシージャを作ったのですが、290万回実行したいのに1800回実行したあたりで実行結果が反映されなくなってしまいます。
どうしたらよいですか?
618NAME IS NULL:2015/02/21(土) 00:01:15.38 ID:???
>>616
誰に安価つけてんのかわからんがストアドいらんよ

>>617
何をしたいのか具体的に書いてくれ
619NAME IS NULL:2015/02/21(土) 00:12:49.55 ID:???
>>618

最初はうまく行ったのに、作ったストアドプロシージャを呼び出しても0 rows affectedになってしまうんです。
ストアドプロシージャの中身はreviewテーブルのデータから相関係数を求めて、それをsimに入れるだけです
620NAME IS NULL:2015/02/21(土) 02:04:50.37 ID:???
だめだこりゃ
621NAME IS NULL:2015/02/21(土) 11:11:02.04 ID:brE3by3l
DELIMITER //
CREATE PROCEDURE updateSimilarity()
BEGIN
DECLARE id1,id2 int unsigned;
DECLARE done int default 0;
DECLARE id1_ave,id2_ave,v1,v2,cov float default 0;
DECLARE rating1,rating2 tinyint unsigned default 0;
DECLARE result float default 0;
DECLARE cur CURSOR FOR
SELECT x.rating,y.rating
from (
SELECT *
from Review
where item_id=id1
) as x
,
(
SELECT *
from Review
where item_id=id2
) as y
where x.user_id = y.user_id;
DECLARE continue handler for not found set done=1;
SELECT item_id1,item_id2
from Similarity
order by ts asc
limit 0,1
into id1,id2;
SELECT AVG(rating)
from review
where item_id=id1
into id1_ave;
SELECT AVG(rating)
from review
where item_id=id2
into id2_ave;


open cur;
while done != 1 do
fetch cur into rating1,rating2;
set cov = (rating1-id1_ave)*(rating2-id2_ave)+cov;
set v1 = (rating1-id1_ave)*(rating1-id1_ave)+v1;
set v2 = (rating2-id2_ave)*(rating2-id2_ave)+v2;
end while;
close cur;
IF v1 != 0 OR v2 != 0 then
set result=cov/sqrt(v1)/sqrt(v2);
END IF;
update Similarity
set similarity=result
where item_id1=id1 and item_id2 = id2;
update Similarity
set similarity=result
where item_id1=id2 and item_id2 = id1;
END
//
DELIMITER ;

これを実行したのですが1800回程度実行して以降テーブルに結果が反映されなくなりました。
622NAME IS NULL:2015/02/21(土) 11:47:13.79 ID:brE3by3l
IF v1!=0 and v2!=0 then
でした
書き間違えました
623NAME IS NULL:2015/02/21(土) 13:46:07.12 ID:???
これ以上はmysqlスレに行ったほうがいいと思うけど、
show warnings;やshow errors; でメッセージとか出てないの?
624NAME IS NULL:2015/02/21(土) 18:34:26.25 ID:???
>>623
けいこくもがエラーもないです
mysqlスレでも聞いてみます
625NAME IS NULL:2015/02/21(土) 19:17:01.44 ID:brE3by3l
自己解決しました。
類似度が0の場合、updateされた時にタイムスタンプが更新されないためでした。
ご迷惑をお掛けしました
626NAME IS NULL:2015/02/23(月) 19:57:45.96 ID:???
accessの2000くらいの、古いバージョンなんですが、
いくつかのテーブルからフィールドを選んで結合したクエリがあって、
そのクエリの日付型フィールドから、既に開いてるフォームのテキストボックスに入力された日付に合致したレコードのみを取り出し、
Aフィールドの文字列によって、AフィールドとBフィールドのどちらかの値を取り出し、
新しいテーブルに書き込むということをしたいと考えてます

さしあたって日付に一致したレコードを取り出すとこからやりたいのですが
クエリの抽出条件に[forms]![フォーム名]![テキストボックス名]と書いて、
SQLで
OpenRecordset("クエリ名",dbopendynaset)
とするとパラメーターが足りないとエラーが返されます
次に、
OpenRecordset("SELECT * FROM クエリ名 where フィールド名 = # & [forms]![フォーム名]![テキストボックス名] & #, dbOpenDynaset,)
としてみると日付型が一致しないとエラーが出てしまいます

どー直せば期待する結果を得られるでしょうか
627NAME IS NULL:2015/02/23(月) 23:32:37.22 ID:???
>>626
クエリ定義をSQLビューで表示して全部書いてみて
下のOpenRecordsetは"が閉じてないけど、ちゃんとプログラム通りに書いて
628NAME IS NULL:2015/02/25(水) 13:31:45.28 ID:67mWbYxh
お世話になります、質問です。

あるテーブルに、ふりがな列と生年月日の列があります。
これを歳の若い順に50件出力したいのですが、
出力の順番はふりがな順(あいうえお順)にしたいのです。

こういうのってSQLだけでできますか?
(PostgreSQLです)
629NAME IS NULL:2015/02/25(水) 13:33:32.44 ID:67mWbYxh
>>628
あ、すいません、もちろん副問い合わせとかなしでの話です。
630NAME IS NULL:2015/02/25(水) 13:41:11.21 ID:???
もちろん って普通サブクエリ使うだろ
631NAME IS NULL:2015/02/25(水) 13:48:53.25 ID:???
余裕でできる→無理
に変わった瞬間を見た
632NAME IS NULL:2015/02/25(水) 13:59:59.31 ID:???
>>628
select * from ユーザ order by 生年月日 desc, ふりがな limit 50;
633NAME IS NULL:2015/02/25(水) 14:05:25.24 ID:???
それ生年月日順やん
634NAME IS NULL:2015/02/25(水) 15:31:27.88 ID:???
>>633
select * from ユーザ order by date_part('years', age(生年月日)) desc, ふりがな limit 50;
635NAME IS NULL:2015/02/25(水) 15:39:51.76 ID:???
>>632 >>634
ポスグレのorder byってこれでふりがな順になるの?逆におかしくね?
636NAME IS NULL:2015/02/25(水) 15:47:57.32 ID:???
>>635
何がおかしいのか理解できない
637NAME IS NULL:2015/02/25(水) 15:48:25.79 ID:???
サブクエリ以外でやれるDBっていったらaccessくらいしか思いつかん
通るか知らんがこんなイメージ

select * from (select * from ユーザ order by 生年月日 desc limit 50 ) order by ふりがな
638NAME IS NULL:2015/02/25(水) 15:48:50.95 ID:???
あと、年の若い順だから>>634でdescはいらないね
639NAME IS NULL:2015/02/25(水) 15:51:54.46 ID:???
>>637
なんだそのアホクエリーは
640NAME IS NULL:2015/02/25(水) 15:58:38.49 ID:???
なんかOracleみたいだな
641NAME IS NULL:2015/02/25(水) 16:04:01.95 ID:???
>>635
descが余分なのは置いといて、俺も>>634の何がおかしいのかわからんぞ。
年齢順・フリガナ順に並べて先頭50件だろ?
642NAME IS NULL:2015/02/25(水) 16:05:08.07 ID:???
row_number() over 〜 って Postagre でも使えたっけ?
643NAME IS NULL:2015/02/25(水) 16:06:15.59 ID:???
ん、ひょっとして、
・年齢順に並べて
・その先頭50件を
・フリガナ順で並べる
ってことか?結果として年齢順にならないソート。
644NAME IS NULL:2015/02/25(水) 16:07:22.18 ID:???
>>641
生年月日順に若い方50件抜き出した上で、それを名前順にソート
>>637 は別名必須
645NAME IS NULL:2015/02/25(水) 16:08:36.73 ID:???
若いほうじゃないか、まあどっちでもいいな
50件以降はいらないのだよね?
646NAME IS NULL:2015/02/25(水) 16:13:09.78 ID:???
>>644
そういう要件なのか−。
でも、それって年齢順に並べたときに50件目と51件目が同じ年齢だったら破綻するんじゃないか?
50件目が、20歳、サイトウ
51件目が、20歳、アベ
で、アベが最終的に表示されなくていいのかって問題がある。
647NAME IS NULL:2015/02/25(水) 16:18:39.65 ID:???
>>646
その場合は、19歳まで全部と、20歳をふりがな順にソートした(50-19歳までのレコード数)を抜き出して、
さらに全体をふりがな順に並べる、というのが要件なのか?
648NAME IS NULL:2015/02/25(水) 16:19:52.65 ID:???
>もちろん副問い合わせとかなしでの話です。

副問い合わせの意味わかって書いてるのかなあこれ、、、
SQL一発で済ませろ的な意味なんじゃないかと、、それじゃなきゃ無理だろw
649NAME IS NULL:2015/02/25(水) 16:22:45.54 ID:???
> 歳の若い順に50件出力
をもっと正しく表して欲さないと終わらない話だなこれ
650NAME IS NULL:2015/02/25(水) 17:09:28.38 ID:???
Window関数使えば出来るのかな?
まあ副問い合わせ禁止する理由がわからんが

>>637
それも普通は副問い合わせに入るんじゃね
651NAME IS NULL:2015/02/25(水) 18:43:39.80 ID:???
select t1.age,t1.name,t1.seq
from user t1
left join user t2
on t1.age > t2.age
or (t1.age = t2.age and t1.name > t2.name)
or (t1.age = t2.age and t1.name = t2.name and t1.seq > t2.seq)
group by t1.age,t1.name,t1.seq
having count(1) < 50
order t1.name

動作確認はしてないが同姓同名、同年齢なら一意キーで若い方
という想定で作ってみたが、こんなんでどうだ?
652NAME IS NULL:2015/02/25(水) 18:47:47.34 ID:???
レコード件数増えたら面白いことになりそうだな、これ
653NAME IS NULL:2015/02/26(木) 03:05:55.44 ID:???
副問い合わせは許されんのに結合は許されるのだろうか
654NAME IS NULL:2015/02/27(金) 17:00:21.61 ID:oUXcvWpV
・mySQL5.5
・1つのカラムにカンマ区切りの数値が格納されている→1,2,3,4,5のような値
・指定した数値(複数有)がカラムに含まれているデータを取得したい

画面上にチェックボックスが複数あり、チェックされた項目に応じた
数値がカンマ区切りでカラムに格納されます。
別途、検索画面がありそのカラムに指定した数値(こちらもチェックボックスです)が
含まれているデータを抽出したいという処理です。
likeを使った曖昧検索のようなイメージです。

例えば
 レコードA → 1,2,3,4,5
 レコードB → 1,2,3,4

検索条件
 検索パターンA:2,3を選択 → レコードAもBも抽出される
 検索パターンB:1,6を選択 → レコードAもBも抽出される
 検索パターンC:5を選択 →  レコードAだけ抽出される
 検索パターンD:6を選択 → どちらのレコードも抽出されない

カンマで格納されているデータをカンマ区切りで分割するのは特に問題ありません。
チェックする項目毎にtinyint(1)型のカラムを作るという案もあったのですが
将来的に増えていく可能性もあるので、その案は取りやめになりました。

1つのテーブルだけで実装するという仕様があるものの、
データの持ち方がそもそもおかしいかもしれませんが、いい方法あったら教えて下さい。
655NAME IS NULL:2015/02/27(金) 17:04:53.95 ID:???
in('dummy',',選択1,',',選択2,',',選択3,')
656NAME IS NULL:2015/02/28(土) 01:44:52.06 ID:???
WHERE concat(',',カラム,',') regexp '\\,(2|3)\\,'
WHERE concat(',',カラム,',') regexp '\\,(1|6)\\,'
WHERE concat(',',カラム,',') regexp '\\,(5)\\,'
WHERE concat(',',カラム,',') regexp '\\,(6)\\,'

正規表現で出来るんじゃないかと始めて見たものの
結局俺には出来なくてカラムにカンマ付け足した。
657NAME IS NULL:2015/02/28(土) 02:58:09.92 ID:???
カンマは正規表現で特殊な意味を持たないよ(=エスケープしなくていいよ)
658NAME IS NULL:2015/02/28(土) 03:01:31.77 ID:???
で、今調べたけど、mysqlならこれでいいんじゃないの?
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set
659NAME IS NULL:2015/03/01(日) 03:55:58.57 ID:???
>>654です。
レス遅くなりましたが、回答ありがとうございます。

>>658
こちらが自分のイメージにぴったりでした!
ありがとうございましたー
660NAME IS NULL:2015/03/03(火) 17:00:11.79 ID:???
SQLServerですけど
checksum は稀にコリジョン起きるという話ですが

select checksum('ab'),checksum('a-b')

これが同じ値を示します。
「-」の有無だけなのですが・・・
661NAME IS NULL:2015/03/03(火) 17:05:47.46 ID:???
失礼しました
binary_checksumを使って解消しました
662NAME IS NULL:2015/03/03(火) 20:16:04.97 ID:???
>>660
コリジョン(偶然の一致)じゃなくて一致する値を返してるだけだろ
'ab'と'a-b'が同じと判定される照合順序なら同じ値返してくれないと困るじゃないか
663NAME IS NULL:2015/03/03(火) 20:52:09.81 ID:???
最初は binary_checksum なるものの存在を知らず、checksum がバイナリ比較かと思ってたんですよ
どうもすみません。。
664NAME IS NULL
ま、おかしいと思った時点で a--b a---bとか試してみることに気がつくべきだったな