2013年17データベース4: SQL質疑応答スレ 14問目 (209) TOP カテ一覧 スレ一覧 2ch元 削除依頼
MySQL 5.0 (553)
PL/SQLできない香具師が上級SE (102)
【PostgreSQL CE認定試験】ってどう? (125)
【SQL Server】 を SQL と略している奴 (100)
さて、この板の看板だが (143)
システム構築ベンダの実力 (938)

SQL質疑応答スレ 14問目


1 :2013/06/17 〜 最終レス :2013/09/23
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。
SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。
質問するときはDBMS名を必ず付記してください。
【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明
前スレ:
SQL質疑応答スレ 13問目
http://toro.2ch.net/test/read.cgi/db/1343899481/

2 :
SQL言語リファレンス一覧
Oracle Database
http://docs.oracle.com/cd/E16338_01/server.112/b56299/toc.htm
Microsoft SQL Server
http://msdn.microsoft.com/ja-jp/library/bb510741
IBM DB2 Database
http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.sql.ref.doc/doc/c0004100.html
PostgreSQL
http://www.postgresql.jp/document/current/html/sql.html
MySQL
http://dev.mysql.com/doc/refman/5.1/ja/sql-syntax.html

参考リンク
http://sql.main.jp/cont/sql/map.html
http://www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html
http://www.geocities.jp/oraclesqlpuzzle/
http://www.techscore.com/tech/sql/

3 :
過去スレ
13問目:http://toro.2ch.net/test/read.cgi/db/1343899481/
12問目:http://toro.2ch.net/test/read.cgi/db/1316769778/
11問目:http://hibari.2ch.net/test/read.cgi/db/1299305530/
10問目:http://hibari.2ch.net/test/read.cgi/db/1274791771/
9問目:http://pc11.2ch.net/test/read.cgi/db/1252492296/
8問目:http://pc11.2ch.net/test/read.cgi/db/1236253554/
7問目:http://pc11.2ch.net/test/read.cgi/db/1223525474/
6問目:http://pc11.2ch.net/test/read.cgi/db/1210940477/
5問目:http://pc11.2ch.net/test/read.cgi/db/1193486961/
4問目:http://pc11.2ch.net/test/read.cgi/db/1176553195/
3問目:http://pc11.2ch.net/test/read.cgi/db/1160458216/
2問目:http://pc8.2ch.net/test/read.cgi/db/1141622643/
帰ってきた:http://pc8.2ch.net/test/read.cgi/db/1124178925/
Part 2:http://pc8.2ch.net/test/read.cgi/db/1103113155/
初代:http://pc8.2ch.net/test/read.cgi/db/1056973582/

4 :
よくある質問1
(問)
ID | DATE     | DATA
--+----------+-----
1 | 2007-11-11 | aaa
2 | 2007-11-11 | bbb
1 | 2007-11-10 | ccc
3 | 2007-11-12 | ddd
3 | 2007-11-11 | eee
4 | 2007-11-10 | fff
1 | 2007-11-12 | ggg
このようなテーブルから、下記のように
1 | 2007-11-12 | ggg
3 | 2007-11-12 | ddd
2 | 2007-11-11 | bbb
4 | 2007-11-10 | fff
各idに対して最新の1件だけ抽出するSQLの書き方を教えてください。
(答)
select A.ID,
    A.DATE,
    A.DATA
from TableName A
   inner join
   (select ID, max(DATE) as MAX_DATE
    from TableName
    group by ID
   ) B
   on A.ID = B.ID
   and A.DATE = B.MAX_DATE
;

5 :
よくある質問2
(問)
key   data
----------------
1     a
1     a
1     b
1     b
1     a
2     b
2     a
2     a
というテーブルから
key   a   b
--------------------
1    3   2
2    2   1
というExcelのピボットの様なデータを取得したいのですが、どういうSQLになりますか?
a,bというのは固定なので、仮にcというデータがあっても無視して構いません。
(答)
SELECT key,
    SUM(CASE data WHEN 'a' THEN 1 END) AS a,
    SUM(CASE data WHEN 'b' THEN 1 END) AS b
FROM table
GROUP BY key
ORDER BY key
;

6 :
よくある質問3
(問)
ID HOGE
01 A
01 B
01 C
02 A
03 B
HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか
(答1)
SELECT id
FROM TableName
WHERE hoge in ('A','B','C')
GROUP BY id
HAVING count(DISTINCT hoge) = 3
;
(答2)
select *
from TableName T1
where not exists (select *
         from (values 'A', 'B', 'C') T2 (HOGE)
         where not exists (select *
                  from TableName T3
                  where T1.ID = T3.ID
                  and T2.HOGE = T3.HOGE
                  )
         )
;
※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意

7 :
よくある質問4
(問)
列の数が可変な問合せはどう書きますか?
(答)
標準SQLでは書けません。
pivotという機能を搭載したDBMSなら一見書けそうですが実はやっぱり書けません。
Oracle 11g以降でpivot xmlというキーワードを使用すれば一応可変っぽくはなります。
が、素直にプロシージャを書くかアプリケーションで処理したほうが良いでしょう。
SQL Serverのpivot(2005以降)
http://msdn.microsoft.com/ja-jp/library/ms177410.aspx
http://www.sqlprof.com/blogs/sqldev/archive/2008/04/12/pivots-with-dynamic-columns-in-sql-server-2005-2008.aspx
Oracleのpivot(11g以降)
http://download.oracle.com/docs/cd/E16338_01/server.112/b56299/statements_10002.htm#CHDCEJJE
http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html

8 :
よくある質問5
(問)
年月(YYYYMM)を指定し、その年月に対応する年月日を取得したい
 例:201006を指定したら、以下の結果を得たい
   20100601
   20100602
    ・
    ・
    ・
   20100630
(答)
SQLでは存在しないデータを生成することはできません。
この問いの場合は素直にカレンダーテーブルを用意しましょう。
どうしてもやりたければ以下のような方法もなくはないですが、
再帰問合せの本来の使い方ではありません。
やめておくことを強くお奨めします。
(PostgreSQLのgenerate_series()関数なら辛うじてセーフかもしれませんが
 賛否の分かれるところでしょう。)
with TEMP (NUM) as (
    select 1 from dual
    union all
    select NUM + 1 from TEMP where NUM < 31
)
select to_char(to_date('201006', 'YYYYMM') + NUM - 1, 'YYYYMMDD')
from TEMP
where to_date('201006', 'YYYYMM') + NUM - 1 < add_months(to_date('201006', 'YYYYMM'), 1)
;
※上記はOracleの場合です。(11gR2以降)
※再帰問合せをサポートするDBMSならこれを適当に改変すれば動きますが
 どのみちお奨めしません。

