1read 100read
2013年17データベース4: SQL質疑応答スレ 14問目 (209) TOP カテ一覧 スレ一覧 2ch元 削除依頼
システム構築ベンダの実力 (938)
【ダッチ製】 Servoy のスレ Table01【大丈夫?】 (194)
データベースを略してデーベーと呼ぶスレ (101)
制約っていらなくね? (111)
UNIX DBMはこちら(GNU gdbm, Berkeley DB etc...) (258)
MQ板もつくれ (135)

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

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
はじまりです。 (579)
ここはデータベース板です (125)
デフォルト名無しネームを決めるスレ (498)
DB専用機はなぜでない (142)
【KVS】 Key-Value Storeを勉強するスレ (138)
オラクルマスターの給与 (274)
--log9.info------------------
ジャズボーカリストになりたいんだが (118)
アウトする禿げ、ジョンスコのスレPart3 (644)
【マイルスにに捧ぐ 】V.S.O.P. 【2007 .10】 (698)
ベースのかっくいいジャズな曲教えて☆ (685)
【黒い】 ドナルド・バード 【プロフェッサー】 (338)
100余年かけてバッハ一人に敵わないジャズwww (505)
シャカタク (844)
最近の南波杏ってえらくソフトだな (250)
ジャズの名盤TOP100を選定するスレ (229)
【本命】田中信正!を語ろう。 (106)
忍法帖!ninjaテストスレ inジャズ (289)
ロバート・グラスパーとか (172)
ジャコ・パストリアス Jaco Pastorius 【6】 (252)
おすすめのジャズの曲教えろ・・いや教えてください (342)
ジャズっておしゃれだよね (576)
マイルスが健在なら絶賛しているだろう (250)
--log55.com------------------
実質11400
【ホモ】銀魂なんでもあり雑談132【ノマ百合】
【画像】3647
実質11401
オンラインストレージ情報交換スレ Part25
ヲチスレ
【〒】ポストマップ 9本目【POSTMAP】
★【YouTube】Reon Nekosky 4【ゲーム実況】