SQL質疑応答スレ 9問目

このエントリーをはてなブックマークに追加
933NAME IS NULL:2010/05/20(木) 22:22:35 ID:GTmF0xlD
DEFENDANT  GUILT  JOROR
-----------+-------+--------
HOGE      | 1     | FOO
HOGE      | 0     | BAR
HOGE      | 1     | BAZ
FUGA     | 1     | FOO
FUGA     | 1     | BAR
FUGA     | 1     | BAZ     (T_JUDGEテーブル)

上記のテーブルにDEFENDANTで絞込をかけた結果、GUILTに一つでも0がある場合
1行も取得せず、全部1の場合はそのまま一覧を返す場合どのようなSQLを書けば
よいでしょうか?この場合、HOGEで絞り込むと0行、FUGAなら3行と言う具合です。

DBMSはMySQL5.0.67です。
934NAME IS NULL:2010/05/20(木) 22:53:51 ID:???
select *
from T_JUDGE A
where not exists (select *
         from T_JUDGE B
         where A.DEFENDANT = B.DEFENDANT
         and B.GUILT = 0)
;
935NAME IS NULL:2010/05/22(土) 01:46:17 ID:???
テーブル tb_mastr     tb_office     tb_area
       master_id     office_code    area_code
       name       office_name   area_name
       office_id
       area_id

のテーブルがあり、office_idでtb_officeのoffice_nameを取得し、area_idでtb_areaのarea_nameを
取得したいのですが、2つ以上のテーブルを結合?させる場合どのように記述すれば
いいのでしょうか?

1対1なら以下の記述でできるのですが、同時にarea_idにarea_codeを割り当てる記述が
見つからなくて困っています。