9 :
以上、テンプレ終わり

10 :
同じデータベース内のあるテーブルが更新されたら、そのテーブルのデータに処理を行って別のテーブルに行を追加したいのですが
このような事をやる場合は他の言語(スクリプト言語など)を利用するしかないですか?

11 :
↑PostgreSQL をwebserver上で使う予定です
元のデータ追加にはpython上のプログラムから追加を行ったり問い合わせを行おうと思っています

12 :
>>10
triggerを知らないってことなの?

13 :
おとしやがって

14 :
ストアド作ってトリガで実行

15 :
ありがとうございます
どの項目を勉強すればいいかわかりました

16 :
【質問テンプレ】
・DBMS名とバージョン
SQlite3をphpのPDOを使って(ローカルでやるのはいろいろインストール面倒なので@pagesの無料サーバでやってます)
・テーブルデータ

・欲しい結果
テーブルitemに「8 hhh」というレコードを挿入する(手順1)と同時に
テーブルstockに「8 xxx 0」,「8 yyy 0」というレコードを挿入したい(手順2)。
手順1の段階でautoincrementのitemId 8を知る方法はありますか?
もしくは手順1と手順2との間で”重複している可能性のある”「data hhh」から「8 hhh」のレコード1つだけをselectする方法はありますか?

・説明

17 :
ttp://www.dotup.org/uploda/www.dotup.org4283484.jpg
すみません。画像上げるの忘れてました

18 :
ぐぐって上のほうに出てきたのがこれだけどどう
http://sqlite.1065341.n5.nabble.com/how-to-get-last-autoincrement-value-td1516.html

19 :
http://php.net/manual/ja/pdo.lastinsertid.php
適当にググってみた。違うかね。

20 :
ありがとうございます。試してみます

21 :
>>20
試してから言え。

22 :
同一構造のテーブルが二つあり、
二つを見比べて片方にしかない値を抽出したい場合、どう書けばいいでしょうか?

23 :
>>22
selectのマニュアル読め

24 :
EXCEPT(OracleだとMINUS)とかNOT EXISTSとかNOT INとか
やりようはあるけどそれだけの質問じゃあ>>23になっちゃうな

25 :
まぁ普通にminusだろうな

26 :
tbl1 join tbl2(直積)とwhere句の組み合わせと、
tbl1 inner join tbl2 on (列x=列y)と、処理の速さを比較すると違ってきますか。

複数列にnullを含んだテーブル同士があって、
そのnullを含む列をつかって結合させたいんですが、
どうも処理が重たくて困っています。
nullは値がないので、インデックスがつくられないそうです。
nullが多ければ多いほど、処理って遅くなりますよね。

27 :
>>26
sql server 2008 r2のexpressなんで、メモリが1GBまでしか有効にならないみたいです。
有料版つかったら、ぱぱぱっと処理されるでしょうか。
30分が経過しました。
行を1行だけに絞って同じ処理をすると、一瞬で終わりました。
これが22万行あるので、時間がかかっているようです。
メモリに展開させられたらもっと処理が速くなるのかなって思いました。

28 :
>>26
上のjoinはinner joinのinnerが無いだけじゃないのか?
一般論だが
DBMSにはオプティマイザがあるので、SQLだけでどっちが早いかはわからない
null=nullは真ではない。null=値も真ではない
null可能の項目でも、null以外を選択するのにインデックスは有効

29 :
>>28
ありがとうございます
今、インデックスをあわてて勉強しています
ユニーク制約でつくられるインデックスしかなかったんです

30 :
すみません。
相関クエリを、通常のテーブルを相関させて書くことはできますが、
相関クエリを、導出テーブルをつかって書くことはできるでしょうか。
外側のテーブルとして導出テーブルを使います。
それを内側の相関クエリ内で使いたいんです。
しかし、as table1 T1 などとして導出テーブルに相関名をつけられません。

select
x
,y
,z
,(select SUM(S) from table2 T2 where T2.k = T1.k) as r
from
)
select x,y,z,k
from abc
) as table1 T1 ←導出テーブルでこのT1という相関名をつけられません

31 :
>>30
SQL SERVER 2008 R2 EXPRESSです。
よろしくお願いします。
導出テーブルに相関名ってSQLデフォルトでも普通はつけられないのかな。

32 :
それ相関名じゃなくない?
table1ってのが相関名だろ。相関名二つもつけれるか?

33 :
>>32
table1だけではエラーになってしまいました。
select
x
,y
,z
,(select SUM(S) from table2 T2 where T2.k = table1.k) as r  ←ここで「table1」と指定することになりますが、エラーになって外テーブルと相関しません。
from
)
select x,y,z,k
from abc
) as table1 ←外側テーブルとなる導出テーブルを名づけます。
かといって、as table1 T1と二重に名前付けできません。
導出テーブルを相関クエリではつかえないってことでしょうか。

34 :
>>33
試したけど、SQLは問題なく通る
fromの後のカッコのtypo直してもダメなのか?
エラー出てるならエラー内容書いてみ

35 :
oracleとかで、外部参照制約かけるとのとかけないのとでは、selectの実効速度に違いは出ますか?

36 :
>>34
レスありがとうございます。
すみません、もう一度試してみたいと思います。
外側導出テーブル(as table1)と、スカラ相関クエリ内テーブルと、
相関させてみます。
できるとお聞きして、一度、簡単な例で試してみようと思います。
またレスします。
ありがとうございます。

37 :
>>34
ありがとうございました。
「できた」とお聞きして、自分でも簡単な例を実行してみました。
すると、エラーにならずに実行することできました。

次の相関クエリを組み試しました。
select 敬称CD as CD,(select 敬称 from 敬称表 TB2 where TB2.敬称CD = TB1.敬称CD) as 名称
from
(
select 敬称CD
from 敬称表
) as TB1

敬称表
--------
1 様
2 御中
3 殿
--------
意図した結果を得られました。
TB1は導出テーブルのエイリアスです。
また、これは、相関クエリでつかえる相関させるテーブル名としても使えることがわかりました。
>>33では勘違いしていたようです。
何か、別のエラーを生じさせてしまっていたようです。
原因を究明します。
ありがとうございました。

38 :
SQLserver 2008 R2 です
where句の等号不等号の表記で、
where ・・・
and x <= y だと、okで、
where ・・・
and x =< y だと、エラーになります。
これって、標準なんでしょうか。
どっちでも良いように思うんですが、納得のいく説明があれば教えてください。

39 :
>>38
納得のいく説明とは、何が納得いかないの?
SQL Server(Transact-SQL)に =< と言う演算子は有りません
したがってエラーになるのは当たり前
標準SQLにあればサポートされるはずなので、標準SQLにもないでしょう

40 :
>>39
すみません、
等号不等号を組み合わせた演算子レベルでみることを忘れていました。

41 :
副問い合わせによる導出テーブルの各列のインデックスは、
もともとの実テーブルの列インデックスを継承して、
自動的に有効になっているのでしょうか。
それとも、導出クエリでインデックスを作成するステートメントでも必要になるのでしょうか。
ORDER BY句に列を書けばインデックスが有効化されるなどありますでしょうか。

42 :
>>41
自分が使っているデータベースの実行計画を見る方法を調べて、それで表示される
内容の意味を調べて、そしてもう一度自分のレスを読み直せ。

43 :
>>20です。できました。お礼が遅くなってすみません。

44 :
mySQL5系の質問です。
2テーブルからデータを取得したいのですが、効率的なSQL文が組めず困っております。

tableA
 id name
 1 サザエ
 2 カツオ
 3 ワカメ
 4 タラヲ
というテーブルがあり、tableA.idをデータとしてセットする
tableBがあったとします。
tableB
 tableA_id key1 key2 key3 
   4     1    2   3 
key1〜key3にセットされる値は、tableA.idの値になります。tableA_idに関しても同様です。
この2つのテーブルからtableBのkey1〜key3にセットされているidに紐づく
実際のnameを取得したいです。
tableBがちょっと妙な気がするのですが、「tableA.idを構成しているのが、key1〜key3という意味」らしいです
データ取得時にtableA_idにセットする値が渡ってくるものとします
SELECT name FROM tableA
WHERE id IN (SELECT key1, key2, key3 FROM tableB WHERE tableA_id = 4);
最初はこのようなSQL文を組んでみたのですが、サブクエリ的にダメなようなので
SELECT name FROM tableA
WHERE id IN (SELECT key1 FROM tableB WHERE tableA_id = 4);
というようなSQL文をkey1〜key3まで繰り返すことしか思いつきません。。
もう少し効率的なSQL文が組めればと思うのですが、どなたかご指導頂けないでしょうか?

45 :
5系で纏めんじゃねえよ
EXPLAINしてみた?
ちなみにそのサブクエリだと5.5未満と5.6以降でだいぶ速度変わると思うけど

46 :
>>44
試してないけど
SELECT name FROM tableA
WHERE id IN (
SELECT key1 FROM tableB WHERE tableA_id = 4
UNION
SELECT key2 FROM tableB WHERE tableA_id = 4
UNION
SELECT key3 FROM tableB WHERE tableA_id = 4
)
はできないかな。

47 :
tableBの設計が明らかにおかしいけど
設計の話はスレ違いだしな

48 :
いや、明らかにおかしいというのは言いすぎだな
key1=保証人1、key2=保証人2とかだったらありえるか

49 :
>>44
最終的に欲しいデータが解らん
タラヲ,サザエ,カツオ,ワカメ で良いのか?
普通に考えたらtableAを4回joinするだけだが
select t.name,t1.name,t2.name,t3.name
from tableB
join tableA t on t.id=tableB.tableA_id
join tableA t1 on t1.id=tableB.key1
join tableA t2 on t2.id=tableB.key2
join tableA t3 on t3.id=tableB.key3
こんな感じ。mySQLで動くかどうかは知らん

50 :
>>44です。
返信遅れて申し訳ないです
>>46さん方式と>>49さん方式を試してみようと思います。
>>48-49
サザエさんの例がよくなかったのと、自分の説明が雑でした
テーブルAを食べ物、テーブルBを献立とさせてください
テーブルAには食べ物も献立もどちらも入っているのです(ここがよく意味わからないのですが。。。)
例えばサーモン握りであれば、サーモン握りもごはんもサーモンもタマネギも
テーブルAに登録されていて、テーブルBの方には
  
  tableA.id      key1      key2      key3
サーモン握りのid ごはんのid サーモンのid タマネギのid
このような形でデータが入っています。
それで、テーブルBの方からidを使ってテーブルAの食べ物名を取得。。らしいです。
ソシャゲ業界に転職したばかりで、ソシャゲはこういうものなのかと思っていたのですが
やっぱり変ですよね。。
お答え頂いた方、ありがとうございました

51 :
単に親子関係を持っていて、親は高々3つの個しか持たないっていう要件があるだけでしょう。
何を難しく考えてるのやら

52 :
まあ作りが悪いことはたしかw

53 :
正規化しろよ

54 :
ソシャゲだし、正規化しないほうが速度要件を満たしやすいんじゃない?
あと多分データのメンテがやりやすい(というかツールを作るのが楽)など。

55 :
普段SQLには全くご縁が無いのですが、急遽下記の作業をしなけらばならず困っています。
DBMS名とバージョン:SQLServer 2008 R2
説明
データベースAに格納されていたテーブルを新しいwinサーバBにコピーするように言われています。
そのため、外付けのHDDで、圧縮されたMDFファイルを渡されました。
外付けHDDから、サーバのデスクトップ上にデータをコピーし、そこで作業が止まっています。
(圧縮されたまま)

新しいサーバBにはSQL Server 2008R2がインストール済みですが、全く使っていません。
データは外付けのストレージに入れる予定です。
(つまり、サーバBのSQL Serverのmdfの置き場はストレージ上にする)
csvファイルの場合、テーブルを作ってデータを流し込むという作業はしたことがあるのですが、
mdfファイルで渡されたことが無かったので、作業が中断しております。
変な質問だったらごめんなさい。
ご教示頂けますと幸いです。

56 :
>>55
MDFファイルならアタッチでいける。
その外付けストレージにファイルを置いてからな。

57 :
どう考えてもスレ違い。専用スレにどうぞ。

58 :
>>56
ありがとうございます(T_T)

59 :
追加しようとしているレコードを主キーから追加・修正を自動判別して実行させたいんですけど良い方法は無いでしょうか?
今はselect count (*) from tableName where primarykey=fookeyで
1ならupdate、0ならinsertってしているんですがこの方法しか無いのでしょうか?
python2.6.6からsqlite3を使用しています。

60 :
SQLiteならinsert or replaceの構文があるだろう

61 :
>>60
ありがとうございます!
こんな便利な構文があったんですね、まさに求めていた理想的な方法でした。