SELECT tb_mastr.master_id, tb_mastr.name, tb_mastr.office_name FROM
tb_mastr LEFT JOIN tb_office ON tb_mastr.office_id=tb_office.office_code
936NAME IS NULL:2010/05/22(土) 02:06:03 ID:???
その後ろにもう1個JOIN書けばいいだけなんだが
937922:2010/05/22(土) 09:48:02 ID:???
>>931,932
お礼が遅くなりました。MSのサイトとかと参考に自力でがんばってみます。
ありがとうございました。
938NAME IS NULL:2010/05/22(土) 15:02:04 ID:???
Mac(10.6)にphpMyAdminを入れたのですが、パスワードがわからず
ブラウザからログインができません。どのように設定すれば良いのでしょうか?
939NAME IS NULL:2010/05/22(土) 15:27:31 ID:???
はい、次。
940NAME IS NULL:2010/05/22(土) 16:17:26 ID:???
Mac(10.6)にphpMyAdminを入れたのですが、パスワードがわからず
ブラウザからログインができません。どのように設定すれば良いのでしょうか??
941NAME IS NULL:2010/05/22(土) 16:53:18 ID:???
942NAME IS NULL:2010/05/22(土) 17:02:06 ID:???
943NAME IS NULL:2010/05/22(土) 17:05:34 ID:???
それとFAQ追加(>>729

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

(答)
標準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/technology/pub/articles/oracle-database-11g-top-features/11g-pivot.html
944NAME IS NULL:2010/05/23(日) 17:50:10 ID:???
num0からnum50までの連番でフィールドがあるのですが、
この中で、レコードの値が0より大きいものをSELECTするにはどうしたらいいでしょうか?
ワイルドカード的な書き方はないのでしょうか?
945NAME IS NULL:2010/05/23(日) 18:02:24 ID:???
「レコードの値が」ってどういう意味やら。
num0〜50のどれかが0より大きかったらって意味か?
946NAME IS NULL:2010/05/23(日) 18:28:35 ID:???
num0が0より大きい または num1が0より大きい または・・・ num50 が0より大きい
ってこと?
まあorで並べるしかないわな
947NAME IS NULL:2010/05/23(日) 18:38:55 ID:???
まずテーブルを最適化しろって言いたくなるような質問だなあ。
>>946でFAだと思う。
948NAME IS NULL:2010/05/23(日) 18:43:04 ID:???
全部足して > 0
949NAME IS NULL:2010/05/23(日) 19:28:00 ID:???
全部足した結果がminより大きかったら。
950NAME IS NULL:2010/05/23(日) 23:07:32 ID:???
全部足してっていうのが動作するのは状況が限られるだろ
951NAME IS NULL:2010/05/23(日) 23:12:24 ID:???
マイナスの値がないこと、nullがないこと、他には?
952NAME IS NULL:2010/05/23(日) 23:14:28 ID:???
全部足しても桁あふれしないこと、か
953NAME IS NULL:2010/05/24(月) 11:06:40 ID:???
質問です。

SELECT COUNT(*)
FROM TABLE
より、
SELECT COUNT(COL_NAME)
FROM TABLE
の方がDBの処理は軽くなると先輩社員に聞きました。

処理時間に違いはないと思うのですが、どうでしょうか。
954NAME IS NULL:2010/05/24(月) 11:15:28 ID:???
>>953
あなたの使っているDBMSによります。
昔のDBMSは、そうした方が速くなるものがありました。
最近のDBMSであればもう解決済みで、ほぼ問題ないはずです。

一番の答えは実際に計測することですね。

…俺がついつい後者で書いてしまうのは悪い癖orz
955NAME IS NULL:2010/05/24(月) 11:59:19 ID:???
>>953
MySQL/InnoDBだとそうなると聞いたことはある。
ほんとにそうなのかどうかは確かめていない。
956953:2010/05/24(月) 12:07:20 ID:???
>>954-955
確かにレコード数に左右されそうですね。
その時に使っていたDBはOracle9iでした。

最新のDBであれば、実感として変わらないという思いは変わりません。
機械があれば計測してみます。
957NAME IS NULL:2010/05/24(月) 13:10:01 ID:???
>>953
COL_NAMEがNULLを含んでいる場合に結果が変わってくるのはわかるよね?
NULLを許可している場合にNULLチェックが必要になる関係で後者が遅くなる処理系がある。
958NAME IS NULL:2010/05/24(月) 15:21:32 ID:???
>>956
誰もレコード数に左右されるとは書いてないが
959953:2010/05/24(月) 18:54:02 ID:???
うう、誤解を招く発言をしてしまい申し訳ありません。

精進します。
960NAME IS NULL:2010/05/25(火) 00:31:12 ID:sUe75wMv
ID|A|B|C|
---------
1 |1|2|3|
2 |3|4|5|
3 |7|8|9| (テーブルFOO)

select FOO.ID,FOO.C from FOO,(select 1 AS EXPR) AS A
where FOO.A = A.EXPR or FOO.B = A.EXPR or FOO.C = A.EXPR;

こんなかんじで得たCの内容を1のところにセットして
該当するIDとCを全てリストアップするSQLはどう書けばよいでしょうか?
MySQL 5.0.67です。ストアドの作成権限はないです。
961NAME IS NULL:2010/05/25(火) 01:10:44 ID:???
>>960
意味がワカラン。
a,b,cいずれかに1がある行のidとaを抽出ってことでもないんだろ?
962NAME IS NULL:2010/05/25(火) 04:47:16 ID:???
エスパーしようと思ったが意味わからないなw
963NAME IS NULL:2010/05/25(火) 07:01:14 ID:???
まず
何がやりたいのか を整理して
日本語 で説明してくれ。
964NAME IS NULL:2010/05/25(火) 10:53:57 ID:???
SELECT * FROM HOGE WHERE A > 100 OR IN (1,2,3,4,5)

SELECT * FROM HOGE WHERE A > 100
UNION
SELECT * FROM HOGE WHERE IN (1,2,3,4,5)
ではどちらが軽いでしょうか?
965NAME IS NULL:2010/05/25(火) 12:47:08 ID:???
構文ミスを除けば一般に前者
後者はソートが発生する
966NAME IS NULL:2010/05/25(火) 14:41:02 ID:???
>>960
俺がエスパーするに
A,B,Cのカラムのいずれかが1であった場合、その1だったカラムの内容をCの値で更新する
実際に更新するSQLと更新対象をリストアップするSQLは?
だとみた

リストアップは
select ID,C from FOO where A=1 or B=1 or C=1
でいいんじゃね。AもBも対象だったら2行だせとかだとまた話は別だが
更新は
update FOO set A=C where A=1
update FOO set B=C where B=1
の2行かな。CをCで更新しても意味ないからな
で、この三つを同一トランザクションで流せばいいんじゃないかと
967NAME IS NULL:2010/05/25(火) 18:28:34 ID:???
誰か次スレ立ててくれ
俺は立てれんかった
テンプレは>>1-6と修正>>942-943
968NAME IS NULL:2010/05/25(火) 21:48:29 ID:???
立ててみる。しばし待たれ。
969NAME IS NULL:2010/05/25(火) 21:54:44 ID:???
次スレ
http://pc11.2ch.net/test/read.cgi/db/1274791771/

ミスがあったらスマン。
970NAME IS NULL:2010/05/25(火) 22:58:51 ID:???
>>969
971NAME IS NULL:2010/05/25(火) 23:11:34 ID:???
>>969
otu
972NAME IS NULL:2010/05/27(木) 23:09:36 ID:JLDVw0sK
こっちを先に消費すること。
973NAME IS NULL:2010/05/28(金) 15:38:37 ID:???
そもそもこれまでのスレ速度考えたら967で次スレ検討とか見積もり甘すぎでしょ。
974NAME IS NULL:2010/05/28(金) 19:02:15 ID:???
質問です。
テーブル設計も質問してもいいんでしょうか?

社内に聞ける人間がいなくて、悩んだ時期が自分にありました。
975NAME IS NULL:2010/05/28(金) 19:10:40 ID:???
それ用のスレは過疎っているように思うからここでもいいんじゃない?
976NAME IS NULL:2010/05/28(金) 19:17:24 ID:???
おお、スレッドあるんですね。
ありがとうございました。
977NAME IS NULL:2010/05/29(土) 00:07:56 ID:???
スレ違い
978NAME IS NULL:2010/05/29(土) 17:21:57 ID:???
>>976

DB設計を語るスレ 3
http://pc11.2ch.net/test/read.cgi/db/1269585561/

このへんかな?
979NAME IS NULL:2010/06/01(火) 23:54:28 ID:4+IIsIOo
テーブルの外部キー制約において、現在ON DELETE RESTRICTとなっているところをCASCADEに変更したいのですが、
運用中なのでDROPできないのでALTERで変更したいのですが、どのように書けばよいでしょうか。

MySQL5.0です。
980NAME IS NULL:2010/06/02(水) 00:28:52 ID:???
drop foreign key してから、add foreign key じゃね?

ttp://dev.mysql.com/doc/refman/4.1/ja/alter-table.html
981NAME IS NULL:2010/06/04(金) 01:02:08 ID:???
hosyu
982NAME IS NULL
そこはUPDATE