62 :
MYSQL5.5
key   a   b
--------------------
1    3   2
2    1   1
3    5   2
4    2   3
こんな感じでkeyが1〜500万くらいまでの500万行のテーブルなんですが
UPDATE テーブル SET a = a + 1 WHERE key = 5749
UPDATE テーブル SET b = b + 1 WHERE key = 18312
UPDATE テーブル SET a = a + 1 WHERE key = 991127

みたいなUPDATE文を300回くらい同時に実行すると10秒程度掛かってしまい
遅すぎて死にそうです
なにか早くする方法ないでしょうか

63 :
>>62
「同時」というのが、厳密にどういうことなのかわからないけど、keyにインデックスが無いなら
インデックスを張れば速くなるよ。

64 :
sqlite 3.7.17
* table club_master
club&nbsp;&nbsp;name
--------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名古屋
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;東京
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;横浜
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大阪
* table match_data
match&nbsp;&nbsp;club
--------------
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1
* table scores
match&nbsp;&nbsp;club&nbsp;&nbsp;scorer
---------------------------------
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;山田
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鈴木
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;田中
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;田中
と3個のテーブルがあって、match_data と scores を結合してそれぞれのテーブルのカラム club から
club_master を参照したいのですがどうしたらいいでしょうか?
select match,
&nbsp;&nbsp;&nbsp;&nbsp;match_data.club as opponent,
&nbsp;&nbsp;&nbsp;&nbsp;scores.club as scorer_club,
&nbsp;&nbsp;&nbsp;&nbsp;scorer
from scores join match_data using(match)
とした場合で、これに加えて club_master を join して、カラム opponent と scorer_club の値でそれぞれ
club_master を参照して以下のようにしたいのです。
match&nbsp;&nbsp;opponent&nbsp;&nbsp;scorer_club&nbsp;&nbsp;scorer
---------------------------------
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;横浜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;横浜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;山田
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;横浜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;横浜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鈴木
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;横浜&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名古屋&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;田中
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;東京&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名古屋&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;田中
サブクエリ使えよって話でしょうか?

65 :
うぎゃー、文字参照使えないのか(´・ω・`)
改めて書き込み直します。

66 :
もうだいぶ前に2ちゃん全体で仕様変更になったはずだがw

67 :
改めてお聞きします。
sqlite 3.7.17
* table club_master
club  name
--------------
0   名古屋
1   東京
2   横浜
3   大阪
* table match_data
match club
--------------
1    2
2    3
3    1
* table scores
match club scorer
-------------------------
1    2   山田
1    2   鈴木
1    0   田中
3    0   田中
と3個のテーブルがあって、match_data と scores を結合してそれぞれのテーブルのカラム club から
club_master を参照したいのですがどうしたらいいでしょうか?
select match,
match_data.club as opponent,
scores.club as scorer_club,
scorer
from scores join match_data using(match)
とした場合で、これに加えて club_master を join して、カラム opponent と scorer_club の値でそれぞれ
club_master を参照して以下のようにしたいのです。
match opponent scorer_club scorer
------------------------------------
1   横浜   横浜     山田
1   横浜   横浜     鈴木
1   横浜   名古屋    田中
3   東京   名古屋    田中
サブクエリ使えよって話でしょうか?

68 :
>>63
単純に>>62のような文を300回実行するという意味です
INDEXはkeyにのみ張ってます
他には張ってません

69 :
>>63
こいつ馬鹿500万行って書いてあるのが読めないのか

70 :
>>68
トランザクションにするとどうなる?

71 :
>>67
select match,
a.name,
b.name,
scorer
from scores join match_data using(match)
join club_master a on match_data.club = a.club
join club_master b on scores.club = b.club
適当だけど、こんなんでいいんじゃない?

72 :
>>68
その300回ってのは、同一のコネクションから順次実行するのか?
(最大300の)複数のコネクションが接続して更新するのか?
環境やスペック書いてないから何とも言えんが、更新そのものが遅いのか
それ以外が遅いのか切り分けろ
>>69
>>63の何がどう馬鹿なのか解説してくれ
俺には言ってる事に間違いがあるとは思えん、

73 :
>>72
インデックスがついてなければ10秒で済むはずがないってことじゃない?

74 :
>>71
おーおー、できましたできました!
どうもありがとうございました!!

75 :
>>69
1万行だろうと500万行だろうと、インデックスアクセスでは大差ないよ。
ちなみに、手元でPostgreSQLなんだけど、pgbenchで1000万行のテーブルを作って
300回更新する時間を計ったら、大体300ms位だったよ。
つまり、1000万行程度なら、ローカルでレコードを更新するのに1ms/rec程度なんだよ。
300回の更新で10秒かかるということは、33ms/recくらいかかってるということで、
更新対象のレコードを見つけるのにインデックスが使われているのなら、
・レコードがとても長い
・ネットワーク経由でDBアクセスをしていて、ネットワークが遅い
とかなのかな。
あるいは、実行しているPCのメモリがとても少ないとか、CPUがとても貧弱とか、ディスクがとても遅いとか?

76 :
>>75
ついでにインデックスつけないで計測してくれ

77 :
>>68
MySQLスレに行った方がいいんじゃない?

78 :
つかってるDBMSとかわからんけど
毎回テーブルロックー開放してるとか?それでも遅い気はするが

79 :
データサイズにも寄るけど、インデックスなかったら10秒程度で終わるわけない。
1回の更新で数百ms位かかると思う。500msだとして、*300で150秒。
なので、インデックスは使われていて、10秒というのが「最も高速に処理が終わる時間」に
比べて遅いのなら、何か別の理由だな。
ただし、「最も高速に処理が終わる時間」というのが10秒であるという可能性も捨てきれない。

80 :
>>78
あ−、(connect→begintran->update->commit->close)*300ってやってて遅いのかも。

81 :
テーブルサイズにもよるが
たとえば数字3項目で6バイトとして、500万件で30Mバイト
今時のサーバスペックならオンメモリで処理できる
インデックスなしでも数百msもかかるか?

82 :
HDDからメモリ移すだけで1秒は掛かりそうだけど

83 :
>>82
それははじめの1回だけで済む。あとの299回はオンメモリでいけるだろ
まあDBのバッファに入るか単にファイルキャッシュなのかとかによっても変わるが

84 :
エンジンはInnoDBです
>>62の10秒超というのは
↓のようなストアドプロシージャを実行した時に掛かった時間です
CREATE PROCEDURE test( IN x1 INT, IN x2 INT, IN x3 INT 〜〜 )
BEGIN
UPDATE テーブル SET a = a + 1 WHERE key = x1
UPDATE テーブル SET b = b + 1 WHERE key = x2
UPDATE テーブル SET a = a + 1 WHERE key = x3
〜〜
×300行
今自宅でローカルに同様の構成で10万行のテーブルを作って
100行でプロシージャを実行してみたらやはり3〜3.5秒程掛かります
試しに
UPDATE テーブル SET a = a + 1 WHERE key = 1
を1行だけ実行じてみたら
(クエリの実行時間 0.0474 秒)と出ました
phpmyadminから実行してるのですがこの表示が間違っているでしょうか
MYSQLのUPDATEが遅いというのは色々読んでわかったのですが
1行だけで50msというのは何か問題があると考えた方がいいのでしょうか

85 :
>>83
文字列比較は0という計算ならな

86 :
やっぱmysqlスレ行け

87 :
引数300個のプロシジャか
すげえとしか言いようがないな

88 :
以下のようなテーブルがあります。
val  priority
---------------
123  2
456  1
456  2
789  1
ここで、val が重複した場合は priority の大きいほうを選ぶにはどうしたらいいでしょうか。
この場合なら
123  2
456  2
789  1
という結果がほしいです。
環境:postgresql 9.1

89 :
select val, max(priority) from テーブル group by val

90 :
>>88
select val, max(priority)
from table1
group by val
でいけました。ですよねー。
ほんとうは他にもカラムがあるから、こんな簡単じゃないけど。

91 :
>>89
ありがとうございます

92 :
質問をさせて頂きます。
よろしくお願いします。
・DBMS名とバージョン
Oracle 8.05
・テーブルデータ
No ,CTG,TIME
1 , A, 1h
2 , B, 2h
3 , C, 3h
4 , A, 1h
1 , C, 2h
1 , B, 3h
※CTGはC以降もあるが、全10個程度
レコード数は100程度
・欲しい結果
NoごとにCTG_A,B,CのTimeを集計(sum)した結果を
取得したいです
出力結果OKイメージ:
No,CTG_A,CTG_B,CTG_C
1 2, 3, 2
2 , 2,
3 , , 3
下記のような出力はNGです
NO CTG Time
1 , A, 2
1 , B, 3
1 , C, 2
2 , B, 2
3 , C, 3
前任者がなんの引き継ぎもないまま
いなくなってしまい前知識なしにSQLを
使用する立場となってしまいました
どうかご助力ください
情報が不足していれば追記します

93 :
>>92
> 下記のような出力はNGです
の結果を出すクエリがかけるなら後は >>5

94 :
>>93
素早い返答有難う御座います
Oracle 8ではcaseは全て使えないと
誤って覚えておりました
単純CaseはOracle8でも使えるのですね
本当に助かりました 
ありがとうございます

95 :
Oracle 8.0(ほんとかよ)だとcase式はないからdecode式を使うんだろうな
http://www.oracle.com/technetwork/jp/content/general-092398-ja.html

96 :
>>95
情報提供有難う御座います
DBはOracle 8.0で間違いないです
前任者の方が10年以上一人で
保守・開発をされていたとのことで
更新などは全くされていないようです

97 :
select id from ( (select id from table1) except (select id from table2) ) as t
というSQLがあります。このとき、「select id from table1」の部分を、リテラル値を埋め込んだ形にする方法があれば教えてください。
イメージとしては
select id from ( (81, 72, 47, 99) except (select id from table2) ) as t;
とか
select id from ( (select id from (81, 72, 47, 99)) except (select id from table2) ) as t;
みたいな感じです。
(PostgreSQL 9.x)
よろしくお願いします。

98 :
リテラルをselectするのをunionでつなげれば出来るだろうけど
そのリテラルはどっからもってきたんだ?何がしたいのかまったくわからんな

99 :
つ VALUES
http://www.postgresql.jp/document/9.2/html/sql-values.html

100 :
VALUESってINSERTでよく使うけどSELECTでも使えたのかw

101 :
というかSELECTと同等、か。
そういやINSERTでVALUESのとこにSELECT置くもんなあ

102 :
VALUESで複数列書けるのは標準的なSQLなのか?

103 :
複数列も複数行も少なくともSQL92ではすでに標準としてある
どのDBMSにいつ実装されたかまでは知らない

104 :
insertで書くときは何も思わずに複数行、複数列指定に使われていたりする、そんなvaluesさん。
便利だよね。

105 :
それでもOracleくんには頑なに受け入れてもらえない、それがvaluesちゃん

106 :
valuesで複数行書けるの標準SQLだとは思ってなかった
SQLServerは2008から出来るっぽい

107 :
>>99
まさにこれです!すてきすぎ!
99とPostgresqlにいいことがありますように。
>>101
その考え方いいですね。

108 :
>>107
その考え方いいですねって、素敵過ぎると思ったマニュアルを読まなかったのか?

109 :
そのマニュアル、翻訳間違ってるな。
> ORDER BY、LIMIT(、これと等価なFETCH FIRST)そしてOFFSET句でVALUESコマンドを使用することができます。
〜OFFSET句「を」VALUESコマンド「で」使用することができます。
だろう。

110 :
いや、あってるだろ

111 :
そのマニュアルとやらがどれか知らんが、ここで言ってもしょうがないだろうに

112 :
【質問テンプレ】
MySQL5.5
key   a   b   c
--------------------
1    3   3   2
1    4   1   1
1    5   2   2
1    2   3   2
2    1   0   5
2    5   0   2
2    2   3   2
2    1   0   0
3    1   2   2
3    2   3   0

上記のような2000万行程度のテーブルに↓のようなSELECT文を投げたいのですが
SELECT abs(a + b - c) AS abs_hoge, key FROM table WHERE key = 2 ORDER BY abs_hoge ASC LIMIT 1;
大体20〜40秒程度の時間が掛かります
インデックスはkeyにのみ張ってます
一つのkeyの値につき2000レコード程あるので
まず2000行フェッチされた後、a+b-cの絶対値でfile_sortされてるみたいなのですが
どうにかして処理を速くできないでしょうか
実際はa,b,cだけでなくd,f 〜 y,zくらいまでカラムがあり
場合によって abs(a - f - k)のように文を変えるので複合インデックスも試そうとしましたが難しいです
よろしくお願いします

113 :
order by で limit 1ってmin とか使えないの?

114 :
は?

115 :
>>112
2000行フェッチするまでが遅いの?それともその後?
感覚的には後者ってことはなさそうな気がするんだけど

116 :
>>112
パフォーマンスはまず実行計画見てみないと話にならん
レコードサイズとかにもよるけど、2000行の演算とソートが20秒もかかるとは思えん
となると遅いのはSELECTそのものの可能性が高い
keyにインデックスあるなら、これ以上は一般論では無理
MySQLのスレいって聞け

117 :
その目気色悪すぎこっち見んなR。その目気色悪すぎこっち見んなR。その目気色悪すぎこっち見んなR。
その目気色悪すぎこっち見んなR。その目気色悪すぎこっち見んなR。その目気色悪すぎこっち見んなR。
その目気色悪すぎこっち見んなR。その目気色悪すぎこっち見んなR。その目気色悪すぎこっち見んなR。
その目気色悪すぎこっち見んなR。その目気色悪すぎこっち見んなR。その目気色悪すぎこっち見んなR。

118 :
フェッチ後が遅いようです
100万行程度テーブルなら2000行程度のfilesortも一瞬なのですが
2000万行でやるとなぜか一気に時間が増えてしまいます
mysqlスレで聞いてみます
ありがとうございました

119 :
【質問テンプレ】
・DBMS名とバージョン: MySQL ver5.0.95
PHPと組み合わせて使っているのですが、PDOステートメントを使って
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
 $rows[$row['data1'] = array($row['data2']);
}
という感じに値を$rowsという配列に入れていってます。
このdata1はカラム名です。data2がNULLになってしまってるのですが
data2というのはサブクエリでとってきた値なのです。
このサブクエリにキー名のようなものをつけることは出来ないのですか?
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
echo var_dump($row);
}
で中身を見ると、
array(3) {
["data1"]=>
string(5) "wtb_3"
["(select data2 from 〜〜〜〜)"]=>
NULL
}
こんな感じで入ってます。
サブクエリの結果を表示するには$row['(select data2 from 〜〜〜〜)']とする以外方法はないのでしょうか。
サブクエリ文自体を変数に入れればスッキリはしますが、他に方法があれば知りたいです。
宜しく御願いします。

120 :
あ、ごめんなさい
["(select data2 from 〜〜〜〜)"]=>
NULL
ではなく、この場合はちゃんと欲しいデータが入ってます。
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
 $rows[$row['data1'] = array($row['data2']);
}
echo var_dump($rows);
としたときに
["data2"]=>NULLとなるのでした。

121 :
スレ違い。

122 :
・DBMS名とバージョン:MySQL5.5
SELECT IF(DATEDIFF(NOW(), created)=0, value, 0) FROM TBL1;
このIF文でcreatedという時間データと現在時刻を比較し、1日以上経っているか、それともcreatedと同じ日かという判別をしているのですが
もし1日以上経っていたら、同じ命令文の中でvalueを0にアップデートする方法が知りたいです。可能なら方法をご教授下さい。

123 :
何だよ命令文って。更新したいならUpdateしろよ。

124 :
>>120
よくわからんけど構文エラーがあるように見える。
それで動くのかな。
>>122
update TBL1 set value = 0 where datediff(now(), created) = 0;
とか?

125 :
sql server 2008とADO.NETを使っています
クライアントのアプリからストアドプロシージャに配列を渡すにはどうすれば良いのでしょうか?

126 :
スレ違いです。

127 :
なかっち 動画
http://www.youtube.com/watch?v=z2qK2lhk9O0s

みんなで選ぶニコ生重大事件 2012
http://vote1.fc2.com/browse/16615334/2/
2012年 ニコ生MVP
http://blog.with2.net/vote/?m=va&id=103374&bm=
2012年ニコ生事件簿ベスト10
http://niconama.doorblog.jp/archives/21097592.html

生放送の配信者がFME切り忘れプライベートを晒す羽目に 放送後に取った行動とは?
http://getnews.jp/archives/227112
FME切り忘れた生主が放送終了後、驚愕の行動
http://niconama.doorblog.jp/archives/9369466.html
台湾誌
http://www.ettoday.net/news/20120625/64810.htm

128 :
お世話になります。
複合インデックスの項目を歯抜けにしても効果的にインデックスを効かせるSQLの書き方教えていただけませんでしょうか。
1テーブルのWhere句に入る項目数は最大30位あるんですけど、全部検索条件に指定してもらえるわけもなく困ってます。
『数値型検索列>=0』のようなもので埋めればいいのですか?
DBはSymfowareV10です。
ご教授の程、よろしくお願いします。

129 :
>>128
特定のDBMSのオプティマイザ動作をここで聞かれてもなぁ
専用スレ行け。あるのかないのかしらんが

130 :
こっちで答えて貰ったから、ここはもういいです
DB設計を語るスレ 6
http://toro.2ch.net/test/read.cgi/db/1341061787/300

131 :
感じわる

132 :
みりゃわかるがまともな回答はついてない。
マルチポストを非難する煽りレスかと。

133 :
SQL server2012 expressですが
指定したテーブル内の項目名を全て取得するにはどうすれば良いでしょうか?
Googleで検索すると'syscolumns'を検索するば良いみたいですが
それっぽい文字列が見つかりません。

134 :
このスレ的には、INFORMATION_SCHEMA.COLUMNS かな。

135 :
>>133ですが
USEでデータベース指定してませんでした。
>>134
ありがとうございました。

136 :
sqlsrver2008R2なんだが、updateクエリを使って列のデータ型を変更する方法を教えて欲しい。
先輩が言うにはやれるらしいが、調べてもalter tableを使う方法しか出てこない。

137 :
無理。

138 :
その先輩をゴーモンして口を割らせろ

139 :
システムテーブル書き換えるんじゃね

140 :
それならできそうw

141 :
凌遅刑

142 :
update table1 set col1 = 'value1' where id = 111;
update table1 set col1 = 'value2' where id = 222;
update table1 set col1 = 'value3' where id = 333;
これを1文でスマートに実行するにはどうしたらいいですか。
以下のようなのを考えたけど、どう考えてもスマートではありません。
update table1
set col1 = case
     when id = 111 then 'value1'
     when id = 222 then 'value2'
     when id = 333 then 'value3'
    end
where id in (111, 222, 333);

143 :
update fromを使ったところでスマートかというとな。
求めてるのって、1文かどうかが重要なんじゃないの。

144 :
update table1 set col1='value'||substr(to_char(id),1,1);

145 :
全件ヒットしちゃうじゃん

146 :
問題はそこじゃないだろ

147 :
自分でいうのもなんだけど。

148 :
1文かどうかなんて重要じゃないと思うが
そもそも1文で処理する必要性がわからん

149 :
排他制御がしやすい

150 :
複文だとしにくいって言ってる?

151 :
うん。
ちょっとだけだけど。

152 :
今回は違うけど、id を書き換えるような場合は1行でやらないと
結果が変わってくる

153 :
複数行ならtransaction使うだろ。
結果が変わって困るというなら設計がおかしい。

154 :
transactionフリーにすると後々様々なメリットを享受できる

155 :
トランザクションを理解できなかった奴がよくこういうことを言ったりする

156 :
トランザクションを理解出来ないやつほど無駄にトランザクションを使う

157 :
一文のSQLはトランザクションじゃないと誤解するのも初心者にはありがち

158 :
俺も昔はそうだった

159 :
SQL Server 2008
日付と時刻とを date型とtime型と、別々に分離されているものを
datetime型に変換するにはどうしたらいいのでしょうか。
declare @date as date;
declare @time as time;
declare @datetime as datetime;
set @datetime = @date + @time;   ← かなぁと思ったら、NGでした

160 :
文字列として組み立てて変換すればいいんじゃね?

161 :
>>159
型が違うんだからまずdatetimeにしてから足せよ
set @datetime = cast(@date as datetime) + cast(@time as datetime);
型が違うものの演算とか代入とか、型の優先順位や暗黙の変換によって結果が決まる奴は
よっぼど自信があっても使わん方が良いぞ

162 :
cast する方法でバッチリ出来ました
どうもありがとうございました

163 :
ポケモンマスターとはポケットモンスターのマスタテーブルであると仮定して
サトシはどのようなクエリ言語でこれを参照しているのでしょうか

164 :
構文は○○ゲットだぜだけで大丈夫よ。初心者にもオススメ。

165 :
ピカ厨

166 :
・DBMS名とバージョン: MySQL 5.0.92
・テーブルデータ     ・欲しい結果
ID |DOMAIN        DOMAIN
- | -----------    -----------
1 |foo.hoge.ne.jp     hoge.ne.jp
2 |bar.fuga.ne.jp →  fuga.ne.jp
3 |qux.piyo.co.jp     piyo.co.jp
テーブル構造
ID integer primary key auto_increment
DOMAIN varchar(255) not null
・説明
DOMAINを like '%.__,jp'で抽出し、
DOMAINのうち右から3番目の「.」以降の文字を、「.」が2個以下の場合全文を列挙したい
よろしくお願いします!

167 :
MySQLならこういう関数があるらしい
http://dev.mysql.com/doc/refman/5.1/ja/string-functions.html#function_substring-index

168 :
ドメイン名の取り扱いは悩ましいなぁ
FQDNじゃなくてサブドメイン単位のデータを格納するべきなんじゃないかと思ってみたり
しかし取り扱いを考えるとFQDNの文字列で持ちたい
ビューでなんとかすべきか、正規化くずすべきか

169 :
ドメイン名自体を管理するならともかく、単に覚えておくだけなら、全部だな。

170 :
FQDNとドメインを両方持ったところで、FQDN→ドメインという関係が存在するだけで
正規化どうこうの問題にはならんだろう。
というか逆に、部分文字列の抽出とか文字列の構造に依存した処理を前提とした
DB設計ってのは避けるべきだな。

171 :
PHP5+MySQL 5.1.69を使っているんだけど…
id user tag
1 56 hoge
2 24 piyo
3 56 foo
4 12 bar
5 1 hoge
6 2 foo
...続く

って感じのテーブル…要するにuserひとつにタグが最大で8個ぐらい付いているっていうのがある
userとtagの組み合わせはユニークになってる(ひとつのuserが同じtagはつけられない)
これで例えばhogeのtagがついているuserは他にどんなtagがついているか知りたい
それがグループ、オーダーで登録数順になった形式が欲しいんだけど
こんなん
tag sum
foo 26
bar 12
pyo 5
...
簡単かなって思ったけど全然思いつかない
誰かご教授いただけると有難い

172 :
tag 毎の登録数が知りたいの?
であれば、select tag, count(*) from table group by tag order by count(*) desc; でいいと思う。
> これで例えばhogeのtagがついているuserは他にどんなtagがついているか知りたい
にどう繋がるかはよくわからんけど。

173 :
いやごめんちょっと違う
id user tag
1 56 hoge
2 24 piyo
3 56 foo
4 12 bar
5 1 hoge
6 2 foo
...
って状態で格納されてるけど
要するに
user tag
56 hoge, piyo, foo
1 piyo, bar, hage
23 bar, foo, piyo
4 hage, bar
...
ってphpで出力して使ってる
これで
「hogeを登録している人は○○も登録していますよ」って感じにしたいから
hogeを登録している人が他に登録しているtagを多い順に集計したい
上の4つだと例えばfooを登録している人は…ってなると

tag sum
piyo 2
bar 1
hoge 1
ってなるようにしたいんだ

174 :
ああそういうことか、ではこうかな?
※ 手元に環境ないので未検証
select t2.tag as tag, count(*) as sum from table t1 inner join table t2 on t1.id = t2.id where t1.tag = 'foo' and t2.tag <> 'foo' group by t2.tag order by count(*) desc;

175 :
それじゃ無理な気がする。

176 :
1. fooを登録してるユーザー一覧
2. 1. のユーザー達が登録してるtag一覧
3. 2. のtag一覧からfooを除いたものをGroup By、でいいのかな。

177 :
>>171
仕事?
趣味?
まさか仕事じゃないよね?
この程度が解決できないレベルでお金もらえるはずがないよね?

178 :
select tag, count(tag) as sum
from table
where
tag <> 'hoge' and
user in (select user from table where tag = 'hoge')
group by tag
order by count(tag) desc;
こんなか?

179 :
>>173
そこに書いてあるやつ、上と下でデータ違うじゃねえか
ちゃんと合わせとけよ
select tag,count(*) from テーブル
where user in (select user from テーブル where tag='foo') and tag<>'foo'
group by tag order by count(*) desc
たぶんこんな感じ

180 :
>>173
SELECT t2.tag,COUNT(1) FROM tables AS t1 INNER JOIN tables AS t2 USING(user)
WHERE t1.tag != t2.tag AND t1.tag='foo' GROUP BY t2.tag ORDER BY t2.tag DESC;
こんな感じ?

181 :
>>179
すまん、かぶった

182 :
うおーありがたい!
どれも上手くいったよ。
どれ使えばいいか迷うなw
>177
もちろん趣味

183 :
質問なのですが、レコードが最後に読み出された時間は自分でフィルード作って記録する必要がありますか?

184 :
一般的には自分で管理しないと無理
selectにトリガ張れるDBMSは聞いたことないけど、監査機能で実現できるかもしれん

185 :
>>184
ありがとうございました!

186 :
mysqlでのソートについてですが
ソート対象のカラム内にa,b,c,dとはじまる文字列あった場合に
最初をbとしてその後にa,c,dなどのようにすることはできるのでしょうか

187 :
>>186
case文でソート用の列をつくればいいんじゃない?

188 :
select * from table order by field(left(col,1),'b','a','c','d');

189 :
order by には複数条件書けるから
col = b desc, col
ってやればbのときTRUEで最優先、残りはcol順になる

190 :
おっと、bで始まる、か
まあ>>188の例も見ればわかるよね

191 :
>>189
アホはレスしなきゃいいのに...

192 :
mysqlでの質問になります
あるカラムの同一データごとからランダムに一つずつデータを抽出することは可能でしょうか。

193 :
ランダムにってどういうこと?

194 :
>>193
説明不足ですいません。
以下のようなカラムからカラムAの1から一つ、カラムAの2から一つというように取得したいんです・・・
カラムA カラムB
1    a
1    b
1    c
2    a
2    b
2    c
3    a
3    b
3    c

195 :
適当
select * from table group by カラムA;

196 :
>>195
いくらなんでもそれは適当すぎる
>>194
select
カラムA,
(select カラムB from テーブル where カラムA=t1.カラムA order by rand() limit 1);
from
(select カラムA from テーブル group by カラムA) t1
とかじゃね、mysql手元にないから知らんけど

197 :
あ、いらんとこにセミコロン入ってる

198 :
標準SQLだとだめ。MySQLだといいみたい
>GROUP BY 部から省略したカラムがグループ内で一定していない場合は、この機能を 使用しないで ください。
>サーバはいかなる値もグループから自由に戻すことができ、すべての値が同じでない限り、結果は不確定です。
http://dev.mysql.com/doc/refman/5.1/ja/group-by-hidden-fields.html

199 :
m(._.)mド初心者です。 MySQL5.5
テーブル名:売上計 
魚 数
はまち 10
かつお 10
いわし 20
テーブル名:売上月次テーブル
魚 数
はまち 1
かつお 0
いわし 5
の2つのテーブルがあるときに、
売上計  に月次のレコードの数をすべて足して、
テーブル名:売上計
魚 数
はまち 11
かつお 10
いわし 25
としたいです。
どうすればよいでしょうか。
UPDATE 売上計 SET 売上計.数 = 売上計.数 + 売上月次.数 WHERE 売上計.魚 = 売上月次.魚 ;
としましたが#1054 エラー UNKNOWN COLUMN 売上計.魚 と出ます。

200 :
UPDATE 売上計,売上月次テーブル SET 売上計.数 = 売上計.数 + 売上月次テーブル.数 WHERE 売上計.魚 = 売上月次テーブル.魚 ;

201 :
ありがとうございます。
UPDATEで 売上計 , 売上月次
とするんですね。できました。
レコードの値を参照するだけで更新しないテーブルでも、
クエリで触れるテーブルについては、UPDATEで書くんですか。

202 :
SELECTで足せばいいだろう、常に使うならVIEW作ればいい

203 :
union all してsumればいいんじゃない?

204 :
SQL SERVER 2008 R2 - Microsoft SQL Server Management Studio 10.50.2550.0
の質問なのですが、SQL文発行時等のエラーメッセージが日本語にならないのですがどこに設定があるのでしょう
メニューバーその他設定などは全て日本語で、DBの照合順序などもJapanese_CI_ASになっているのですが・・・
別環境では問題なく全て日本語で出るのですが、新しく作った環境では上記のような状態になってしまいます
とても初歩的で申し訳ありませんがご教授お願い致します

205 :
各キーのトップ5を抽出するSQLを教えてください。

206 :
SELECT TOP 5

207 :
id name num とあって
id: 1 2 3 4 5 6 7 ...
name: tarou hanako tarou tarou tarou hanako tarou
num
となっています。
update table set num = 1 where name = tarou
とすると、tarou全てが1になります。
ですが、idが最大のtarouだけを1にしたいんです。
update table set num = 1 where name = tarou and id = 7
とやれば7のtarouだけを更新することができますが、常に最大のものだけを更新したいので
これではできません。
簡単にできそうに見えるんですがやり方が分かりません。
やり方教えてください!ちなみにsqliteを使ってます。

208 :
update table set num = 1 where id = (select max(id) from table where name = 'tarou')
とか?

209 :2013/09/23
ありがとーーーーーー
できました。
TOP カテ一覧 スレ一覧 2ch元 削除依頼
MSDEよりいいDB、ありませんか? (345)
SQLについて語るスレ (142)
【Java】H2 Database Engine【GCJ】 (196)
mysqlについて語ろう (139)
WebObjectsってどうなん。 (244)
はじまりです。 (579)
--log9.info------------------
【新規歓迎】封神ストーリー【旧天道オンライン】 (574)
真・女神転生IMAGINE 孤独な奴が集まるスレ 71周目 (660)
【UO】UltimaOnline復帰者スレッド Part3 (785)
メイプルストーリー売ります買いますスレ (550)
【改悪】神説セオス Part4【正式】 (721)
【GNO2】漫然と続けるGNO2【本スレ116】 (159)
【やられたら】Secondlife戦闘novel【やりかえす】 (101)
【挫折】Second Life 辞めた人が集うスレ【失望】 (752)
■-Master of Epic 本スレ案内所 7 (387)
いきものがたり EARTH ETERNAL 8匹目 (420)
【ユグドラシル】Part21 (361)
Tales Weaver チートスレッド combo 113 hit (502)
【SO】Seal Online Plus Vol.446 (713)
なんかおもしろいのおしえろやごるぁ(ゲームで) (361)
三国ヒーローズ part42 (731)
トキメキファンタジーラテール エメラルド鯖スレ9 (220)
--log55.com------------------
中学受験界をみつめて 高学年用 Part19
徳島県の高校7
☆広島県中学高校受験総合スレッド★Part58
◆◆◆ 群馬県高校統一スレッド -其の61- ◆◆◆
【TSB】東京スクールオブビジネス パート4
【小林幸子の弟子】岸浩太郎【自称】
国家一般職★近畿【32局目】
【涙の】裁判所事務官(一般職) Part83【合格発表】