【帰ってきた】SQL質疑応答スレ 2問目

このエントリーをはてなブックマークに追加
1NAME IS NULL
2NAME IS NULL:2006/03/06(月) 14:24:36 ID:???
過去ログ
SQL質疑応答スレ Part 2
http://pc8.2ch.net/test/read.cgi/db/1103113155/
SQL質疑応答スレ
http://pc8.2ch.net/test/read.cgi/db/1056973582/
3NAME IS NULL:2006/03/06(月) 18:53:11 ID:???
>>1
前スレ終了してるし・・・
4NAME IS NULL:2006/03/06(月) 19:35:03 ID:???
質問テンプレート

ニックネーム:
1日のオナニー回数:
けつ毛生えているか:Y/N
質問:


5NAME IS NULL:2006/03/08(水) 15:16:31 ID:???
A=1という条件 AND(B=1またはB=2)という条件で検索する場合
どうすればいいでしょうか?
イメージ的にはこんな感じです。
SELECT * FROM table WHERE A = 1 AND (B=1 OR B=2);
もちろんこれじゃ上手くいかないのですが・・・。
6NAME IS NULL:2006/03/08(水) 15:17:21 ID:???
>>5
それでいくはずだけど。
どううまくいかないのか
7NAME IS NULL:2006/03/08(水) 16:35:38 ID:Fp38/AxV
何で試して、どう上手くいかないの?
8NAME IS NULL:2006/03/09(木) 09:22:10 ID:???
>>5
たぶん5の環境なら
〜 WHERE (A = 1 AND B = 1) OR (A = 1 AND B = 2);
9NAME IS NULL:2006/03/10(金) 11:41:14 ID:???
ニックネーム: らーめん
1日のオナニー回数: 1
けつ毛生えているか:Y
質問:
A、BテーブルがありAテーブルのレコードはBテーブルにレコードがなくても全てだしたいのですが
select id from A left join B using (id) だったらいけますが
select id from A left join B using (id) where B.suu>5
等という風に条件をつけたらBのレコードで条件にあうものがないAレコードが
表示されないんですけどどうしたらいいでしょうか?

109:2006/03/10(金) 11:54:33 ID:???
自己レス。
select id from A left join B on A.id=B.id and B.suu>5
でいけました、すまそ。
11NAME IS NULL:2006/03/10(金) 11:58:09 ID:???
AとBひっくりかえすとか。
もう解決したみたいだが。
12NAME IS NULL:2006/03/10(金) 12:36:09 ID:???
>>9
どんな要件なのか詳細はわからないが大抵の場合は外部結合せずにサブクエリで
解決でき、かつパフォーマンスはよくなる。

どうしてもleft join じゃないとだめなのかどうかよく吟味してみるべし。

脱線スマソ
13NAME IS NULL:2006/03/10(金) 15:12:55 ID:???
>>12
嘘?俺は逆にサブクエリは外部結合で解決でき、外部結合の方がパフォーマンスいいと思ってた。
まぁ、ルールベースのオプティマイザの時ね。
相関サブクエリは極力避ける。
14NAME IS NULL:2006/03/10(金) 15:24:24 ID:???
>>12
内部結合ならサブクエリにできることは多いけど、外部結合には当てはまらんのとちゃう?
>>9の例でサブクエリをあえて使うとするとこんな感じか。(確認はしてないけど)
select id from A left join (select * from where B suu>5) Bdash using (id)
>>10 の他にもこれもいけるかも。(これも未確認)
select id from A left join B using (id) where B.suu > 5 or B.suu is NULL
Bのsuuがはじめから NULL だったらだめだけど・・
159:2006/03/10(金) 15:41:38 ID:???
みなさんありがとう。
>>12 俺もサブクエリより結合のがパフォいいと思ってたけど違ったのか・・。

>>14 下の方はsuuが5以下だったらでませんでした。
上の方はいけたんですけど構文の意味がわかりません、教えてください^^;
Bdashってなんでしょうか? 一瞬マリオかとオモタ
169:2006/03/10(金) 15:51:52 ID:???
すみません、たびたび自己すれです。
Bdashはサブクエリの別名だったんですね。
つまり left join 後に BテーブルじゃなくサブクエリのBdashというテーブルが参照される
ということなんですね。
勉強になりました。^^
1712:2006/03/10(金) 16:26:08 ID:???
実行計画とかで試してみたらわかるよ。
外部結合はレコード数増えれば増えるほど飛躍的に重くなる。

カラム数が多いとSQLがまどろっこしく長くなるから面倒だけど、
一個一個サブクエリで持ってきたほうが早い。

tblA (id, hoge)
tblB (id, hoge2, hoge3, hoge4)

外部結合だと
select a.id, a.hoge From tblA as a left join tblB as b on a.id = b.id
サブクエリだと
select a.id, a.hoge,
 (select b.id from tblB where a.id = b.id),
 (select b.hoge2 from tblB where a.id = b.id),
 (select b.hoge3 from tblB where a.id = b.id),
 (select b.hoge4 from tblB where a.id = b.id)
from tblA as a

tblBに該当IDのレコードが無くてもちゃんとNULL帰ってくるし断然早い。
18NAME IS NULL:2006/03/10(金) 16:53:10 ID:???
>>12だけど
>>17
それ、微妙だと思うよ。
その相関副問い合わせだと、仮にtblAに100万件データがあると
SELECTリストのselectが100万回が4つで計400万回実行される。
インデックスはってなきゃ、死亡確実だし、インデックスあっても、
400万回のIndexScanはどうだろう?
非相関副問い合わせなら1回の4つで計4回しか実行されないけど、
みんな相関副問い合わせのコストわかってないね。


19NAME IS NULL:2006/03/10(金) 17:25:03 ID:???
>>12だけど、
というか比較するものが微妙だったね。
今、tblA,tblB共に100万件でOracleで試してみた。
・id列にインデックスなし
外部結合の方が圧倒的にはやい。(まぁ、インデックスなしはレアケース)

・id列にインデックスあり
外部結合:約10秒で最初の1件、約40秒で全件フェッチ完了
サブクエリ:約1秒で最初の1件、約90秒で全件フェッチ完了

まぁ、最初に書いたように、比較する対象、最初の1件か全件フェッチかで
変わってくるね。
20NAME IS NULL:2006/03/10(金) 17:39:15 ID:???
上の「>>12だけど」は「>>13だけど」の間違いね。
2112:2006/03/10(金) 17:46:52 ID:???
>>19
検証どもです。

なんか盲目的に間違ったこと信じこんでたっぽいですね俺(汗
手元にあったMSDEでカラム数5個程度で1万件同士のテーブルで
やってみたら外部結合の方がコスト確実に低いし…_| ̄|○
22NAME IS NULL:2006/03/10(金) 18:10:21 ID:???
>>13です。
まぁ、そもそもケースバイケースだよね。
最初の1件を重視するか全件フェッチの時間を重視するかで変わってくるよ。
ユーザーと対話する画面とかなら、最初の1件返ってくる時間が短い、サブクエリの
方がいいと思うし、バッチとかなら、全件フェッチの時間が短い外部結合がいいと思うし。
俺もいい勉強になった。
まぁ、でも、最初に書いたように、全件フェッチするとなると、相関サブクエリは
レコード数増えるとレコードごとに相関サブクエリが実行されるので、何気に
コストがかかるってこと。
23NAME IS NULL:2006/03/10(金) 23:20:26 ID:???
レコードごとに相関サブクエリが実行される、って、nested-loop joinのことか?
index scanされたnested-loop joinは多くの場合最も速いし、そうでなくても
破綻が少ないと思うがなぁ。

それと、「外部結合」も「相関サブクエリ」もSQLの表現の話だけど、イマドキの
DBMSは字面と実際のアクセスプランが一対一対応するわけじゃなし。
特に、相関サブクエリはプランナの技術が行き着いていて、内部的には
ほとんどjoinと同じに扱われていると思うが。
24NAME IS NULL:2006/03/11(土) 00:54:24 ID:???
>>23
>>13だけど、
>レコードごとに相関サブクエリが実行される、って、nested-loop joinのことか?
全然nested-loop joinの事じゃないよ。で、先ほどの例で実行計画を取ってみたけど、
俺の環境のOracle9i(統計情報取得済み)では、
tblAに対して全表スキャンのみ。joinとかは全くされていない。
つまり、tblAのid列が1,2,3,4・・・1000000というようにレコードがあったら、ます、id列が1の
レコードを取り出して、
select b.id from tblB where 1 = b.idというSQLを実行。
id列が2のレコードを取り出して
select b.id from tblB where 2 = b.idというSQLを実行。
つまり、これをtblAのレコード数100万回実行されてる。それが4つだと400万回。
いくら、インデックスがあってもselect b.id from tblB where a.id = b.id
を100万回実行すれば、コストは高くなる。
Oracle10gならどうなるか知らんが、多分、無理だと思う。










25NAME IS NULL:2006/03/11(土) 15:21:52 ID:???
mysqlのユーザ名に 数字のみやハイフンって使えるのでしょうか?
マニュアルみてもちょっとよくわからんかったとです。
26NAME IS NULL:2006/03/11(土) 17:33:42 ID:???
27NAME IS NULL:2006/03/11(土) 18:13:43 ID:???
プランナの技術が行き着いてるとは随分、かしこいRDMSを使ってるんだな。
俺的には、まだ、中学生のレベルだと思う。一人前になるにはまだまだ。
人間の脳をなめすぎだよ。人間なら簡単にサブクエリを外部結合に変換できるけど、
それをコンピュータで簡単にできると思っているとは。
コンピュータができるのは単純なお決まりパターンしか変換できないよ。
28NAME IS NULL:2006/03/12(日) 01:18:29 ID:???
>サブクエリを外部結合に変換

 するなんて、まさに

>単純なお決まりパターン。

 なんだけど。
29NAME IS NULL:2006/03/12(日) 02:26:20 ID:???
ぐたぐた言う前に実際に試してみろ。
30NAME IS NULL:2006/03/12(日) 12:22:25 ID:???
オマエモナ
31NAME IS NULL:2006/03/12(日) 16:55:09 ID:???
ヒント:>>24で実際にサブクエリが外部結合に変換されてない
32NAME IS NULL:2006/03/14(火) 21:23:55 ID:???
世の中、RDBのかわりにExcelでデータを管理してる人がすごく多いんですけど、
いったい、なんでなんでしょうか?
33NAME IS NULL:2006/03/14(火) 23:19:39 ID:wdw0js8n
Excelの画面が広くていろんなことができるからさ
34NAME IS NULL:2006/03/14(火) 23:24:35 ID:kSfSoeFw
35NAME IS NULL:2006/03/15(水) 21:26:32 ID:???
Excel vs RDB
36NAME IS NULL:2006/03/16(木) 01:03:08 ID:???
Excelなら、VBAで個人で開発でき、いちいち、SIに仕事頼む必要もないし、
金もかからんからね。

37NAME IS NULL:2006/03/16(木) 01:06:54 ID:???
ExcelとRDB比較するのは馬鹿のやること
38NAME IS NULL:2006/03/16(木) 09:11:48 ID:???
同意。
39NAME IS NULL:2006/03/16(木) 09:15:03 ID:???
でも、現実に本来DBでやるべきことを、Excelとマジカルなマクロを多様してやってるところって多いよ。
実際、現業務の分析とかでExcelシート渡されること多いし、マクロってなんつうかわからんし。w
関心するよ、へーこんな風にして集計したり、切り出したり・・・。
SQLなら・・・。
40NAME IS NULL:2006/03/16(木) 15:55:04 ID:???
んでシステム組むと使い勝手悪い自由度低いと言われるんだよな
41NAME IS NULL:2006/03/16(木) 16:15:14 ID:???
そういうユーザには自転車と車の違いを説明してあげよう
42NAME IS NULL:2006/03/16(木) 16:30:24 ID:???
せめてアクセスを使えばいいのにな
43NAME IS NULL:2006/03/16(木) 16:41:42 ID:nPRizLu0
自転車の例でいうと、自分専用にカスタムチューンしたロードレーサータイプだな。
それで好きなら車は不要な場面多いし。w
44NAME IS NULL:2006/03/16(木) 18:07:49 ID:???
ただしABSもエアバッグもついてませんよ
ってかw
45蒸せ:2006/03/16(木) 20:34:02 ID:tLmkQ+0B
46NAME IS NULL:2006/03/16(木) 21:23:42 ID:???
自転車にエアバッグついてても怖いんだけど…
47NAME IS NULL:2006/03/17(金) 00:58:15 ID:gX2nOHG/
どこで質問していいのか分からなかったので
ここで質問させてもらいます。

例えば会社の中で使うdbとして
「肩書きmaster」とデータを書き込んでいく「データ」というテーブルがあったとします。

#肩書きmaster
肩書きid | 名前
-------------
001 | 部長
002 | 課長
003 | 係長

#データ
月 |肩書きid | 本文
-------------------------
3 | 003 | うんたらかんたら
3 | 002 | なんとかかんとか
4 | 002 | あーだこーだ

リレーションを使って肩書きidをつなげられますが、
4月から組織改変で課長→グループ長とかに変わったら、
肩書きmasterの名前を変えますよね。
そうした場合、3月以前のデータもグループ長に肩書き名が変わっちゃいます。

3月以前の表示について課長と表示したい場合、
データテーブルに肩書き名を持っておく方が良いのでしょうか?
それとも肩書きmasterに一行追加する方が良いのでしょうか?
48NAME IS NULL:2006/03/17(金) 01:12:41 ID:???
月 |肩書きid |肩書名 | 本文
通常はこのようにしておき、旧番号を残し、新規番号を追加する。

ただし、会社組織では組織ルールの方を優先させるから
組織のトップの方針に基づき設計しなければならない。
49NAME IS NULL:2006/03/17(金) 02:16:32 ID:???
そういう使い方をしたいマスタには適用開始年月日と適用終了年月日を持たせる
50NAME IS NULL:2006/03/17(金) 15:43:32 ID:???
postgresql8系使ってます。

SQLで任意ユーザの(若しくは自分自身の)所属するグループを取得する関数ありますか?
5150:2006/03/17(金) 20:57:59 ID:???
>>50

SELECT * from pg_group
SELECT * from pg_user
この辺で解決させました。
5247:2006/03/17(金) 23:17:24 ID:???
>>48,49
ありがとうございます。
趣味グラマーで勉強中なので
お二人のやり方を両方試してみます。

>>49さんのやり方でいくと
例に挙げたようなマスターの更新(追加)と、
単純な肩書き名の訂正(上書き)が発生することを考えると
間違えて上書きしないようなロジックまで作らないといけないとか
プログラムって難しいですね。 > スレ違い

>>48さんのでも肩書き名を「科長」とか間違えている時に
データを作られると修正が面倒だし.... > これもスレ違い

うーん、考えることがいっぱいだ。
53NAME IS NULL:2006/03/19(日) 11:30:03 ID:w7DK1yew
今度、SQLを扱うことになったため勉強中の初学者です。

 【所属テーブル】  ※実際には文字ではなく数字で管理している
 名前|所属クラブ
 --------------------
 高橋|野球部
 高橋|サッカー部
 高橋|音楽部
 鈴木|野球部
 鈴木|秘密警察
 斉藤|野球部
 山田|サッカー部
 山田|音楽部
 ジョン|野球部
 ジョン|サッカー部
 ジョン|海外通販番組愛好会

というようなテーブルがあったとします。
このとき、「野球部とサッカー部の両方に所属している者の名前」 は、
どのように取得すれば良いでしょうか。
(この場合、「高橋」と「ジョン」が取得できればよい。)

「野球部 *または* サッカー部のどちらか、または両方に所属している者」という条件なら
DISTINCT を付けるだけで理想の結果が得られたのですが……。

なお、システムはMySQL 3.23 (サブクエリやUNIONが使えない)、
1日のオナニー回数は2回、ケツ毛ありです。
54NAME IS NULL:2006/03/19(日) 11:48:38 ID:???
SELECT 名前
FROM 所属テーブル
WHERE 所属クラブ = '野球部'
OR 所属クラブ = 'サッカー部'
GROUP BY 名前
HAVING COUNT(*) > 1

MySQLはよくわからんけど、↑ではダメ?
55NAME IS NULL:2006/03/19(日) 11:52:40 ID:oG+r0ax/
ある項目に何人登録するかわからない場合、どうテーブルを構築しますか?

具体的には、
●項目「hoge」を購読するアカウント「sato」「takahashi」「kato」
●項目「foo」を購読するアカウント「ito」「sato」「kato」「izumi」
といった感じです。

上手い方法が思いつかなかったので、
[id]=1 [name]="hoge" [user]="sato,takahashi,kato"
[id]=2 [name]="foo" [user]="ito,sato,kato,izumi"
のようにカンマで連結して登録しています。
そしてスクリプト(PHP)側でカンマで区切って配列に格納しています。

一定期間の間ユーザが増減することはないので変更作業は気にしなくていいのですが、
こういう方法が一般的なのか、あるいはもっとスマートな方法が使われているのでしょうか?
「項目テーブル」ではなく、アカウントに対して項目を指定する「ユーザテーブル」を作ればいいのでしょうが、
入ってくるデータの関係上、「項目テーブル」のほうが入力しやすいのでこのような感じになっています。
56NAME IS NULL:2006/03/19(日) 12:00:30 ID:???
普通に

項目, アカウント
hoge, sato
hoge, takahashi
hoge, kato
foo, ito
foo, sato
foo, kato
foo, izumi

でよいと思われ。
57NAME IS NULL:2006/03/19(日) 12:16:42 ID:???
所属テーブル=名前×所属クラブ
なので

除数リレーション=
所属クラブ
---------
野球部
サッカー部

とした場合

所属テーブル÷除数リレーション=
名前
---------
高橋
ジョン

このような演算を関係演算のひとつ、商演算という。
SQLでの書き方はいくつかあるのでググってみそ。
それと、商演算には割り切れるもののみを求めるもの(この場合、
野球部とサッカー部「のみ」に所属する名前を求める)と、そうでない
ものの二種類があるので注意。
5853:2006/03/19(日) 13:24:10 ID:???
>>54氏&>>57

お早いアドバイス、ありがとうございます。
これから試してみようと思います。

>>55
なんか私と似たような話題になってる気がします(笑)
59NAME IS NULL:2006/03/19(日) 19:36:50 ID:???
データベースの接続確認に使えるような NOP のような汎用的な SQL ってないですか?
60NAME IS NULL:2006/03/19(日) 19:47:06 ID:yWTQ8jHa
SQL SERVER2000ですが、日付データが現在の日時の間なら
データを返すwhere条件式ってどうやって書くのですか?
DATEDIFF(d,GETDATE(), 日付)であってますか?
6160:2006/03/19(日) 20:00:52 ID:???
取れました。
あとRandomで取得する関数ってありますか?
62NAME IS NULL:2006/03/19(日) 22:02:57 ID:???
>60-61 はSQL鯖スレの存在と、
BooksOnlineには検索機能があるということを知ったほうが幸せになれるだろう。
63肉太郎:2006/03/21(火) 00:08:19 ID:1obp7zZf
はじめまして。
64肉太郎:2006/03/21(火) 00:10:25 ID:1obp7zZf
databaseを作成したいのですが
sql文を実行するとこのようなエラーが出てしまいます。
すでにマウントってどういうことでしょうか。
どなたかご教授お願いします。

ORA-01501: CREATE DATABASE文でエラーが発生しました。
ORA-01100: データベースはすでにマウントされています。
65NAME IS NULL:2006/03/21(火) 06:53:43 ID:???
ORACLEからマニュアルをDLしてくれば?
エラーリファレンスとSQLリファレンスと管理者ガイドとか。
66NAME IS NULL:2006/03/21(火) 06:58:08 ID:???
>>64
NOMOUNTでCREATE DATABASEするんだべ
67NAME IS NULL:2006/03/21(火) 09:45:00 ID:???
OracleでいうDATABASEと他のRDBMSのDATABASEは別物というのを知ったほうがいいかも。
CREATE DATABASEなんて、Oracleではわかってる人が使うものだと思う。
68NAME IS NULL:2006/03/21(火) 12:03:27 ID:???
Oracleは1インスタンス1データベースなんでCREATE DATABASEは大概インストール時に終わってる。
DDLは処理系依存が大きいからOracleの専用スレで聞いたほうがいい。
69NAME IS NULL:2006/03/22(水) 13:15:27 ID:???
生徒テーブルに得点カラムがあったとして、その得点による生徒数の分布を求めたいのですが、
こういったことはSQLで可能なのでしょうか?
70NAME IS NULL:2006/03/22(水) 13:31:24 ID:???
>>69
得点1点ずつでよければ簡単に。
SELECT 得点, COUNT(*) FROM 生徒 GROUP BY 得点
7170:2006/03/22(水) 13:32:14 ID:???
SELECT 得点, COUNT(*) AS 生徒数 FROM 〜
のほうがよかったかな
7269:2006/03/22(水) 14:26:42 ID:???
>70
ありがとうございます。

質問の説明が不足していました。一点ずつではなく、下記のような範囲で結果を求めたいです。

0〜10点 -- 1人
10〜20点 -- 4人
20〜30点 -- 5人




73NAME IS NULL:2006/03/22(水) 14:41:39 ID:???
>>72
それだと、 10 点の人は 0〜10 と 10〜20の両方にカウントされるけどそれでいいの?
74NAME IS NULL:2006/03/22(水) 15:23:11 ID:???
UPDATE HOGE SET TOTAL=(SELECT SUM(LENGTH) FROM HOGE WHERE 条件1) WHERE 条件2

で条件1に引っかかるレコードがない場合に 0 を設定してやりたいんですけどどうしたら良いでしょうか?
TOTAL が NOT NULL 制約なのでこのままだと「NOT NULL 制約に違反してます」と出ます。
7569:2006/03/22(水) 15:40:06 ID:???
>73

ですね。。。 以下のような結果を求めたいです。

0〜9点 -- 1人
10〜19点 -- 4人
20〜29点 -- 5人


76NAME IS NULL:2006/03/22(水) 16:11:06 ID:???
SELECT 得点/10*10||' - '||得点/10*10+9,count(*) FROM 生徒 GROUP BY 得点/10;

これだと0件が出ないか。
CASE文でカウントするのがよいかも。
77NAME IS NULL:2006/03/22(水) 16:16:56 ID:???
>>74
SUM(LENGTH)

coalesce(SUM(LENGTH), 0)
でどうか。
78NAME IS NULL:2006/03/22(水) 16:24:24 ID:???
>>77
オオ うまいこといきました。なるほどね。
79NAME IS NULL:2006/03/23(木) 07:15:41 ID:???
>>76
||って文字列の連結か何か?
自分の環境でやってみても上手くできないんだけど、なんかそういうの詳しく解説してるサイトとかないですか
80NAME IS NULL:2006/03/23(木) 18:58:13 ID:???
あーすみません、|| はもしかしてPostgreSQL方言か・・・
おっしゃるとおり文字列の連結です。
81NAME IS NULL:2006/03/23(木) 19:39:38 ID:???
oracleにもあるんじゃ。
演算子の方言は調べにくいので困る。
82NAME IS NULL:2006/03/23(木) 19:44:32 ID:???
|| の文字列連結って ISO/ANSI 仕様だけど?
83NAME IS NULL:2006/03/25(土) 12:40:30 ID:/SPcXai6
こういうシステムはこういう組み方にするといい、みたいな、
データベースの組み方の定石とかを勉強できるサイトってありますか?
SNSをつくってるんですが、いまいちデータベースの組み方がわからなくて。。。
84NAME IS NULL:2006/03/25(土) 12:40:43 ID:/SPcXai6
こういうシステムはこういう組み方にするといい、みたいな、
データベースの組み方の定石とかを勉強できるサイトってありますか?
SNSをつくってるんですが、いまいちデータベースの組み方がわからなくて。。。
85NAME IS NULL:2006/03/25(土) 12:41:15 ID:???
うわっ連投すいません
86NAME IS NULL:2006/03/26(日) 08:59:38 ID:???
ここはSQLスレであって、
DBの構築や
テーブル設計のスレではありませんぬ
87NAME IS NULL:2006/03/26(日) 09:39:02 ID:???
良いテーブル設計なんて何やるかで千差万別なんだから定石なんてありようがない。
88NAME IS NULL:2006/03/26(日) 14:59:09 ID:f0EsOhhE
オラクルで順序を作成する時に増分値をマイナスにしたときの
デフォルトの開始値を教えてください。
僕の本には1と載っているんですが-1なんですか?
89NAME IS NULL:2006/03/26(日) 20:04:57 ID:???
ここはSQLスレであって(ry
90NAME IS NULL:2006/03/27(月) 11:01:35 ID:???
>>88

デフォルトは1では。
増分が -1なら、1,0、−1、−2となるのでは?

というか、デフォルトをあてにせず、
START WITH 句で指定しては?
91NAME IS NULL:2006/03/27(月) 22:24:25 ID:G/iM8KCO
テーブル名に日付使えないですか?060329みたいなの
日付ごとにテーブル作りたいのですがなにかよい方法はありませんか?
92NAME IS NULL:2006/03/27(月) 23:00:50 ID:???
作れば良いんでない?
日付のカラムを設けて1テーブルにするのが一般的だと思うんだが...
93NAME IS NULL:2006/03/27(月) 23:32:48 ID:???
>>91
毎回日付のテーブル名でDDL組み立てて流すだけじゃだめなの?
DDL実行できるかどうかは環境(RDBMS, ミドルウェア)による。
9491:2006/03/28(火) 00:11:17 ID:???
>>91>>92
ありがとうございます。
テーブル作成時にテーブル名もしくはカラム名が数字だけだとsyntax errorがでるので
質問してみました。

1テーブルに・・・ですか、なるほど。
月ごとにテーブルを作成して日付のカラムでやってみようと思います。
データにはIDと時間を入れるつもりです。
指定した日付・時間+ID(商品の内容)でIDを抽出したいのです。
商品のテーブルは別に作成し商品内容でしぼりこみできるようにしたいのです。
95NAME IS NULL:2006/03/28(火) 07:17:25 ID:???
またか
まったく同じカラムのテーブルを複数作る考えをする人が後をたたないな
まあ好き好きかもしれないが、テーブル名まで意味のあるデータにしても
メリットないぞ。まああとで気がついたらマージすればいいか
96NAME IS NULL:2006/03/28(火) 10:04:22 ID:FaApuw4t
Oracle10gにてIN句を使用する際、検索対象数(下記A,B,C)は最大いくつまで指定できるのでしょうか?
SELECT * FROM TBL_HOGE WHERE FLD1 IN ('A','B','C')

教えてください。
97NAME IS NULL:2006/03/28(火) 10:10:34 ID:???
メモリの許す限り
98NAME IS NULL:2006/03/28(火) 10:11:23 ID:???
俺の許す限り
99NAME IS NULL:2006/03/28(火) 11:08:27 ID:hOm5gZpT
つうか、そんなこと考える必要のあるINにすることを調べる暇あったら、代案考えるよな。
ミドルウェアとかの仕様もかむんじゃないのか?SQL文として許容される長さが2Kとかあるから。
100NAME IS NULL:2006/03/28(火) 12:45:35 ID:+mR6V9Y6
データベースに入れた住所を県名で文字検索で検索しているが、
「京都」で検索したとき「東京都」まで引っかかるのでなんとかしたい。
住所の項目には、『京都府京都市中京区二条通堀川西入二条城町・・』とあるものも、
ただ単に『京都』と書いてあるだけのものもあるので
「京都府」で検索するのでは上手くいかない。

まず「東京都」を別の文字AAAなどに置き換えて、
置き換えたデータを「京都」で検索すれば上手く行くと思うが、
そういった処理はSQLで、出来るのか、まあはどうすれば良いか分からない。
MySQLを使っています。アドバイス求む。
101NAME IS NULL:2006/03/28(火) 13:18:01 ID:???
>>100
はじめから都道府県だけでも別フィールドにする。
それ以下は合併とかあるから、あとはまとめてでもいいかもしれない。
102NAME IS NULL:2006/03/28(火) 13:20:34 ID:???
それで検索するにしても、条件をもうちょっと詳細にしたほうがいい。
京都で始まるのか、京都が含まれててかつ東京都ではないものなのか、
京都の左が東以外、なのか
103100:2006/03/28(火) 13:46:33 ID:+mR6V9Y6
>>101
そのご指摘はもっともなことなのですが、
既にこれで運用しててデータも1万件ぐらいいれたので。
多少の誤差は起きても良いので入力のとき簡単なようこうしたのですが、
「京都」で検索したとき「東京都」が猛烈にヒットしまくって困ってます。
104NAME IS NULL:2006/03/28(火) 14:02:57 ID:???
前方一致じゃ駄目なの?
10596:2006/03/28(火) 15:10:45 ID:FaApuw4t
>>97 >>99
どうもありがとうございます。
106100:2006/03/28(火) 16:20:18 ID:+mR6V9Y6
>>104
企業の所在地が書いてあって営業所とかも含め、複数の住所が書いてあることもあるのです。
【兵庫県神戸市なんとか。京都府京都市・・・。・・・】ってな感じで。
なので前方一致では上手くいきません。
107NAME IS NULL:2006/03/28(火) 16:34:47 ID:???
SQLでできる仕事じゃねーよ、それ。
ヒットした物の中から例外を除外する処理をしこしこ書くしか無いでしょ。

「福岡」→「上福岡」とか、「山口」→「山口町」とか、
チェックしなきゃならん物がどれほどあるか知らんけど。
108NAME IS NULL:2006/03/28(火) 16:58:55 ID:???
できるけど、条件があいまいだから。
109NAME IS NULL:2006/03/28(火) 17:07:29 ID:AmrQ8SKW
仕様がはっきりすれば正規表現を使えばいい
110100:2006/03/28(火) 17:36:12 ID:+mR6V9Y6
「福岡」→「上福岡」とか、「山口」→「山口町」とか、は
少ないから別に入ってもそんなに問題にならないからいいのですが。
京都→東京都だけはヒット数が多すぎてなんとか処理しないと使い物にならんのです。
「京都→東京都」だけ解決で出来ればいいです。
111NAME IS NULL:2006/03/28(火) 17:59:45 ID:???
複数の住所が入ってて、京都と東京都が両方入ってる場合もあるしな
“京都”単独で抜き出すための条件を書いてみてよ
112NAME IS NULL:2006/03/28(火) 19:50:16 ID:???
[^東]京都 ぐらいしか思いつかん…orz
113NAME IS NULL:2006/03/28(火) 20:01:47 ID:???
複数の住所が同じカラムにあるのなら、別のテーブル作って別処理で
入れていけばいいし、ついでに都道府県の判別もしてこういうカラムに
入れていくようにすれば、いざ検索するときは単純なSQLで済むし、
今後のためにもそうするけどなあ
114NAME IS NULL:2006/03/28(火) 21:29:37 ID:???
複数の住所が1つのカラムにある=アトミックでない
標準的なSQL(SELECT)じゃむりぽ。
115NAME IS NULL:2006/03/28(火) 22:44:52 ID:???
SELECT ADDRESS
  FROM JYUSHO_TBL
 WHERE ADDRESS LIKE '%京都%' AND ADDRESS NOT LIKE '%東京都%'
116NAME IS NULL:2006/03/28(火) 22:56:13 ID:???
「京都府京都市なんとか。東京都千代田区なんとか」
117NAME IS NULL:2006/03/28(火) 23:29:35 ID:???
WHERE ADDRESS LIKE '%京都%' AND (ADDRESS LIKE '京都%' OR ADDRESS LIKE '%。京都%')
118NAME IS NULL:2006/03/29(水) 02:19:01 ID:???
郵便番号は入ってないのですか?
119NAME IS NULL:2006/03/29(水) 02:46:04 ID:Tjg7mIYc
>>115>>117
みたいな簡単なSQLでできるっけ??
NOT EXISTと副問い合わせ使って・・・

select address
from
(select address from Jyusho_tbl whrere address like '%京都%)
not exist
(select * from Jyusho_tbl whrere address like '%東京%)'

と思ったけど、同一カラムに東京都の住所と京都の住所が入っていた場合、
その京都の住所は選択されない?か?

うーん、やっぱり>>114>>113
の言うとおり、1つのカラムに二つの事実がある場合にはこれはもう
データベースとして問題があるから、思ったようにデータは取り出せないな。
120NAME IS NULL:2006/03/29(水) 11:02:54 ID:???
MySQLだから答えにくいってのもあるんだよね
ズバリ答えても使えなさそうで

専用スレで聞いた方がいいかもしれないよ
121NAME IS NULL:2006/03/30(木) 01:19:27 ID:???
郵便番号も無くて住所しかないなら

select distinct case when address like '%東京%' then null
else address
end address2
from jyuusho
where address like '%京都%'
order by address = null
limit 1, 999999
122NAME IS NULL:2006/03/30(木) 09:18:28 ID:WLIUzmVz
典型的に無意味なSQLの議論だな・・・。
すでにあるからしょうがないでその糞テーブルを使い続けるのか・・・。w
それによる生産性の低下、実現困難になるデータの集計など考えたら、再設計だと思うが。
123NAME IS NULL:2006/03/30(木) 09:32:50 ID:???
上司がこれで良いと言ったらこれが正しいのだ。
124NAME IS NULL:2006/03/30(木) 12:09:59 ID:???
まぁ、一応上司にデメリット説明して、それでもいいと言うなら、責任とってもらえばいいじゃん。
125NAME IS NULL:2006/03/30(木) 17:46:38 ID:???
すいません質問させてください。

SQLSeverで、URLの絞りこみを行いたいのですが、
「/」6つ目までの文字列を返すsql文は書けるものでしょうか?
126NAME IS NULL:2006/03/30(木) 18:09:51 ID:DzbucjDX
まぁ、客先のテーブル設計にああだこうだ言い張るのもうっとうしがられるしな。
提案しても意見が通るとは限るまい。
127NAME IS NULL:2006/03/30(木) 19:28:39 ID:ynO9LlOb
設計の悪いテーブルほとSQLのいい演習にはなる
128NAME IS NULL:2006/03/30(木) 19:34:21 ID:???
誰が良い事言えといった
129NAME IS NULL:2006/03/31(金) 09:22:00 ID:t8urZYae
でもそんなSQLの知識は普通は不要だな。

きちんとした仕事をしてる人は、アクロバチックなSQLは知らない。
パズル自慢してる奴はろくな仕事をしていないってこと。
本当に出来る人(火消しとかに突っ込まれる人)って糞設計があったら、こねくり回さずに捨てるよな。
所詮屑は磨いても屑だから。
130NAME IS NULL:2006/03/31(金) 12:01:24 ID:???
それでも何とかするのがプロ
現場で動いて何ぼだよ
131NAME IS NULL:2006/03/31(金) 12:09:26 ID:???
捨てれるかどうかは状況によりけりだな。趣味で作ってるデータベースならいざ知らず。
132NAME IS NULL:2006/03/31(金) 12:22:06 ID:???
>129
>126
133NAME IS NULL:2006/03/31(金) 12:26:02 ID:viY9dnFH
>>125
文字列関数
134125:2006/03/31(金) 12:31:23 ID:???
>>133
レスありがとうございます。

charIndexのことでしょうか?
最初に試したのですが、6回目のヒットを返すと言うことが出来ませんでした…
135NAME IS NULL:2006/03/31(金) 13:14:34 ID:ovwj//lb
>>132
出来ない奴の言い訳だよ。>>126
136NAME IS NULL:2006/03/31(金) 13:19:31 ID:???
と MySQL のエキスパートが申しております
137NAME IS NULL:2006/03/31(金) 17:42:16 ID:viY9dnFH
>>134
7回ぐらいcharIndexを使う
138NAME IS NULL:2006/03/31(金) 22:13:13 ID:HHIOs9rj
>>129
>本当に出来る人(火消しとかに突っ込まれる人)って糞設計があったら、こねくり回さずに捨てるよな。
まじめに読んで損した。
139NAME IS NULL:2006/03/31(金) 22:28:15 ID:???
シッ!
本人はまじめに書いてんだから
140NAME IS NULL:2006/03/31(金) 22:37:17 ID:???
実務を知らない学者先生は理想論を唱える。
しかしながら、現場では無形の理想よりも形ある現実を優先させる。
141NAME IS NULL:2006/03/32(土) 18:41:33 ID:???
誰が良い事言えといった
142NAME IS NULL:2006/03/32(土) 19:31:25 ID:???
良い事か?
143NAME IS NULL:2006/03/32(土) 22:16:26 ID:???
糞しかしらない末端は、それが全てだと思ってる。

糞仕様・糞実装を幾ら直しても、客の用件満たさないんだよ。
とくにDB周りは、致命的な設計ミスはその延長で作っても糞は糞。
ここで現場じゃどうしようもないと言ってるやつは、いつもチキンレースしてるだけ。
144NAME IS NULL:2006/03/32(土) 22:45:29 ID:???
>>143
× 用件
○ 要件
カッコつけてても漢字知らんだけでヴァカに見えwww
145NAME IS NULL:2006/04/02(日) 01:30:20 ID:???
おまえんとこはエンジニアふぜいが口出すのか。
エスカレーションも知らん会社にお勤めとはこりゃ悲惨だな。
146NAME IS NULL:2006/04/02(日) 03:05:07 ID:SxF3YPE4
現在カラムが100ほどあるのですが、カラムをさらに100ほど追加し
1つのカラムに対してSELECTかけるとすると
現在のカラム数100と追加して200とでは処理速度に影響はありますか?
147NAME IS NULL:2006/04/02(日) 16:10:57 ID:???
環境、システム構成とかOSとかによって処理性能が変わってくるので
一概に結果にどのように影響するかはわからない。
規模にもよるが、単純な比例ではないし、エラーで停止することもある。
答えを得るには、ターゲットで実際に動かしてみるしかない。
148NAME IS NULL:2006/04/02(日) 16:19:17 ID:???
PARAM01、PARAM02、… とかいうオプション項目がひたすら並んでるならともかく
今まで大手銀行や保険やってきたが 1 テーブルにカラム 100 って見た記憶がないなぁ。
149超初心者:2006/04/02(日) 23:02:56 ID:WwyuTBf+
実はアクセスでがんばってきたのですが、SQLじゃないと
そろそろだめだと、思い、無料のをダウンロードしてみたのですが、
テーブルやクエリなどの作りかたは、買った本でわかったのですが、
アクセスのようなフォームやレポートの作り方がないのです。
もしかして、SQL Server 2005というのは、必要なレコードの結果
だけをテーブルのリンク?みたいにしてアクセスのフォームで
みるものなのでしょうか?
150NAME IS NULL:2006/04/02(日) 23:30:01 ID:???
はい。データベースエンジンってのはそういうもんです。
SQL Server は知らんけど普通 GUI は付いておらず C, VB や Java なんかの
他の言語で作ります。
151超初心者:2006/04/02(日) 23:45:57 ID:WwyuTBf+
NAME IS NULL さん返事をありがとうございました。
152NAME IS NULL:2006/04/03(月) 03:46:20 ID:???
日付を主キーとしたテーブルで、任意の日付に最も近い日付を前後1件ずつ得るにはどうしたらいいでしょうか
SELECT Day FROM Table WHERE Day > '2004-01-01' ORDER BY Day LIMIT 0,1;
SELECT Day FROM Table WHERE Day < '2004-01-01' ORDER BY Day DESC LIMIT 0,1;
別のアプローチも含めて、これを1回に纏めたいのです。
MySQL5.0です。
153152:2006/04/03(月) 04:08:52 ID:???
最古(新)レコードを基準にすると面倒なことになりそうなので、やっぱり2クエリでやろうかと思います。失礼しました。
154NAME IS NULL:2006/04/03(月) 09:31:23 ID:???
ニックネーム:ポプラ
1日のオナニー回数:0.5
けつ毛生えているか:たくましく

MySQL4.1でこのような2つのテーブルから発売日「2006-04-%」で絞り込んだ以下のようなサマリーテーブルを作りたいのですがどのようにすればよろしいでしょうか?
|タイトル|名前1|名前2|3人以上|発売日|
|タイトル1|Aさん|NULL|NO|2006-04-01|
|タイトル2|Bさん|Cさん|YES|2006-04-06|

TableA
|id|タイトル|発売日|
|1|タイトル1|2006-04-01|
|2|タイトル2|2006-03-31|
|3|タイトル3|2006-04-06|

TableB
|名前|タイトルid|
|Aさん|1|
|Bさん|2|
|Bさん|3|
|Cさん|3|
|Dさん|3|
155NAME IS NULL:2006/04/03(月) 11:00:03 ID:???
select
a.タイトル,
(select b.名前 from TableB as b where タイトルid = a.id limit 0,1) as 名前1,
(select b.名前 from TableB as b where タイトルid = a.id limit 1,1) as 名前2,
case
when (select count(*) from TableB where タイトルid = a.id) >= 3 then 'YES'
else 'NO'
end 三人以上,
a.発売日
FROM TableA as a
where a.発売日 like '2006-04-%'

こんなもんでいかがでしょ。
名前1と名前2に同じのが来ないように何かしら並べ替えできるというのが前提ですが。
156NAME IS NULL:2006/04/03(月) 11:24:49 ID:???
日付型にしないのはなんで?
157NAME IS NULL:2006/04/03(月) 13:45:07 ID:???
likeより日付のbetweenのほうが速そうだね
158ポプラ:2006/04/03(月) 15:55:34 ID:???
>>155
Subquery returns more than 1 row になっちゃいます。

SELECT b.名前 FROM TableA AS a, TableB AS b WHERE b.タイトルid = a.id AND a.id = 1 LIMIT 0,1
こんな感じで名前は抽出できるんですが、WHERE部分がうまくできず「名前1」「名前2」がとりだせません。

>>156-157
お恥ずかしい限りでorz
159NAME IS NULL:2006/04/03(月) 18:51:23 ID:PWDWeczB
ちょっとスレ違いかもしれませんがアドバイスをお願いします。
新人でSQLの勉強をするように言われています。
今は入門書を読んでいるところです。
実機をまだ触らせてもらってないし、最初は見てるだけのような気がするんです。
それでこういう↓の本で独学して、実機の演習をしたいのですが
http://home.impress.co.jp/reference/2237.htm
どうなんでしょうか?焦りすぎですかね。
160NAME IS NULL:2006/04/03(月) 19:42:34 ID:b8wx+sXJ
10:30〜15:00みたいに時間範囲を1つのカラムで表現できますか?
12:00のように指定時間で抽出したいのですが。。
161NAME IS NULL:2006/04/03(月) 19:49:07 ID:???
>>160
RDBMSによると思うけど、普通無理なんじゃないかな。
TIME INTERVALってのがあったとしても、あくまでも時間間隔で、時刻から時刻じゃないから。
162NAME IS NULL:2006/04/03(月) 20:05:11 ID:???
>>159
なんで焦りすぎなんだね?いいことじゃないか。
で、君はまず何の勉強から始めるつもりだね??
その本をちらっと見たが、HTML DBアプリを作るとかあるが、
ちょっと他の本の方がいいと思うぜ。HTML DBアプリなんて仕事で使ってるとこみたことないし。

163NAME IS NULL:2006/04/03(月) 20:10:22 ID:???
CREATE TABLE HOGE(D INTEGER);
INSERT INTO HOGE(D) VALUES(10301500);

SELECT * FROM HOGE WHERE ((D / 10000) <= 1200) AND ((D % 10000) >= 1200);

-- SQL で余剰ってどう書くか知らんけど。
164NAME IS NULL:2006/04/03(月) 22:14:03 ID:A4wZsWSB
2006-1-1
てな多数のデータを
2006-01-01
に変えたいんですが、よい方法はないでしょうか?
SQLの仕事ではない?
165NAME IS NULL:2006/04/03(月) 22:27:09 ID:???
>>164
> 2006-01-01
これはDATE型? それとも文字列?
一旦、DATE型にキャストしてさらに文字列型に変換するといけると思うが。

ex)pgsql
SELECT '2006-1-1'::date::text;
166NAME IS NULL:2006/04/03(月) 22:32:34 ID:???
>>164
基本的なUPDATE構文
変換は文字列関数を使う
ただし文字列関数は方言が激しいのでDBのリファレンスをよく見れ
167NAME IS NULL:2006/04/03(月) 23:42:27 ID:???
はじめて、こちらで質問します。

code
------
02
02

というテーブルがあったとして、
結果としては

code   COUNT
------ -------
01    0件
02    2件

というふうに、実際には存在しない値も表示したい場合、
どのようなSQL文を作るべきでしょうか?
code値の'01'が、他のテーブル値だったら外部結合にするだけで簡単なんですが、
文字列でしかないのです。

どうかご指導お願いします。
168NAME IS NULL:2006/04/03(月) 23:54:34 ID:???
結合用のテーブルを作ればいいじゃん。
169NAME IS NULL:2006/04/04(火) 09:27:29 ID:jEqObLh/
そもそも文字列でしかないって何処に01が存在するの?
DB上?ロジック上?

DB上なら外部結合で出来そうだし、ロジックだったらそれを通して取った後に加工するかしかないでしょ?
170NAME IS NULL:2006/04/04(火) 17:12:48 ID:???
集計に関して悩んでます。

例えば
製品ケーキは原材料 小麦粉2個と卵1個とリンゴ3個を使ってます。

製品プリンは原材料 卵4個とオレンジ2個を使ってます。

ケーキ7個と、プリン4個の注文が入った場合、それぞれの原材料の数量をカウントする集計方法は、テーブルA(製品)とテーブルB(原材料内訳)を元にしてテーブルC(原材料エントリ)を作成し集計する方法がいいのでしょうか?
それとも、他に方法があるのでしょうか?
171NAME IS NULL:2006/04/04(火) 17:50:07 ID:GyIWhKO+
TableCはViewとかSelect結果でOKなんでしょ?
製造業のBOMの考え方そのものだけど、1階層なら普通にできると思うが。
172NAME IS NULL:2006/04/05(水) 10:16:57 ID:Yd1uo026
ウィンドウズ(XP)でapache・phpとMYSQL:4.026を入れてます。
質問ですが、SQLでtrimを使って特定の文字を消去しているのですが、複数の文字を指定することは出来ないのでしょうか?
selecr trim('あ' and 'い' and 'う' from field)from table;
みたいに・・レコードが10万件近くあり消去対象の文字が多いため何度も消去させるには少し時間がかかってしまうのです・・・
173NAME IS NULL:2006/04/06(木) 00:01:21 ID:???
列の足し算はSUMでできたんですけど。
列の掛け算はどうやってやるんですか。
174NAME IS NULL:2006/04/06(木) 05:42:24 ID:???
>>173
どんな掛け算を想定しているかわからないけど、一般論ではストアドファンクションを自前で作るしかないでしょうね。
掛け算だと、あっという間に数値の範囲を越えるから、その点だけ注意。でも、たぶんSUMのようには使えない。
175NAME IS NULL:2006/04/06(木) 10:32:26 ID:???
SELECT EXP( SUM( LN( hogehoge ) ) )
みたいなので求まるだろうけと、あっという間に数値の範囲を超えるのは同じやね。
あとオーバーフローしないまでも誤差とか。
176NAME IS NULL:2006/04/06(木) 19:10:48 ID:???
>174-175 さんのでサクッっと解決できました。 どうも、ありがとです。
177NAME IS NULL:2006/04/07(金) 00:41:33 ID:???
まぁ、掛け算してもいいけど、0のデータを1件だけ入れとけ
178NAME IS NULL:2006/04/07(金) 09:34:56 ID:???
>>177
ワラ
179NAME IS NULL:2006/04/07(金) 10:18:40 ID:???
質問お願いします

Aテーブルのa句、かつ
Bテーブルのb句から検索するにはどうすればいいでしょうか?
select * from A where a & select * from B where b
みたいな感じです
180NAME IS NULL:2006/04/07(金) 10:29:39 ID:???
a, b って条件?

SELECT * FROM A, B WHERE a AND b

つーことか?
181NAME IS NULL:2006/04/07(金) 10:29:52 ID:kx08W7Yf
日本語をまず・・・。
182179:2006/04/07(金) 10:47:25 ID:???
すいません、条件でした。

>>180
それだとa, b両方の条件に一致するデータになりませんか?
183NAME IS NULL:2006/04/07(金) 10:49:36 ID:???
>>182=179
もしかして、UNIONのことかな。
select * from A where a
union
select * from B where b
184183:2006/04/07(金) 10:50:35 ID:???
書き忘れ。UNION使うときは、個々のSQLが返すSELECTリストを一致させることを忘れずに。
185NAME IS NULL:2006/04/07(金) 10:51:20 ID:???
UNIONとか
186185:2006/04/07(金) 10:51:52 ID:???
ウヘ 被ったスマソ
187179:2006/04/07(金) 10:59:11 ID:???
>>183
あ、それに非常に近いです、
ただおっしゃっている select リストが一致しなければ
ならないのが厳しいっぽいです。
カラム名が異なるので・・・・

説明が不足してました、すいません
目的は「データを表示したい」ではなく、
「該当のデータが存在するか」を調べたいと考えています。
188NAME IS NULL:2006/04/07(金) 11:10:00 ID:IwmuPLeT
>>187
>カラム名が異なるので・・・・
カラム名に別名を与えることを知らない。

>「該当のデータが存在するか」を調べたい
EXISTSくらい調べれば出てきそうなものだが。

それ以前に情報を後出しするな。いちばん嫌われる。
189NAME IS NULL:2006/04/07(金) 11:22:39 ID:???
存在確認だけならSELECT二回実行でもよさそうなものだが
190NAME IS NULL:2006/04/07(金) 11:37:04 ID:IwmuPLeT
ある時点での存在確認なら、2回SQL投げるのはよろしくないのでは?
たまたま更新とかが入ったらまずいし。
191NAME IS NULL:2006/04/07(金) 11:50:25 ID:???
確かに…
UNIONとSELECTで結果行が1行でもあれば存在、とか。
192NAME IS NULL:2006/04/07(金) 12:12:47 ID:???
ちなみにWBCでボブを降板させられなかったのはUNIONの存在があったからである
トリビアァァ
193NAME IS NULL:2006/04/07(金) 13:00:02 ID:ecrvSKWK
>>190
結合したView作ればいいじゃん。
194NAME IS NULL:2006/04/07(金) 13:02:09 ID:???
>>193
お前、脊椎で思考してるだろ
195NAME IS NULL:2006/04/07(金) 14:08:07 ID:LNBtOaeS
   
あーな賂愚
196NAME IS NULL:2006/04/07(金) 19:14:01 ID:???
DROP DATABASE hoge_*
で hoge_abc や hoge_def を一気に削除したいのですが、
上手くいきません。
間違ってるところあったらよろしこです
197NAME IS NULL:2006/04/07(金) 19:22:42 ID:???
>>196
コマンドラインだけじゃフツーにムリでしょ。
DROP DATABASE hoge_abc;
DROP DATABASE hoge_def;

と記述したSQL文をバッチで走らすしかないのでわ?
198NAME IS NULL:2006/04/08(土) 08:28:31 ID:???
>>196
ワイルドカードってなんだよ。あほか。
199NAME IS NULL:2006/04/08(土) 13:42:59 ID:???
>>196
1.テーブル名を取得できるディクショナリを見つける
2.SELECT 'DROP DATABASE '||TABLE_NAME FROM うんちゃら WHERE TABLE_NAME LIKE 'HOGE_%'
3.2とファイルに書き出す
4.書き出したファイルをSQL実行する
これが普通のやり方かな?
200NAME IS NULL:2006/04/08(土) 15:18:27 ID:???
初歩的な質問だと思いますが、副問い合わせで得た値をUPDATE文のSET句に使うことはできますか?
UPDATE emp SET salary = ( SELECT MAX(salary) FROM emp WHERE empno = 123 ) WHERE empno = 456;
見たいな事をしたいのですが。
201NAME IS NULL:2006/04/08(土) 15:36:39 ID:???
>>200
RDBMSによる。環境あるならやってみるのが一番。
202NAME IS NULL:2006/04/08(土) 17:42:42 ID:???
MySQLですがだめでした。
203NAME IS NULL:2006/04/08(土) 21:39:15 ID:???
UPDATE emp,emp as emp2 SET salary = max(emp2.salary) where emp2.empno = 123 and emp.empno = 456

みたいなことは出来ないのかな?
204NAME IS NULL:2006/04/09(日) 01:07:15 ID:???
>>203
それってwhere句がどこにかかってるかわからんよ。
205NAME IS NULL:2006/04/09(日) 17:24:30 ID:ZDhYCRCX
お知恵をお貸しください。
テストの点数によって、「優良可不」の評価をつけたいとします。

#評価テーブル
[評価]|[点数_以上]|[点数_以下]
-------------------------------
優|90|100
良|80|89
可|60|79
不|00|59

#成績テーブル
[氏名]|[点数]
-------------------------------
あああ|66
いいい|95

の2つのテーブルを用意し、

あああ|可
いいい|優

というように、成績評価ができるSQLは作れるでしょうか?
206NAME IS NULL:2006/04/09(日) 17:27:26 ID:???
select 氏名,評価 from 成績テーブル,評価テーブル where 点数 between 点数_以下 and 点数_以上
207205:2006/04/09(日) 17:36:54 ID:???
早速お返事いただきありがとうございます。
あっというまに解決してしまいました。
知識不足をさらしてお恥ずかしい限りです・・・
208NAME IS NULL:2006/04/10(月) 09:20:35 ID:CHe7rhoM
PHPより以下のSQL文を発行してレコードの作成を試みているのですが
うまくいきません。
$spl ="INSERT INTO $dbtable (s_code,s_name)VALUES('test','hoge');";
$result = pg_query($dbhandle,$sql);

ちなみにSELECT文はPHPからでも問題なく実行できます。
psqlのプロンプトからだとINSERTも問題なくレコード作成されるのですが
何故でしょうか?
209NAME IS NULL:2006/04/10(月) 10:32:11 ID:tQpfpmup
列A 列B 列C
001 AAA null
002 null QQQ
003 AAA null
004 BBB null

と言うテーブルがあるとして、
下記のような結果を取得したいです。

列A 列B
001 AAA
002 QQQ
003 AAA
004 AAA

何かよい方法はないでしょうか?あれば教えていただけたらと思います。
カラム 結合 null などで検索してみましたが、有益な情報が見つけられなかったので。
よろしくお願いします。
210NAME IS NULL:2006/04/10(月) 10:59:55 ID:???
oracleならnvl()使え
他ならcase〜when〜使え
211NAME IS NULL:2006/04/10(月) 11:05:42 ID:???
列B,列C が同じ型かつ、どちらか一方が必ずnullであるなら

select 列A,列B from テーブル where 列B is not null
union
select 列A,列C from テーブル where 列C is not null

これでもいいよ
俺ならnvlだな

212NAME IS NULL:2006/04/10(月) 12:27:22 ID:???
>>208
エラーメッセージ等の内容がわからないとなんとも。
権限は大丈夫?
213NAME IS NULL:2006/04/10(月) 12:29:12 ID:???
>>209
coalesce() でどうか?
214208:2006/04/10(月) 12:36:36 ID:???
>>208
ありがとうございます。
エラーメッセージすらでないのです。
$resultにはResource id #5 などと帰ってきています。
権限については同じ$dbhandle にてSELECT文は実行できましたので
問題ないと思うのですがいかがですか?
215208:2006/04/10(月) 13:54:11 ID:???
orz

すいません。。。。。
×$spl
○$sql
の記述ミスでした。。。

;y=ー(゚д゚)・∵. ターン
216NAME IS NULL:2006/04/11(火) 11:44:19 ID:WGNJU/LX
SELECT ID, POINT
CASE
WHEN AAA = 0 THEN POINT+10
WHEN AAA = 1 THEN POINT+50
ELSE 70
END AS CAL_POINT
FROM 〜

こういうクエリでCASE句で算出される「CAL_POINT」をさらに計算したものを
SELECT句に載せたいのですがどうすればよいでしょうか。

例えば↓のような感じで(↓はエラーになりますが)
SELECT ID, POINT
CASE
WHEN AAA = 0 THEN POINT+10
WHEN AAA = 1 THEN POINT+50
ELSE 70
END AS CAL_POINT,
CAL_POINT * 100
FROM 〜
217NAME IS NULL:2006/04/11(火) 11:50:38 ID:???
サブクエリにして、外で計算
218NAME IS NULL:2006/04/11(火) 12:36:31 ID:nLSgyURu
質問です。
違うデータベース名のテーブルとの結合はできますか?
やり方を教えていただけませんでしょうか。

--- DBnameA --- --- DBnameB ---
| --table1-- | | --table2-- |
| No | | No |
| name | | value |
--------------- ---------------

table1とtable2の結合がしたいです。
219NAME IS NULL:2006/04/11(火) 12:56:31 ID:???
RDBMSによるんじゃねの?
SQL Serverはできるが。
220NAME IS NULL:2006/04/11(火) 12:58:20 ID:3o22UbSY
>>218
DBMSは?
違うDBってのは起動マシンとかも違うのか?
221NAME IS NULL:2006/04/11(火) 12:59:15 ID:nLSgyURu
外部からSQL Serverに接続してます。
具体的にどうすればよいですか?
222NAME IS NULL:2006/04/11(火) 13:02:03 ID:???
んな感じ
select name,value
from DBNameA.dbo.table1 table1,
DBNameB.dbo.table2 table2
where table1.No=table2.No
223218:2006/04/11(火) 13:10:36 ID:nLSgyURu
できました!
ありがとうございます!
224NAME IS NULL:2006/04/11(火) 16:31:04 ID:36H0vpy0
全レコードのカラムAのデータをカラムBにコピーするような方法はありますか?
一ずつ読み込んで入れていくのが妥当でしょうか?
225NAME IS NULL:2006/04/11(火) 16:33:44 ID:???
あります
226224:2006/04/11(火) 17:16:38 ID:???
>>225
ありがとうございました。
UPDATEでできたんですね、助かりましたぁ!
227NAME IS NULL:2006/04/11(火) 17:17:15 ID:???
>>225 ちゃんと答えてやらないと、わかんない奴になっちゃうよ

>>224
UPDATE tablename SET カラムB = カラムA
1つずつ読み込むとかの「手続き」は、RDBMSまかせ。
228224:2006/04/11(火) 17:47:28 ID:???
>>227
ご親切にどうもありがとうございます!
まだDBいじりはじめた所で^^;;
がんばって勉強します。

229NAME IS NULL:2006/04/12(水) 18:19:30 ID:???
postgresqlでデータベースの操作権限をあるユーザーのみに許可したい場合どうすればいいのでしょうか。
grant/revokeでテーブル単位の権限付与は出来たのですがデータベース単位では出来ませんでした。
mysqlでいうところの
GRANT ALL ON hoge.* TO hoge_user@localhost
に当たる事をしたいと思っております。
230NAME IS NULL:2006/04/13(木) 10:59:02 ID:???
質問させて頂きます。
oracleで以下のSQLを実行したときと同等の結果を出力するSQLを
ACCESSで作りたいのですがどのようにすれば良いでしょうか。

SELECT 1,2,3 from DUAL
UNION ALL
SELECT 4,5,6 from DUAL

テーブルは何も使用しないことが条件です。
DUALに相当する機能があれば出来そうですが、わかりませんでした。
231NAME IS NULL:2006/04/13(木) 11:19:08 ID:???
>>230
1行だけならFROM句なしの構文で書けるのだが, UNIONと組み合わせるとエラーになるようだ。
SELECT 1, 2, 3

ORACLEと同じ構造のDUAL表を作ったらどう?
ORACLEのは確かこんな構造だった。
CREATE TABLE DUAL (DUMMY VARCHAR(1));
INSERT INTO DUAL VALUES ('X');
さらにDUALをシノニムにしてたが、ACCESSだと非表示にでもしておくとよい。
そうすれば下のがそのまま動く

>SELECT 1,2,3 from DUAL 
>UNION ALL 
>SELECT 4,5,6 from DUAL 
232NAME IS NULL:2006/04/13(木) 11:51:06 ID:???
>>231
すばやい返事ありがとうございます。

自前でダミーの表を用意すればよかったのですね。
おかげで上手く動きました。

これでいろいろ過去の資産が流用できます。
233NAME IS NULL:2006/04/13(木) 20:55:26 ID:???
すんません質問いいでしょうか

テーブルAにABC三つの列があって
A列昇順でかつ中身が空のやつを先頭に持ってきたいのですが

SELECT A,B,C
FROM Table_A
ORDER BY A,B,C

ってやるとうまくいかないっぽい
なんかいい方法ないでしょうか?
234NAME IS NULL:2006/04/13(木) 22:21:16 ID:???
>>233
「空」ってのはNULLか? それとも''か。
NULLの場合、処理系によって違うようだが、設定によって指定できるものもあったりするかも。

とりあえず、以下で可能かな。
(SELECT A,B,C FROM Table_A WHERE A is NULL ORDER BY B,C)
UNION ALL
(SELECT A,B,C FROM Table_A WHERE A is not NULL ORDER BY A,B,C);

UNION ALLするからSQL的には順序の保証はないのだろうけど。
235NAME IS NULL:2006/04/13(木) 22:44:57 ID:???
>>234
どうもありがとう!
ちょっとやってみまつ
236白馬の玉子 ◆PqSzNbkqDo :2006/04/14(金) 09:39:18 ID:???
>>235

IsNull か NVL で、
列を変換しちゃったら?

でも、データ量多いと、激烈に遅くなるけど・・・。
237NAME IS NULL:2006/04/14(金) 12:07:35 ID:yImA1Zrj
SELECT A,B,C
FROM Table_A
ORDER BY A Is nullA,B,C

238NAME IS NULL:2006/04/15(土) 17:02:49 ID:???
こんにりは。

キー|名前  | 交通費
ーー+ーーーー+ーーーーー
 1|小泉  | 1000
 2|ブッシュ|   50
 3|フセイン|  300
 4|ブッシュ| 1500
 5|小泉  |  500
ーー+ーーーー+ーーーーー

交通費の合計が最大の人物の名前を求めるにはどうしたらいいですか?
239NAME IS NULL:2006/04/15(土) 17:07:35 ID:???
交通費が同じ人がいるならmax使ってでんでん。
いないなら、交通費を降順にソートして最初の一件を取り出す、というのが手っ取り早い。
240NAME IS NULL:2006/04/15(土) 17:41:41 ID:???
「交通費の合計が最大」じゃまいか?
241NAME IS NULL:2006/04/15(土) 17:59:15 ID:???
あう
242238:2006/04/15(土) 19:21:13 ID:???
select キー,名前,合計select キー,名前,sum(交通費) from 秘密会談 group by 名前,キー order by sum desc limit 1;
でできました!
やっぱりlimitがいいんですかね。maxはこういう時には使わないのが定石ですか?
243238:2006/04/15(土) 19:24:38 ID:???
あう、242だと確かに交通費の合計が同じ人がいるとまずいですね。
View使わないと無理ですか?
244NAME IS NULL:2006/04/15(土) 23:13:06 ID:???
>243
1クエリでっつーんなら、
インラインビューか
EXISTS使った相関サブクエリかな。
245NAME IS NULL:2006/04/16(日) 15:57:51 ID:1uIYODi3
すみません、質問させてください。
現在、DB2を使ってSQLの開発を行っています。
friendsというテーブルにbirthdayというカラムがあり、'2000/01/01'という形でデータが入っています。
これを、年の部分だけ呼び出し、ダブルクオートで囲み、"2000"という風に出力させようとしたのですが、

select '"' || left(birthday,4) || '"' birthday from friends

上記のselect文を実行した際、エラーになりました。
(すみません、少し前の出来事のため、エラーの内容は忘れてしまいました・・・)

別名でbirthdayという名前を宣言しているのですが、これが原因っぽいんです。
DB2では、文字列を加工した場合というのは、別名はつけられないのでしょうか。
246NAME IS NULL:2006/04/16(日) 16:08:00 ID:???
DB2スレへどぞ〜
247NAME IS NULL:2006/04/16(日) 16:41:20 ID:???
as がネェな。ケツの穴でも突っ込んどけ
248245:2006/04/16(日) 16:50:55 ID:???
246>
DB2スレがあまり動きがなかったようなので、こちらで質問させて
いただきました。

247>
回答ありがとうございます。
文字列を加工しない場合、asがなくても別名指定できていたんです。
加工する場合はいるということでしょうか?

とりあえず、DB2スレで質問してみます。ありがとうございました。


249NAME IS NULL:2006/04/16(日) 21:20:24 ID:???
MAX() のような集計関数を
CREATE FUNCTIONで自作したいんですけど、
自身のテーブルを取得するにはどうしたらいいですかね。
250NAME IS NULL:2006/04/18(火) 06:54:51 ID:???
PHPとデータベースを使って、オンラインテストサイトを作る課題を出されました。
・データベースに複数のテストトピック
・1つのテストトピックに3つの質問
・1つの質問に3つの答え(うち1つが正解)

testテーブルとして、testID, testType
questionテーブルとして、testType, question, answer
を作りました。

testID | testType |
------------------------
1 | math
2 | music


testType | question | answer
------------------------------------
math | 1+1 = ? | 1
math | 1+1 = ? | 2
math | 1+1 = ? | 3

mathのquestionとanswerを表示させようと、

SELECT DISTINCT question.question, question.answer
FROM test, question
WHERE test.testType = question.testType
AND test.testType = "math";

と打ちましたが、questionが3回とも表示されてしまいます。

1つのquestionに対し、3つのanswerを表示させるにはどうしたらいいでしょうか?
questionテーブルのanswerの部分を、answer1, answer2, answer3のようにするしかないんでしょうか?
251NAME IS NULL:2006/04/18(火) 08:23:52 ID:JdZlOdJq
下の様なテーブルから "●" の行を抜き出すには並べておいて順番になめていくしかないでしょうか。
なんか一発(か二発か三発か…)でうまく抜き出せる方法ありませんか。


 列A 列B        列A 列B
 10 a          8 a
 9 a          6 b
 8 a ●   →    4 a
 7 b
 6 b ●
 5 a 
 4 a ●
 3 c
252NAME IS NULL:2006/04/18(火) 08:33:19 ID:JdZlOdJq
あら、くっついちゃった…

列A|列B 列A|列B
10 | a 8 | a
9 | a 6 | b
8 | a ● → 4 | a
7 | b
6 | b ●
5 | a 
4 | a ●
3 | c
253NAME IS NULL:2006/04/18(火) 08:35:24 ID:JdZlOdJq
ありゃりゃ…もうダメだ…
254NAME IS NULL:2006/04/18(火) 10:45:08 ID:???
>>251
SQLiteで試してみた
sqlite> create table aa ( n1 integer primary key, n2 text );
データ突っ込んで
sqlite> select aa.n1,aa.n2 from aa join aa as bb where aa.n1=bb.n1+1 and aa.n2<>bb.n2 order by aa.n1 desc;
8|a
6|b
4|a
でどうよ?
255NAME IS NULL:2006/04/18(火) 22:57:03 ID:BgW55tF/
postgresqlなんですけど
text形式のカラムに - をデフォルトで入れたいのですが
エラーで設定できません。なにか方法はありませんか?
256NAME IS NULL:2006/04/18(火) 23:03:59 ID:???
CREATE TABLE X(A TEXT DEFAULT '-')

で何か不都合でもあるのか?
257NAME IS NULL:2006/04/19(水) 02:27:21 ID:0RBlEwHY
誰か教えてください
258NAME IS NULL:2006/04/19(水) 02:35:15 ID:???
>>257
それであってる
259NAME IS NULL:2006/04/19(水) 02:50:50 ID:0RBlEwHY
テーブルのデータをCSVファイルに出力する方法を誰か教えてはくれませんか?
よろしくお願いします。
260NAME IS NULL:2006/04/19(水) 02:58:24 ID:???
おーい、エスパー
お呼びだぞー
261251:2006/04/19(水) 06:07:55 ID:???
>254
ちょっと例題を単純にしすぎてしまったんですが(くっついちゃってるし)、
列Aは降順というだけで必ず1づつ減ってる訳ではないんです。すまん。

DBは Pervasive.SQL 2000i つうのなんだけど、ためしに>251のデータで
テーブル作って>254のSELECT文やってみたらエラーになっちゃった。
262NAME IS NULL:2006/04/19(水) 07:53:53 ID:???
>259
ODBC設定してExcelかAccessでインポートして、CSV形式でアウトプットする。
この回答で満足できないのであれば、環境ぐらい示せ。
おいらはエスパーではないし、ここの住人も大概エスパーではない。。
263NAME IS NULL:2006/04/19(水) 11:20:49 ID:???
PostgreSQL のデータをCSV出力する
ttp://it-revolution.seesaa.net/article/1173038.html
こーゆーことじゃなくて?
264NAME IS NULL:2006/04/19(水) 16:07:22 ID:???
ORACLE 8.16 で WINですが、
SQLで 2006/02/15 に半月を加算したいのですが
+15では 2006/03/02になってしまいます。
大の月小の月に 半月や1/3月を加算するのには 
どんな考え方したらいいんでしようか?
関数などで対応可能でしょうか?
265NAME IS NULL:2006/04/19(水) 16:31:32 ID:++s2VMjx
つうか、貴方の半月の概念って教えて欲しいよ。
3/16に半月足したら3/31?4/1?
266白馬の玉子 ◆PqSzNbkqDo :2006/04/19(水) 16:49:57 ID:???
>>264

265さんの意見に同意。

日数/月に、28,29,30,31日の4パターンが存在するのに、
それをひとくくりに「半月」とかって表現している264さん、
あなた、すごいね。

で、半月=15と定数定義しちゃってるところもすごいよね。
そこらへんをわかってて書いてるなら、俺は吊られたことになるな(笑)

厳密にするなら、
Months Between 使って、
当月1日と翌月1日との日数の差を出して、
そいつをFloat型としてから、
2で割って、(あるいはMod出して)
そいつをさらに、FloorするのかCeilするのか判断して、
適用する。

で、ここまで算出する「半月」という概念が、重要なのかどうか微妙。
っていうか、月をまたいで「半月」って厳密表現できないし。。。。

だったら、

・毎月1日〜15日 を「上半月」とし、
・毎月16日〜月末日 を「下半月」として、

あらかじめ定義してしまうことで、

「上半月」は絶対的に15日
 (グレゴリウス暦の単月単位が15日未満に将来変更されなければ絶対に!)
「下半月」は月によっては不定だが、
 Oracleなら上記のMonths Between、SQLServerならDateDiffで、
 その日数を算出できるので、もーまんたい!

ちなみに、上記の定義、というか、対処方法、
むかし、このような「半月」なんつーばかげた概念を要求してきた
エンドユーザに切り替えした手法です。

ちなみに、月の途中、たとえば、x月6日、とかの時点で、「半月後」とかっていう
要望は、却下なのは、上記の仕様では言わずもがな。
毎月の1日と15日と月末がすべてのポイントであって、
それ以外は仕様として却下なので算出する機能も付与しない。

こんなもんなら、実現できるっしょ?
グループウェアとかスケジューラだったら、これで十分。
この定義に賛同しないやつはペルソナノングラータってことで・・・。
267NAME IS NULL:2006/04/19(水) 16:51:01 ID:???
>265 さん
4/1になります。
ただ 今回の件は 締日(5日、10日、15日、20日、25日、 末日) に半月や
1/3月を足して集金日を算出したいのです。
2/15に+15したら 3/2になってしまったら半月後にならないので
2/28になってほしいのです。
268NAME IS NULL:2006/04/19(水) 16:55:03 ID:???
そう組め
以上
269白馬の玉子 ◆PqSzNbkqDo :2006/04/19(水) 17:41:32 ID:???
>>267

集金日が不定日って、業務的にどうなんよ?
一定法則で固定日で法則付ければにすればすむことじゃねーのか?

固定法則にせずに、あえて15とか定数を日数を加算するのは、なんの意味があるんだ?

もうね、SQLとかプログラミングとかじゃなくて、
業務分析とリエンジニアリングが必要なレベルだと思うね。

その要求仕様つくったやつが、馬鹿すぎの基地外だわさ。
ふつうは、そんなことできません!って、要求受けるときに
断るか、別提案をしてるね。してない時点で、もう、k;えじゃヴぃあだfsだ・・・。

そんな要求受けちゃって作ってるPGの方、大変だね。
あとでバグの責任、おしつけられちゃうよ。
ご愁傷様。
270NAME IS NULL:2006/04/19(水) 18:07:07 ID:???

まで読んだ
271NAME IS NULL:2006/04/19(水) 18:27:46 ID:???
>半月や 1/3月を足して集金日を算出したい
半月の場合と1/3月の場合があるって事か?

締日 集金日A  集金日B
05日 当月20日 当月15日
10日 当月25日 当月20日
15日 当月末日 当月25日
20日 次月05日 当月末日
25日 次月10日 次月05日
末日 次月15日 次月10日

こういう事?
272NAME IS NULL:2006/04/19(水) 18:27:56 ID:???
Webプログラミングなんですが、
あるページでテーブルAの中のmathを選択したとします。
次のページで、testTypeを引き継ぐとして、
(1) SELECT * FROM TABLE-B WHERE testType='math'
ってやってもよいものでしょうか。
それとも地道にTABLE-Aも見て、
(2) SELECT * FROM TABLE-A, TABLE-B
     WHERE TABLE-A.testType='math' and TABLE-A.testType=TABLE-B.testType
とすべきでしょうか。
ユーザーからパラメータが見えなければ、(1)でもいいか、と思っているのですが。

TABLE-A
testID | testType |
------------------------
   1 | math
   2 | music

TABLE-B
testType | question | answer
------------------------------------
   math | 1+1 = ? | 1
   math | 1+1 = ? | 2
   math | 1+1 = ? | 3
273NAME IS NULL:2006/04/19(水) 18:31:32 ID:???
>>>266
お時間を割いていただいて恐縮です。

パッケージソフトの仕様で 
月2回締とか3回締とか出来るようになっているんですが
集金日は1回しか設定できないようになってるんです。
定数15は2回締めはマスタに15という定数が3回締めは10が
入ってたんで便宜的に使ってたというのが実際です。

で、もうサポートも切れかかっているしベンダーとも疎遠なので
エンドユーザーの馬鹿が考えているわけなんですが。。。

でも 商習慣では月に2回締めて2回集金や3回締めて3回集金
などは結構あるとは思うんですが 特殊なんでしょうかねえ

考えられる条件を全て割出してFUNCTIONを作ろうかなと今は
ぼんやり考えています。

おさわがせしました。
 
274NAME IS NULL:2006/04/19(水) 18:35:45 ID:???
math を music に改ざんされてセキュリティ的な不具合があれば NG。
単に表示がおかしくなるとかユーザの不利益になるだけなら OK。

てか (1) と (2) ってユーザから見える見えない関係ないじゃん。
275NAME IS NULL:2006/04/19(水) 18:42:16 ID:???
>271

締日 集金日A  集金日B
05日 当月20日 当月15日
10日 当月25日 当月20日
15日 当月末日 当月25日
20日 次月05日 当月末日
25日 次月10日 次月05日
末日 次月15日 次月10日

ではなく

締日  締日2 締日3    集金日A  集金日B  集金日B
10日  20日  末日  当月20日 当月末日 次月10日
15日  末日       当月末日 次月15日

こんな感じなんですが、SQLじゃ無くなってきましたね。

276NAME IS NULL:2006/04/19(水) 18:45:46 ID:???
そういうときは、締め日と集金日を対応させたテーブルを
別に用意して結合させるとよいよ
277NAME IS NULL:2006/04/19(水) 18:46:03 ID:uBoJgKdo
>>274
ありがとうございます。
>てか (1) と (2) ってユーザから見える見えない関係ないじゃん。
サンプルで書いたのでそうなってしまいました。
たとえば、ユーザによってmusicしか見せないとかの条件が増えると、
>math を music に改ざんされてセキュリティ的な不具合があれば NG。
が効いてきます。
278NAME IS NULL:2006/04/19(水) 19:01:03 ID:???
>>276

わかりました!!
集金予定のカレンダーテーブルみたいなのを作れば
いいんですね。

解決できそーです。 ありがとうございました。
279NAME IS NULL:2006/04/20(木) 00:48:46 ID:???
DB初めて1週間な素人の俺が言うのもなんだけど、

「締日テーブル」
顧客ID|締日ID|締日
   1 |   1 |10日
   1 |   2 |20日
   1 |   3 |末日
   2 |   1 |15日
   2 |   2 |末日

「集金日テーブル」
顧客ID|締日ID|集金日
   1 |   1 |当月10日
   1 |   2 |当月末日
   1 |   3 |次月10日
   2 |   1 |当月末日
   2 |   2 |次月15日

みたいなテーブル作れば対処できるんでない?
顧客ごとに締日と集金日が決まってるのじゃなくて、いくつかあるパターンから一つを選ぶなら
顧客IDの所をパターンIDとかの名前にすればおk
280白馬の玉子 ◆PqSzNbkqDo :2006/04/20(木) 11:06:42 ID:???
>>278

だから「一定法則」って言ったんだけど・・・。

言葉が足りなかったね・・・。

「締切日-集金日マスタテーブル」みたいなものを作れ!

だったね。

っていうか、それさえも考えてなかったってことね・・・・・。
俺の言葉と思考と配慮が足りなかったっす・・・。
ごめんなさい。
281NAME IS NULL:2006/04/20(木) 18:23:09 ID:WpAs8yli
すみません。教えてください。
もしかしたら、簡単かもしれないのですが、

A列  B列   C列
1   name1  value1
1   name2  value2

とあって、

B列に、name1,name2が存在したら、同じA列=1のC列の
値を使用して、
1 value1 value2
という形で1レコードでセレクトするという方法
はあるのでしょうか?

282NAME IS NULL:2006/04/20(木) 18:46:35 ID:???
A列の位置づけがわからん。

A列  B列   C列
1   name1  value1
1   name2  value2
2   name1  value3
3   name2  value4
4   name1  value5
4   name2  value6

の場合に、結果は
1 value1 value2
4 value5 value6

となるってことか?
283NAME IS NULL:2006/04/20(木) 18:56:07 ID:???
という前提で
select T1.A列,T1.C列,T2.C列 from TABLE as T1,TABLE as T2 where T1.A列=T2.A列 and T1.B列='name1' and T2.B列='name2'
284NAME IS NULL:2006/04/21(金) 10:45:31 ID:CX6yg83T
Postgresスレでも書いたのですが反応がないので、こちらで質問させて下さい。

連番のプライマリIDをふる時に、numeric(n)とvarchar(n)のどちらのほうがいいでしょうか。
感覚的には文字列比較のvarchar(n)より、数値比較のnumeric(n)のほうが
速くていいのではないかと思うのですが。
うちの昔のシステムはなぜかvarchar(n)で0詰めなんですが、何か意味があるんでしょうか。
285NAME IS NULL:2006/04/21(金) 11:08:48 ID:???
>>284
文字列連番は0パディングとかで順列に並ぶけど、それってもともと数値だからってことだよね?
だからnumericのほうが良いかと。
あなたのとこの旧システムのことなんかは知らん。けど、自分が経験したのでは、汎用機との
データ交換のため、数字→文字列変換が頻出するので相手のレコード定義に合わせて文字列に
したことがあります。
286NAME IS NULL:2006/04/21(金) 11:09:33 ID:tbOfvmy1
>>281
group_concat
287NAME IS NULL:2006/04/21(金) 11:37:21 ID:???
>>285
>文字列連番は0パディングとかで順列に並ぶけど、それってもともと数値だからってことだよね?
はい、そういうことです。
理由がない限り、numericにします。
そのほうがシーケンスで連番をとったときの処理も少しだけだけど楽だし。
ありがとうございました。
288NAME IS NULL:2006/04/21(金) 15:12:34 ID:???
NULLで検索するにはどうすればよいでしょうか?
指定カラムに何もデータが入っていない行を抜き出したいのです。
289NAME IS NULL:2006/04/21(金) 16:15:12 ID:???
>>288
NOT EXIST
290NAME IS NULL:2006/04/21(金) 20:58:22 ID:???
>>288
カラム名 is nullのことかな。
291NAME IS NULL:2006/04/21(金) 23:37:00 ID:adYs71/0
CREATE PROCEDURE [dbo].[sp_test]
@HIN_CODE int,
@PRICE int = 0 OUTPUT,
@QUANT int =0 OUTPUT
AS
SELECT
@PRICE=TANKA,
@QUANT=SURYO
FROM
SYOHIN
WHERE
HINCD=@HIN_CODE
↑の場合
「変数に値を代入する SELECT ステートメントを、データ取得操作と組み合わせることはできません。」
と出るのですが、構文としておかしいですか?
戻り値を変数に入れて返したいのです。
292NAME IS NULL:2006/04/22(土) 02:03:27 ID:???
output パラメータにデフォルト値指定できるんだっけ?

なんにしても
SELECT 
  @PRICE=TANKA, 
  @QUANT=SURYO 
FROM 
  SYOHIN 
WHERE 
  HINCD=@HIN_CODE 

この部分だけ見れば別に問題は無いので、
一度他の変数で受け取ってからoutputパラメータに入れるとか試してみれば?
293NAME IS NULL:2006/04/22(土) 07:49:34 ID:???
294NAME IS NULL:2006/04/22(土) 08:00:08 ID:???
>>293
PostgreSQL スレで馬鹿晒したからってこっちまで荒らしに来るなよw
295NAME IS NULL:2006/04/22(土) 08:12:39 ID:???
>>294はスルーできない馬鹿w
296NAME IS NULL:2006/04/22(土) 09:15:12 ID:???
(´,_ゝ`)プッ
297NAME IS NULL:2006/04/22(土) 18:46:43 ID:YssWFDXh
クライスラーの中古車検索のページで
SQL文を直接埋め込んだリンクを使っているんですけど
こんな設計ってアリ?

ttp://www.chrysler.co.jp/servlet/chrysler.UCarSearchServlet?SV_ACTION=PAGE_CHANGE&PAGENO=1&SQL=WHERE@CLASSID@in@(@'PT'@)@AND@DELFLAG@=@'0'@&ORDER=3
例)PTクルーザーで価格を安い順にした場合
298NAME IS NULL:2006/04/22(土) 18:50:28 ID:???
>>297
ワロタ。どこの会社が作ったんだろう?
299297:2006/04/22(土) 19:10:02 ID:???
>298
JAVAで組んでると思うのでスレ違いですが、JAVAのこと分からないので
コチラで質問投げてみました。
趣味グラマーの自分でもこんな作り方したことない&見たことないし、
SQLインジェクションとか考えたらこんな作り方しないですよねぇ。
300NAME IS NULL:2006/04/23(日) 01:35:10 ID:41Q31Zfh
質問です。
AテーブルとBテーブルを外部結合しているのですが、
Bテーブルと結合する条件はBテーブルのKEY2が5555と
比較して一番大きいデータと結合したいです。
(AテーブルとBテーブルの結合は1対1になります。)

SQL文を書いてみたのですが、

SELECT A.aaaa,B.xxxx
FROM Aテーブル AS A
LEFT OUTER JOIN (
SELECT *
FROM Bテーブル AS BB
INNER JOIN
(
SELECT KEY1,MAX(KEY2) AS DATEMAX
FROM Bテーブル
WHERE KEY2 <= 5555
GROUP BY KEY1
) AS C ON C.KEY1 = B.KEY1
) AS B ON B.KEY1 = A.KEY1

けっこう時間がかかります。
SQL-Serverの実行プランで見ると、
Aテーブルの件数×Bテーブルの件数
をSeekやSortかけているようです。

もっといいやり方がありましたらご教授ください。
301NAME IS NULL:2006/04/23(日) 06:36:56 ID:G1eIi97b
UPDATE $dbtable SET data = hoge WHERE code = 01 ORDER BY name, name LIMIT 1 OFFSET $no;
とやってみたのですがエラーがでます。
更新をnameをソートした$no番目だけに行いたいのですがよい方法はありませんか?
302NAME IS NULL:2006/04/23(日) 08:37:29 ID:???
>>300
ORACLEだとこうできるけど、どうだろう?

SELECT A.aaaa,B.xxxx
FROM Aテーブル A
LEFT OUTER JOIN
(SELECT *
  FROM (
    SELECT B.*, ROW_NUMBER() OVER(PARTITION BY KEY1 ORDER BY KEY2 DESC) AS R
    FROM Bテーブル B
    WHERE KEY2 <= 5555
  )
WHERE R = 1)
USING(KEY1);
303300:2006/04/23(日) 08:42:15 ID:???
SQL-SERVERって書いてるな・・・。
すまそ。
SQLServer2005ならROW_NUMBERサポートされてるっぽいが。
304302:2006/04/23(日) 08:45:53 ID:???
↑名前間違えた
305NAME IS NULL:2006/04/23(日) 09:36:31 ID:???
>300 はホントにこれで正しい結果が得られているの?
正しい結果が得られているのであれば

SELECT A.aaaa, B.xxxx
FROM Aテーブル AS A
LEFT OUTER JOIN
(SELECT * FROM Bテーブル
WHERE KEY2<=5555) AS B
ON A.KEY1=B.KEY1

でもいけると思うけど。
BテーブルのKEY2が最大という条件を生かしたいのであれば、

SELECT A.aaaa, B.xxxx
FROM Aテーブル AS A
LEFT OUTER JOIN
(SELECT * FROM Bテーブル AS B1
 WHERE EXISTS
  (SELECT KEY1 FROM Bテーブル AS B2
   WHERE
    KEY2<=5555
   GROUP BY KEY1
   HAVING MAX(KEY2) = B1.KEY2) AS B
ON A.KEY1=B.KEY1

とかになっちゃうけど、実際どっち?
306NAME IS NULL:2006/04/23(日) 12:42:34 ID:Bkz4SFA0
>>303
SQL-Server2000です。
ROW_NUMBERサポートされてないみたいですね。

>>305
Bテーブルの内容

KEY1 KEY2 項目a
1 111 tttttttttt
1 222 zzzzzz
1 333 kkkkk
2 30 ppppp
2 40 uuuuuu

テーブルAと結合対象としたいデータ
KEY1 KEY2 項目a
1 333 kkkkk
2 40 uuuuuu

KEY2が最大の行と結合したいです。
307NAME IS NULL:2006/04/23(日) 13:05:24 ID:+HAiPb4I
以下のストアドを別のストアド内で使用しようと思っています。

CREATE Procedure sp_Table(@CODE varchar(2))
AS
SELECT CODE,NAME FROM Table
WHERE CODE = @CODE
ORDER BY SORT

取得先のストアドで、OUTPUTパラメータのない↑のストアドの戻り値を取得するには
どのような記述になるのでしょうか?
308NAME IS NULL:2006/04/23(日) 13:36:20 ID:???
アーカイブログを1日分取得するSQLを書いていますが、下記の結果がちがうのは
何故でしょうか。結果を見ると、to_dateは時間を無視して、日付のみ
対象にしているようですが、何故なのか理由がわかりません。

--to_date
select to_char(COMPLETION_TIME,'yyyy-mm-dd hh24:mi') from v$archived_log
where to_date(COMPLETION_TIME,'yyyy-mm-dd hh24:mi')
between to_date(sysdate-1,'yyyy-mm-dd hh24:mi')
and to_date(sysdate,'yyyy-mm-dd hh24:mi');

--to_char
select to_char(COMPLETION_TIME,'yyyy-mm-dd hh24:mi') from v$archived_log
where to_char(COMPLETION_TIME,'yyyy-mm-dd hh24:mi')
between to_char(sysdate-1,'yyyy-mm-dd hh24:mi')
and to_char(sysdate,'yyyy-mm-dd hh24:mi');

309NAME IS NULL:2006/04/24(月) 02:15:46 ID:???
TABLE-A
顧客ID | 明細ID
-------------------
001 | 001
001 | 002
002 | 003

TABLE-B
明細ID | 商品ID
----------------
001 | 001
001 | 010
001 | 005
002 | 008
003 | 001

というようなテーブルがあって、(1)「商品ID 010と008の両方を買ったことがある
顧客のID」、(2)「商品ID 001と005を同時に買ったことがある顧客のID」を調べたい
と思ってます。ターゲットはMySQL3.23です。どういうクエリーを書いたらいい
でしょうか。
310NAME IS NULL:2006/04/24(月) 09:04:53 ID:???
>>309
(1)
SELECT 顧客ID
FROM TABLE-A INNER JOIN TABLE-B
USING(明細ID)
WHERE 商品ID IN('010', '008')
GROUP BY 顧客ID
HAVING COUNT(DISTINCT 商品ID) = 2

(2)
SELECT 顧客ID
FROM TABLE-A INNER JOIN TABLE-B
USING(明細ID)
WHERE 商品ID IN('001', '005')
GROUP BY 顧客ID, 明細ID
HAVING COUNT(DISTINCT 商品ID) = 2
311309:2006/04/24(月) 10:50:12 ID:???
>>310
ありがとうございます。やってみます。
312NAME IS NULL:2006/04/24(月) 22:57:47 ID:???
>>300
こんなので行けない?

SELECT A.aaaa,B.xxxx
FROM Aテーブル AS A
LEFT OUTER JOIN
(
SELECT TOP 1 xxxx FROM Bテーブル
WHERE KEY2 <= 5555
ORDER BY KEY2 DESC
) AS B
ON A.KEY1 = B.KEY1

313NAME IS NULL:2006/04/25(火) 00:39:15 ID:Rj3HDiyY
|都道府県|値 |数
------------------
|東京  |aaa|5
|東京  |bbb|3
|東京  |ccc|1
|大阪  |ddd|6
|大阪  |eee|8
|福岡  |fff|9
|福岡  |ggg|0
|福岡  |hhh|2

というようなテーブルがある場合に、都道府県別に
最大の数を持つ行を抽出したいのですが、
どのようなクエリを書けばいいのでしょうか?

上記例の場合、欲しい結果は次の3行です。

|東京  |aaa|5
|大阪  |eee|8
|福岡  |fff|9


対象DBはPostgreSQL 8.1です。宜しくお願いします。
314白馬の玉子 ◆PqSzNbkqDo :2006/04/25(火) 09:33:55 ID:???
>>300

そんなにレコード数が多くないなら、
#Tempで一時テーブルにInsert Into〜 Select して、
その#TempにIdentity列を生成して、通番を確保して、
その通番列と比較する、って方法もあります。

ただ、これって、一時テーブルを毎回生成するので、
複数のクライアントから連続して投げ込まれると、
サーバが大変だったりします。

でも、レコード数が少ない場合は、結構有効な手段ですよ。
315白馬の玉子 ◆PqSzNbkqDo :2006/04/25(火) 09:36:59 ID:???
>>313

都道府県別にGroupしてMax値をとるサブクエリを埋め込んだ、
もとのテーブルの値と比較するクエリをつくれば、
いっぱつで出てこない??

で、313さんにしつもん。
最大値を持つ同じ都道府県のレコードが複数あったらどうすんの?
316NAME IS NULL:2006/04/25(火) 09:50:10 ID:???
select * from table
where (都道府県, 数)
in (
select 都道府県, max(数) from table
group by 都道府県
)
317NAME IS NULL:2006/04/25(火) 11:48:24 ID:2WcMpKNa
ある検索システムなんですが、検索に正規表現を使えるようにしようかと思っています。
このシステム自体はどのDBMSでも(小さな修正程度で)対応できるようにしたいと思っています。

ですが、SQL標準には正規表現検索機能はなく、各DBMSが独自に拡張しているものですよね。
だから正規表現検索に対応していないDBMSもあるかもしれないわけです。

で、実際問題、正規表現検索に対応していないDBMSというのはあるのでしょうか?
318NAME IS NULL:2006/04/25(火) 12:20:07 ID:???
正規表現検索はDBの独自拡張なので、使用方法はまちまちだし
検索できないDBもいっぱいある

さらに、DBの正規表現検索は全カラムを走査するのでひたすら遅い
だから普通は検索用indexを別に用意する
319NAME IS NULL:2006/04/25(火) 14:12:49 ID:2WcMpKNa
>>318
うん。で、正規表現検索に対応していないDBMSとは
具体的にどれでしょうか。
320NAME IS NULL:2006/04/25(火) 15:14:13 ID:9aFhrn60
>>319
自分で調べれば?
321NAME IS NULL:2006/04/25(火) 15:21:36 ID:2WcMpKNa
>>320
このスレは何のでスレでしょうか?
322NAME IS NULL:2006/04/25(火) 15:37:25 ID:???
>>321は、馬鹿なうえに師匠も友達も居ないから2chで質問するわけで。
323313:2006/04/25(火) 16:18:38 ID:???
>>315、316

ありがとうございます。316のクエリでいけました。

315で指摘されているように
> 最大値を持つ同じ都道府県のレコードが複数あったらどうすんの?
が今度は問題になりました。その場合は値が小さい方、この例で
言うと「aaa」、「bbb」が同じ数の場合、東京は「aaa」になるように
したいです。(実際はここの値は日付)

select 都道府県, min(値), 数 from table
where (都道府県, 数) in (
  select 都道府県, max(数) from table
  group by 都道府県
)
group by 都道府県、数

これで合っていると思うのですが、どうでしょうか。
324NAME IS NULL:2006/04/25(火) 16:23:33 ID:???
>>321
>このシステム自体はどのDBMSでも…

具体的にどれとどれに対応すんの?
話はそれからじゃない?
325NAME IS NULL:2006/04/25(火) 18:16:49 ID:???
データベース関連の会社で働いている方、
でデータベースにデータを入力する仕事ってどのぐらい金とってる?
お客に一番大変なところはエクセルに入力させて、カラム20で3千行というか3000件で、
客の知らないソフト使って裏でコピペして流し込むだけで、幾ら取っている?
326NAME IS NULL:2006/04/25(火) 18:48:13 ID:???
それがSQLに何の関係が。
327NAME IS NULL:2006/04/25(火) 19:06:28 ID:???
スレがないからご迷惑を承知で聞いています。なにとぞ緊急の要件上お答えくださらぬか。。。。。
328NAME IS NULL:2006/04/25(火) 19:12:50 ID:???
緊急だということが、SQLに何の関係か。
329NAME IS NULL:2006/04/25(火) 19:16:11 ID:???
食いつくな、おしゃぶり暇か?知らないならほっとけ、ペイペイには、わかるわけないから
330NAME IS NULL:2006/04/25(火) 19:18:08 ID:???
何語?
331NAME IS NULL:2006/04/25(火) 19:25:26 ID:???
ヒント: 縦読み
332NAME IS NULL:2006/04/25(火) 19:25:28 ID:???
おまえおしゃぶり暇人?かって
333NAME IS NULL:2006/04/25(火) 21:10:49 ID:???
>>325 は、馬鹿なうえに師匠も友達も居ないから2chで質問するわけで。
その他は、馬鹿なうえに師匠も友達も居ないから2chで質問のレスをするわけで。
334NAME IS NULL:2006/04/25(火) 21:19:17 ID:???
ツマンネ
335NAME IS NULL:2006/04/25(火) 21:20:26 ID:???
>>333はPostgresスレの名言ですよ?
336NAME IS NULL:2006/04/25(火) 21:21:06 ID:???
へえ。
それで?
337NAME IS NULL:2006/04/25(火) 21:22:29 ID:???
知ってる。リアルタイムで見てたから。
で?
338NAME IS NULL:2006/04/25(火) 21:34:26 ID:???
平静を装っているレスほど、必死なのがミエミエってことだ。
339NAME IS NULL:2006/04/25(火) 21:40:26 ID:???

> プライマリIDをふる時に、numeric(n)とvarchar(n)のどちらのほうがいいでしょうか。
340NAME IS NULL:2006/04/25(火) 21:44:35 ID:o7iPPQm7
333 NAME IS NULL sage 2006/04/25(火) 21:10:49 ID:???
>>325 は、馬鹿なうえに師匠も友達も居ないから2chで質問するわけで。
その他は、馬鹿なうえに師匠も友達も居ないから2chで質問のレスをするわけで。


334 NAME IS NULL sage 2006/04/25(火) 21:19:17 ID:???
ツマンネ


335 NAME IS NULL sage 2006/04/25(火) 21:20:26 ID:???
>>333はPostgresスレの名言ですよ?


336 NAME IS NULL sage 2006/04/25(火) 21:21:06 ID:???
へえ。
それで?


337 NAME IS NULL sage 2006/04/25(火) 21:22:29 ID:???
知ってる。リアルタイムで見てたから。
で?


338 NAME IS NULL sage 2006/04/25(火) 21:34:26 ID:???
平静を装っているレスほど、必死なのがミエミエってことだ。


339 NAME IS NULL sage 2006/04/25(火) 21:40:26 ID:???

> プライマリIDをふる時に、numeric(n)とvarchar(n)のどちらのほうがいいでしょうか。
341NAME IS NULL:2006/04/25(火) 21:55:13 ID:???


548 NAME IS NULL 2006/04/20(木) 18:32:27 ID:gTr1CKh8
質問させて下さい。
プライマリIDをふる時に、numeric(n)とvarchar(n)のどちらのほうがいいでしょうか。
感覚的には文字列比較のvarchar(n)より、数値比較のnumeric(n)のほうが
速くていいのではないかと思うのですが。
うちの昔のシステムはなぜかvarchar(n)で0詰めなんですが、何か意味があるんでしょうか。

342NAME IS NULL:2006/04/26(水) 14:48:58 ID:slukrszv
2つのテーブル結合する際のON句でLIKE 演算子を使いたいのですが
LIKEに列名を使用できるのでしょうか?

具体的には・・・

通常では
WHERE NAME LIKE '東京%'
とか使うと思うのですが
TABLE1 a INNER JOIN TABLE2 b ON a.NAME LIKE b.NAME%
みたいな使い方をしたいのですがどうでしょうか?
343NAME IS NULL:2006/04/26(水) 14:56:23 ID:???
b.NAME% が無理
oracleだと
b.NAME || '%' とかすりゃいける
344NAME IS NULL:2006/04/29(土) 22:23:17 ID:7TpjCHZg
>>313,323
PostgreSQLならdistinct on使えばいいんじゃあるまいか。

select distinct on (都道府県) * from table order by 都道府県, 数 desc, 値;
345NAME IS NULL:2006/05/01(月) 11:18:22 ID:fu6HSMPN
ちょと教えてください。
ある文字フィールドに特定の文字列が存在しないレコードをだしたいのですが
select name from table where name not like '%hoge%'
のようにすればいけるのですがこの文字列が複数ある場合
select name from table where name not like '%hoge%' and name not like '%hage%'
というように name not like '%%'という文をandで繋げる以外に短く書ける方法はありませんでしょうか?

346NAME IS NULL:2006/05/01(月) 17:01:25 ID:???
>>345
標準的なSQLでは無理です。
hogeやhageの位置が明確なら、別の列にしておけば、IN句で一致を見ればいいんですが、
たぶんそういう構造のデータじゃないんだよね?
347NAME IS NULL:2006/05/01(月) 17:18:41 ID:???
in条件の中でLIKE条件を使うことはできないのですか?
348NAME IS NULL:2006/05/01(月) 19:21:46 ID:???
>>347
できませんよ。INはあくまで()内の列挙のなかから一致するものを探す処理。
もちろんIN句の中に正規表現が書ける素敵RDBMSもあるかもしれませんが、寡聞にして知らず。
349NAME IS NULL:2006/05/01(月) 22:23:19 ID:???
>346
INだけでもだめだっつーの…。


SELECT * FROM TABLE
EXCEPT
SELECT * FROM TABLE AS T
WHERE NOT EXISTS
(SELECT * FROM (SELECT 'hoge' AS NAME
UNION
SELECT 'hage' AS NAME
:
UNION
SELECT 'moge' AS NAME) AS C
WHERE T.NAME LIKE '%' || C.NAME || '%')

…orz もうちょっとわかりやすそうなの、誰かヨロシク。orz
350349:2006/05/01(月) 22:25:56 ID:???
あ、>349 は >346の「別の列にしておく」案が使える場合って感じで
見てくれるとありがたい。
351sql:2006/05/02(火) 00:01:05 ID:???
SQLの質問です。お願いします。

Employee(person-name,age,street,city)
Work(person-name,company-name,salary)
Company(company-name,city)
Manage(person-name,manager-name)
#同じ名前は同一人物とする。
#1人の人が、違う会社で働いている場合もある。
#問1と問2は2パターンで答えよ。

[問1]LAに住んでいるどのemployeeよりも高い給料をもらっているemployeeの名前をあげよ
[問2]自分がmanageしている、少なくとも1人のemployeeの給料より高い給料をもらっている、managerの名前をあげよ。
[問3]全ての雇用者の給料の総額が、$100000より高い会社の名前をあげよ。

という問題なのですが、複雑すぎて、よくわかりません。
教えてください。お願いします。
352NAME IS NULL:2006/05/02(火) 01:16:56 ID:???
>>351
いっぺんに考えず、順序を追って条件を割り出し、SQLに変換するといいです。
たぶん勉強用のお題でしょうから、あえてSQLは書きません。考え方の例を参考までに。

>[問1]LAに住んでいるどのemployeeよりも高い給料をもらっているemployeeの名前をあげよ

「LAに住んでいるどのemployee」ってことで、"LAに住んでいるemployeeとその給料”が必要。
これはEmployeeとWorkのJOINでできることはわかると思う。
さて、「LAに住んでいるどのemployeeよりも高い給料」ってことで、"LAに住んでいるemployeeの
一番高い給料”を得る。ここはさっきのJOIN表で得られるはずだよね。
次に「よりも高い給料」ってことで、上記の給料<比較対象の給料
比較対象とは何か?出力が「employeeの名前をあげよ」で、付加事項なしだから、salaryのある
Work表を使えばいい。

以上をまとめると、条件になるEmployeeとWorkのJOINで"LAに住んでいるemployeeの一番高い給料”を
副問い合わせで取得し、Work表でより大きいsalaryのperson-nameが答え。

問2、問3も同じように段階的に考えれば解けるはず。がんばれ。
353NAME IS NULL:2006/05/02(火) 17:30:15 ID:XQqSpU3B
テーブル結合時に、一方のテーブルの行に対してもう片方のテーブルの複数の値を
くっつけて一覧表示したいのですが、これはSQL1回で実行できますか?
たとえば…

DATA テーブル
id, content, tagset
---------------
1, aaa, 1
2, bbb, 2

TAGSET テーブル
tagset, tagname
---------------
1, A
1, B
2, B

というテーブルがあり、DATA.tagset と TAGSET.tagset が紐付いている状態です。
で、一覧は
id, content, tag(tagsetの内容を列挙)
---------------
1, aaa, "A, B"
2, bbb, "B"
...
のように行いたいのです。

ってこれを書いていて思ったのですが、単純に
id, content, tag
---------------
1, aaa, A
1, aaa, B
2, bbb, B
を出力して、あとはロジック側でうまいことまとめ上げるのが正しいのでしょうか。
354NAME IS NULL:2006/05/02(火) 18:02:31 ID:???
>>353
SQL、つまりRDBでは原則として元になるタプルも、結果として得られるものも、カラムは
アトミックである必要があります。その意味で、お求めの結果は、ご自身で書かれている
ようなSQL外の処理が正しいかと。
ただクライアント/サーバで、その処理がクライアントで頻出するなら、なんとかサーバで
処理したいですよね。
と、偉そうに書いてて具体的な処理は思いつきませんでしたとさ。ごめんなさい(´・ω・`)
355NAME IS NULL:2006/05/02(火) 18:07:10 ID:???
tagname の数が決まってるなら出せる
356353:2006/05/02(火) 18:48:08 ID:XQqSpU3B
>>354 さん
さすがにid, config, tagsetを得るSQLを投げて、
結果の各行に対してtagsetに対応するtagを得るSQLを投げなきゃならんのか、と
最初はそう思っていたので… ← 初心者過ぎ
SQL外で処理する方が正しそうですね。ありがとうございます。

>>355 さん
tagnameはユーザが任意で設定可能なんですよ… orz
357NAME IS NULL:2006/05/10(水) 13:53:41 ID:osiC7ill
>>353
group_concat
358NAME IS NULL:2006/05/12(金) 03:22:51 ID:4uggOY09
トピックとコメントが1対多数の関係で、最新20件のトピックを取得するときに、それぞれのトピックごとへのコメント件数も一緒に取得したいのですが、以下のSQLでうまくいきません。

select topics.*, count(*) from topics, comments
where topics.id = comments.topic_id
group by topics.id
order by topics.update_time desc
limit 20;

これだとコメントが一件もついていないトピックが無視されてしまいます。
コメントのないトピックについてもcount(*)が0になる形で取得したいのですが、どのようにすれば良いのでしょうか?
359NAME IS NULL:2006/05/12(金) 03:40:15 ID:???
>>358
外部結合。処理系で書き方が微妙に違う。
from topics left outer join comments on topics.id = comments.topic_id
360358:2006/05/12(金) 04:41:49 ID:???
>>359
おぉ!そんなふうにやるんだったんですね!
MySQLでそのままの構文でいけました!

で、また一つ問題点がでてきまして、コメント0件のトピックもきちんと取得できたものの、count(*)の項目が「0」ではなく「1」になってしまいます。
1件と0件を識別するうまい方法はないものでしょうか?
361358:2006/05/12(金) 05:02:09 ID:???
自己レスです。
count(comments.id)にしたらできました。
>>359さん、どうもありがとうございました。m(_ _)m
362358:2006/05/12(金) 05:58:03 ID:???
連投失礼します。
358のSQLを改良、というかtopicsテーブルの設計から変えて、topics.update_timeを記録するのをやめてみました。
(そうすると、コメントの投稿時にtopicsテーブルを触る必要がなくなるからです)
代わりに最新のコメント投稿時間max(comments.posted_time)をupdate_timeとして使うことにしました。
ところが、コメントが1件もないトピックの場合にはupdate_timeがNULLになってしまいます。
そこで、コメントが1件もないものに関してはトピックが作成された時間(topics.posted_time)のほうをupdate_timeとして使いたいと思います。

とりあえずSQLを以下のようにしたのですが、どのように変更したらできるでしょうか?
(長いのでtopicsテーブルをt、commentsテーブルをcと略しました)

select t.*, count(c.id), max(c.posted_time) as update_time
from topics as t left outer join comments as c on t.id = c.topic_id
group by t.id
order by update_time desc
limit 20;

よろしくお願いします。
363NAME IS NULL:2006/05/12(金) 13:41:14 ID:???
coalesce(max(c.posted_time), max(t.posted_time))
364358:2006/05/12(金) 14:04:16 ID:???
>>363
まさにそんな感じのが欲しかったんです!
(実際にはcoalesce(max(c.posted_time), t.posted_time)でうまくいきました)
どうもありがとうございました!!
365NAME IS NULL:2006/05/12(金) 16:30:21 ID:GztnNXkK
5,7,15,16,99,200...
みたいな不連続な数値の入ったフィールドがあって、それを
1から始まる連続した数値になるようにUPDATEしたいのですが、
どうすればいいのでしょうか?
MySQL+Perl+DBIです。
366NAME IS NULL:2006/05/12(金) 16:36:40 ID:Yg59p/eg
日付カラムと時刻カラム分かれているときに、
○日○時から×日×時までのデータを取得するにはどうすればいいのでしょうか?
367NAME IS NULL:2006/05/12(金) 18:43:06 ID:???
簡単な備品管理DBを作ってるんですが,
カテゴリAに入力する項目が「名前」「場所」「備品番号」
カテゴリBに入力する項目が「名前」「値段」「購入年月」
カテゴリCに入力する項目が「場所」「使用者」「現在状況」
だった場合,
データの登録テーブルには「ID」「column1」「column2」「column3」
のようにフィールドを定義して,
カテゴリ定義テーブルには「カテゴリID」「カテゴリ名」
カテゴリ情報テーブルには「カテゴリID」「column1のタイトル」「column2のタイトル」「column3のタイトル」
のようにDBを作成したんですが,何かもっとスマートな方法はありますか?
368367:2006/05/12(金) 18:44:13 ID:???
>>367
データの登録テーブルに「カテゴリID」が抜けてました.
369NAME IS NULL:2006/05/13(土) 00:08:21 ID:???
「SELECT * FROM 備品」で並べたいのか?

備品{ID, カテゴリID}
カテゴリ定義{カテゴリID, カテゴリ名}
A備品{ID, 名前, 場所, 備品番号}
B備品{ID, 名前, 値段, 購入年月}
C備品{ID, 場所, 使用者, 現在状況}

備品{ID, カテゴリID, 名前, 場所, 備品番号, 値段, 購入年月, 使用者, 現在状況}
カテゴリ定義{カテゴリID, カテゴリ名}
370NAME IS NULL:2006/05/15(月) 01:10:21 ID:???
特定のフィールドの現在の値にSを付けたいんですが、
どんなSQL文を使えばいいでしょうか?
ちなみに mysql です
371NAME IS NULL:2006/05/15(月) 01:14:46 ID:???
SELECT ('S' || FOO) AS SFOO FROM BAR
372370:2006/05/15(月) 03:26:39 ID:???
>>371
レスありがとうございます。
UPDATE を使う必要性はないんでしょうか?
373NAME IS NULL:2006/05/15(月) 07:52:56 ID:???
>>372
一時的にSの付いた値が欲しいのなら>>371でいいし、
Sの付いた値に更新(UPDATE)したいのなら、
UPDATE bar SET foo='S'||foo;
374370:2006/05/15(月) 14:49:19 ID:???
>>373
ありがとうございます、
しかし、なぜか上手くいかないのです。
上の例は bar テーブル、foo フィールドですよね?
SETが上手く機能していないようです。
375NAME IS NULL:2006/05/17(水) 00:56:11 ID:???
mysqlなら
update bar set foo = concat('s', foo);
376NAME IS NULL:2006/05/17(水) 11:35:05 ID:???
データベースサーバにあるファイルをPL/SQL経由でアクセスに渡したいのですが
どういう風にすればよいでしょうか?(データパンプの結果をアクセスに送ろうとしてます)
377NAME IS NULL:2006/05/17(水) 11:52:10 ID:/bcXyhaw
多分ORACLEだと思うけど、マニュアルで調べろ、ファイルアクセス用のパッケージがあるよ。
そもそもですれ違い。
378NAME IS NULL:2006/05/18(木) 20:15:30 ID:F00yGgO9
DBに一番最後に追加したデータを取りたいのですが、
これを取る方法って無いでしょうか?
last_index_rowid()は今回の接続の最後の行数が分かるだけですので使えません。
いつの接続かは不明だけど、一番最後に追加されてるデータの内容を知りたいのです。
Indexはつけていますが、対象は一つずつあがるタイプではないですし歯抜けがあるため
使えません。
DBはSqliteです。

どうかよろしくお願いします。

379NAME IS NULL:2006/05/18(木) 20:28:44 ID:???
素直に
datetime(または date と time の2つ) か timestamp 系のフィールド作って
更新時刻をログするのが確実なんじゃね?
380NAME IS NULL:2006/05/18(木) 20:30:28 ID:F00yGgO9
>>379
それはログテーブルを作って、トリガーで最終更新だけを入れておいてそこのデータを使って
読み書きするってことでしょうか?
381NAME IS NULL:2006/05/18(木) 23:32:55 ID:???
SQLだけでDB内のデータを四則演算してから出力する方法はありますか?

id a b
-------
0 10 20
1 15 20

このようなDBがあった時、id毎にa+bを求め

id ans
-------
0 30
1 35

と出力したいのです。
382NAME IS NULL:2006/05/18(木) 23:44:56 ID:???
事故解決しました。
スンマセン
383NAME IS NULL:2006/05/19(金) 00:24:08 ID:???
オラクルのPL/SQLの質問です。
例外処理でEXCEPTIONのあとによくみかける
RISE;って何してるんですか?
384NAME IS NULL:2006/05/19(金) 02:02:03 ID:???
>>383
RAISEちゃうの?ここのスレにはなじまないからオラクルスレへ
385NAME IS NULL:2006/05/19(金) 02:57:24 ID:???
たびたびすみません。
複数のテーブルで求めた列の和を、1回のクエリー送信で結果を出力する方法はありますか?
table内で同じnameの人の点数を合計し、一覧にしたいのです。

table1
name pt
--------
a   20
a   30
b   20
c   10

table2
name val
---------
a    5
b    4
b    3
c    6

table1と2をnameで結合すると↓になり

name pt val
-------------
a   20  5
a   30  5
b   20  4
b   20  3
c   10  6

このままsumを取るとbのptが40になったり、aのvalが10になってしまうのですが、

name pt val
------------
a   50 5
b   20 7
c   10 6

こういう結果を得たいのです。
386NAME IS NULL:2006/05/19(金) 07:12:34 ID:???
先にsumとればいいだけじゃないの?見易さのため、ちょっと古い書き方になるけど

SELECT *
 FROM ( SELECT name, sum(pt) FROM table1 ) t1,
      ( SELECT name, sum(val) FROM table2 ) t2
 WHERE t1.name = t2.name

最近の書き方なら、外側のFROM句でINNER JOINしてください。
387NAME IS NULL:2006/05/20(土) 21:01:36 ID:iy7XMW5q
年度 店舗 個数 金額 ...

上みたいなDBから指定した年度で、店舗ごとの千円未満の商品の個数の合計、
千円以上1万円未満の商品の個数の合計、1万円以上の商品の個数の合計を
出したいんですが。
388NAME IS NULL:2006/05/20(土) 22:30:40 ID:???
>387
SELECT
 年度, 店舗, 商品
 SUM(個数) 個数,
 SUM(CASE
  WHEN 金額 BETWEEN 1000 AND 9999
  THEN 個数
  ELSE 0 END
 ) 千円以上,個数,
 SUM(CASE
  WHEN 金額 > 9999
  THEN 個数
  ELSE 0 END
 ) 一万以上,個数
FROM てーぶる
389NAME IS NULL:2006/05/21(日) 10:42:54 ID:???
>>387
>>388さんとは別解。結果が縦になるけどね

SELECT 年度, 店舗, 商品, '千円未満', SUM(個数) AS 個数
 FROM てーぶる
 WHERE 金額 < 1000
UNION
SELECT 年度, 店舗, 商品, '千円以上一万円未満', SUM(個数) AS 個数
 FROM てーぶる
 WHERE 金額 BETWEEN 1000 AND 9999
UNION
SELECT 年度, 店舗, 商品, '一万円以上', SUM(個数) AS 個数
 FROM てーぶる
 WHERE 金額 >= 10000
390NAME IS NULL:2006/05/21(日) 13:03:43 ID:???
相関サブクエリーについて、理解できない部分があるので教えてください。
以下のような2つのテーブルがあります。

■[受注] テーブル
受注コード, 商品コード, 数量
1     , 10    , 3
2     , 30    , 3

■[商品] テーブル
商品コード, 名前, 単価
10    , あ , 300
20    , い , 200
30    , う , 100

これらのテーブルに対し、受注のあった商品のみを表示するクエリーとして
下記の SQL を ACCESS で実行したところ
「このサブクエリでは 1 つのレコードしか返せません。」
というエラーになりました。

SELECT S.*
FROM 商品 AS S
WHERE
 S.商品コード = ( /* [A] */
  SELECT J_SUB.商品コード
  FROM 受注 AS J_SUB
  WHERE J_SUB.商品コード = S.商品コード
 )

コメント [A] の行を
・S.商品コード IN (
・EXISTS (
に変えたら、こちらの期待した通りのレコードが返ってきます。

本来、このような SQL では EXISTS を使うのが正解だと思いますが
「=」ではエラーなのに「IN」ではOKというのが理解できません。
「=」を使う場合、比較対象のサブクエリーは必ず唯一の結果セットでなくてはダメだから
エラーになっているのですか?
また、「IN」では、なぜOKなのですか?
391NAME IS NULL:2006/05/21(日) 17:29:08 ID:???
INは右辺が集合体になるときに使う。
=は右辺がスカラーのときに使う。
392NAME IS NULL:2006/05/21(日) 17:30:30 ID:???
>388
GROUP BY ぬけてっぞ…。
393390:2006/05/21(日) 20:27:42 ID:???
>>391
教えていただきありがとうございます。

S.商品コード IN [結果セット] としたとき
[結果セット] が集合体になるのはなんとなく理解できるのですが
結果セットが 0 件の場合は、どのように扱いになるのかが知りたいのです。

このような場合を IN の右辺値を直打ちした場合
S.商品コード IN (NULL)
のような感じになるのでしょうか?
これで S.商品コード = NULL を評価した結果、不定になるという考え方で間違いありませんか?
(ちなみに、S.商品コード IN () では構文エラーになりました)
394NAME IS NULL:2006/05/21(日) 22:11:50 ID:???
>393
INを使ったとき、
右辺の集合の件数が0件だろうが1億件だろうが、
左辺の値がそこに含まれていたらTrue
そうでなければFalseだ。
S.商品コード IN (NULL) とは違う。
これはNULLというデータが1件ある集合体だ。
395390:2006/05/21(日) 22:46:53 ID:???
いろいろとありがとうございます。

S.商品コード IN [サブクエリーの結果セット = 集合A]

とした場合、結果セットが 0 件であれば集合Aは空集合となり
その空集合には S.商品コード と等しい値は含まれないため必ず FALSE になる
という考え方をすればいいのですね。

ずっとモヤモヤしてたんですがスッキリしました。
ありがとうございました。
396NAME IS NULL:2006/05/22(月) 09:23:55 ID:???
>>388>>389
ありがとうございます。助かりました。
397NAME IS NULL:2006/05/24(水) 11:26:48 ID:z0yjecQK
問題:北陸三県(石川県、富山県、福井県)で最も高い駅弁を売っている駅名とその駅弁名、また、最も安い駅弁を売っている駅名とその駅弁名を求めよ。
使用するテーブルはstation(駅情報)、lunch(駅弁情報)、pref(県情報)、stpref(駅−県情報)、stlunch(駅−駅弁情報)です。
一応下のような感じでで書いてみたのですが、うまく表示されませんでした。
select station.name as "STATION_name",lunch.name as "LUNCH_name",lunch.price
from station,lunch,pref,stpref,stlunch
where stpref.stid=station.stid
and stpref.prid=pref.prid
and stlunch.stid=station.stid
and stlunch.luid=lunch.luid
and pref.name in('福井','石川','富山')
group by lunch.price
having lunch.price=max(lunch.price) or lunch.price=min(lunch.price)
;
どこがいけないのか分かりません。
よろしくお願いします。
398NAME IS NULL:2006/05/24(水) 13:06:53 ID:MDtixMev
lunch.priceをselectにそのまま入れるのが悪いだろ。selectには入れるな。
あと、havingでmax(lunch.price)でやってるのに、何でgroup byにlunch.priceをやると
havingは全く意味ないだろ

と、いうわけで全てにおいてダメなSQLってことで終了
399NAME IS NULL:2006/05/24(水) 14:22:59 ID:???
SQL2000のINDEXDEFRAGで一時的に排他ロックが起こる事に対して、
何で排他ロックをするのかって理由を教えてほしいのですが…っ

漠然とイメージでしかわからなくて、参考文献とか見ても載ってないんですよね
400397:2006/05/24(水) 21:54:40 ID:gHbYKPPi
>>398
そのまま入れるなとはどういうことでしょうか?
maxとかを使ってやれと言うことでしょうか?
ちょっと改良して、
select station.name as "STATION_name",lunch.name as "LUNCH_name",max(lunch.price) as "price"
from station,lunch,pref,stpref,stlunch
where stpref.stid=station.stid
and stpref.prid=pref.prid
and stlunch.stid=station.stid
and stlunch.luid=lunch.luid
group by station.name
having pref.name in('福井','石川','富山')
UNION
select station.name as "STATION_name",lunch.name as "LUNCH_name",min(lunch.price) as "price"
from station,lunch,pref,stpref,stlunch
where stpref.stid=station.stid
and stpref.prid=pref.prid
and stlunch.stid=station.stid
and stlunch.luid=lunch.luid
group by station.name
having pref.name in('福井','石川','富山')
;
こんな感じにしてみたのですが、解答には近くなっているでしょうか?
401NAME IS NULL:2006/05/25(木) 08:06:03 ID:???
>>397
分析関数
402NAME IS NULL:2006/05/25(木) 14:46:17 ID:0r269Mr8
データの削除をしたいのですが、うまくいきません。
DELETE FROM hoge
WHERE (item_id IN
(SELECT hoge
FROM table_hoge
WHERE (id = @hoge_id)))
2行目の「IN」が間違っているのでしょうか?
403NAME IS NULL:2006/05/25(木) 14:55:44 ID:???
>>402
うまくいかないのが、構文エラーなどで実行できないのか、期待してるデータが削除されないのか
はたまた人とのコミニケーションがうまくいかないのか・・
404NAME IS NULL:2006/05/25(木) 17:37:29 ID:???
>>402
hogeがテーブル名になったりカラム名になったりしてるから、例示が悪い。
それではわからんよ。
405NAME IS NULL:2006/05/25(木) 18:02:40 ID:???
・サブクエリが使えないDBMSである
406NAME IS NULL:2006/05/26(金) 16:44:18 ID:ANkJk1m3
下は
・テーブル名
フィールド名
etc・・

・スコア設定テーブル
(省略)

・期間中出現回数検索テーブル
プライマリキー
スコア設定テーブルプライマリキー#これを複数入れたい。
検索期間
登録日時

こんなテーブルがあって、上に書いてあるように「期間中出現回数テーブ」ルの一つのレコードに
「スコア設定テーブルプライマリキー」を複数設定(可変)にしたいのですがどのようにフィールドを設定すればいいですか?
MySQLを使用するので、一つのフィールドに複数項目入れられる型も使えるのですが、
今後違うデータベースに移行する可能性もありSQL全般で使用可能な方法で構築したいです。
どなたか良い方法があったら教えていただけると嬉しいです。
407NAME IS NULL:2006/05/27(土) 15:55:05 ID:bNSDh8D4
+---------------------+----+--------+
| time | rw | name |
+---------------------+----+--------+
| 2006-05-27 14:01:07 | w | apple |
| 2006-05-27 14:01:00 | w | orange |
| 2006-05-27 14:04:17 | r | apple |
| 2006-05-27 14:04:14 | r | orange |
| 2006-05-27 14:04:13 | r | apple |
| 2006-05-27 14:04:12 | r | banana |
+---------------------+----+--------+

というテーブルがあり、rwのrのnameを抽出し、rwがwの項目のnameを除外したいのですが、
(上記の場合、bananaを抽出したい)
現在、
SELECT name FROM table WHERE rw = "w" GROUP BY name
SELECT name FROM table WHERE rw = "r" GROUP BY name
でそれぞれ取得し、perlで配列比較しています。

これをSQLのみでやる方法はあるのでしょうか?
408NAME IS NULL:2006/05/27(土) 16:33:43 ID:???
>>407
SELECT name FROM table AS T1 WHRER rw='r' AND NOT EXISTS (SELECT * FROM table WHERE rw='w' AND name=T1.name);
409NAME IS NULL:2006/05/27(土) 16:40:52 ID:bNSDh8D4
>>408
ありがとうございます。出来ました^^

410408:2006/05/27(土) 23:29:29 ID:???
GROUP BY name を忘れてたが、まぁ気づいてくれてるっしょ。

普段使わないから忘れてたけど、EXCEPTがあったな。
SELECT name FROM table WHERE rw='r'
EXCEPT
SELECT name FROM table WHERE rw='w';
但し、rwが'w'のみのnameも拾ってしまうので、
仕様上'w'のみってのが発生しえないときのみと限定されるが、
データのばらつき次第ではこちらの方が速そう。
411NAME IS NULL:2006/05/29(月) 23:20:29 ID:pGMfcDpv
fruits_tbl
種類  生産地 特徴名 特徴
−−−+−−−+−−−+−−
りんご  A  大きさ 大
りんご  A  色   赤
りんご  A  傷   なし
りんご  A  …   …
りんご  B  大きさ 中
りんご  B  色   緑
りんご  B  糖度  2
りんご  B  …   …
りんご  C  大きさ 小
りんご  C  色   黄
りんご  C  糖度  3
みかん  D  大きさ 大
みかん  D  …   …

となっているとします。(…のそれぞれは違う内容)

ここで,りんごに多く共通する特徴を纏めた,
以下のようなViewないし表を作りたいのです。

apple_view
生産地 大きさ 色  糖度
−−−+−−−+−−+−−
 A  大   赤  なし(又はNULL)
 B  中   緑  2
 C  小   黄 3

将来,共通する特徴が増えたときに,簡単にapple_viewに追加できる
ようにしたいのですが,どうするのが一番賢いやり方でしょう?
412NAME IS NULL:2006/05/30(火) 02:37:54 ID:+JwpeOWp
Mysql5.0.21+perl(DBI)で
サーバUTF8、クライアントs-jisで自動文字コード変換を利用しているのですが、
データの末端に「表」の字をINSERTしようとするとSQLエラーとなります。
データの末尾でなければ問題無くINSERTできます。

ex. DBI::st=HASH(0x86f0880)->errstr

これはどういう理由からなのでしょうか?回避策とかありますかね?
413NAME IS NULL:2006/05/30(火) 10:57:44 ID:???
初歩的な質問になります。
同じようなテーブルが2つあって今はSQLを2つで実行していますが
whereに指定する条件文が同じなので
1つのSQLにまとめられないかと思ったんですが
どのように書けば良いでしょうか?

よろしくお願いします。
414NAME IS NULL:2006/05/30(火) 11:31:40 ID:???
>>413
SQLのテーブル名だけ変えたいってこと?それとも一緒にSELECTしたいってことかな
415NAME IS NULL:2006/05/30(火) 11:33:31 ID:???
まとめなくてよいというか、
まとめることに意味が無いと思ったんですが
どうでしょうか?
416NAME IS NULL:2006/05/30(火) 11:39:22 ID:???
一緒にselectしたいです。
別のプログラムの中に組み込んで使ってるので
SQLが2つだと無駄に長くなってしまう気がしたのです。
417NAME IS NULL:2006/05/30(火) 12:05:53 ID:???
unionの結果セットに対してwhere使う。
効率悪そう。
418NAME IS NULL:2006/05/30(火) 12:22:44 ID:???
>>411
正規化

>>412
0x5C問題かな? 詳しくはMySQLスレで聞くほうがいい。

>>417
WHERE したあとUNION (ALL) した方がよくね?
まぁ、SQL2つをUNIONで一つにしても長さはかわらん、つーか増えるがw
419418:2006/05/30(火) 12:27:26 ID:???
補足ってか蛇足。
WHEREとUNIONの順序なんて、昨今のDBなら
プランナやオプチマイザが勝手に判断してくれそですね。
420NAME IS NULL:2006/05/30(火) 12:33:10 ID:???
複数表を一緒にSELECTしたいって時点で、
・見かけ上の型にとらわれて、データの持つ意味を見失っている
・同じ意味を持つデータが複数表に分裂・重複してる(設計が悪い)
と、思ってしまいました。
実際やるなら、みなさんが言ってるUNIONでしょうね。
421NAME IS NULL:2006/05/30(火) 12:42:35 ID:???
回答ありがとうございました。
まとめない方が良さそうみたいなのでこのままやってみます。

もう1つなのですが、前述の条件に加えて
selectで指定するものも一緒でもやはりまとめない方がよいでしょうか?
422NAME IS NULL:2006/05/30(火) 12:49:02 ID:???
ケースバイケースだよ、それは。
423NAME IS NULL:2006/05/30(火) 18:23:38 ID:+JwpeOWp
>>418
ありがとうございます。MySQL板で聞いてきます
424NAME IS NULL:2006/05/30(火) 18:24:40 ID:+JwpeOWp
Mysql板なんてないわ。(-o-;
425NAME IS NULL:2006/05/30(火) 18:58:13 ID:???
作れw
426NAME IS NULL:2006/05/31(水) 15:29:52 ID:???
mysqlをインストールしたいと思い、
tar コマンドで解凍
./configure --prefix=/usr/local/mysql --with-charset=ujis
make
make install
まで出来たのですが、データベースの初期化をしようと
cd /usr/local/mysql
./bin/mysql_install_db
としたら、
Could not find help file 'fill_help_tables.sql'
in /usr/local/share/mysql or inside /usr/local.

とでました。 ./bin/mysqld_safe & と入力しても
mysqlのサーバーも起動できませんでした。

どうしたらmysqlを起動できるでしょうか?
427NAME IS NULL:2006/05/31(水) 16:00:36 ID:???
適切なスレに行ってください。
428NAME IS NULL:2006/05/31(水) 22:07:31 ID:???
質問です。

■旧会員テーブル
会員番号,氏名
1,山田 太郎
2,山田花子
3,西村 博之
4,福原愛

■新会員テーブル
会員番号,氏名
1,田中太郎
2,山田 太郎
3,西村博之
4,今夜山田

この様に苗字と名前の間に半角や全角のスペースがある状態で
旧会員テーブルと新会員テーブルの両方に存在している人の、
新会員テーブルの会員番号(2と3)を出力するには、
どの様なSQL文を書けば良いのか教えてください。
429NAME IS NULL:2006/05/31(水) 22:39:36 ID:???
>>428
DBによっては正規表現による置換をサポートしたものが有りそうだが、
replace(replace(Oldtable.name,' ',''),' ','') = replace(replace(Newtable.name,' ',''),' ','')
こんな感じで空白を排除した氏名で結合しちゃえばいいんじゃね。

ところで氏名にカタカナがあったりするとその全角半角の違いとか出てきそうだし、
やっぱ入力の前に統一処理した方が良さそうだな。
ただ、空白削除すると苗字と名前の区切りが判りにくくなる名前の人も居るだろうけど。
430428:2006/05/31(水) 22:50:19 ID:???
>>429
ありがとうございます。
ORACLEのPL/SQLなんですけど
それでやってみます。
431NAME IS NULL:2006/06/01(木) 21:56:18 ID:???
なんで福原愛なんだろう……
432NAME IS NULL:2006/06/02(金) 14:36:28 ID:???
例えば
日付   名前
20060511 AAA
20060515 AAA
20060527 AAA
20060423 BBB
20060510 BBB
20060601 BBB
のような日付が違うだけで名前が重複するような所から
日付が最新の各名前を取ってきたい場合どのように書けばよいのでしょうか?
433NAME IS NULL:2006/06/02(金) 14:44:39 ID:o5lzJQYZ
>>432
select 名前, max(日付) from table_name
group by 名前
434NAME IS NULL:2006/06/02(金) 14:49:01 ID:???
ありがとうございます。
435NAME IS NULL:2006/06/02(金) 18:28:02 ID:???
SQL文を整形する良いソフトを紹介してください。
#UNIX(だけとは限らないかな?)のindentコマンドみたいなやつです。
「SQLEndia」や「psti」等、いろいろ試したのですが、満足が行きません。

僕の好みでは

SELECT
sex,
COUNT(*),
AVG(age),
(MAX(age) - MIN(age)) AS age_range
WHERE
grade = 'A' AND
Students.stud_nbr = Gradebok.stud_nbr
GROUP BY
sex
HAVING
COUNT(*) > 3;

といった感じなのですが、僕が見た限りのソフトでは、

SELECT
sex
,COUNT(*),
,AVG(age),
,(MAX(age) - MIN(age)) AS age_range
WHERE
grade = 'A'
AND Students.stud_nbr = Gradebok.stud_nbr
GROUP BY
sex
HAVING
COUNT(*) > 3;

といった感じなのです。
#カンマとANDの位置が気に入らない。

わがままで申し訳ありませんが、もしこのような要求を満たせるようなソフト
をご存知でしたら、ご教授いただきたくお願いいたします。
#ソフトウェア板の方が良かったでしょうか……?
436NAME IS NULL:2006/06/02(金) 18:29:46 ID:usTMUvpr
#行頭を整形しました。

SQL文を整形する良いソフトを紹介してください。
#UNIX(だけとは限らないかな?)のindentコマンドみたいなやつです。
「SQLEndia」や「psti」等、いろいろ試したのですが、満足が行きません。

僕の好みでは

SELECT
 sex,
 !COUNT(*),
 AVG(age),
 (MAX(age) - MIN(age)) AS age_range
WHERE
 grade = 'A' AND
 Students.stud_nbr = Gradebok.stud_nbr
GROUP BY
 sex
HAVING
 COUNT(*) > 3;

といった感じなのですが、僕が見た限りのソフトでは、

SELECT
  sex
 ,COUNT(*),
 ,AVG(age),
 ,(MAX(age) - MIN(age)) AS age_range
WHERE
   grade = 'A'
 AND Students.stud_nbr = Gradebok.stud_nbr
GROUP BY
 sex
HAVING
 COUNT(*) > 3;

といった感じなのです。
#カンマとANDの位置が気に入らない。

わがままで申し訳ありませんが、もしこのような要求を満たせるようなソフト
をご存知でしたら、ご教授いただきたくお願いいたします。
#ソフトウェア板の方が良かったでしょうか……?
437NAME IS NULL:2006/06/02(金) 18:38:22 ID:???
CSEで試したら、お好みの状態になっている気がする
438NAME IS NULL:2006/06/02(金) 19:54:39 ID:???
んだんだ 積み木 だね
439NAME IS NULL:2006/06/02(金) 22:56:48 ID:o6G0qQ0K
同じ主キーのレコードを、
まだcommitしてない別のトランザクションから
それぞれinsertしたら、どうなる?
どのタイミングでエラー?
440NAME IS NULL:2006/06/02(金) 23:39:16 ID:???
>>439
DBによって違うだろ。
PostgreSQLはMVCCが効いてエラーにならんし。
441NAME IS NULL:2006/06/03(土) 06:47:52 ID:???
>>439-440
PostgreSQLはよく知らないが、共有ロック方式でもマルチバージョニング方式でも
書き込み動作同士は普通に排他ロックがかかると思うけどな。

トランザクション1でinsert
トランザクション2が同じキーでinsertした時点でロック解除待ち
トランザクション1がcommitしたらトランザクション2はキー重複エラー
トランザクション1がrollbackしたらトランザクション2のinsertは正常終了
442440:2006/06/03(土) 07:38:57 ID:???
あースマソ、updateと勘違いしてた。
>>440に書いたのは間違い。
PostgreSQLでも>>441と同じはずです。
443NAME IS NULL:2006/06/03(土) 08:07:52 ID:???
つうか3分あれば実験できるよな
実験しないで聞こうなんて輩は開発に向いていn(ry
444436:2006/06/03(土) 09:29:26 ID:???
>>437>>438
どもです。
ほぼ望みどおりのことができました。

苦言を呈せば…

SELECT guestname, ' was here during ', celebname
FROM Guests, Celebrations
WHERE
 addirval BETWEEN start_date AND finish_date OR
 departure BETWEEN start_date AND finish_date;

を整形すると、

SELECT
  guestname,
  ' was here during ',
  celebname
FROM
  Guests,
  Celebrations
WHERE
  addirval BETWEEN start_date AND
  finish_date OR
  departure BETWEEN start_date AND
  finish_date;

になっちゃうんです(BETWEEN〜ANDの解釈を間違っている)。
SQLEndiaでは出来たんですが。
#そもそもこんな文脈依存予約語のある言語仕様が間違ってるんだよなー。
#主犯はコッド氏か、IBMサンノゼ研か、はたまたOracleか……。

ともあれお二方には大変感謝しております。どうもありがとうございました。
445NAME IS NULL:2006/06/03(土) 10:04:02 ID:???
Oracle9i+UNIXでテーブルの内容をCSVに出力したいのでSPOOLを使おうと思っています。

ただ、そのままだとcharやnumber型の項目が全て固定長で出力されます。
例えば4バイトのchar項目で項目未設定の場合は、[, ,]と、半角スペース4バイト分が
出力されてます。同様に数値型はその型の最大バイト桁が前スペース埋めで出力されます。
(100だと[, 100,]となります)

型に合わせて出力するためこうなるのでしょうが、これを前後スペースなしの可変長で出力
する事はできないのでしょうか。SELECT句でTRIMをかけてもダメでした。

一旦CSV出力用の全項目がvarchar2型のテーブルにコピーした上でやるしかないのしょうか。。。
446445:2006/06/03(土) 11:08:31 ID:???
すいません。自己解決しました。。。
447NAME IS NULL:2006/06/03(土) 13:21:31 ID:gFdCglmk
住所テーブルを作成しようと思うのですが、一般的に↓くらいの領域で大丈夫ですか?

県 → char(8)
市区郡 → char(20)
その他 → char(50)
448NAME IS NULL:2006/06/03(土) 14:50:33 ID:???
PostgreSQL にして text 型にすれば OK
449447:2006/06/03(土) 15:17:21 ID:gFdCglmk
上記はMySQLで作成したのですが、
varcharより固定長のcharのほうが色々と速くなるんですよね?(復元もしやすいとか)
無駄な容量を使う以外はcharのほうがメリットがあるみたいでしたので。

上記での「その他(other)」に住所が全て入っている場合、
下のSQLで都道府県にUPDATEする方法は何となく分かりましたが、
市区郡を置換するのが大変そうなので、よい正規表現などありますでしょうか?

UPDATE `Address`
SET prefecture = '東京都'
other = replace( other, '東京都', '' )
WHERE `other` LIKE '%東京都%'
450NAME IS NULL:2006/06/03(土) 17:02:59 ID:???
>>449
市町村合併の激しい昨今、あまりよい手段はないんじゃないでしょうか。
京都郡って福岡県にありました(「みやこぐん」と読みます。今もあるかどうか
は知らない)。小郡市と小郡町ってな例もあるし(小郡町はもうない)。さいたま
市を埼玉市と書く人は多そうだし。
WHERE other LIKE `%[都府県道]`
とかやるより、テキストに落としてPerlで処理する方がいい。

…っつーか、
UPDATE Address SET prefecuture = '北海道' other replace(other, '') ...
UPDATE Address SET prefecuture = '青森県' other replace(other, '') ...
UPDATE Address SET prefecuture = '岩手県' other replace(other, '') ...
とかやるほうがいいと思います。たかだか47件ですし。

また最近では「日本国東京都」なんて書く人もいますから、結局人の目で確認
せねばなりませんが。
451NAME IS NULL:2006/06/04(日) 01:28:26 ID:???
s/日本国//g;
452NAME IS NULL:2006/06/05(月) 09:31:07 ID:???
DISTINCTって
select DISTINCT AAA, BBB, CCC
みたいに書くとどれに適用されるんですか?
453NAME IS NULL:2006/06/06(火) 14:43:06 ID:???
>>452
普通はタプルに効くから、AAA,BBB,CCCの組み合わせでは。
454NAME IS NULL:2006/06/06(火) 19:35:57 ID:???
はじめまして よろしくご教授お願いいたします。

概要:SQL-serverのデータベースに300,000件(30万件)のデータを
   BCPコマンドを使用してアップロードした時に、インポートは
   うまく行きません。

事象:エラーの内容は、1件目から、日付項目にエラーと出るのですが、
   実際はデータ的に問題ありません。
(※@ 既にそのデータは、ローカル間の環境での試験には成功しています。)
(※A 200,000件(20万件)のデータでのサーバー間での環境では成功しました。)

懸念:今回、失敗したのは、@のサーバから、BCPコマンドをたたいて、
   AのサーバのDBにデータをインポートします。
   ローカルのPCでの作業ではうまく行ったで、サーバー間の環境では
   うまく行かないため、何かしら制限があるのかと思いました。

やはり、サーバー間同士だと、なにかしら、数の制限があるのでしょうか?
SQL-serverのデータの許容範囲の設定のところは十分クリアできるデータサイズです。
いろいろ、試行錯誤したんですが、わかりません。
どなたか、知識ある方は教えていただけると、助かります。
すみません。m(_ _)m
455NAME IS NULL:2006/06/06(火) 20:48:22 ID:tUY0e1UM
抽出条件について質問です。

商品|会社区分|品目|登録日
----+--------+----+--------
AA |  Z-001|02  |20060606
AA |  Z-002|03  |20050101
AA |  Z-001|00  |20050101
BB |  Z-003|02  |20010101
BB |  Z-003|01  |19850812

上のようなテーブルとレコードがあって、
「商品の中で最も古い登録日のレコードの会社区分で、
 登録日が同一ならば品目の小さいレコードの会社区分」を抽出したいのですが、
条件がどうしても上手くいきません。ご教示頂けると有難いです。よろしくお願いします<m(__)m>
456NAME IS NULL:2006/06/06(火) 22:15:35 ID:???
>>454
スレ違い
つ Microsoft SQL Server 総合スレ 4
457NAME IS NULL:2006/06/06(火) 22:24:53 ID:???
>>456 了解です。 失礼しました。 m(__ __)m
458NAME IS NULL:2006/06/07(水) 11:14:16 ID:???
>>455
要件の日本語がちょっとおかしいのは、考え方がおかしいからだと思う。
強引にそのままSQLにするなら、

SELECT * FROM テーブル
 WHERE (商品, 登録日, 品目) IN (
    SELECT 商品, 登録日, MIN(品目)
     FROM テーブル
     WHERE ( 商品, 登録日 ) = ( SELECT 商品, MIN(登録日) FROM テーブル GROUP BY 商品)
     GROUP BY 商品, 登録日 )

一時表使うとかしたほうがいいと思うけど。てか、推移従属とか入ってない?
459NAME IS NULL:2006/06/07(水) 11:15:12 ID:???
>>458
サブクエリの中のサブクエリとの比較、=だけどINに訂正します
460NAME IS NULL:2006/06/07(水) 12:06:26 ID:???
指定したテーブルの全項目に対する問い合わせを簡単に行う方法はありませんか?
イメージ的には、
select * from 'TABLE' where * like '%hoge%'
のように考えています。
よろしくお願いします。
461NAME IS NULL:2006/06/07(水) 13:43:54 ID:???
>>460
ありません。

RDBでは各項目はアトミックで独立したものが原則。
共通の条件で…ってのは、共通の要素を内包しているということですから、この原則に反しています。
462460:2006/06/07(水) 13:50:46 ID:???
>>461
理由まで書いて頂き、納得しました。
プログラム側でSQLの発行の仕方を考えます。
ありがとうございました。
463800:2006/06/07(水) 16:44:48 ID:???
MySQLでどのようにクエリを出せば良いのか悩んでいます。
少し長くなりますが、よろしくご教授お願い致します。
以下のような3つのテーブル(user、item、tyumon)があります。

user (注文者)

id | name | year |
---+------+------+
1 | taro | 2004 |
2 | jiro | 2005 |
3 | sabu | 2006 |
4 |shiro | 2006 |

item (アイテム)

id | name |
---+------+
1 | aaa |
2 | bbb |
3 | ccc |
4 | ccc |

tyumon (注文リスト) u_idはuser.id i_idはitem.id

id | u_id | i_id | kosuu |
---+------+------+-------+
1 | 1 | 1 | 1 |
2 | 1 | 2 | 2 |
3 | 2 | 1 | 1 |
4 | 3 | 3 | 1 |
5 | 3 | 4 | 2 |
6 | 4 | 2 | 2 |
464800:2006/06/07(水) 16:45:28 ID:???
続き

このテーブルから指定年のアイテム毎の注文合計数を取得したいのですが、
思ったように取得できません。
3つのテーブルを結合してsum()で計算すればいいと思い、
以下のようなSQLクエリを出したのですが、注文があったアイテムしか返ってきません。

yearが2006のアイテム毎の注文合計数を取得
SELECT item.id, sum( ifnull( tyumon.kosuu, 0 ) ) AS kosuu
FROM item
LEFT JOIN tyumon ON item.id = tyumon.i_id
LEFT JOIN user ON tyumon.c_id = user.id
WHERE user.year = 2006
GROUP BY item.id

↓ 上記の結果
id | kosuu |
---+-------+
2 | 2 |
3 | 1 |
4 | 2 |

↓ 欲しかった結果
id | kosuu |
---+-------+
1 | 0 |
2 | 2 |
3 | 1 |
4 | 2 |

条件の書き方がおかしいと思い、色々試したのですがダメでした...
あまりSQLが分かっていないので、変な書き方をしているのだとは思います。

できればテンポラリテーブルなどは作らずに1文で済ませたいのですが、無理でしょうか?
分かりにくいかとは思いますが、どのようにクエリを出せば良いかご教授願えればと思います。
よろしくお願い致します。
465NAME IS NULL:2006/06/07(水) 16:57:44 ID:???
>>463-464
名前欄は800でまた質問するってこと?w
ご希望の結果を得るには、OUTER JOINについて調べてみてください。と、ヒントだけ。
466NAME IS NULL:2006/06/07(水) 17:12:27 ID:???
【売約テーブル】         【在庫テーブル】
予約ID|商品ID|予約数   商品ID|在庫数
───┼───┼───   ───┼────
0001  │AAA  │ 3      AAA  │ 4
0002  │BBB  │ 2      BBB  │ 2
                    CCC │ 2


【抽出結果】
商品ID| 数量 │予約ID
───┼───┼───
AAA  |  3  │0001
BBB  |  2  │0002
AAA  |  1  │     ←
CCC. |  2  │

二つのテーブルから、【抽出結果】をSELECTしたいのですが
この例の三番目の行(商品IDがAAAで予約IDが空欄の行、矢印つき)を
出す方法がわからず困っています
一番下(商品IDがCCCで予約IDが空欄)は外部結合にして差を数量に
出力するだけなのですが、【在庫テーブル】を親にすると
三番目の行をどうしたら…
oracle9iです。どうかご教示ください
467NAME IS NULL:2006/06/07(水) 17:42:45 ID:???
>>466
抽出結果の上2行と下2行は性質が違う問い合わせなので、
別に求めてUNION ALLで連結することをすすめる。
468463:2006/06/07(水) 18:06:20 ID:???
>>465
ヒント有難うございます。
ひとまず3番目のテーブルをRIGHT JOINすることで思った結果が出ました。

SELECT item.id, sum( ifnull( tyumon.kosuu, 0 ) ) AS kosuu
FROM item
LEFT JOIN tyumon ON item.id = tyumon.i_id
RIGHT JOIN user ON tyumon.c_id = user.id
WHERE user.year = 2006
GROUP BY item.id

が、正直いまいちJOINが分かっていないので勉強します。
800...orz です...
469NAME IS NULL:2006/06/08(木) 05:29:59 ID:???
質問なのですがSQL*Plusでuser_constraintsを使い制約を見ようとするとズラーっと出てきてしまい、最初の方が消えてしまいます
特定の表の制約だけを見たり、消えないように表示することなどは可能でしょうか?
学校のPCなので環境や設定は変えられません
470NAME IS NULL:2006/06/08(木) 09:25:03 ID:zVJdgrU1
よろしくご教授お願いいたします
って普通に使う?
471NAME IS NULL:2006/06/08(木) 09:57:51 ID:???
472NAME IS NULL:2006/06/08(木) 13:16:04 ID:???
>>469
WHEREでTABLE_NAMEを指定するとかset spoolでファイルに吐き出すとか
473NAME IS NULL:2006/06/08(木) 13:41:26 ID:x1LjqPsR
>>463
これ、item.id=1の注文が全体としてはあるのに,2006年にはないから削られてしまうんですね。
誰もitem.id=1の注文をしていないと、多分1のところには0って出てきます。

ということで、joinの方法をこう変えてみたらどうでしょう。
FROM item
LEFT JOIN (tyumon LEFT JOIN user ON user.id = tyumon.u_id) AS t ON (t.i_id = item.id AND t.year = 2006);
さきに注文テーブルとユーザテーブルを結びつけて、それを商品テーブルと結合するときに、結合条件に加えちゃったらよさそう。
474463:2006/06/08(木) 21:30:01 ID:???
>>473
遅くなりましたが、レス有難うございます。
なるほど結合させたテーブルと結合とかも出来るんですね。
勉強になりました。いろいろ試してみます。
475455:2006/06/08(木) 23:31:00 ID:???
>>458

一時表作るパターンのも作ってみたのですが、
教示していただいたsqlのほうが性能良かったです。

ご教示ありがとうございました(感謝)。
476NAME IS NULL:2006/06/09(金) 13:08:55 ID:hI72BCsj
oracleのsql文で以下のように出力したいと思っています
--
id アイディー primary
name 名称

user_tab_columnsと、user_col_comments、user_cons_columns、これらのテーブル使えばいい?
IDとコメントまでは大丈夫なのですが、primaryの部分はどうすればよいのでしょうか。
他に簡単な方法があるのかな。教えてください。

select rtrim(a.column_name), rtrim( b.comments)
from user_tab_columns a ,
user_col_comments b where a.table_name(+) = b.table_name
and a.column_name(+) = b.column_name
and a.table_name = 'table1'
order by a.column_id

477NAME IS NULL:2006/06/09(金) 13:25:04 ID:???
DBMS固有のお話は、そっちのスレへどうぞ。
478NAME IS NULL:2006/06/09(金) 13:57:50 ID:???
その、そっち、をおしえて
479476:2006/06/09(金) 14:17:49 ID:???
質問、Oracle 総合 sessionというところ移しました。
480NAME IS NULL:2006/06/09(金) 14:34:30 ID:???
MySQL 4.1.15 (XP)
varchar(50) default nullに設定していても、そこにindexを設定するとnullは入らなくなるんですか?
481NAME IS NULL:2006/06/09(金) 21:06:36 ID:6nTbXVX3
下位10件の取り方がわかりません。
TOPを使って上位10件取るのは簡単ですが
その逆って関数のようなものはないのでしょうか?
482NAME IS NULL:2006/06/09(金) 21:23:44 ID:???
>>481
逆順にソートして先頭10件
483481:2006/06/09(金) 22:30:11 ID:???
やってみたら出来ました
でも、パラメータとして@IDなどをwhere条件式に入れるとエラーが・・・orz
484NAME IS NULL:2006/06/10(土) 17:54:25 ID:???
何が言いたいんだかさっぱりだ。
エラーが出るなら逆順にソートしなくてもエラー出るだろ
485NAME IS NULL:2006/06/11(日) 23:07:33 ID:???
PostgreSQLでのDISTINCTの使い方なんですが、
ttp://www.h7.dion.ne.jp/~matsu/feature/postgresql/sql-intro/select2.html#1
ここを見てたところ、

SELECT DISTINCT ON (n, nb) n, nb FROM result_linpack;
SELECT DISTINCT n, nb FROM result_linpack;

が同じ結果になるとのこと。
DISTINCTと、DISTINCT ONを使い分けるべきケースって、
どんな場合なんでしょう?
486NAME IS NULL:2006/06/12(月) 03:38:29 ID:???
SELECT DISTINCT ON (n, nb) n, nb, other FROM result_linpack;
487NAME IS NULL:2006/06/12(月) 13:12:54 ID:???
>>486
dクス。
でも、そもそもまだDISTINCTとDISTINCT ONのきちんとした仕様を
ちゃんと理解できてないオレガイル。
もう一回、おさらいしてきます。
488NAME IS NULL:2006/06/12(月) 14:14:54 ID:A68TTZqN
テーブルのキーとして、コンピュータIDというものがあります。
いまテーブルにはコンピュータIDが1の行がひとつだけあります。
この行の内容をコンピュータID=2、コンピュータID=3としてコピーする場合は
どのようなクエリを書けば宜しいでしょうか。
489NAME IS NULL:2006/06/12(月) 14:42:47 ID:???
insert into TABLE select 2 as コンピュータID,〜 from TABLE where コンピュータID=1
insert into TABLE select 3 as コンピュータID,〜 from TABLE where コンピュータID=1
490NAME IS NULL:2006/06/12(月) 14:59:59 ID:A68TTZqN
>>489
速レスありがとうございますた。
それでやってみようと思います。
491NAME IS NULL:2006/06/12(月) 23:54:41 ID:FXISZQXM
駄スレですいません。
SQLの初歩的な質問をしたいのですが、この板でよろしいでしょうか?
492NAME IS NULL:2006/06/13(火) 12:03:06 ID:???
駄スレとは何だこの野郎
493NAME IS NULL:2006/06/13(火) 18:07:41 ID:???
select COUNT(*) from TABLE;
のCOUNT句(関数?)って、単独でしか使われないんでしょうか?

select COUNT(*), col1, col2 from TABLE;
select COUNT(col1), col2 from TABLE;

といったことは出来ないんでしょうかね?
PostgreSQLでは、SQL自体がエラーになりました。
494NAME IS NULL:2006/06/13(火) 18:19:54 ID:???
>>493
よく考えてごらん。
何の数を数えてるの?
495NAME IS NULL:2006/06/13(火) 18:31:46 ID:???
group byを併用
496493:2006/06/13(火) 22:21:55 ID:???
>>494
うーん、SELECTの結果に、常に特定のカラムのカウント値を入れておきたい、
というようなことは、ナンセンスなんですかね。。。

>>495
ありがとうございます。group byを調べてみます。
497NAME IS NULL:2006/06/13(火) 23:03:39 ID:???
>>496
Oracleの分析関数使えば、特定のカラムのカウント値入れることは可能だ。
498NAME IS NULL:2006/06/14(水) 00:31:43 ID:???
>>497
それだとOracle依存になりませんか?
SQL-92だか99だかで標準だと、select句で使えるcountは1つなのかな。。
調べてみます。
499NAME IS NULL:2006/06/14(水) 10:12:39 ID:???
だから、何の数をかぞえてんだ。
試しにテーブルとデータを用意して、自分の求める結果を
書き出してみな。
500NAME IS NULL:2006/06/15(木) 10:44:05 ID:???
重複する行を集計するクエリで、下の二つのうち
どちらの方が早いのでしょうか?
distinctは良くないと言われたので1.のクエリを考えてみたのですが
実際にクエリアナライザでSQL投げても、
どちらも実行時間は0秒で変りませんでした。
ちなみに「SHYOUHIN」は数千件、「URIAGE」は数万件ほどです。

1.
select a.code,sum(a.TotalPrice)
from SHYOUHIN As a
where
exists (select * from URIAGE As b where a.code = b.code)
group by a.code
order by a.code

2.
select distinct a.code,sum(a.TotalPrice)
from SHYOUHIN As a,URIAGE As b
where a.code = b.code
group by a.code
order by a.code
501NAME IS NULL:2006/06/15(木) 17:17:17 ID:???
>>500
インデックスとオプティマイザによる。

1のSQLだと、2に置き換えて実行するRDBMSって多いんじゃない?
だって1は相関で、馬鹿正直にやったらURIAGEを何度も全件検索しなきゃならない。
だったら2で一気に出したほうが正解。
もちろんインデックスとかで、1が有利になるケースは十分考えられる。

実験結果に明示的な差がないなら、件数を増やして再試験するか、
実用上、問題がないならどっちでもいいんじゃない?
502NAME IS NULL:2006/06/15(木) 22:17:35 ID:???
>>500
SHYOUHINって商品マスター的なテーブルじゃないんだな。
単純にBROUP BY code とした場合、どのくらいの行数になるんだろうか?
何分の1とか極端に少なくなるのだったら、1.のexists述語を
HAVING句へ持っていったほうが速そう。 >>501が言うように
URIAGE.codeにインデックスが効かなきゃダメだけど。
503NAME IS NULL:2006/06/17(土) 11:53:41 ID:???
>>500
「SHYOUHIN」なんてローマ字は止めて欲しいんだがな…。
まあ500がカラム名を決めたわけじゃないのかもしれないが。
504NAME IS NULL:2006/06/17(土) 12:23:13 ID:???
コード| 名前  |タイプ |有効 | 順位
--------------------------------------------
10  |あいうえお|A   |N   |1
11  |かきくけこ|B   |Y   |2
12  |さしすせそ|A   |Y   |3
13  |たちつてと|B   |Y   |4
14  |なにぬねの|A   |Y   |5

という表があり、タイプ別に有効なものだけそれぞれ1つづつ、順位が一番高い
コードを取得したいと思ってます。
で、SQL文にすると

select コード from 表 where
コード=(select コード from 表 where 有効='Y' and タイプ='A' order by 順位 limit 1)
or コード=(select コード from 表 where 有効='Y' and タイプ='B' order by 順位 limit 1);

と、一応期待した動作はするのですが、ものすごく冗長になってしまいました。
group byを使えばもっと簡単にできるかと思うのですが、なかなかうまく書けません。
簡潔にいく方法はありますでしょうか。
505NAME IS NULL:2006/06/17(土) 12:58:31 ID:???
このスレでFAQ化している題材だよ。
506NAME IS NULL:2006/06/18(日) 14:31:09 ID:hiv9Xv4W
JAVAでSQLがベストですか?
507NAME IS NULL:2006/06/19(月) 09:43:39 ID:???
501さん、502さん、ありがとうございます。
データ件数を「SHYOUHIN」を20万件弱、「URIAGE」を150万件強にして、
かかった時間のうちわけがわかるようにCommonSQLで実行してみました。
以下がその結果です。

where句にexists
SQL応答時間 : 2.078000秒
取得データ出力時間 : 12.078000秒

HAVING句にexists
SQL応答時間 : 1.828000秒
取得データ出力時間 : 12.062000秒

DISTINCT使用
SQL応答時間 : 96.781000秒
取得データ出力時間 : 12.109000秒

という結果になりました。
DISTINCTだと応答時間にかなりかかるのが驚きでした。

なお、テーブル名の「SHYOUHIN」は商品マスターではなくて
これも「URIAGE」と同じようなテーブルで、売れたらレコード追加される感じです。
あと抽出項目の「code」は、どちらでも主キーの一つになっていますが
「URIAGE」テーブルの方がKEYの数が多いですし、
1レコードのデータ量もかなり大きいです。

実際にはここまで大きくなる事はありえなくて、
(前回のテストで使った件数ですら想定よりはるかに多いです)
DISTINCTが良くないと言われたから実験したかっただけなのですが、
DISTINCTだとなぜこんなに遅くなるのでしょうか?
ネットで調べてみたら
ttp://support.microsoft.com/default.aspx?scid=kb%3Bja%3B892392
こんなのがあったんですが、これのせいなんでしょうか?
SQL Server 2000使ってるし。
OracleやDB2だとどうなるんでしょうね?

>>503
そのままの名前使ってるわけではないので・・・
508NAME IS NULL:2006/06/19(月) 13:42:50 ID:???
>>507
1と2の結果ちがってないかい?
結合を使って1に等価なSQLはこうだと思うのだが。
select a.code, sum(a.TotalPrice) 
from SHYOUHIN As a, (select distinct code from URIAGE) b
where a.code = b.code group by a.code order by a.code 
509NAME IS NULL:2006/06/20(火) 00:24:23 ID:kCOtweJA
以下のようなテーブルがあり、
グループはツリー構造になっています。
例えばグループコード=1で検索すると
「あ」と「い」が両方引っかかるようなSQLを
組みたいのですが、
どのようにすれば良いでしょうか?

ちなみに階層はいくつあるか不定なのですが、
固定のSQLでいけるでしょうか?
#データを追加して階層が増えても
#SQL変更無しでいける方法はあるでしょうか?

<<社員マスタ>>
社員コード 社員名 グループコード
  200 あ         1
  201 い         2
  202 う         4

<<グループマスタ>>
グループコード グループ名 親グループコード
      1 すべて          0
      2 設計課          1
      3 営業課          1
      4 1係           2
      5 2係           2
510502:2006/06/20(火) 00:52:37 ID:???
>>507
>>508氏も指摘しているが、これで結果が同じなら
2のSQLって結果的にDISTINCTいらないんじゃね。

で、2の場合はMaxでURIAGEの行数分をGROUP BYに掛けることになるが、
1の場合はMaxでSHYOUHINの行数分で済むはず。DISTINCTは関係ない。


>>509
再帰的に結合する必要があるので、標準のSQLじゃ無理だろ。
DBによっては拡張SQLだったかプロシージャで解決できるが、
CONNECT BY だったかな。
-- ところで、グループコード=1なら「う」もヒットしたいんじゃ?
511NAME IS NULL:2006/06/20(火) 04:44:23 ID:???
mysqlのselect文中で、最近7日間のうちに更新されたレコードだけを取り出すときはどうすればいいでしょうか?
timestampのカラムはありますが、これを使えますか?
512509:2006/06/20(火) 22:19:43 ID:???
>>510
そうなんです。
再帰的に結合すると、階層が固定なら読めるんですが
不定だったらやっぱり無理ですかね。。。

プログラム内でごりごりツリーを検索するしかないかな。

ありがとうございます

>-- ところで、グループコード=1なら「う」もヒットしたいんじゃ?
そのとおりです(><)
513NAME IS NULL:2006/06/21(水) 09:22:10 ID:ub7tfZIU
>>510
標準でもSQL99だっけ?Withかなんかで実現可能になってるはず。
@IT に記事があったような。

ただ、準拠してるDBMSは少ないけど。
514NAME IS NULL:2006/06/21(水) 12:17:57 ID:???
質問があります。
テーブルからランダムに1個レコードを取得しようとしています。
ただ、全部のレコードが同じ確率でではなく、
例えば全部で10レコードあったとして、1個目が30% 2個目が20%…というように
それぞれ選ばれる確率が異なるようにしたいのです。
こういう場合、どのようにしたらいいのでしょうか?
515NAME IS NULL:2006/06/21(水) 15:02:04 ID:???
>>514
SQLで書けるかな?書けてもかなり制限が強い(ランダムは数値のみとか)+冗長で処理が遅い
ものになりそうな気がする。まともに考えてないから、確言はできませんが。
素直にアプリケーション処理またはストアドプロシージャを使うのがよろしいのでは。
516514:2006/06/21(水) 17:11:13 ID:???
>>515
レスありがとうございます。
なるほど、SQLでどうにかしようとは考えない方が良さそうですね。
ストアドプロシージャというものを知りませんでしたので、
検討してみようと思います。どうもありがとうございました。
517502:2006/06/21(水) 23:25:39 ID:???
>>513
WITH RECURSIVE っすね。実装したDBってあるんでしたっけ。
最近PostgreSQLしか使ってないし、しかも8.0まででいまだにメインは7.2か7.4系なんで...
昔は早く実装してくれりゃいいなと思ってたが、connectbyを使ったり、入れ子型にしたり
してしのいでたからすっかり忘れ(ry
518NAME IS NULL:2006/06/22(木) 11:16:43 ID:???
select count(*) count from tbl_1
aliasにcountって使うのって何か問題ある?
519NAME IS NULL:2006/06/22(木) 17:23:11 ID:???
>>518
RDBMSによっては予約語扱いされてるかも。だから汎用性はないね、って問題だけかと。
関係ないけどaliasするならASを書いてくれるほうが、個人的には好き。
520NAME IS NULL:2006/06/23(金) 10:59:36 ID:???
>>511ってどうすればいいですか?
521518:2006/06/23(金) 12:59:11 ID:???
>>519
レスTHANKS。

そーいや、大文字と小文字にこだわる人結構いるのかな?過去にもあがってそ。

where派
WHERE派

やっぱ予約後は大文字だろ、とか。
Where派とかもいそうだけど。

おいらはどっちでもいいだろ派。ま、区切りのスペースは一つがいいよなとは思うけど。
522NAME IS NULL:2006/06/23(金) 13:01:59 ID:XClUlwys
DBMSによっては、SQLの実行キャッシュで大文字小文字を区別するようなのがあったような。
523NAME IS NULL:2006/06/23(金) 14:47:24 ID:???
>>522
Oracleがキャッシュしだした頃(Oracle7だよね)、そういう仕様だったね。今の仕様は知らない。
524NAME IS NULL:2006/06/25(日) 01:27:24 ID:i+iXipeb
フィールドの結合についての質問です
(かなりアホな質問だと思います)

FIELD1:文字列
FIELD2:文字列

この二つのフィールドを結合するさい、AccessVBAでやっていたときは
ずっと [FIELD1]&[FIELD2] みたいな書きかたをしていました

最近たまたまDelphiからAccessのmdbをいじる機会があり
文字列をくっつける場合は
MyStrSQL:=MyStrSQL+・・・・
な感じで、&ではなく+を使うと知りまして

じゃあフィールドをくっつける場合はどうなんだと

& + 両方ためしたら、結果はどっちもOK
どっちも動くんだからどっちでもいいというのもやっぱり不安で

どっちが正しいのか知りたいなと
525NAME IS NULL:2006/06/25(日) 01:43:32 ID:???
>>524
> & + 両方ためしたら、結果はどっちもOK
スレ違いの予感
526NAME IS NULL:2006/06/25(日) 03:02:48 ID:???
ID  ユニーク
Date 日付型 2006-06-25
Text テキスト型

mysqlで、↑のようなテーブルを作りました。
これを、年月ごとの件数を取得したいと思い悩んでいます。

Select count(ID), Date From テーブル Group By Date
これだと年月日ごとになるし、どうにかして、年月ごとの件数として
取得できないものでしょうか?
527NAME IS NULL:2006/06/25(日) 03:42:24 ID:???
>>524
マニュアルくらい読め
528NAME IS NULL:2006/06/25(日) 10:29:58 ID:???
>>526
Select count(ID), EXTRACT(YEAR_MONTH FROM Date) From テーブル Group By 2;

Group byにカラム番号指定していいかどうかは自信がない。。
529NAME IS NULL:2006/06/25(日) 12:57:20 ID:???
>>528
ありがとうございます。
期待通りの結果が得られました。

>Group byにカラム番号指定していいかどうか
試してみたところ大丈夫でした。けど、一応ASつけて別名で指定しました。
530NAME IS NULL:2006/06/29(木) 00:23:23 ID:DrKT9pbj
SQLの検索についてですが、違う条件で同じ項目のデータを
2つ抽出するときselect句でどのように区別して書けばよいですか。
ようは、1レコードとして同一項目のデータを2つ取得したい。

例:以下のような場合IDを2つ指定してテーブルAとBで一致する
IDのcodeAを抽出(2つ)したい。(1レコードで取得)

テーブルA
ID
codeA
codeB

テーブルB
ID
dataA
dataB
531NAME IS NULL:2006/06/29(木) 00:37:56 ID:???
table1
---
key1, key2, data

table2
---
key1, key2, quantity

上記のようなテーブルがあったとして、table2 を key1 と key2 で Group By して、
Sum(quantity) を取ります。その結果と、table1 を結合したいのですが、
どんな SQL を書けばよいのでしょうか?
532NAME IS NULL:2006/06/29(木) 01:51:17 ID:???
>>530
select a.ID, a.codeA, b.codeA from テーブルA a join テーブルB b on a.ID = b.ID
where a.ID = ?

>>531
select t1.key1, t1.key2, t1.data, t2.total_quantity from table1 t1 join 
(select key1, key2, sum(quantity) as total_quantity
 from table2 group by key1, key2) t2
on (t1.key1 = t2.key1 and t1.key2 = t2.key2)
533NAME IS NULL:2006/06/30(金) 19:12:44 ID:B3GH3cDl
以下のようなSQLがあって、
JOINを条件によってLEFT JOINに変更したり、
JOIN右側を変更するやり方はないでしょうか?

かなり無茶なことかもしれませんが、似たようなことが
できる方法でも教えていただけないでしょうか?

SELECT B.data,D.data FROM B
JOIN (SELECT data FROM C) AS D
534NAME IS NULL:2006/06/30(金) 23:44:37 ID:???
>>533
ストアドプロシージャ、または、ユーザープログラム側で動的SQL生成をしましょう
535NAME IS NULL:2006/07/01(土) 00:40:50 ID:???
>>533
SELECT B.data,D.data FROM B
LEFT JOIN (SELECT data FROM C) AS D
WHERE フラグ = 1
UNION ALL
SELECT B.data,D.data FROM B
RIGHT JOIN (SELECT data FROM C) AS D
WHERE フラグ = 2

と書いてみてやっぱり動的SQLの方がましなことに気づく俺・・・


536NAME IS NULL:2006/07/01(土) 03:45:04 ID:???
>>533
SELECT B.data,
case when 条件1 then
D.data
case when 条件2 then
F.text
end
FROM B
JOIN (SELECT data, key FROM C) AS D
on B.key=case when 条件1 then D.key end
LEFT JOIN (SELECT data, id FROM E) AS F
on B.id=case when 条件2 then F.id end

joinのパターンはfrom句に列挙して、条件はcaseに書く
right joinが使えないのかな?これは。どういう条件か
わからんとね。
537NAME IS NULL:2006/07/03(月) 07:24:40 ID:3bEKjJDE
ド初心者です、お助けください。
このSQL文の意味を誰かご指南ください。

SELECT商品.商品番号,商品名,価格+消費税
FROM商品.販売実績
WHERE商品.商品番号=販売実績.商品番号
AND商品LIKE"%パソコン%"

よろしくおねがいします。
538NAME IS NULL:2006/07/03(月) 12:09:36 ID:???
ピリオドとカンマがごっちゃになってる気がするが・・
FROM句のはカンマじゃない?
ANDの後は商品名じゃない?

販売実績テーブルの商品番号が含まれる
商品テーブルのうち、商品名に"パソコン"が含まれるものを
商品番号、商品名、価格(税込み) の順番で取り出せ。
539NAME IS NULL:2006/07/03(月) 13:30:11 ID:KGeeSO0Z
ありがとうございました。
ANDの後は商品名でした。参考になりました。
感謝します。
540NAME IS NULL:2006/07/05(水) 22:15:49 ID:jXk3M2BG
日付    金額
−−−−−−−−−−−−−−
1月1日  100
1月2日  100



1月31日 100
2月1日  200
2月2日  200



2月30日 200

上記形式のテーブルを検索して、以下のようなレコード形式で抽出する
SELECT文のいい書き方はないでしょうか?
よろしくお願いします。

1月計  2月計    3月計
−−−−−−−−−−−−−−−−−
3100  6000  ・・・・
541NAME IS NULL:2006/07/06(木) 00:33:21 ID:???
日付用のフィールドに全角数字プラス「月」「日」ですかい。
542NAME IS NULL:2006/07/06(木) 04:00:05 ID:???
MSDEのストアドについてですが、スレッドのSleepのように他の処理にCPUパワーを
割り当てることコードは描けないのでしょうか、CPUパワーが20%程度で動いてる
システムが、集計処理を走らせると100%になり全体に影響を与えてしまうので
こまってます。担当者は、Sleepみたいな処理は無いというのですが、どうなんでしょう。
543NAME IS NULL:2006/07/06(木) 10:57:45 ID:???
MySQL なんですが、
AフィールドのデータとBフィールドのデータを結合したデータをそれぞれ
Aフィールド、BフィールドにUPDATEしたいと考えています。
どのようにSQLを記述すればよいでしょうか?
具体例を挙げますと下記のような感じです。

A     B     C
−−−−−−−−−−−−−−−−−
aaa     bbb    10000
ccc     ddd    10000



A     B     C
−−−−−−−−−−−−−−−−−
aaabbb   aaabbb   10000
cccddd   cccddd   10000

544NAME IS NULL:2006/07/06(木) 21:12:50 ID:???
>>543
MySqlがどうかわからないけど標準的なupdate文じゃね?

UPDATE 表 SET a=a||b, b=a||b

これ使えねえの?
545NAME IS NULL:2006/07/07(金) 10:49:00 ID:???
>542
5分スリープ
waitfor delay '00:05:00'

でもうまくCPUパワーが他所行くかはわかんないや
546NAME IS NULL:2006/07/07(金) 22:33:42 ID:???
>542
SQLServerスレに投げたほうがいいとは思うが…。
集計処理用と、通常処理用のDBを別に作成し、
別インスタンスでそれぞれ立ち上げておき、
それぞれのインスタンスに対してCPUの割り当てをすればいいかと。
詳しくは、BooksOnlineで「CPU インスタンス」あたりで研削してくで。
547NAME IS NULL:2006/07/10(月) 10:47:07 ID:ESDXIZu+
Oracleで
あるユーザに現在接続しているセッションを取得するSQLを教えて下さい。
ためしに
SELECT SID, Serial#, Machine, Status FROM V$Session WHERE UserName = 'hogehoge' AND Status <> 'KILLED';
こう書いたら余計なレコードが残ってるのか、セッションが切れてるはずなのにわらわら取れてたまげました。
548NAME IS NULL:2006/07/10(月) 15:57:04 ID:???
>547
Status = 'ACTIVE' じゃだめ?
549NAME IS NULL:2006/07/10(月) 16:20:23 ID:???
>>548
Statusってマニュアルとかいろいろ見たけど
ActiveとInactiveの差がよく分からないっす。
550NAME IS NULL:2006/07/10(月) 17:48:20 ID:H/gE7eDk
SQL-SERVERです。
ストアドで引数や変数などの値によって
ORDER BY 項目を変えたいのですが可能でしょうか?
551NAME IS NULL:2006/07/10(月) 18:52:28 ID:???
>549
INACTIVEはKILLEDと同じで消去予定マークつき
最近ACTIVEだった、くらいの感じかと
552NAME IS NULL:2006/07/10(月) 21:56:14 ID:???
>550
できるよ。CASE式使えや。
つかさ、何でSQL Serverスレできかねーのかな?
553NAME IS NULL:2006/07/11(火) 08:54:08 ID:???
>>551
さんくす〜!!
554NAME IS NULL:2006/07/11(火) 09:03:51 ID:jBZOO1gG
>>551
って今試しにSQLPlus3個立ち上げて試してみたら
SQL実行中のやつがACTIVEで残り2つがINACTIVEでした…
通常はつながってるけど実行中でないやつがINACTIVEだとしたら
INACTIVEだけど実際はセッションが切れてる(幽霊状態)ってありうるんでしょうか?
555542:2006/07/11(火) 13:15:43 ID:???
>>545, 546
知識に足がかりになるものがなかったため助かります
ありがとうございます
556NAME IS NULL:2006/07/11(火) 14:59:56 ID:???
>554
ごめん。マヌアル読み間違えますた。551はナシでお願いします
ACTIVEとINACTIVEは、どっちも接続状態で、
違いはトランザクションがあるか無いか、ですな。

で、クライアントが落ちているにもかかわらず、PMONが認識してなくてプロセスが残る問題
はクライアントのハングしたタイミングによって起こるそうなので
ACTIVEでもINACTIVEでもどっちでも幽霊になる可能性はあるです。
INACTIVEで消えない事例は「セッションがINACTIVE」でOTN掲示板検索(いっぱいあったyo)。
557NAME IS NULL:2006/07/11(火) 15:08:53 ID:???
>>556
サンクスです。OTN掲示板も検索かけたのですが
検索ワードのせいかうまく引っかからなかったようです。
とりあえず幽霊になることがあるということがわかりました。ありがとうございました。
558NAME IS NULL:2006/07/11(火) 22:50:42 ID:Qj/HyKb+
複合主キーの片方のみをwhere区内で条件に指定した場合、索引は機能しますか?

例えばorderテーブルがあり主キーがorder_no,branch_noで定義されているとします。
このテーブルを検索する際に order_no = 1 もしくは branch_no > 5 のような条件を指定した場合です。
559NAME IS NULL:2006/07/12(水) 01:45:54 ID:gwf4ge9L
postgresqlを使ってまして、質問です。宜しくお願いします。

CREATE TABLE "properties" (
"uid" int REFERENCES "main_log" ("uid"),
"name" text NOT NULL,
"value" text NOT NULL DEFAULT '',
PRIMARY KEY("uid", "name"));

このようなテーブルがあります。中身は下記だとします。

uid, name, value
--------------------
1, title ,今日の日記
1, writer ,おれ
2, title ,明日の日記
2, writer ,おれ
2, note ,まだ書いてない

nameに入る文字列は種類が増える可能性があります。これを、sqlで下記のような雰囲気で取得することは可能でしょうか。

uid, title, writer, note
--------------------
1, 今日の日記, おれ, NULL←この辺あいまい
2, 明日の日記, おれ, まだ書いてない
560NAME IS NULL:2006/07/12(水) 02:17:31 ID:???
>>558
DBによる。が、pkey(c1,c2)の場合、先頭のc1側のみならたいてい効くんじゃまいか。

>>559
nameが固定ならできる。
SELECT T1.uid,
(SELECT value FROM properties WHERE uid=T1.uid AND name = 'title') AS title,
(SELECT value FROM properties WHERE uid=T1.uid AND name = 'writer') AS writer,
(SELECT value FROM properties WHERE uid=T1.uid AND name = 'note') AS note
FROM properties AS T1 GROUP BY uid;
相関サブクエリじゃなくて、properties+各サブクエリをLEFT JOINしてもいいがな。

nameが増えても同一SQLでってのは_。
PL/pgSQLを使えば可能だと思うが、スレ違い。
561559:2006/07/12(水) 03:02:22 ID:???
ありがとうございます!name固定でいけるか検討してみます。
あと、PL/pgSQLも勉強してみます。
562NAME IS NULL:2006/07/12(水) 11:09:07 ID:???
しかし、そもそも固定ならそんな構造にはしないのではないか
563NAME IS NULL:2006/07/13(木) 22:41:30 ID:???
大至急教えてください
オラクルのある項目に日本語のデータが入ってるんですが
これがDEC漢字コードらしい
これってCONVERT関数とか使えば読めるんですか?
564NAME IS NULL:2006/07/13(木) 23:07:18 ID:/Wsv+rKy
ここはSQLについて聞くところだから文字コードは余所で聞いてね
565U ◆CZtFsGiu0c :2006/07/14(金) 12:20:08 ID:???
>>563
Oracle Rdb(旧DEC Rdb)じゃないOracle(ああややこしい)にDEC漢字で
登録できたんだっけ? もしOracle自身がDEC漢字をサポートしている
のであれば、SQLで変換かけなくてもドライバなりツールなりが
サポートしてくれると思うけど。
566550:2006/07/14(金) 14:11:48 ID:6Om5TVuD
>>552
ありがとうございます!!
SELECT にCASEを入れてそれをORDER BYにして出来ました。

さらにこの形で昇順降順が切り替えることはできますでしょうか。

567Q:2006/07/14(金) 15:21:44 ID:g/CUrufV
PostgreSQL使ってます。

ID 日付 名前
1 2006/06/02 A
2 2006/06/03 A
3 2006/06/04 A
4 2006/06/10 A
5 2006/06/11 A
というデータがあるとき、連続した日付をまとめてSELECT一発で
下記のようなリストを得ることはできるんでしょうか?

2006/06/02〜2006/06/04 A
2006/06/10〜2006/06/11 A

SELECT一発でやりたい理由は、LIMITを使いたいからなんだけど。
568NAME IS NULL:2006/07/14(金) 18:30:50 ID:???
>>567
select一発厳しいような。というか無理かな。
569NAME IS NULL:2006/07/14(金) 19:35:55 ID:???
>567
PostgreってOracleのCONNECT BYみたいなのなかったっけ?
それがありゃできるんだけど。
570NAME IS NULL:2006/07/14(金) 19:38:14 ID:???
>>550
だからSQL Serverスレで聞けと…。
そういう複雑な要求を満たすために
一時テーブルとかいう便利なものがあるんだよ。
571NAME IS NULL:2006/07/15(土) 00:08:00 ID:???
>>567
もっと簡素化できるかもしれんが、思いつきで、

SELECT 名前,日付,
(SELECT MIN(日付) FROM Table T2 WHERE 名前=T1.名前 AND 日付 > T1.日付 AND
NOT EXISTS (SELECT * FROM Table WHERE 名前=T1.名前 AND 日付 = T2.日付 + '1 day'::interval))
FROM Table AS T1 WHERE 名前=T1.名前 AND
NOT EXISTS (SELECT * FROM Table WHERE 名前=T1.名前 AND 日付 = T1.日付 - '1 day'::interval)

最初の日付と最後の日付を別カラムにしているが、
1カラムにまとめたかったら連結するだけ。

SELECT 名前,日付 || '〜'||
以下同じ
572571:2006/07/15(土) 00:19:12 ID:???
余計なところがあった。orz

SELECT 名前,日付,
(SELECT MIN(日付) FROM Table T2 WHERE 名前=T1.名前 AND 日付 > T1.日付 AND
NOT EXISTS (SELECT * FROM Table WHERE 名前=T1.名前 AND 日付 = T2.日付 + '1 day'::interval))
FROM Table AS T1 WHERE
NOT EXISTS (SELECT * FROM Table WHERE 名前=T1.名前 AND 日付 = T1.日付 - '1 day'::interval);
573Q:2006/07/15(土) 10:52:06 ID:???
おお〜!できるのかぁ。さっそく試してみます。

自分の中ではワークテーブルを使う以外に手は無い
ということになっていた。。。
574NAME IS NULL:2006/07/16(日) 17:57:20 ID:???
PostgreSQLです
整数配列の . 区切りデータを次のような列に格納しています

|data : int4[]|position : int4[]| ※data列はデータそのもの、position列は . の位置です

具体例として、[1].[1,2].[1,2,3] は data列:[1,1,2,1,2,3]、position列:[1,3,6] となります

入力データ o1.o2.….on (oi:i 番目の配列の順序) から該当するデータを取得したいのですが、どのようなSQLを記述すればよいでしょうか?

例えば既存データが以下で
[1].[2].[1]
[1].[2,1].[1]
[1].[2,1].[1,2]
[1].[2,2].[1]
入力データが 1.2.2 の場合、 [1].[2,1].[1,2] を取得したいのです
575NAME IS NULL:2006/07/17(月) 17:12:46 ID:AJgNsG8A
ORDER句でソートするときに,独自条件でソートさせるというのは可能ですか?

例えば"A B C D 1 2 3"があるときに、
Selectの結果 "1 2 3 D A C B"のような順番で取りたいのです。
576NAME IS NULL:2006/07/17(月) 20:21:46 ID:???
お知恵をお貸し下さい…

テーブル構造は

条件文字列1 , 条件文字列2 , 条件文字列3 , 結果文字列

のように4列あって,条件文字列1と結果文字列はNOT NULL, それ以外はNULL可となっているテーブルがあります。

前3列ぶんのレコードデータとしては

親番号1
親番号1 枝番1-2
親番号2 枝番2-1 枝番2-2-1


のようになっています。

ここで,もしアプリケーションが
常に3つの検索条件を指定してきたとして,
テーブルの条件文字列1,2,3の全てに合致しているものがあればその行の結果文字列が得られるが,
テーブルに条件文字列1,2だけが指定されていればそれが,
テーブルに条件文字列1だけが指定されていればそれが…

というように,より限定的に条件に合致するものがあればその結果文字列が,もしなければより条件が「ゆるい」
レコード結果文字列が返される…

というような(できれば1回のSQL実行でとってこれるような)SQLを書きたいのですが,
どうやったらよいのか悩んでいます。

こうやったらいいよ,というアイデアいただけませんでしょうか。


577NAME IS NULL:2006/07/17(月) 22:42:26 ID:???
>>575
ORDER BYで値を変換すればOK。

オラクルなら
ORDER BY
  DECODE(ソート項目,
    'D', 'A',
    'A', 'B',
    'C', 'C',
    'B', 'D')
みたいに。
578訂正:2006/07/17(月) 22:45:46 ID:???
ORDER BY
  DECODE(ソート項目,
    'D', 'A',
    'A', 'B',
    'C', 'C',
    'B', 'D', ソート項目)
579NAME IS NULL:2006/07/17(月) 23:27:32 ID:???
>576
結果文字列ってのがなんだかわからんが、親番号・枝番号がNOT NULLなら、
CASE式が使えると思う。

WHERE
 親番号 = CASE WHEN 条件文字列1 IS NULL THEN 親番号 ELSE 条件文字列1 AND
 枝番号 = CASE WHEN 条件文字列2 IS NULL THEN 枝番号 ELSE 条件文字列2 AND
 枝番号2 = CASE WHEN 条件文字列3 IS NULL THEN 枝番号2 ELSE 条件文字列3

とすればよい。
親番号・枝番号がNULL許可なら、
NULLかどうかチェックして何か(例えば空文字とか)に置換するという
処理をかませばよいかと。
580579:2006/07/17(月) 23:28:31 ID:???
あ、おいらも訂正…。END抜け。

WHERE
 親番号 = CASE WHEN 条件文字列1 IS NULL THEN 親番号 ELSE 条件文字列1 END AND
 枝番号 = CASE WHEN 条件文字列2 IS NULL THEN 枝番号 ELSE 条件文字列2 END AND
 枝番号2 = CASE WHEN 条件文字列3 IS NULL THEN 枝番号2 ELSE 条件文字列3 END
581NAME IS NULL:2006/07/18(火) 21:57:37 ID:dogqYQ0g
timestamp型の列にインデックスを張るのはおかしい?
582NAME IS NULL:2006/07/18(火) 22:04:25 ID:P4U1S9qY
SQLについて
複数の前方一致(LIKE)のやり方をしたいのですが、どなたか教えてください。

'A'と'B'が先頭にあるデータを取得したいのですが・・・

よろしくお願いします。
583NAME IS NULL:2006/07/18(火) 22:09:38 ID:???
>>582
つ 性器表現
584NAME IS NULL:2006/07/18(火) 22:16:53 ID:P4U1S9qY
SELECT SEQNO from テーブル名 WHERE 列名 LIKE 'A%'

上記は"A"の前方一致かと思いますが、それにプラス"B"の前方一致も
取得したいのですが・・・
どうすればいいですか?
585NAME IS NULL:2006/07/18(火) 22:28:02 ID:???
SELECT SEQNO from テーブル名 WHERE 列名 LIKE 'A%' or 列名 LIKE 'B%'
586NAME IS NULL:2006/07/18(火) 22:33:58 ID:P4U1S9qY
ありがとうございます。
587NAME IS NULL:2006/07/18(火) 22:41:19 ID:???
>>581
timestampは処理系で意味が全然違う。
ANSI SQLのtimestampはただの日付時刻型だから索引をつけてもおかしくはない。
MySQLやMS SQLのtimestampはレコードの更新のたび変化するので索引はつけない。
しかしANSI SQLはなんで既に出回っている処理系で別の意味で使ってそうな名前をわざわざつけたのか不思議だ。
588NAME IS NULL:2006/07/18(火) 22:52:09 ID:DAvgl4if
未熟者ですが、教えてください。
A表とB表に同一の項目1があります。
ただし、A表の項目1にしかない値を拾いたいのですが
どのようなSQL分になるのでしょうか?
589NAME IS NULL:2006/07/18(火) 23:51:35 ID:???
DBなんだかしらないけど
集合演算でいけるとおもふ
590NAME IS NULL:2006/07/19(水) 00:03:43 ID:pa4kMVFQ
例えば既存データが以下のような場合、
select 項目A from A表
where 項目A <> (select 項目A from B表);
[もしくは、
select 項目A from A表
where 項目A NOT IN (select 項目A from B表);
]
としたら、結果は、"1"だけ返ってきますか?
《A表》 《B表》
項目A       項目A
-----------    ----------
1 2
2 3
4 5
5 6
-----------    ----------
591NAME IS NULL:2006/07/19(水) 00:05:52 ID:pa4kMVFQ
*フォーマットか崩れてしまったので、改めて。
すいません。
例えば既存データが以下のような場合、
select 項目A from A表
where 項目A <> (select 項目A from B表);
[もしくは、
select 項目A from A表
where 項目A NOT IN (select 項目A from B表);
]
としたら、結果は、"1"だけ返ってきますか?
《A表》      《B表》
項目A       項目A
-----------    ----------
1          2
2          3
4          5
5          6
-----------    ----------

592576:2006/07/19(水) 00:10:27 ID:???
>>580

ありがとうございます,チャレンジしてみます
593NAME IS NULL:2006/07/19(水) 06:39:42 ID:???
>>591
書いてるSQLと例の値がずれてるような気がするが・・・

B表のどの値より少ない値を返したいというのなら
where 項目A < all(select〜)

B表に無い値を返すつもりなら1番目のは通らないと思う。
where 項目A <> any(select〜)
とかにしないと。1項目と1項目複数レコードを返すサブクエリーは
直接比較できない。

2番目のはまあ正解。ただ、B表の項目AにNULLがあると×

他にはnot existsとかexcept(minus)とか使う手もある。
not existsがベストかな。
594NAME IS NULL:2006/07/20(木) 02:28:21 ID:???
オラクル9、selectで取ってくる項目にビット演算ってできるんですか?
595NAME IS NULL:2006/07/20(木) 22:07:58 ID:EYMkKJPJ
初歩的な質問で申し訳ないのですが、今日たまたま

select 0 A from 表(どんな表でもかまいません)の結果が

A    0とAは任意のものでかまいません
----
0
0
0
0
.
.(表のデータ数だけ0を表示)
.

となることを知りました。
この仕組みが気になって仕事中ずっとネットで調べてみたのですが、
どこにも見当たりませんでした。
この仕組みについて説明しているサイトや書籍があれば教えて下さい。
596NAME IS NULL:2006/07/20(木) 22:11:00 ID:???
0 を A という名前の列として条件無しで選択するので 0 のみを出す。
構文レベルの問題。
597NAME IS NULL:2006/07/21(金) 02:20:33 ID:???
>>595
実は、0 と A の間に AS が省略されてる
これでわかる?
598595:2006/07/21(金) 08:26:31 ID:bTn+n/rQ
〉〉596
〉〉597
参考になりました。ありがとうございます!
599595:2006/07/21(金) 08:27:26 ID:bTn+n/rQ
〉〉596
〉〉597
参考になりました。ありがとうございます!
600NAME IS NULL:2006/07/21(金) 11:45:13 ID:t5UpclNT
朝、姉ちゃんが俺の部屋に起こしに来てたんだけど
俺は連日の2ch閲覧による夜更かしで眠すぎて起きれなかったんだ
全然起きる気の無い俺を見て、姉ちゃんが部屋に入ってきて、俺に馬乗りになる
鬱陶しいなーとか思ってると、姉ちゃんが寝てる俺の耳元で

「朝だぞおおおお早く起きなさああああい」

寝起きの悪い俺は姉ちゃんにムカついてガバっと起きた
「キャッ!!」
起きた瞬間俺の唇に何か柔らかい感触、びっくりして目を開けたら
俺が急に起きたせいでベッドの上に転んでる姉ちゃん
「え・・・と、今口に何か当たったんだけど・・・」
「ん・・・んー?wなぁに?w」

二人でちょっと無言になっちゃったけど気づくと姉ちゃんの手が俺の股間に乗ってるのがわかった
「ちょっと姉ちゃん、とりあえず降りて、ベッドから降りて!」
俺は焦って、慌てて姉ちゃんをどかそうとする。
「なによwせっかく起こしてあげたのにー・・・あ、そっかwコイツのせいかw」
俺の股間の硬さに気づかれた、俺は思わず逃げようとしたが寝起きで力が入らない。

「ちょっとおとなしくしててw」

そう言うと姉ちゃんが両手で俺の股間に手を置き、触りだした。
初めて他人に触られる俺の股間・・・みるみるうちに大きく膨れ上がるのが自分でわかった
「あ・・・wおっきくなってきた・・・もうwしょうがないなぁw」
そう言うと姉は俺のトランクスの中に手を入れてきて

長くなりそうなんで続きはこっちで↓
http://life7.2ch.net/test/read.cgi/souji/1150284363/
601NAME IS NULL:2006/07/21(金) 19:00:51 ID:???
姉ちゃんをオカンに置き換えてお楽しみください
602NAME IS NULL:2006/07/21(金) 19:31:33 ID:???
いや、妹に置き換えて
603NAME IS NULL:2006/07/22(土) 12:32:57 ID:???
また騙されたなお前ら というのが出てくる気がするのでスルー
604NAME IS NULL:2006/07/23(日) 23:10:55 ID:???
どこで質問していいかわからなかったのですが
一応データベース使ってますのでここで質問させてください。

素朴な疑問です。
ショッピングカートを作成中ですが、
例えば在庫数が5個の場合、
カートに入れた時点で在庫を減らしたほうがいいのでしょうか?
それとも売れたあとに在庫を減らしたほうがいいのでしょうか?
よろしくお願いします。
605NAME IS NULL:2006/07/23(日) 23:22:03 ID:???
カートに入れた時点で個数を減らすとセッションタイムアウト時なんかにもとにもどしたりとかしなきゃならない。
日時バッチで商品の個数が同期取られるならたいした問題じゃないとおもうけど。
大きいショッピングサイトとかだとこれが多いかな?

購入時点で個数を減らすと0個になってその時点でカートに入れてる人が買えなくなる。
申し込み画面で御取り寄せになりますが・・・みたいのを出せばまぁ問題ない(?)けど。
在庫切れで購入完了しちゃった人にはメールを手動で送るみたいなこともやったことがあるなぁ。
606NAME IS NULL:2006/07/23(日) 23:29:52 ID:???
>>604
多いのは売れたとき。
607NAME IS NULL:2006/07/24(月) 00:06:59 ID:UbIRhfM+
なるほどです。
勉強になりました。
608NAME IS NULL:2006/07/26(水) 00:42:15 ID:vjYWKT5p
Oracle SQL*Plusで、Select〜Into文で取得した結果を変数に入れて、
次のSelect文の条件に使いたいと思っています。

variable 変数 varchar2(8)
select 項目A into :変数 from 表A where 条件(No = '1');
select 項目B from 表B where 条件(CODE = :変数);
※変数をselect文で使用する際は頭に:を付けています

これだと2行目のselect文で項目Aが表示されて、
print 変数 で変数の中身を表示しても空の状態になります。
(3行目のselect文も条件の変数が2行目の項目Aの値となる)

なにか良い方法はないでしょうか?
ご教授ください。よろしくお願いします。
 
609NAME IS NULL:2006/07/26(水) 02:00:06 ID:???
>>608
Oracleローカルな質問はOracleスレへ。
それ以前に何がやりたいのかさっぱりわからないから質問の文章も吟味してくれ。
610NAME IS NULL:2006/07/27(木) 01:48:07 ID:IvNm9YUp
PHPやPerlなどのプログラミング言語にある"配列"のようなテーブルを作る事って出来ますか?
id | data
--------
01|Apple
02|Expect
03|Ecept
04|Get
というテーブルがあったとして、idの02と03の間にdataがLispという項目を追加すると
id | data
--------
01|Apple
02|Expect
03|Lisp
04|Ecept
05|Get
となって欲しいのですがこの様な事は可能でしょうか?
# この様にソートして出力できればidについては別に必要ないです。
611NAME IS NULL:2006/07/27(木) 05:07:44 ID:???
>>610
リスト構造のレコードセットはRDBではサポートしてない。
確かネットワーク型DBでサポートしてたかな。
どうしてもやりたければこんなテーブルになる。
create tabel listtable (id int primary key, data varchar(..), next_id int)
普通は親子レコードの子がリスト構造を持つことが多いので、
全部読み込んで変更があれば番号振りなおして全部書き出す。
612NAME IS NULL:2006/07/27(木) 13:18:46 ID:???
お願いします。

<table1>
id | group | point
--------------
1 | 3 | 5
2 | 2 | 0
3 | 1 | -10

<table2>
group | rank
----------
1 | b
2 | c
3 | a

<table3>
rank | bonus
-----------
a | 10
b | 2
c | 5

table2.rankに対応するtable3.bonusをsub1
table1.pointが正ならpointを、0以下なら0を採用し、
table1.groupに対応するsub1を加算

<MySQL>
select * FROM
(
 select table1.id,if(table1.point>0,table1.point,0)+sub1.t3bonus
 from table1,
 (
  select table2.group as t2group,table3.bonus as t3bonus
  from table2,table3
  where table2.rank = table3.rank
 ) as sub1
 where table1.group=sub1.t2group
) as sub2;

<result>
1 | 15
2 | 5
3 | 2

一応これで動いたのですが、コスト面などから根本的に改善すべき点などはないでしょうか?
613NAME IS NULL:2006/07/27(木) 15:09:43 ID:???
>>612
MySQL使いじゃないし、実データの量とか分布がどのようになっているかわからんので、
判断しようがないが、SQLを単純にしてオプチマイザ任せにした方がいいことない?

SELECT id,IF(table1.point>0,table1.point,0) + table3.bonus
FROM table1,table2,table3
WHERE table1.group=table2.group AND table2.rank=table3.rank;
614612:2006/07/27(木) 17:07:51 ID:???
>>613
なるほど、シンプルの方が自分自身も分かりやすいですね。
オプチマイザについても調べてみます。
ありがとうございます。
615610:2006/07/28(金) 00:29:16 ID:???
>>611
SQLで実現しようとすると結構無理しないとならないんですね。。なるほど、よく分かりました。
ありがとうございましたー!
616NAME IS NULL:2006/07/28(金) 16:08:56 ID:???
UPDATE database
SET ShippedDate = 'aaa'
WHERE @ShipptedDate IS NULL;

このSQL文の@にはどんな意味があるのでしょうか?
617NAME IS NULL:2006/07/28(金) 23:46:18 ID:???
変数じゃないの?
618NAME IS NULL:2006/07/29(土) 05:16:25 ID:???
超初歩の質問ですが宜しくお願いします。
さくらインターネットでサーバをレンタルし
PHPmyAdminで***というDBとtesttableというテーブルを
作成しました。
書籍に添ってユーザーを作ろうと下記コードを実行したのですが
上手くいきません。 ご助言をお願いします。


grant select, insert, update, delete on ****.testtable
to testuser@localhost
identified by '1234';

619NAME IS NULL:2006/07/29(土) 12:43:47 ID:qyKlRwZf
株価情報を統計処理するSQLを書いているのですが
「特定の日付の株価が、過去の株価の平均を超えているコードを抜き出す」
という文をどう書いていいのか分かりません。MySQL使ってます。

テーブルの構造は

+--------+------------+------+
| コード | 日付 | 株価 |
+--------+------------+------+
| 0000 | 2006-07-28 | 120 |
| 0000 | 2006-07-27 | 100 |
| 0000 | 2006-07-26 | 100 |
| 0000 | 2006-07-25 | 115 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| 0001 | 2006-07-28 | 101 |
| 0001 | 2006-07-27 | 105 |
| 0001 | 2006-07-26 | 150 |
| 0001 | 2006-07-25 | 160 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| 0005 | 2006-07-28 | 107 |
| 0005 | 2006-07-27 | 125 |
| 0005 | 2006-07-26 | 110 |
| 0005 | 2006-07-25 | 110 |

のようになっています。

たとえば
 select コード, avg(株価) from 株価テーブル group by コード
とすれば、コードごとの平均が出ます。また
 select コード, 株価 from 株価テーブル where 日付='2006-07-28' group by コード
とすれば、7/28のコードごとの株価が出ます。しかし、これらを比較する方法が分かりません。
比較対象が固定値であれば
 select コード, avg(株価) from 株価テーブル group by コード having avg(株価) > 20000
などのように出来るのですが…。

どなたかご教授していただけると幸いです。
620619:2006/07/29(土) 12:49:14 ID:???
自己レス

>過去の株価の平均
特定の日付以前とかやると複雑そうなので、そのコードの「株価全ての平均」とさえ比較できればokです。
621NAME IS NULL:2006/07/29(土) 13:09:48 ID:???
>>619
SELECT * FROM 株価テーベル AS T1
WHERE 株価 > (SELECT avg(株価) FROM 株価テーブル WHERE コード=T1.コード AND 日付<T1.日付);

>>620
上のSQLから
AND 日付<T1.日付
を取れば桶。
622621:2006/07/29(土) 13:10:56 ID:???
株価テーベルってなんだ...orz
623619:2006/07/29(土) 13:39:33 ID:???
>>621

ご回答どうもありがとうございます。
が、何回試しても上記のSQL文を投げると、CPU使い切ってマシンがフリーズします orz

620の発言で
「特定の日付の株価が、過去の株価の平均を超えているコードを抜き出す」

「特定の日付の株価が、そのコードの株価の平均を超えているコードを抜き出す」
としたつもりなのですが、上記のSQL文だと、この「特定の日付」をどこで指定すれば良いのでしょうか。
624621:2006/07/29(土) 14:14:51 ID:???
>>623
あーそういうことね。取り違えた。

SELECT コード FROM 株価テーブル AS T1 WHERE 日付 = '2006-07-28'
AND 株価 > (SELECT avg(株価) FROM 株価テーブル WHERE コード=T1.コード AND 日付<'2006-07-28')

かな。日付を限定している為>>621よりは負荷が少ないと思うが、相関サブクエリなんで
ループしていることには代わりがない。
625621:2006/07/29(土) 14:18:54 ID:???
あぁ、サブクエリはそのままでも良かったか。その方が書き換えるところが少ないし。

SELECT コード FROM 株価テーブル AS T1 WHERE 日付 = '2006-07-28'
AND 株価 > (SELECT avg(株価) FROM 株価テーブル WHERE コード=T1.コード AND 日付<T1.日付);

書き忘れていたが、'2006-07-28'が「特定の日付」な。
626619:2006/07/29(土) 17:12:35 ID:???
>>621
やはり5分立ってもCPU使い切ったままですね。30万レコードは難しいんですかね。

一応あのあと自分なりに考えた
select a.code from (select code, round(avg(price)) as _avg from stock group by code) a left outer join (select code, price as _price from stock where date='2006-07-28' group by code) b on a.code = b.code where _price > _avg
という汚いSQLで0.7秒ほどで処理できました。まだ速く出来そうですが、とりあえず出来るので良しとしようかなと。

お世話になりました。
627NAME IS NULL:2006/07/29(土) 18:27:47 ID:???
Microsoft SQL Server 2005 Express Edition with Advanced Services
と言うのをインストールしたんですけど、これ
簡単にExcelデータのインポートって出来ないのですか?
628NAME IS NULL:2006/07/29(土) 20:23:31 ID:???
>>626
MySQLは使ったことないけど、

select code, price as _price from stock where date='2006-07-28' group by code

は意味的に変。(RDBMSによってはエラー)
テーブルの主キー/一意制約については書いていなかったけど、
もし(code, dete)で一意になるなら、group byは不要。
629619:2006/07/29(土) 22:04:36 ID:???
>>628

ご指摘ありがとうございます。
テーブルには主キーや一意制約はつけていませんでしたが、おっしゃるように (code,date) で一意になります。
group by をはずしましたところ、わずかに速くなりました。

難しいですね。頭がこんがらかります。
630619:2006/07/29(土) 22:06:54 ID:???
手続き型言語と勝手が違うのに戸惑いますが、SQLも味があって楽しいですね。
631NAME IS NULL:2006/07/30(日) 20:23:26 ID:UiZ0TjBd
VARCHAR2で定義してある項目に、
文字列の '0A' を HEXの '3041' ではなくて '0A' で登録したいときってどう書くの?
(オラクル10g)
632NAME IS NULL:2006/07/30(日) 21:38:50 ID:???
>>631
なにを言いたいのかよくわからないけど、
無理やり翻訳すると「改行コードを入れたい」ってこと?
633631:2006/07/31(月) 00:37:40 ID:62b3ohlt
改行だけでなく、英数字漢字も全部文字コード入力されて
文字列としてSQLへ渡されてきますので
そのまま文字コードとして登録したいのですが
634NAME IS NULL:2006/07/31(月) 01:05:09 ID:???
ああ、16進数の文字列が送られてくるから、それを文字コードとして文字に変換したいってことね
で、質問の答えはわかりませんw(おい
635NAME IS NULL:2006/07/31(月) 11:53:50 ID:???
>>633
一般的なSQLじゃなくて、関数で実現する。
細かい要求がよくわからんので答えは書かないが
to_char()、ascii()、convert()、chr() あたりを組み合わせてみれば
636NAME IS NULL:2006/07/31(月) 11:55:02 ID:???
あと、to_number() もかな
637NAME IS NULL:2006/07/31(月) 23:48:46 ID:???
組み合わせても無理だろ
638NAME IS NULL:2006/08/01(火) 18:04:51 ID:???
CREATE OR REPLACE FUNCTION code2vchar(code IN varchar2)
RETURN VARCHAR2
IS
  i NUMBER;
  OUT_STR VARCHAR2(512);
  HEX_TBL VARCHAR2(16) := '0123456789ABCDEF';  -- 16進文字変換TBL
  CODE_LEN NUMBER := trunc(length(CODE)/2);    -- 入力コード文字列長/2
BEGIN
  -- ぐるぐる
  FOR i IN 1..CODE_LEN LOOP
    OUT_STR := OUT_STR ||
      CHR((INSTR(HEX_TBL,UPPER(SUBSTR(CODE,i*2-1,1)))-1) * 16
        +(INSTR(HEX_TBL,UPPER(SUBSTR(CODE,i*2 ,1)))-1));
  END LOOP;

RETURN OUT_STR;

END;
/

Function created

SQL> select code2vchar('6162636465666768696a6B6C6d0a6E6F707172737475767778797a') from dual;

CODE2VCHAR('616263646566676869
--------------------------------------------------------------------------------
abcdefghijklm
nopqrstuvwxyz

SQL>

テスト?エラー処理?それっておいしい?
639NAME IS NULL:2006/08/01(火) 18:14:35 ID:???
あ,2Byte文字も('A`)シラネ
640NAME IS NULL:2006/08/01(火) 19:24:44 ID:???
CREATE OR REPLACE FUNCTION code2vchar(CODE IN VARCHAR2)
RETURN VARCHAR2
IS
  i NUMBER := 1;
  OUT_STR VARCHAR2(512);
  CNV_BUF VARCHAR2(4);
  HEX_TBL VARCHAR2(16) := '0123456789ABCDEF';  -- 16進文字変換TBL
  CODE_LEN NUMBER := TRUNC(LENGTH(CODE)/2);   -- 入力コード文字列長/2
BEGIN
  -- ぐるぐる
  WHILE i <= CODE_LEN LOOP
    CNV_BUF := SUBSTR(CODE,i*2-1,4);
    IF (('81'<=CNV_BUF AND CNV_BUF<='9F' AND LENGTH(CNV_BUF)=4 )) OR
     (('E0'<=CNV_BUF AND CNV_BUF<='FC' AND LENGTH(CNV_BUF)=4 )) THEN
      OUT_STR := OUT_STR || CHR((INSTR(HEX_TBL,UPPER(SUBSTR(CNV_BUF,1,1)))-1) * POWER(16,3)
                   +(INSTR(HEX_TBL,UPPER(SUBSTR(CNV_BUF,2,1)))-1) * POWER(16,2)
                   +(INSTR(HEX_TBL,UPPER(SUBSTR(CNV_BUF,3,1)))-1) * 16
                   +(INSTR(HEX_TBL,UPPER(SUBSTR(CNV_BUF,4,1)))-1));
      i := i + 2;
    ELSE
      OUT_STR := OUT_STR || CHR((INSTR(HEX_TBL,UPPER(SUBSTR(CNV_BUF,1,1)))-1) * 16
                   +(INSTR(HEX_TBL,UPPER(SUBSTR(CNV_BUF,2,1)))-1));
      i := i + 1;
    END IF;
  END LOOP;
RETURN OUT_STR;

END;
/

ちょ、ちょっと気になっただけなんだからね!
あんたのためにやったんじゃないんだから!
勘違いしないでよね!絶対バグってるんだから!

select code2vchar('82CA2082E90a0a0a82DB') from dual;
641NAME IS NULL:2006/08/01(火) 21:53:10 ID:???
フロントで変換して渡せよw
642NAME IS NULL:2006/08/01(火) 23:43:31 ID:???
MySQL4.0.26 を使用しています。

ID, GroupID, テキスト
--------------------
1, A, text1
2, B, text2
3, A, text3
4, A, text4
5, B, text5
6, B, text6
7, B, text7
1, A, text8

このようなテーブルを作成しています。
これを、次のように取得したいと考えています。

GroupID, 繋がれたテキスト
--------------------
A, text1text3text4text8
B, text2text5text6text7

このようにGroupIDごとに、テキストが繋がった状態にすることは
可能でしょうか?

GROUP_CONCATが使えるかと思ったのですが、4.1以降のようです。
よろしくお願いいたします。
643NAME IS NULL:2006/08/02(水) 00:50:00 ID:p6iinng0
>>635
hextoraw/rawtohexじゃだめ?
644NAME IS NULL:2006/08/03(木) 22:13:08 ID:bA92EII+
>>642

1グループの項目数は必ず4つ固定なの?
それなら思いつく方法もあるけど、項目数が可変だとちょっと難しそう。
645NAME IS NULL:2006/08/04(金) 02:03:31 ID:???
Oracle 8iですが
今ある範囲にあるフラグを調べ、それを判定するプログラムを
作りたいのですが、
cursor cu is select name from hogejoge where a_time between A and B group by name;
loop
fetch cu into a_name;
exit when cu%notfound;

これでとってきたnamaを動的に
Select flag1, flag2 from hogehoge where name = ''||a_name||'' a_time between A and B;
ということをやって、flagをとり判定しているのですがnameで帰ってくるのが多いと時間が
非常にかかってしまっております。現在最初のSelect句で50万程度、次のSelect句で
12列以下が帰ってくることはわかってるのですがなにかうまい方法はないでしょうか?
646NAME IS NULL:2006/08/04(金) 04:05:33 ID:???
>>645
「判定する」の意味やhogejogeとhogehogeの関係がわからないのでそこには触れないけど、
hogejogeのa_timeに索引が付いてないという話じゃないの?
647NAME IS NULL:2006/08/04(金) 04:39:26 ID:???
mysql5.0でvarchar binaryで設定したカラムに対して大文字、小文字を区別せず
検索するにはどうしたら良いのでしょうか。
648619:2006/08/04(金) 11:12:26 ID:???
>>647

select * from テーブル where cast(列 as char) like '%検索文字列%'
649NAME IS NULL:2006/08/04(金) 11:45:48 ID:???
同一の定義がされてるテーブルが10個あります。
全てのテーブルからデータを引き出したい場合、どうSQLを書くのが効率的でしょうか?
SELECT * FROM `table1`と `table2`と`table3`と.....`table10` WHERE `id` LIKE 'test%';
みたいな感じの流れなんです

UNIONだと遅いので、。。(LIKE 'test%'が遅いとかではないです。)
650NAME IS NULL:2006/08/04(金) 12:56:14 ID:???
やりたいと言ってることを実現するにはユニオンオールしかないと思うが…

てか、書いてるクエリーとやりたい事が違うやん。
651NAME IS NULL:2006/08/04(金) 12:58:41 ID:rRh5kdDw
UNIONだと遅いの根拠が不明だが。
652NAME IS NULL:2006/08/04(金) 13:01:16 ID:???
>>644

>>642 の例は、適当に書いたので、そこまでは気が回りませんでした。
項目数は可変というのがよく分かりませんでしたが、たぶん可変です。

GroupIDを主キーとしたTableは、約2万行です。
これに対して、例で示したTableの行数は、約1万行です。

あれから色々試して、結局該当する行を全て取得するSQLを書き、PHP側でくっつける
ということでやりたいことはできました。(重くなると覚悟してたけど、思った以上に速かった)

ということで、やりたいことはできたのですが、MySQL側でできるならコードを書き直したい
と思ってますので、何か案があれば教えて頂きたいと思います。
653649:2006/08/04(金) 16:37:15 ID:???
えっと、全てのテーブルを検索対象にしたい、ということです。
654NAME IS NULL:2006/08/04(金) 17:23:53 ID:???
SELECT * FROM TABLE1 WHERE 条件
UNION ALL
SELECT * FROM TABLE2 WHERE 条件
UNION ALL
   :

と先に絞りこんでからUNION ALLすればいいんでない?

主キーの重複がないor重複がOKならUNION ALLが速いよ。
655649:2006/08/04(金) 18:39:46 ID:???
>>654
ありがとうございます。
WHERE句の訂正には全ての部分を変えなきゃいけなくなりますね。。

WHERE句を一つだけで、っていう方法はあるのでしょうか?
656NAME IS NULL:2006/08/04(金) 18:49:17 ID:???
>>655
SELECT * FROM 
 (SELECT * FROM TABLE1 UNION ALL SELECT * FROM TABLE2 UNION ALL ..) x
  WHERE 条件
まともな処理系なら>>654と同じプランで動くと思うのだが、要プラン確認。
サブクエリで中間表を作ってるようならあきらめよう。
657NAME IS NULL:2006/08/04(金) 19:19:55 ID:???
どんなDBつかってるか知らんが、
union くらいオプティマイザが最適化してくれるぞ。
普通に結合しろ。

否定しているが、like 'test%' が遅としか思えないんだが。
658649:2006/08/04(金) 19:32:07 ID:???
>>656
なるほど、、わかりました。
ありがとうございます。
>>657
like 'test%'はWHERE句のサンプルとして使わせていただきました。

UNIONとサブクエリについてもう少し調べてみます。ありがとうございました。
659644:2006/08/04(金) 21:15:56 ID:fELsxDtD
>>652

では参考までに項目数4つ固定の場合を書いとくよ。
最近雑誌の記事で覚えた自己結合だ。
可変の場合は・・・なんとかならんかな。

SELECT S1.group_id, S2.text || ',' || S3.text || ',' || S1.text || ',' || S4.text
FROM Students AS S1, Students AS S2, Students AS S3, Students AS S4
WHERE S1.group_id=S2.group_id
And S1.group_id=S3.group_id
And S1.group_id=S4.group_id
And S1.text>S2.text
And S1.text>S3.text
And S1.text>S4.text
And S2.text>S3.text
And S2.text>S4.text
And S3.text>S4.text;
660644:2006/08/04(金) 21:17:41 ID:???
テーブル名はテストで作ったやつなので、適当に書き換えて。
661647:2006/08/05(土) 00:34:18 ID:???
>>648さんありがとうございました。
カンピューターでasciiにキャストとかやってました。
662NAME IS NULL:2006/08/05(土) 21:17:52 ID:???
MySQL4.0でOracleのrank()関数のような集計関数のようなことをしたいのですが、全く思い浮かびません。
アプリケーション側で処理するしかないのでしょうか。。?
663NAME IS NULL:2006/08/05(土) 21:24:33 ID:???
>>662

4.0ということは、サブクエリなしだよね。
それだと厳しいな。。
664NAME IS NULL:2006/08/06(日) 00:29:22 ID:???
MySQLで1万件くらいデータ扱おうと思ってるんですけど大丈夫でしょうか?
もし大丈夫でしたら、目安として何件くらいまで大丈夫でしょうか?
665NAME IS NULL:2006/08/06(日) 00:32:22 ID:???
10001件
666NAME IS NULL:2006/08/06(日) 14:48:15 ID:???
>>664
「大丈夫」を定義してください。
667619:2006/08/06(日) 20:14:12 ID:???
>>664

>>666さんのおっしゃるように、なにをもって「大丈夫」するかが分かりませんが…。
私に関して言えば30万レコードでも「大丈夫」です。
668NAME IS NULL:2006/08/08(火) 00:27:19 ID:???
何故ここで100人という定番ボケが出ないッ!?
669619:2006/08/08(火) 02:27:09 ID:???
>> 664

100人までは大丈夫です。
670NAME IS NULL:2006/08/08(火) 09:42:01 ID:???
671NAME IS NULL:2006/08/08(火) 17:08:09 ID:???
じゃあ、イナバの「大丈夫」はどういう意味だ?
100人乗っても全壊はしないが、多少屋根がヘコむ、とかあるかも。
672NAME IS NULL:2006/08/08(火) 19:08:53 ID:???
物置として使うには何の支障も無い、かな
673619:2006/08/08(火) 23:40:50 ID:???
社長が「大丈夫」と言えば大丈夫です。
674NAME IS NULL:2006/08/10(木) 22:10:11 ID:???
MySQL 4.1.12
Datacode,wrkDate、、、、、、といったテーブル hage があり、Datacode,wrkDateの2つを主キーとしています。
この中から、あるDatacodeについて最新のレコードから100件前のレコードを引っ張ってきたいんですけど、
どうsqlを書けばいいのか教えてください。 毎日入ってくるとは限らないので単純に100日前の…とすることが
できないんです。 ちなみにその件数が100件以上あることは確認しています。
675NAME IS NULL:2006/08/10(木) 23:44:20 ID:???
>>674

wrkDateの昇順でレコードに連番割り当てて、その連番が「100」のレコードを選択する、という内容でいいのかな?
それなら可能だと思うが。
676NAME IS NULL:2006/08/11(金) 00:09:45 ID:???
>>675
レスどうもです。すいません、?です。その例だと、100に当たるのが最新の日付のレコードだという事になると
思うんですが、、はて?です。
677NAME IS NULL:2006/08/11(金) 11:21:20 ID:???
最新は1もしくは0だろ
678675:2006/08/11(金) 16:04:56 ID:???
ああ悪い。「降順」じゃないと最新日付が先頭に来ないな。

「降順に並べて100番目のレコード」でいいか?
よければ次サンプルのせるよ。
679NAME IS NULL:2006/08/11(金) 17:33:50 ID:2h6D2tc6
オフセット指定のROWと、
オフセット指定しない場合のトータルのROWの数を
セットで取る方法ってありますか?

よくある、「全検索結果〜件中の〜件を表示しています」
みたいな処理なんですが。
いまは、よくわからないので、

select hoge_id from hoge; → 全部獲って、行数をカウント
select hoge_id from hoge offset = 100; → 表示用に欲しい限定行

みたいな感じでやってるんですが、おそらく間違ってるんだろうなあと思いつつ
やり方も調べ方もわからず強引に上記の方法でやってまつ。
680674:2006/08/11(金) 19:59:20 ID:???
>>678
ぜひお願いします。m(__)m
681675:2006/08/11(金) 22:57:43 ID:???
>>674

これでどうかな。俺も自己結合でやってみた。

SELECT *
FROM(SELECT H1.wrkDate,
         (SELECT COUNT(H2.wrkDate)
          FROM hage H2
          WHERE H2.wrkDate < H1.wrkDate
           AND Datacode = 適当な値) +1 AS seq
     FROM hage H1
     WHERE Datacode = 適当な値)
WHERE seq = 100;
682675:2006/08/11(金) 22:59:24 ID:???
しまった。不等号逆だ。

×:「WHERE H2.wrkDate < H1.wrkDate」
○:「WHERE H2.wrkDate > H1.wrkDate」
683NAME IS NULL:2006/08/12(土) 01:07:08 ID:???
これじゃ駄目なの?
select * from hage where Datacode = 適当な値 order by wrkDate desc limit 100,1;
684NAME IS NULL:2006/08/12(土) 11:29:16 ID:49/4QN7u
id | data
--------
01|Apple
02|banana
03|Apple
04|Apple
05|banana
06|orange

こういうテーブルの中から、重複が3つ以上(上の例だとApple)のDataだけ抽出したいのですが、
これはどうしたらよいのでしょうか?
685NAME IS NULL:2006/08/12(土) 11:48:40 ID:???
>>684
HAVING でいいかな?

SELECT data FROM table GROUP BY data HAVING count(data) >= 3;
とか
686NAME IS NULL:2006/08/12(土) 12:11:24 ID:49/4QN7u
>>685
ありがとうございます
id | data | data2
--------------
01|Apple |あ
02|banana |あ
03|Apple |い
04|Apple |う
05|banana |あ
06|orange |い

すいません。。実際は、上のテーブルでdata2の項目が重複しているものを抽出したかったのですが、
(重複二つ以上という条件であれば、data2が「あ」が二つあるので、bananaが該当し、抽出したい)、
せっかく教えていただいたのですが、応用できません><;
最初からこう聞けばよかったです。
687NAME IS NULL:2006/08/12(土) 12:17:24 ID:49/4QN7u
id | data | data2
--------------
01|Apple |あ
02|banana |あ
03|Apple |い
04|Apple |う
05|banana |あ
06|orange |い

度々すいません。。質問間違えていました。
やりたい事は
上のテーブルでdata2の項目が重複していればまとめて一つとし(distinct?Group by?)、
data列の数を算出し、(Apple:3、banana:1、orange:1)
そのうえで、3つ以上のカウントがあるdata(上の例ではApple)を抽出したいのでした。。汗

688NAME IS NULL:2006/08/12(土) 13:58:38 ID:???
>>687
select data from (select discinct data,data2 from table ) group by data having count(data) >= 3;
689NAME IS NULL:2006/08/12(土) 14:00:58 ID:???
まちがえた
× discinct
〇 distinct
690NAME IS NULL:2006/08/12(土) 16:39:16 ID:49/4QN7u
>>688
Every derived table must have its own alias
というエラーが出ます。><;
691NAME IS NULL:2006/08/12(土) 16:49:29 ID:???
>>690

) と group の間に、 AS foo 入れてみたらどうよ?

・・・ table ) AS foo GROUP BY ・・・
692NAME IS NULL:2006/08/12(土) 17:14:32 ID:49/4QN7u
>>691
できました!
ありがとうございます
これって自己結合とはまた違うんですよね?
教えていただいた事を参考に勉強します
693NAME IS NULL:2006/08/12(土) 18:49:36 ID:???
該当スレが見つからなかったのでこちらで質問させてください。
他に適当なスレがありましたら誘導お願いします。

小規模なショップの通販サイト制作をしているんですが
商品や顧客等のIDが必要なら適当につけてくれといわれました。
(個人経営でもともとそういう管理をしていないのです。)
このとき、管理上わかりやすいマイルールでつけちゃっていいのか、
それとも一般的なルールや、推奨されている規則などはあるものでしょうか。
また参考になるようなサイトなどありましたらおしえてくださいm(_ _)m
694NAME IS NULL:2006/08/12(土) 18:51:32 ID:???
>692
>688の方法は自己結合ではなくインラインビューというです。
'インラインビュー'とか'副問い合わせ'でググってみたらそれなりにわかるとおも。
695693:2006/08/12(土) 18:54:59 ID:???
すいません、↓に移動します
DB板自治・質問・雑談スレ
ttp://pc8.2ch.net/test/read.cgi/db/1056957157/
696NAME IS NULL:2006/08/14(月) 04:13:43 ID:???
MySQLを使用しています。

auto_increment で 1,2,3....
のように自動的に値を増やしていくことができますが、
abc0001,abc0002,abc0003....
のように増加させることは可能でしょうか?

可能な場合方法をご教授くださいませ。
697NAME IS NULL:2006/08/14(月) 09:28:03 ID:???
小分類コード(int P_Key)
年月日(Date)
他属性(Text)

のテーブルで
小分類コード毎で、年月日が最新のタプルを取り出すSQLはどうなりますか?

SELECT b.*
FROM (
SELECT 小分類コード, MAX(年月日) AS mdate
FROM テーブル
GROUP BY 小分類コード
) a, テーブル b
WHERE a.小分類コード = b.小分類コード
AND b.年月日 = a.mdate
ORDER BY 小分類コード

こんなのを考えましたけど
698NAME IS NULL:2006/08/14(月) 09:54:29 ID:???
>>696
No用テーブルを作成、内容は
フィールド1:abc  
フィールド2:1    

新しいNoを発行するたびに、フィールド2にauto_incrementで更新し
目的のフィールドにフィールド1 & フィールド2 を格納すればOK
699674:2006/08/14(月) 20:39:38 ID:???
>>681
遅くなってすいません。う〜ん、どうしても

Every derived table must have its own alias

というエラーが出ます。><

>>683さんのやり方だとMysql限定だけど出来るんですけどね。

700NAME IS NULL:2006/08/14(月) 21:44:52 ID:iI6Ye70+
質問です。
オラクルの勉強がしたいのですが、
オラクルってフリーで使えるソフトはないのですか?
あと、買わなくては使えないとしたら、学割とかはないのでしょうか?
いくらくらいしますか?
701NAME IS NULL:2006/08/14(月) 21:53:19 ID:???
702NAME IS NULL:2006/08/14(月) 22:00:44 ID:w+MP73iN
>>699

ビューにエイリアスがついてないってエラーだから、FROM句のインライン・ビューに適当な別名つけてみたら?
703NAME IS NULL:2006/08/15(火) 11:36:28 ID:???
>>699
Every derived table must have its own alias
これを和訳してみろよ。どうすればいいか一発でわかるぞ
704NAME IS NULL:2006/08/15(火) 21:21:10 ID:NzFzJZ4F
すみませんお聞きしたいのですが、例えば
日付 売上のデータがあり、各日付に対して前5日の平均を出したいのですが、
可能でしょうか

日付 売上 平均
2006/08/01 1
2006/08/02 2
2006/08/03 3
2006/08/04 4
2006/08/05 5
2006/08/06 6 5 ←15/5
といった感じです、dbはaccessです。
よろしくご教授おねがいします。
705NAME IS NULL:2006/08/15(火) 21:27:20 ID:NzFzJZ4F
度々すみません間違えました・・・・
日付 売上 平均
2006/08/01 1
2006/08/02 2
2006/08/03 3
2006/08/04 4
2006/08/05 5
2006/08/06 6 3 ←15/5 よろしくおねがいします。
706NAME IS NULL:2006/08/15(火) 21:34:00 ID:FqADhABU
in演算子を使ったSQLで、inに指定した値の順序で結果を取得したいのですが、
何かいい方法はないでしょうか? 対象データベースはOracle 9iです。

select * from products where id in (15, 18, 4, 7, 24);
このようなSQLだと、実際に返ってくる結果の順序は分からないのですが、
この結果をproduct idが15, 18, 4, 7, 24の順で取り出したいということです。
よろしくお願いいたします。
707NAME IS NULL:2006/08/16(水) 00:06:32 ID:t8b87dJx
>>704

日付に歯抜けはないと考えていいの?
歯抜けがないことが保証されているなら、スカラ・サブクエリでいける(Accessってスカラ・サブクエリが出来ればだけど)。

1日の次が3日だったりして歯抜けがあると難しそう。
708NAME IS NULL:2006/08/16(水) 00:18:02 ID:???
>>704
SELECT *,
(SELECT avg(売上) FROM Table WHERE 日付 BETWEEN T1.日付 - INTERVAL'5 day' AND t1.日付 - INTERVAL'1 day')AS 平均
FROM Table AS T1;
前5日間のデータがなくても平均を出してしまう、
出さないようにすることもできるだろうけど、
休日など売上がない場合の取り扱いとかあるし...

>>706
SELECT *,CASE id
WHEN 15 THEN 1
WHEN 18 THEN 2
WHEN 4 THEN 3
WHEN 7 THEN 4
WHEN 24 THEN 5
END AS c1
FROM products WHERE id IN(15,18,4,7,24) ORDER BY c1;
いい方法じゃなくてチョット面倒だな。
709708:2006/08/16(水) 00:20:38 ID:???
あー、Accessだったんか、>>708が動くかどうか知らん。
710NAME IS NULL:2006/08/16(水) 00:50:00 ID:BAkG8Mau
データベースを自分で作って勉強がしたいのですが、
どんなソフトを使うといいですか?
やはりオラクルでしょうか?それともマイSQLでしょうか?
711NAME IS NULL:2006/08/16(水) 01:04:46 ID:???
>>710
大金投資していいならオラクル、無料でやりたいならMySQL
712NAME IS NULL:2006/08/16(水) 01:36:35 ID:???
>>711
何のために勉強するかの方が大事だろ。
それにオラクルだってただで手にはいるし。
713NAME IS NULL:2006/08/16(水) 07:21:14 ID:???
「データベースを勉強する」のが目的なら MySQL やら PostgreSQL でいいんじゃね?
Access でもいいかもしれんね。

「Oracle を勉強する」のが目的なら話は変わるけど。
714NAME IS NULL:2006/08/16(水) 09:53:03 ID:???
勉強して仕事に役立てたいとか言うよこしまな奴ならオラクル
真にデータベースのことを勉強したいというピュアなハートの持ち主(死後)ならオープンソースだな。
715NAME IS NULL:2006/08/16(水) 17:04:22 ID:???
MySQL5.1で全文検索機能を利用しようかと考え
phpMyAdmin経由で、該当フィールドの「全文」フルテキストキーで操作しようと試みてみたのですが
ボタンアイコンが白色になって、押せない状況です

いろいろ調べてみたのですが解はみつかりませんでした
プライマリーキー、インデックスボタンは問題なく押せます

原因をご存知の方、お願いいたします
716NAME IS NULL:2006/08/16(水) 18:37:12 ID:bgyWbXAC
>>715
このスレの範疇じゃないよ、DBMS別のスレへどうぞ。誘導できないけど。
717715:2006/08/16(水) 21:58:13 ID:???
そうなのですか・・・・
JaneDoeStyleで見る限り、DBMS系はこの板しかなさそうですが
どこで質問しればいいのでしょうか、途方に暮れるばかりなり
718NAME IS NULL:2006/08/16(水) 22:09:34 ID:???
この板にもMySQLのスレはいくつかあるのだが。
719704:2006/08/16(水) 22:21:03 ID:aSzkfV70
>>708
サンクス!すごスキルっすね
そうなんですよ、休日とかも考えなくちゃいけなくて、それは次のステップと
考えてました。
そのままaccessじゃ動かないすけど、十分ヒントになります。
自作関数とか組み込んで考えてみます。
引き続き解る人、レスまってます。(_ _)
720NAME IS NULL:2006/08/16(水) 22:57:19 ID:acRKAobC
簡単にお金稼ぎ!!!

以下の手順でやれば、無料でお金稼ぎができます。
企業も広告の宣伝になるから、お金をくれるわけです。
最初の1日目で 2000 円〜3000 円 は確実に稼げます。
実際の作業は数十分程度、1時間はかかりません。

@ http://www.gendama.jp/invitation.php?frid=469323
    ↑このアドレスからサイトに行く。
Aそこのサイトで無料会員登録(応募)します。
 (その時点で 500 ポイントが貰えます。)
 ※事前に新規でヤフーなどのフリーメールアドレス
 を取っておくといいですね。
Bポイントを稼ぎます。
 懸賞の応募や無料会員登録をすればするほど、
 ポイントが貰えます。
 他にも沢山種類があるので、1日目で
 約 20000 ポイントは GET できます。
C 3000 ポイントから、現金や WEB マネーに交換できます。
Dトップの右上に「交換」という所がありますので、
 そこから交換をしましょう。
 その月に初めてポイントバンクにポイントを移行した時、
 さらに別途として 1000 ポイント貰えます。

これで現金や WEB マネーを稼ぐといいですよ!!!
721NAME IS NULL:2006/08/17(木) 16:29:57 ID:???
>>717
ここはSQLのスレであって、MySQLのスレじゃないんだよ。
722NAME IS NULL:2006/08/17(木) 18:12:46 ID:???
SQLで、あるカラムの値がが全レコードの同カラムの中で
何番目の大きさかを出したいのですが、そういう命令ってあるんでしょうか?
一旦全部表示させないとダメですか?
723NAME IS NULL:2006/08/17(木) 18:17:19 ID:???
>>722
それ以下の数をカウントするんじゃダメか?
ちょっと条件があいまいなんで、こんなもんで
724NAME IS NULL:2006/08/17(木) 20:32:18 ID:???
>>722

要はランキング出したいんでしょ。
OracleとかならRANK関数がある。
なくてもできるけど。
725NAME IS NULL:2006/08/18(金) 02:33:08 ID:XpaUcx/2
質問です。
SQL2000を使用し色々と勉強をしているのですがアタッチやデタッチ等を使って
自作のアプリケーションにデータベースを持たせる等、色々と試していくなかで
データベース名が""のデータベースが出来上がってしまいました。
そのデータベースを削除や名前の変更をしようにもデータベース名が""のデータベースが
あるために削除することは出来ないというエラーがでます。
どなたか同じ状態になった方はいないでしょうか?
ぐぐってもなんの情報もなく途方にくれています。
""のデータベースに名前を再度付ける方法や削除する方法をご存知の方が
おられたら知恵を貸してください…
""データベースが出来てからテ当該SQL内でばタッチアタッチや削除、
データベースの新規作成やテーブルの追加も出来ないのでバックアップを取ることも
出来ないので再インストールだけは避けたいです。
726NAME IS NULL:2006/08/18(金) 03:00:19 ID:???
>>725
いろいろ見当違いな操作をしたのだろう。ここのスレで聞くのも見当違いだから誘導しておく。
つMicrosoft SQL Server 総合スレ 4
727uyu:2006/08/18(金) 04:49:27 ID:2u2zhENw
民主党は“全て中国の言う通り”がモットー。
公明党は創価学会とともに日本を朝鮮のものにしようとしてる。
創価学会は日本の大手メディアを間接支配していて、 社民党は朝鮮総連とともに拉致の存在を否定し、被害者の活動を妨害した。
共産党は北朝鮮に関して社民党と同じ。それに加えて反自衛隊・反米である。
朝鮮総連と民潭は日本を解体して朝鮮にしようと参政権を狙っているし、
統一教会は売国政党の社民党を支援している。
☆朝日新聞などは中国と朝鮮の代弁者、つまり日本最大手の売国新聞だし、
日教組は基本理念のレベルから反資本主義・反体制であり、残る自民党にも中国の顔色ばかり窺っている者が潜んでいるのである。
今後は『人権擁護法案』成立を契機に公明党は民主党に鞍替えして連立し、 実質外国人与党が誕生して第二期工作の完結となるのが彼らの筋書きである。 (今、実際にそのように動きつつある)
そうすればあっという間に外国人参政権を成立させて日本の国政は全て
朝鮮人が牛耳り、朝鮮に歯向かう日本人の政治介入する隙間を残さない
新たな制度が完成することだろう。
そしてこれらの売国組織に必ず関与し、彼らの侵略行為の結果において
最も利益を享受する立場にあるのが『在日朝鮮人』である。
http://hisazin-up.dyndns.org/up/src/14540.wmv 在日特権の真相にせまる21.68MiB
728NAME IS NULL:2006/08/18(金) 16:22:02 ID:jMqzW2b4
質問です。
すでにあるテーブルで、
|(購入日時)|(名前)|(購入商品グループ)|
|20060801 |モナー|AAA|
|20060801 |モナー|BBB|
|20060801 |ギコ  |AAA|
|20060801 |しぃ  |BBB|
|20060802 |モナー|AAA|

みたいになっています。(購入商品グループはAAAかBBBの二種類)
このときに

|(購入日時)|(名前)|AAA|BBB|
|20060801 |モナー| ○ | ○ |
|20060801 |ギコ | ○ | × |
|20060801 |しぃ  | × | ○ |
|20060802 |モナー| ○ | × |

のような行を取り出したいのですが、SQLでなんとかできるのでしょうか。
苦肉の策としてデータを取り出した後にプログラム側で変形しているのですが、
これだと最終的な行数が最後までわからないのが難点です。。
729NAME IS NULL:2006/08/18(金) 17:04:29 ID:???
select 購入日時, 名前, nvl(AAA, '×') as AAA , nvl(BBB, '×') as BBB
from (select 購入日時, 名前, '○' as AAA from テーブル where 購入商品グループ = 'AAA')
full outer join (select 購入日時, 名前, '○' as BBB from テーブル where 購入商品グループ = 'BBB')
using (購入日時, 名前)

oracleならこんなかんじだ。
他の場合は、nvlのところをかえる。
サブクエリーと完全外部結合がサポートされてないDBの場合は union つかえ。
730728:2006/08/18(金) 17:18:35 ID:???
>>729
ありがとうございます。
じっくり読み解いてみます。
エンジン書くのを忘れてました。
mysql3.23なのできびしそうですね。
DBの変更も視野に入れて考えてみます。
731SS:2006/08/18(金) 17:23:02 ID:CL1dlijo
oracle pl/sqlで下記のようなイメージのことをやりたい
のですが、やり方がよくわかりません。どなたか教えて
ください。

cursor cWrk(pcd) is
select nm from tbl_a
where cd like %pcd%
;

問題は3行目のlike句でカーソルのパラメータを
使いたいときどうするかという点です。

どうかよろしくお願いします。
732NAME IS NULL:2006/08/18(金) 20:17:44 ID:???
関数に渡さないときの GROUP BY ってどのような結果になるのでしょうか?
733NAME IS NULL:2006/08/18(金) 20:44:22 ID:???
>>732

もう少し詳しく。それじゃ意味不明だ。
734NAME IS NULL:2006/08/18(金) 22:29:49 ID:???
>>731
like '%' | pcd | '%'
pcd が文字列でないなら、to_char などで変換する

735NAME IS NULL:2006/08/18(金) 23:41:52 ID:???
おっと、すまん文字列結合は || だった。

like '%' || pcd || '%'
736NAME IS NULL:2006/08/19(土) 01:18:27 ID:???
>>733
SELECT の中で SUM とか MAX を利用しない場合、という事です。
737NAME IS NULL:2006/08/19(土) 01:45:37 ID:???
>>736
文法エラー
738NAME IS NULL:2006/08/19(土) 08:48:29 ID:???
739NAME IS NULL:2006/08/19(土) 08:58:26 ID:???
>>738
mySQLは通るんだ。確かにこの制約はうざすぎるからオラクルも何とか汁。
740NAME IS NULL:2006/08/20(日) 11:01:54 ID:???
今SQLを触れる環境にいないのでお尋ねします
date型のデータに対して、グループ関数のcountは使えるんでしたっけ?

例 select count( 誕生日 ) from テーブル名

みたいな感じで・・・・
どなたかご教授おねがいします。
741NAME IS NULL:2006/08/20(日) 14:45:47 ID:???
>>740
SUMは知らんがCOUNTはOK。NULLじゃない誕生日のROWを数えてくれる。
742NAME IS NULL:2006/08/20(日) 16:24:59 ID:???
(名前)(出社時間)(退社時間)で、時間はあるときからの経過秒であらわしているとします。
A,100,200
B,250,300
C,220,400
B,310,450

こうしたときに、0〜500の間で誰も働いていない時間帯(例では0〜100、200〜220、450〜500)を探す場合、なにか良い策はないでしょうか?
743NAME IS NULL:2006/08/21(月) 00:34:00 ID:???
>>742
まず。0〜500のレコードを持つテーブルを用意する。
なくてもSQL内でレコードを生成できるのなら不要。

そんでもってNOT EXISTS指定で
上の連番 BETWEEN 出社時間 AND 退社時間
でおk。
744NAME IS NULL:2006/08/21(月) 04:14:53 ID:c/1DvAlc
質問です。MYSQLを使用しています。

UPDATE文を実行する際にUPDATEをかけるテーブルとは別のテーブルを
参照して条件付けをしたいのですが、方法がわかりません。

試しに
update A left join B on A.id = B.id set B.name = 'hoge' where A.type = 1
↑こんな感じのSQLを発行してみたら、条件に該当する行が複数あるはずなのに
常にそのうちの一件しか更新されないのです。

どうかよろしくおねがいします。
745NAME IS NULL:2006/08/21(月) 04:29:10 ID:w6gheO/i
質問です。MYSQL+phpMyAdminを使用しています。
サーバーを借りていて引越しのためデータを
旧サーバーからSQL文でエクスポートしたのですが
150M程あるので新サーバーでインポートしようとすると
phpMyAdminのインポートの制限?が2M程しかないので
インポートできない状況です。

初心者質問とは思いますがどなたか助けてください............orz
746NAME IS NULL:2006/08/21(月) 06:24:30 ID:???
>>745
ツール使えばいいんじゃないですか?(よくわかりませんけど)

ちなみに僕も質問させてください。
テーブルAにcode,name,mailというカラムがあります。
これをnameで並び替えてさらにcodeで並び替えたいのですがどのような構文になるでしょうか?
よろしくお願いします。
747NAME IS NULL:2006/08/21(月) 07:03:21 ID:???
>>746
ORDER BY name,code
748NAME IS NULL:2006/08/21(月) 08:12:45 ID:???
>>747
ありがとうございます。
nameだけ逆に並び替えるにはどうしたらいいでしょうか?
749NAME IS NULL:2006/08/21(月) 09:57:00 ID:???
ORDER BY name desc ,code asc

asc は省略可能
750SS:2006/08/21(月) 10:57:11 ID:tkf6SvHw
>>735

ありがとうございました。ほんとに助かりました。
PL/SQL中のSQL文なのでリテラルと変数を||でつなげると思ってません
でした。精進します。
751745:2006/08/21(月) 18:02:40 ID:RHXo36CW
>>746
例えばどんなツールでしょうか?



旧サーバにSSHでMYSQLにログインして

mysqldump -u root -x --all-databases > dump.sql

で、その後ftpか何かでdump.splを捜し出して旧サーバからDL

新しいサーバで任意の場所に 例えば /home/html/
とかにdump.sqlをUPして
新サーバでSHHでMYSQLにログイン

mysql -u root -p < /home/html/dump.sql

であってますでしょうか?
752745:2006/08/21(月) 18:04:17 ID:???
>新サーバでSHHでMYSQLにログイン

SHHはSSHの間違いです...
753NAME IS NULL:2006/08/21(月) 18:16:50 ID:???
>>751
スレの範疇からずれているので、続きはこっちで頼む。
つ MySQL 総合 Part9
754745:2006/08/21(月) 18:35:07 ID:???
>753
了解です。
755NAME IS NULL:2006/08/21(月) 21:26:28 ID:???
>>744
BをUPDATEしたいんだよな?

update B set B.name = 'hoge' from A.B where A.id = B.id and A.type = 1
756NAME IS NULL:2006/08/21(月) 23:23:19 ID:B9qeOaIo
(id)(data)
1, ABC
1, DEF
2, DEF
2, EFG

のようなテーブルから"ABC"と"DEF"の両方の(data)が存在する(id)を
select distinct id 〜のような感じで、この場合1を結果として得たいのですが、
普通にやるとANDではヒットせず、ORでは1と2両方をヒットしてしまいます。
良い方法がありますでしょうか…。

よろしくおねがいします。
757NAME IS NULL:2006/08/21(月) 23:27:42 ID:wNsZV2I0
ここはバカばっかしだから他所で聞いたほうがいいよ
758NAME IS NULL:2006/08/21(月) 23:31:20 ID:???
SELECT ID FROM
(SELECT ID ID_A FROM x WHERE DATA = 'ABC') A
(SELECT ID ID_B FROM x WHERE DATA = 'DEF') B
WHERE A.ID_A = B.ID_B

手元に試せるのないので、適当書き。

759756:2006/08/22(火) 00:52:54 ID:wh12vBXx
>>758
どうもありがとうございます。
自分でも試行錯誤してみたのですが、INTERSECTというのでいけたかもです…。
760NAME IS NULL:2006/08/22(火) 09:34:36 ID:???
SQL初心者です。
試行錯誤しているのですが、よく分かりません。
アドバイスいただければ嬉しいです。

○テーブル例
テーブル:category
cat_id: カテゴリID(主キー、オートインクリメント)
cat_name: カテゴリ名
cat_description: カテゴリの詳細説明

商品テーブル:goods
goods_id: 商品ID(主キー、オートインクリメント)
goods_catid: カテゴリーID
goods_name: 商品名
goods_description: 商品の詳細説明

○やりたいこと

カテゴリID(cat_id)が分かっているときに、
カテゴリテーブルの情報と、そのカテゴリに所属する商品の個数を
取得したい。
(上記例では、cat_name, cat_description, および商品個数)

どのようなselect文を書けばよいのかよく分かりません・・・

今は、cat_idからカテゴリテーブルの情報を求めるSQLと、商品個数を求めるSQLの
二つのSQLを書いて動いています。
でも、一つのSQLでできそうな気がしています。
どうやればうまくいくかアドバイスいただければ嬉しいです。
761NAME IS NULL:2006/08/22(火) 10:05:27 ID:???
>>760
select cat_id, max(cat_name), max(cat_description), sum(*) as 商品個数
from category left outer join goods on cat_id = goods_catid
group by cat_id having  cat_id

cat_idに対してcat_nameとcat_descriptionは常に一定なのでminかmaxの集約関数を用いることができる。
本当は適当などれかをピックアップする集約関数があればいいのだが標準にはない。
MS-AcessのJETには最初にヒットした一件目を返す関数FIRST()があったりする。
762NAME IS NULL:2006/08/22(火) 10:19:55 ID:???
>>760
>>761とは別の解
SELECT *,(SELECT count(*) FROM goods WHERE goods_catid=T1.cat_id) AS 商品個数
FROM category AS T1 WHERE cat_id=カテゴリーID;

最後のWHERE句を省くとカテゴリーとそれに属する商品個数の一覧が取れる。
763NAME IS NULL:2006/08/22(火) 19:49:32 ID:AmtPwf5f
A列  B列  C列
1   a   2
1   b   1
2   c   1
3   d   1
3   e   2
4   f   2
上のようなテーブルで
A列で同じ値があった時
C列を見て高い値のレコードを表示するにはどうしたらいいでしょうか?
結果はこのようにしたいのですが・・・
A列  B列  C列
1   a   2
2   c   1
3   e   2
4   f   2

764NAME IS NULL:2006/08/22(火) 20:06:12 ID:???
重複とかどうするのかな。
↓で動くと思うけどDBによるかも

SELECT * FROM table WHERE (a,c) IN (SELECT a,max(c) FROM table GROUP BY (a))
765760:2006/08/22(火) 20:31:44 ID:???
>>761

ありがとうございます。
cat_name, cat_descriptionを取得するためにmax関数をかけて、どれかひとつ
抽出するということですよね。
こういう方法があったんですか。

>>762

ありがとうございます。
すごくすっきりです。こういう方法もあったんですね。便利そう。
でも、MySQL4.0系を考えているので、サブクエリが使えないのです。残念。

みなさん、ありがとうございます。勉強になります。
766NAME IS NULL:2006/08/23(水) 01:09:05 ID:???
>>760

単純に

select cat_id, cat_name, cat_description, count(*)
from category C, goods G
where C.cat_id=G.goods_catid
group by cat_id, cat_name, cat_description

じゃだめなん?
767NAME IS NULL:2006/08/24(木) 02:13:52 ID:0aY0kvJv
Accessにてクエリーを作成する機会があり
SQLを直接入力して動かしていたのですが、コメントが入力できないのです。
コメント行は先頭に「--」だと思い込んでおり、
コメントを書きたい場合はどうするんでしょうか
768NAME IS NULL:2006/08/24(木) 03:12:32 ID:???
>>767
思い込みは良くない。ACCESSはそういうもの。
適当な誘導先が見つからないが、ビジネスsoft版あたりか?
769760:2006/08/24(木) 10:24:46 ID:???
>>766

ありがとうございます。
なるほど、そういう方法があったんですね。思いつきませんでした。

参考にさせていただき、下記のSQLで思い通りに動きました。
報告まで。

select C.cat_id, C.cat_name, C.cat_description, count(G.goods_id) as goodsnum
from category C left join goods G on C.cat_id=G.cat_id
where C.cat_id=?
group by C.cat_id, C.cat_name, C.cat_description
770NAME IS NULL:2006/08/25(金) 12:51:44 ID:rgXmdUMm
すみません、こちらのほうが適切かもしれませんのでこちらで質問させてください。
環境はMySQL3.23です。

no uid visit_id year month day timestamp
1 35 1 2006 8 20 1156044334
2 1 31 2006 8 25 1156437877
3 1 33 2006 8 25 1156440499
4 31 1 2006 8 25 1156441495
5 31 32 2006 8 25 1156442959
6 31 1 2006 8 25 1156442961
7 35 33 2006 8 25 1156443005
8 35 1 2006 8 25 1156443007
9 35 1 2006 8 25 1156443342


上記のようなテーブル構成でデータが入っているとき、
「同じ年月日の中で、visit_idで同じ値をまとめて、
 それぞれのtimestampが最も大きいレコードのuid(またはno)」
を、抽出したいと考えています。

たとえば、visit_idが「1」のとき、「no」が「1」と「6」と「9」のレコードを得たいです。

それで
SELECT `no`, `uid`, `year`, `month`, `day`, `timestamp`
FROM テーブル
WHERE `visit_id`='1'
ORDER BY `timestamp` DESC
だと、
「no」が「9,8,6,4,1」のレコードが得られます。
ここまでは想定通りです。


ここで、「uidが重複しているレコードのうち、timestampの値が小さいほう」を除外すれば、
抽出したくないレコード(「no」が「8と4」のレコード)を含まず、
当初の目的である、「no」が「1,6,9」のレコード だけが得られるはずです(…よね?)


そこで、
SELECT `no`, `uid`, `year`, `month`, `day`, `timestamp`
FROM テーブル
WHERE `visit_id`='1'
GROUP BY `uid`
ORDER BY `timestamp` DESC

と、GROUP BY `uid`を加えてみると、得られる結果は「no」が「4と1」のレコードでした。
「no」が「8と4」のレコードを得るのではなく、
逆にこれを除外して「no」が「9」と「6」と「1」のレコードを得たいと
思っていたのに、まったく正反対の結果になってしまいます。

正しい結果を得るには、どういうSQL文を発行したら良いのでしょうか?
771NAME IS NULL:2006/08/25(金) 14:34:41 ID:???
>>770
group by したときに、
min() とか max() とかの関数を使わないで素のカラムを指定すると、
グループにまとめられた行のうちのどれの値が出てくるかは不定っぽい。

サブクエリで該当のtaimestampでも抽出することになるんだろうけど
3.xではできないので作業用のテーブルにでも一度吐き出すしかないんじゃないか。
772NAME IS NULL:2006/08/25(金) 14:50:44 ID:???
スレッドタイプの掲示板群を作る場合、どんなテーブルの構成が一番いいのでしょうか??
今考えているのは
 1ジャンルごとに1テーブル
 すべて1つのテーブル、bbs_seqでジャンル分け(DB掲示板ならbbs_seq = 2など)
です。
皆さんならどんな構成にしますか?
773770:2006/08/25(金) 19:21:18 ID:rgXmdUMm
>>771
アドバイスありがとうございます。
私の環境で何度も実験したところ、出てくる値は「不定」ではなく、最も古いというかnoが若いというか、
時間的に先にテーブルに入れられたレコードがいつも出てくるようです。

で、以下のようにテンポラリ・テーブルを使ってみましたが、
エラーなく正常にクエリが実行されるものの、何もSELECT結果が表示されません。
(ちなみに#以下のコメントは、クエリ実行時にphpMyAdminが自動で付加したものです)

CREATE TEMPORARY TABLE tmp(
`timestamp` VARCHAR( 10 ) NOT NULL
);# MySQLが空の値を返しました。(例えば行が空とか).
LOCK TABLES テーブル READ ;# MySQLが空の値を返しました。(例えば行が空とか).
INSERT INTO tmp
SELECT MAX( `timestamp` ) AS `timestamp`
FROM テーブル
WHERE `visit_id` = '1'
GROUP BY `uid`
ORDER BY `timestamp` DESC
LIMIT 30 ;# 影響された行数:2
SELECT テーブル.`no` , テーブル.`uid` , テーブル.`year` , テーブル.`month` , テーブル.`day` , テーブル.`timestamp`
FROM テーブル, tmp
WHERE テーブル.`timestamp` = tmp.`timestamp` ;# 行: 2
UNLOCK TABLES ;# MySQLが空の値を返しました。(例えば行が空とか).
DROP TABLE tmp;# MySQLが空の値を返しました。(例えば行が空とか).
774770:2006/08/25(金) 22:24:28 ID:rgXmdUMm
すいません、いろいろ試行錯誤してみたところ、以下のようなクエリで
期待通りの結果を得ることが出来ました。ありがとうございました。

SELECT MAX( `no` ) AS `no` , `year` , `month` , `day` , `uid` , MAX( `timestamp` ) AS `timestamp`
FROM テーブル
WHERE `visit_id` = '1'
GROUP BY `uid` , `year` , `month` , `day`
ORDER BY `timestamp` DESC
775NAME IS NULL:2006/08/26(土) 11:28:56 ID:PyZeKlHK
SQL Server 2000で、外部結合を大量に使った時間のかかるSELECT文があります。

このSELECT文のテーブル結合部分を事前にVIEW一つにまとめておいて、
SELECT文ではその結合したVIEWから取得した場合、
かかる時間は短くなりますか?
776NAME IS NULL:2006/08/26(土) 13:54:27 ID:???
>>775
早くはならない。
VIEWはプランや処理速度にはなんら影響を与えない。
ストアドならプランニングの分だけ速くなる。
777NAME IS NULL:2006/08/26(土) 14:15:56 ID:???
すいません、初心者なのですが頭こんがらがってきたので質問させてくださいorz
売上テーブルという表に、品物名、売上日、売上個数というフィールドがあり、これに対して

SELECT [売上日],SUM(売上個数) AS [一日売上個数]
FROM [売上テーブル]
WHERE [品物名] = 'リンゴ'
GROUP BY [売上日]

とやって、一日ごとの売上個数を出したのですが、この結果からさらに
一日の売上個数の平均を出すやり方に悩んでいます。
返って来た結果にたしてAVGとかかましたいのですが、うまくできません。
副問い合わせかな?と思ってやると、複数行返ってきてしまうのでIN使うのかなって
考えてるんですが・・・いい例も見つからなくて困ってます。
ヒントだけでもよければ教えてください、お願いしますm(_ _)m
778NAME IS NULL:2006/08/26(土) 14:32:08 ID:???
WHEREの後ろじゃなくてFROMの後ろにも副問い合わせってできるんですね・・・。

SELECT AVG([一日売上個数]) AS 平均 FROM (
SELECT [売上日],SUM(売上個数) AS [一日売上個数]
FROM [売上テーブル]
WHERE [品物名] = 'リンゴ'
GROUP BY [売上日] )

で、できました。スレ汚しごめんなさいorz
779NAME IS NULL:2006/08/27(日) 13:09:18 ID:xTqxtHGC
flgbitが1であるレコードが存在するかを調べるために
select flgbit from shain where flgbit = 1;
としていました。
しかし、この戻り値でflgbit=1が得られますがそれは使いません。
このような場合、selectでなくfindのようなものはありませんか?
select flgbit from shain where flgbit = 1;
が一番高速な方法ですか?
780NAME IS NULL:2006/08/27(日) 13:29:03 ID:???
>>779
何を言っているんだお前は。
使わないものをselectして何の意味があるんだと小一時間。
781NAME IS NULL:2006/08/27(日) 15:11:15 ID:???
>>780
お前よりましな回答がついた
ttp://oshiete1.goo.ne.jp/kotaeru.php3?q=2365483
782NAME IS NULL:2006/08/27(日) 15:46:51 ID:???
>>781のリンク先より
>flgbitやcount(*)を得るのは仕方がないんですね。

select count(*)の結果も要らないのか…。
ほんとに何のためにselectしているのか興味がある。
783NAME IS NULL:2006/08/27(日) 17:15:43 ID:???
まず、何があればいいのかを書いてくれ。
SELECT NULL なら NULLが得られるが満足か?
784NAME IS NULL:2006/08/27(日) 19:02:54 ID:???
とりあえず>>779>>781が狂っていることだけは確かだ。
DBについて質問する前に、「質問の仕方」を質問したほうがいい。
785NAME IS NULL:2006/08/27(日) 22:15:42 ID:???
>>775

SQLServerはマテリアライズド・ビューは持っているだろうか?
それ使うと速くなる。ただしビューというよりほとんど中間テーブルみたいなもんだが。
786NAME IS NULL:2006/08/28(月) 00:20:33 ID:oU4+KMyd
787NAME IS NULL:2006/08/29(火) 18:47:21 ID:BhUCBw9m
バイナリラージオブジェクトからは検索できないのですか?
それともデータベース依存ですか?
788NAME IS NULL:2006/08/29(火) 23:56:09 ID:???
結合について質問です…(´Д`;)

SELECT * FROM AFILE
LEFT JOIN BFILE ON (LEFT JOIN CFILE ON CFILE.ID=BFILE.ID) BFILE.ID=AFILE.ID
WHERE AFILE.BBB=100



SELECT * FROM (AFILE
LEFT JOIN BFILE ON BFILE.ID=AFILE.ID)
LEFT JOIN CFILE ON CFILE.ID=BFILE.ID
WHERE AFILE.BBB=100


この差がわからないのです…
結果が変わりますか?
789NAME IS NULL:2006/08/30(水) 00:10:06 ID:???
訂正です…(´Д`;)

SELECT * FROM AFILE
LEFT JOIN BFILE ON (LEFT JOIN CFILE ON CFILE.ID=BFILE.cID) BFILE.ID=AFILE.ID
WHERE AFILE.BBB=100



SELECT * FROM (AFILE
LEFT JOIN BFILE ON BFILE.ID=AFILE.ID)
LEFT JOIN CFILE ON CFILE.ID=BFILE.cID
WHERE AFILE.BBB=100


です
790NAME IS NULL:2006/08/30(水) 09:48:47 ID:???
1対多のテーブル、MAINとDETAILがあって、DETAILの検索条件に合致する
(重複のない)MAINのレコード数を知りたいのですがSQLの書き方がわかりません。
例えば
SELECT COUNT(MAIN.KEY) FROM MAIN, DETAIL
WHERE MAIN.KEY = DETAIL.MAIN_KEY AND DETAIL.CATEGORY = 3;
だと、DETAILのレコード数と同じ数が返ってきます。
どなたか教えてください。よろしくお願いします。
791NAME IS NULL:2006/08/30(水) 10:40:01 ID:???
>>790
count(DISTINCT main.key)
他同じ。
792790:2006/08/30(水) 16:05:09 ID:???
>791
動作確認とれました。
助かりました。ありがとうございました。
793NAME IS NULL:2006/08/31(木) 13:58:04 ID:???
SQL Serverで

UPDATE [テーブル] SET [対象日付カラム] = getdate()

として、日付を一括更新した場合、
全ての対商行の[対象日付カラム]の値は同一になると保証されるんでしょうか?

※仮に100万行のデータを作って一括Updateしてみましたが、全て同一の値になっているようでした
794NAME IS NULL:2006/08/31(木) 19:24:27 ID:dueqFyYs
一晩で解るSQLを呼んでも解らなかったので質問させてください。
#書名ちがってるかも。

ID1|ID2|連番
---------------
0001|12345|
0001|12345|
0002|12345|
0002|12345|
0002|12345|



現状こんな感じのテーブルの連番カラムを下記みたいに
ID1とID2をグループにして連番で振りたいんですけど
どんなSQL書けばよろしいでしょうか。

ID1|ID2|連番
---------------
0001|12345|      1
0001|12345|      2
0002|12345|      1
0002|12345|      2
0002|12345|      3



795NAME IS NULL:2006/09/01(金) 08:51:47 ID:???
>>794
ROW_NUMBER() が使える処理系なら
select id1, id2, ROW_NUMBER() AS OVER (PARTITION BY ID1 ORDER BY ID2) as 連番 from table1

id1 と id2 がユニークだという前提が成り立つなら
select id1, id2, (select count(*)+1 from table1 b where b.id1 = a.id1 and b.id1 > a.id1) as 連番 from table1 a
id1 id2 以外にユニークになるキーがあるならこの応用で対応できる。

ユニークなキーが無い場合はカーソル使って対応。
796NAME IS NULL:2006/09/01(金) 10:24:10 ID:???
not null 制約が表制約構文では許可されていないのには、
どのような背景というか哲学というか、
そのようなものがあるのでしょうか?
797NAME IS NULL:2006/09/01(金) 10:41:38 ID:???
>>796
質問が哲学的で良くわからないから具体的に
798NAME IS NULL:2006/09/01(金) 12:55:15 ID:???
だって表に対する制約じゃないじゃんよ。>>796
具体的に、どうやって表に対してNotNULLを適用したいのか言ってみてくれ。
799794:2006/09/01(金) 20:45:14 ID:???
>795
ありがとうございます。
使用しているのはAccess2000ですので、ROW_NUMBER()は有りませんでした。
id1,id2は当然のようにユニークではなく、他にユニークなキーも存在しません。

掲示したミニマムコードの部分だけをROW_NUMBER()の使える物に切り出して
連番を更新した後に、Accessに戻すことで対応してみようと思います。
800NAME IS NULL:2006/09/01(金) 22:26:04 ID:???
>>796
なぜ主キー制約や一意キー制約と違って、列制約でしか指定できないのかってこと?

NOTNULL制約は1項目で完結するからじゃないの。
主キー制約や一意キー制約は複数項目も有りで別レコードとの関係もあるし。
801NAME IS NULL:2006/09/02(土) 12:35:35 ID:???
あとから制約を追加する時に
addじゃなくてmodify使わにゃならんよね。
802NAME IS NULL:2006/09/03(日) 17:01:27 ID:???
掲示板に書き込まれた最後のデータを表示するような場合、
SELECT 書き込み内容 FROM 掲示板テーブル WHERE 書き込みタイムスタンプ = MAX(書き込みタイムスタンプ);
とするとMAX(書き込みタイムスタンプ)の部分が通りません。(MySQL4)
どうすればよいのでしょうか?
803802:2006/09/03(日) 17:16:11 ID:???
たまたま人に教えてもらえました。
ごめんなさい。
804NAME IS NULL:2006/09/03(日) 17:58:28 ID:???
>>803
どのように解決したのか具体的に書かないと。
805NAME IS NULL:2006/09/04(月) 00:33:02 ID:???
CASE文で、FILE1.Aが1なら'あ'、2なら'い'
それ以外ならFILE1.Bを
とかは可能ですか?
806NAME IS NULL:2006/09/04(月) 11:06:06 ID:???
>>805
いまいちよくわからんけど普通に可能なんじゃない。
807NAME IS NULL:2006/09/05(火) 01:35:24 ID:???
oracleではテーブル名の一文字目に記号は使えるの?
ダブルクォーテーションで括るってのは別にして。
808NAME IS NULL:2006/09/05(火) 20:22:47 ID:???
質問よろしいでしょうか。

重複したレコードをdeleteしたいのですが、どう記述したらよいでしょうか。
テーブルの構成は以下のようになっています。

  ID  |  No  |  name
------------------
    1 | 1001 |  apple 
    2 | 1002 |  orange 
    3 | 1002 |  orange 
    4 | 1003 |  peach 
    5 | 1003 |  peach 

DBはPostgreSQLで、IDがユニークです。
削除する条件は、Noが重複していて、IDが大きい物です。
(Noが重複しているのものが3つ以上あった場合はIDが最小の物を残して全部消します。) 
レコードを削除するのが目的ですのでselectするときにdistinctやuniqで絞るという対応はできません。

select a.ID from table as a, table as b where a.No = b.No and a.ID < b.ID;
このSQLで条件を満たすIDが取得できた(ように見えました)ので、結果をファイルに落として
プログラムで削除することも考えたのですが、SQLを勉強中なのでできればSQLで処理したい
と思っていますし、なにより上記SQLがあってるかどうかも自信はなくて。
809NAME IS NULL:2006/09/06(水) 01:09:23 ID:Mk9L3eKX
postgresqlですが、
select distinctで残るものは何かで悩んでいます。

select distinct on (a) a,b from ( select a,b from test order by b ) as tmp;
として、
ab
12
11
22
21
としたとき、order byでbが並べ替えが行われた後に、
distinctですから、

ab
11
21

が残るというようになっていますが、
これは、distinctを取ったとき、表の上の方にあるデータが
残るということでよいのでしょうか?
810NAME IS NULL:2006/09/06(水) 02:54:42 ID:???
>>808
DELETE FROM table WHERE ID NOT IN (SELECT min(ID) FROM table GROUP BY No);
ズルっぽいところがあるが、IDがユニークならこれでいけるはず。

>>809
> これは、distinctを取ったとき、表の上の方にあるデータが
> 残るということでよいのでしょうか?

そういうことであってんだが、DISTINCT ON はカーソル段階で重複削除っぽいので、
SELECT DISTINCT ON(a) a,b FROM test ORDER BY a,b;
とすべきだと思っている。
>>809だと、サブクエリで整列後DISTINCT aが効く(GROUP BY aの再整列)ので、
bの最小値が選択される保証はない。
811NAME IS NULL:2006/09/06(水) 11:43:25 ID:???
すいません質問させてください。
行いたい処理:Table1⇒Table2へのコンバート
Table1とTable2がリンクテーブルの状態です。
Table1にはデータがありTable2は空です。

ACCESS97
Table1 name:テキスト型 pass:テキスト型
name | pass
------------------
AAAA | 0000
BBBB | 1111
CCCC | 2222
DDDD | 3333
EEEE | 4444
:
:
現在のデータを下記の形に。

ACCESS2003 ID:数値型 name:テキスト型 pass:テキスト型
Table2
ID | name | pass
------------------
1 | AAAA | 0000
2 | BBBB | 1111
3 | CCCC | 2222
4 | DDDD | 3333
5 | EEEE | 4444
:
:
SQLの形はこのように考えていますが、INSETのIDの部分とSELECTのNULLの部分で悩んでおります。
INSERT INTO Table2(ID, ユーザー, PASS )
SELECT NULL, ユーザー, PASS FROM Table1
どのように記述すればよいのでしょうか。
812NAME IS NULL:2006/09/06(水) 13:54:18 ID:8AGGOxSN
重複データを取り除きたいのですが、重複しているデータの内、
キー番号の若い方のレコードを採用したいと思っています。

select distinct 項目1, 項目2 from テーブル1

と、実行すると、重複は取り除けますが、キー番号の若い方が取得できているか、
また、1レコードの全ての項目を取り出すことができません。

何か良い方法は無いでしょうか。。。
813NAME IS NULL:2006/09/06(水) 14:06:56 ID:???
814812:2006/09/06(水) 14:22:35 ID:8AGGOxSN
あ、すみません。
SQLSERVER2003を利用していて、DISTINCT ONが利用できないのです。。。
815810:2006/09/06(水) 14:22:38 ID:???
>>813
DISTINCT ON は PostgreSQLでしか使えないんじゃ?
>>812がナニを使ってるか知らんけど。

>>811
SEQUENCEを使えば?
ex.)
CREATE SEQUENCE testseq;
INSERT INTO Table2 (ID,ユーザー,PASS)
SELECT nextval('testseq')AS ID,ユーザー,PASS FROM Table1;
816810:2006/09/06(水) 14:28:28 ID:???
被った。

>>812
SELECT min(キー番号),項目1,項目2 FROM テーブル1 GROUP BY 項目1,項目2;
じゃダメ?
817812:2006/09/06(水) 16:53:53 ID:8AGGOxSN
うおお〜〜!!
おしいっす!!

もうちょっとでいけそうなのですが、GroupByに含む必要の無い項目もあるんです。。
集計する必要の無い項目があるので、それもなんとか取り出せないかなと。。。

キー番号, 項目1,項目2の他に、集計する必要のない項目(項目3とか)があるため、これをどうしようかと。。
サブクエリとか使えば、とれそうな気がするのですが。。。
818808:2006/09/06(水) 21:03:30 ID:???
>>810
ありがとうございます。
無事やりたいことができました。

819NAME IS NULL:2006/09/06(水) 22:00:10 ID:???
SQL Serverにて、
ID|値|累計
---------
1|10|10
2|14|24
3|26|50
4|90|140
のように値から累計を取りたいのですが
SUM(hage) OVER(ORDER BY hoge)とかは無理でした。
累加した値を取るのは、サブクエリを使うしかないのでしょうか?
820NAME IS NULL:2006/09/06(水) 23:10:21 ID:???
>>819
集計関数で使えるのはOVER (PARTITION BY だけでORDER BYの指定は出来ない。
サブクエリを使ってくれ。
821NAME IS NULL:2006/09/06(水) 23:18:34 ID:???
>>820
ありがとうございます。
Oracleならいけるっぽかったんで、SQL Serverに代替がないかと探してたのですが
やっぱり無理なんですね。
重そうですけどサブクエリでやります。
822810:2006/09/06(水) 23:53:12 ID:???
>>817
十分ヒントになってると思うが、、思考停止しちゃったか?

SELECT * FROM テーブル1 AS T1
WHERE キー番号 = (SELECT min(キー番号) FROM テーブル1 WHRER 項目1=T1.項目1 AND 項目2=T1.項目2);
823NAME IS NULL:2006/09/07(木) 01:50:55 ID:???
日付Aから日付Bまでの全てのyyyy/MM/ddを取得するSQLがあれば教えてください。
824番組の途中ですが名無しです:2006/09/07(木) 01:54:39 ID:SCPpVvfU BE:491842894-BRZ(7611)
Oracle限定で申し訳ないんですけども、困ってます。

TB1
ID 申し込み日

TB2
ID 申し込み日 申し込み内容 クーポンフラグ(1=クーポンあり)

TB3
ID 申し込み日 申し込み内容 クーポンフラグ(1=クーポンあり)

とある時に、
TB1の申し込み日がsysdate以前
・同じIdの同じ日付のTB2とTB3の申し込み内容を一度に1レコードで返してもらいたい
・申し込み内容が 'Aコース' のものだけ拾いたい。
・クーポンフラグが立っているものだけ拾いたい。
という条件って、

SELECT
TB1.ID , TB2.申し込み内容 , TB3.申し込み内容
from TB1 , TB2 , TB3
WHERE
TB1.申し込み日 <= sysdate
TB1.ID = TB2.ID(+)
AND TB2.ID = TB1.ID(+)
AND TB2.申し込み日 = TB1.申し込み日(+)
AND TB2.申し込み内容(+) = 'Aコース'
AND TB2.クーポンフラグ(+) = 1
AND TB3.ID = TB1.ID(+)
AND TB3.申し込み日 = TB1.申し込み日(+)
AND TB3.申し込み内容(+) = 'Aコース'
AND TB3.クーポンフラグ(+) = 1

でやったみたのですが
TB1だけしかない空のレコードが作られてしまいます。
何かヒントでもあればご教授お願いします。。。
825NAME IS NULL:2006/09/07(木) 06:02:42 ID:???
(+)の意味を理解しているのかどうか。
異なる日付でIDが同じレコードが存在するのか?
826NAME IS NULL:2006/09/07(木) 06:02:59 ID:???
>>824
どのテーブルもID+申し込み日でユニークだと考えていいのか?
それともTB2, TB3 はID+申し込み日+申し込み内容(コース)+クーポンフラグでユニークなのか?
外部結合にLEFT (OUTER) JOINの書式は使えないバージョンなのかい?
827NAME IS NULL:2006/09/07(木) 13:48:18 ID:nPkemtCV
>>822
バッチリですた。
う〜ん。柔軟に考えられませんでつた。

ありがとうございます。
828NAME IS NULL:2006/09/08(金) 07:21:09 ID:???
質問させてください。
nameに「鈴木」「佐藤」「高橋」が入ってるとします。
order by nameだと「鈴木」「佐藤」「高橋」で並び変わるとします。

これを「高橋」「鈴木」「佐藤」の順で並び替えるにはどうしたらいいでしょうか?
829828:2006/09/08(金) 07:31:37 ID:???
ちなみにnameには「鈴木」「佐藤」「高橋」以外のデータは入りません。
要するに、自由に並び替えしたいのです。
どうかよろしくお願いします。
830NAME IS NULL:2006/09/08(金) 11:03:17 ID:???
no name
--------
1 高橋
2 鈴木
3 佐藤

というテーブルを別に用意しておく
831828:2006/09/08(金) 12:08:23 ID:???
質問の仕方が悪かったようですみません。
1,2,3で並び替えたり2,1,3や3,1,2など
要するに、自由に並び替えしたいのです。
よろしくおねがいします。
832NAME IS NULL:2006/09/08(金) 12:38:24 ID:???
あくまでもSQLでなんとかしたいなら

name s1 s2 s3 s4 〜
--------------------
鈴木 1 1 2 2 〜
佐藤 2 3 1 3 〜
高橋 3 2 3 1 〜

からs#を使い分けるしかないだろ。
833828:2006/09/08(金) 12:41:45 ID:???
あ、すみません。
SQLでできました。
834NAME IS NULL:2006/09/08(金) 14:53:11 ID:fYwGASlo
>>828
case式
835NAME IS NULL:2006/09/08(金) 22:52:12 ID:???
つうかさ、>>828みたいなのは、やりたいことを論理的な日本語で説明してくれよ。
それすらできないのに、どうやってSQL書くのさ。
836NAME IS NULL:2006/09/09(土) 00:16:05 ID:CMzEgnKw
質問します。
oracleでは空文字はNullと見なされると学びました。
char型だと長さを満たすだけの空白で埋めますよね。
で、char(1)とすると''も' 'も' 'となって格納され、
比較時に末尾の空白が無視され空文字となり、
is null で検索できると思ったのですがうまくいきません。
私は何を勘違いしているのでしょうか?
837NAME IS NULL:2006/09/09(土) 00:55:53 ID:???
char(1)のフィールドは、nullか何か一文字入ってる状態にしか出来ないじゃないか?
俺はcharなんぞ使わんので知らんけど。
838NAME IS NULL:2006/09/09(土) 02:07:35 ID:???
>>836
> oracleでは空文字はNullと見なされると学びました。

本当か? 俺はoracle使いじゃないので試せないがたぶん違うと思うぞ。

CREATE TABLE T1 (c1 int,c2 char(1));
INSERT INTO T1 VALUES(1,' ');
INSERT INTO T1 VALUES(2,'');
INSERT INTO T1 VALUES(3,NULL);

SELECT c1,
CASE
WHEN c2=' ' THEN '空白'
WHEN c2='' THEN '空文字'
WHEN c2 IS NULL THEN 'Null'
END AS result
FROM T1;

たぶん、以下のように返ってくると思うぞ。
c1|result
1 |空白
2 |空白
3 |Null
839NAME IS NULL:2006/09/09(土) 05:30:06 ID:???
VARCHAR2とCHARの違い。
長さ0の文字列があるDBMSと、VARCHAR2での長さ0の文字列=NULLのオラの違いじゃないの?
840NAME IS NULL:2006/09/09(土) 08:49:09 ID:???
>>836
色々勘違いしてると思うけど、君の基本がコボルベースなのか、
Javaベースなのか、VBベースなのか、そもそも始めてのコンピューターなのか
どれ?
841NAME IS NULL:2006/09/09(土) 09:03:22 ID:???
>比較時に末尾の空白が無視され空文字となり、
ここが間違い。
CHARは長いほうに合わせて空白がパディングされて比較される。
Oracleの空文字はあくまでNULLとして扱われて空白がパディングされることは無い。
CHARの後方空白を切り捨てるのはクライアントのプログラムが読み取るときのオプション動作じゃなかったっけ。
842NAME IS NULL:2006/09/09(土) 11:17:17 ID:Iy8PAeCd
フィールド名を1個目としてしまいました。
僕は大馬鹿野郎ですか?
843NAME IS NULL:2006/09/09(土) 12:35:35 ID:???
>>841
まぁ、君が正解だと思うけど、
空白が埋められて比較される空白埋め比較が行われるのは、
CHARとCHARやNCHARやテキストリテラル同士の比較の場合のみ。
CHARとVARCHAR2の比較は空白で埋められない非空白埋め比較が行われる。

>CHARの後方空白を切り捨てるのはクライアントのプログラムが読み取るときのオプション動作じゃなかったっけ。
これはその通りだね。クライアントのプログラムの種類による。

844NAME IS NULL:2006/09/09(土) 14:15:52 ID:???
>CHARとVARCHAR2の比較は空白で埋められない非空白埋め比較が行われる。

昔のことなんだけど、Ver.8.0.5のときにこうならなくってハマッた覚えがあるんだ。
どっちかの型をあわせてやらないと比較できなかったんだよ。
それってバージョンによって違うのか、それともオプションによるのかな?
845NAME IS NULL:2006/09/09(土) 15:09:29 ID:???
TRIM すれば NULL になるからいいじゃない
846NAME IS NULL:2006/09/09(土) 16:23:04 ID:???
SELECT 1個目 FROM mytable;

で、結果が
個目
1
1
1
1
1
1
1
ってなってしまいます。
847NAME IS NULL:2006/09/09(土) 17:33:41 ID:???
それは、SELECT 1 AS 個目 FROM mytable; だから
848NAME IS NULL:2006/09/10(日) 11:40:59 ID:???
昨日からハンドブック片手に勉強始めた超怒急初心者です。
ここで質問よかったかな。。

Mixiのような過去にユーザーが書き込んだコメントを
スレッド毎に五つ表示したいのですが

"SELECT threadid, comment, date, name"
FROM `dt_comment`
WHERE name=username
GROUP BY threadid
ORDER BY DATE DESC
LIMIT 5

UNIX+MySQL4.3です。
上のだと
2006-09-06(コメント投稿日)+( ^ω^)(コメント本文)+スレのURL
2006-09-04(コメント投稿日)+( ^ω^)(コメント本文)+スレのURL2
2006-09-02(コメント投稿日)+( ^ω^)(コメント本文)+スレのURL3
2006-08-31(コメント投稿日)+( ^ω^)(コメント本文)+スレのURL4
2006-08-30(コメント投稿日)+( ^ω^)(コメント本文)+スレのURL5

のように
以前書き込んだスレ毎を日時順に5つ表示できてるのですが
スレに新しいコメントを書き込んでもデータが更新されずに
スレに一番最初に書き込んだ日時と本文のまま固定されて
しまっております。。
スレ毎の最新の書き込みを表示するにはどうしたらいいでしょうか?
849NAME IS NULL:2006/09/11(月) 09:36:35 ID:???
>>848
本当にそうなったのか?
実際のデータ数例と実際のSQL出してみてよ
850849:2006/09/11(月) 14:32:36 ID:???
つーか、やっと意味がわかった・・・

SELECT threadid, comment, MAX(date), name
とかでどうか。
851NAME IS NULL:2006/09/11(月) 14:34:27 ID:???
しかし MySQLはこんな書き方で許されるのか。
もうちょっと工夫がいるかもしれんな
852NAME IS NULL:2006/09/12(火) 07:40:17 ID:???
おはようございます。
>>849氏 ありがとうございます!
大分、やりたい事に近づきました。

スレ毎の最新日時(date)を降順して表示できるようになりました。
ただ、もう一つ質問がありまして。。
なぜか今もコメント本文(comment)が日時のROWと合っておらぬまま。

テーブルのスクショを撮ってみました。
#threadid=contentidです。
http://monkeyuploader.dyndns.org/Offering/mnkyup055.png
Max(date)で最新日時になるも、commentの内容は古いまま。。
http://monkeyuploader.dyndns.org/Offering/mnkyup057.png

idをユニークキーでレコードしてあるので、これを使ってみたのですが
うまくいけてないです。

とても助かります。勉強進めます。
853NAME IS NULL:2006/09/12(火) 07:56:43 ID:wOotiUt0
はじめましてよろしくお願いします。
以下の様な2つのテーブルがあり両方に存在するデータの内、
最大値を持ったデータを取得したいのですが。
但し、テーブル2に重複行が有った場合は複数分だしたのですが
テーブル1         テーブル2
列A 列B 列C      列1 列2
1   1   5       1   1
1   1   10       1   1
1   2   8       1   2
1   2   3       2   1
2 1 5 3 1

   ・
よろしくお願いします。

854NAME IS NULL:2006/09/12(火) 09:54:56 ID:???
どういう結果がほしいのか書いてくんろ
855NAME IS NULL:2006/09/12(火) 10:03:01 ID:???
イヤです
856NAME IS NULL:2006/09/12(火) 10:06:00 ID:???
>853
「両方に存在する」の存在する条件が不明なのと
「最大値」が何の最大値なのか不明なのとを
はっきりさせれ。
857NAME IS NULL:2006/09/12(火) 10:43:14 ID:1QTPaM/W
>>853
しょうがっこうこくご
でも嫁
858NAME IS NULL:2006/09/12(火) 14:29:15 ID:???
>>854-857
釣られたね
859NAME IS NULL:2006/09/13(水) 00:19:28 ID:???
>>852
group by 句に指定していないカラムを select できるなんていう
変態仕様に頼っているからだろ。
860NAME IS NULL:2006/09/13(水) 10:09:03 ID:???
dateがなにがでてくるかはランダム
サブクエリで獣医が5位以内にしたら?
861NAME IS NULL:2006/09/13(水) 17:10:59 ID:???
859氏ありがとうございます!
Group By句にcommentを追加して
投稿最新日時、スレ毎の最新コメント、ユーザー名で区分する
コメントチェッカーをサイトに載せることが出来ました。
おかげさまでスッキリしました!
860氏も参考になりました。ありがとうございます!
862NAME IS NULL:2006/09/15(金) 04:32:17 ID:???
テーブル1
列A 列B 列C
1   1   5
1   1   6
1   2   8

OK --- select 列B,count(列B) from テーブル1
NG --- select 列B,count(列B),列C from テーブル1
列Bが1の時に列Cが2種類あるからだめなのかな?
863NAME IS NULL:2006/09/15(金) 09:52:25 ID:???
それをOKにするRDBMSってどれ?
864NAME IS NULL:2006/09/15(金) 13:50:41 ID:???
select 列B,count(列B),min(列C) from テーブル1
って、列Cが文字型でもいのかな?
865NAME IS NULL:2006/09/15(金) 14:42:15 ID:???
それは別にかまわんが、GROUP BY 無しでそれいけるのか?
MySQLか何か?
866NAME IS NULL:2006/09/16(土) 23:02:23 ID:???
日付、名前、点数の表があります。
名前がAで、日付が一番新しいデータを持って着たい場合はどのようにすればよいのでしょうか?

日付、名前、点数
2006-09-14,A,10
2006-09-15,A.20
2006-09-15,B.30
2006-09-16,.A,40

今のところAさんの最新点数を表示するのに
SELECT * FROM 表 WHERE 名前 = "A" AND (SELECT 日付 = MAX(日付) FROM 表);
とやっていますが、本当はどうすればいいのでしょうか?
867NAME IS NULL:2006/09/17(日) 08:07:03 ID:qBdk3wJz
本当は?って。
それはそれでよいんじゃないの?
DBMS毎で若干性能出る方法はあるから、DBMSさらせばさらに回答つくでしょ。
868NAME IS NULL:2006/09/17(日) 09:22:07 ID:jvVMt5Re
SQLの高速化についてのまとめサイトみたいなとこないかな?
869NAME IS NULL:2006/09/17(日) 09:30:24 ID:???
>868
もしチューニングサイトがあったとしても、
データベースの構成やデータの持ち方で変わるんだから、
結局のところ試行錯誤するしかないよ?

おいらが知ってるのは、基本的には
・ORよりUNIONが速い
・INよりEXISTSが速い
とかいう程度で、上記も実際のデータに当てはめてやってみなくちゃわからんってことぐらいかなぁ。
870NAME IS NULL:2006/09/17(日) 09:58:35 ID:qBdk3wJz
>>869
まあ、知識として、いかにHDDアクセスをなくすかってのが基本でしょ。

あと、下手に知識が入った辺りでやらかすのが、自己満足の複雑な結合。
その結果、2表の総当りとかいう馬鹿な結合が出て、データ件数の掛け算で性能劣化。
871NAME IS NULL:2006/09/17(日) 13:26:21 ID:???
>>866
2か所に'A'を使うのがいまいちだけどこんなのどう?
SELECT * FROM 表
WHERE 名前 = 'A' AND 日付 = (SELECT MAX(日付) FROM 表 WHERE 名前 = 'A' GROUP BY 名前);

もしくは
SELECT 表.* FROM 表, (SELECT 名前, MAX(日付) AS 最新日付 FROM 表 GROUP BY 名前) AS 抽出表
WHERE 表.名前 = 抽出表.名前 AND 表.日付 = 抽出表.最新日付 AND 表.名前 = 'A';
こっちだと最後の条件を削るだけで全員の最新点数が得られるよ
SELECT 表.* FROM 表, (SELECT 名前, MAX(日付) AS 最新日付 FROM 表 GROUP BY 名前) AS 抽出表
WHERE 表.名前 = 抽出表.名前 AND 表.日付 = 抽出表.最新日付;
872NAME IS NULL:2006/09/17(日) 13:48:39 ID:???
>>871
相関サブクエリにした方が、多くの場合最適化がうまくいくよ。
873NAME IS NULL:2006/09/17(日) 21:07:46 ID:???
>870
そだね。
クエリをみるのも大切だけど、
データベースのテーブルレイアウトにインデックス、
キャッシュヒット率とかのリソースをみるほうが重要だし。
874NAME IS NULL:2006/09/19(火) 01:33:59 ID:???
OracleでSyslogにかいてるところに通知したい
ってどうすればいい?
875NAME IS NULL:2006/09/19(火) 11:07:22 ID:???
SQL ServerやMySQLの質問がまぎれることはあるが
Oracleは珍しいな。
SQL関係無いのでOracleスレでどうぞ
876NAME IS NULL:2006/09/20(水) 18:41:49 ID:1b4kpAoh
SELECT文でTIMEとDATAを格納してる列があるデータベースに対して、
指定したTIMEに一番近くて大きなTIMEのところにあるDATAを取り出す方法ってどう書けばいいの?

例えばTIMEに100,101,102,103,104,105とあるときに
102を指定したら102のところのDATAが、102が無い場合は103を取り出したいのですが。
877NAME IS NULL:2006/09/20(水) 18:51:09 ID:JrAxKI9g
物凄く初歩的な質問くさいんですが。
下記の用な成績データがあったとして、自分の順位(3位)を知るには
どうすればよいんでしょうか?

100
90
80 <- 自分はここ
70
60

DBはMySQLです。
878NAME IS NULL:2006/09/20(水) 19:15:26 ID:???
>>876
状況によって書き方換わるけど、WHEREで102以上を指定して
その中からmin()を持ってくればいいと思う。
879NAME IS NULL:2006/09/20(水) 19:16:30 ID:???
minはORDER BY とLIMITの組み合わせでもいける
880NAME IS NULL:2006/09/20(水) 19:17:57 ID:???
>>877
自分の点数以上の人をCountすれ
881NAME IS NULL:2006/09/20(水) 19:17:57 ID:???
>>877
順位=その値より大きいものは何件あるかだから、
WHERE で絞ってcount()すればいい。

順位をいっぺんに出すのはもうちょっと工夫がいる
882NAME IS NULL:2006/09/21(木) 10:40:01 ID:???
>>878-879
ありがとうございました。
883NAME IS NULL:2006/09/21(木) 21:16:37 ID:YFo2jc56
基本的なところを教えてください。
Indexを付けている抜けがときどきある番号があります。重複はありません。
この場合の指定した番号のIndex値を知るにはどのように書けばいいのでしょうか。
select Index from hogetable where hoge=123;
などとやってみましたがIndex値は抜けませんでした。

外部のプログラムからDBのデータをひとつずつ抜いて中身確認しようと思っています。
for i=1 to index値とやりたいのですがうまく抜けないのですみませんが教えてください。
884NAME IS NULL:2006/09/21(木) 21:41:23 ID:???
>>883
あなたのおっしゃるIndex値って、いわゆる「行番号」に相当するものかしら?
885NAME IS NULL:2006/09/21(木) 22:16:03 ID:???
>>884
はい、そうです。
886NAME IS NULL:2006/09/21(木) 22:24:21 ID:???
>>885
csvで書き出してExcelで読み込ませるとか、どーよ?
887NAME IS NULL:2006/09/21(木) 22:33:44 ID:???
>>886
すみませんがまずはひとつずつやってみたいので、>>883をお願いします。
888NAME IS NULL:2006/09/21(木) 22:52:00 ID:???
中華日本語 >>883
889NAME IS NULL:2006/09/22(金) 01:47:45 ID:???
indexに行番号なんてあるの?
tree構造だとばかり思ってたべ。。。
890NAME IS NULL:2006/09/22(金) 10:15:41 ID:???
>>883
下のやり取りでなんとなくわかった気がするが、、、、

例えば、hoge順に並んでいるものの100番目を取り出したいなら

SELECT * FROM table ORDER BY hoge LIMIT 1 OFFSET 99

とかやればいい。
891NAME IS NULL:2006/09/22(金) 10:17:49 ID:???
あと、一つずつ取り出して何かやるってんならカーソル作ってFETCHしたらいいかと
892NAME IS NULL:2006/09/22(金) 14:50:45 ID:???
もう一つ。
RDBSにはデータの格納順という概念は存在しない。
だから単一の行だけ取り出してもそれが何番目かということは知ることはできない。
(1つ取り出したのだから、順不同なデータの1番目、とは言える)
必ず選択条件と並び順を決定しなくては、何番目のデータとは言えない。
893NAME IS NULL:2006/09/22(金) 14:57:29 ID:???
いまだに883の意味がわかりません><
894NAME IS NULL:2006/09/22(金) 19:36:23 ID:???
>>893
では、ヒントを。

文章中の「Index」と「Index値」は別の意味で使われている。
もちろん「番号」と「Index値」も別物だ。
この点に注意してもう一度読み直してみよう!
895NAME IS NULL:2006/09/22(金) 23:21:40 ID:???
そこまでして読まないといけない使命があるわけでもないし。w
896893:2006/09/23(土) 00:17:36 ID:???
>>894

やっとわかりました。ありがとうございます!!

とある番号項目の値を指定して、
その項目でソートした場合の
先頭レコードからの行番号をとりたいってことですね。

じゃ、おやすみなさい。
897NAME IS NULL:2006/09/23(土) 14:49:08 ID:???
MySQL4.1を使用しています。

id | type | up_time
10    a  2006-09-10
11    b  2006-09-12
12    a  2006-09-13
13    c  2006-09-15
14    a  2006-09-18
15    b  2006-09-20

こんなデータを下記のように
日付の新しい順、且つtypeごとにまとめて並べたいのですが
なにかうまい方法はないでしょうか?

id | type | up_time
15    b  2006-09-20
11    b  2006-09-12
14    a  2006-09-18
12    a  2006-09-13
10    a  2006-09-10
13    c  2006-09-15

SELECT * FROM table_foo ORDER BY up_time DESC, type;
としても下のように日付ごとにばらばらになってしまいます…

id | type | up_time
15    b  2006-09-20
14    a  2006-09-18
13    c  2006-09-15
12    a  2006-09-13
11    b  2006-09-12
10    a  2006-09-10
898NAME IS NULL:2006/09/23(土) 17:27:16 ID:???
>>897
id | type | up_time | last_up_time_byId  (last_up_time_byId は idで最大の日付)
という表があったら出来るのはわかる?
あとはサブクエリで。
MySQL4.1でどの程度サブクエリが使えるかはわからないから自分で調べてくれ。
899NAME IS NULL:2006/09/23(土) 18:01:05 ID:???
>>897
きわめて妥当な結果だと思うけどどういう結果が欲しいの?
ソートの優先順位が違うなら、それを入れ替えればいいじゃん

SELECT * FROM table_foo ORDER BY type, up_time DESC;
900NAME IS NULL:2006/09/23(土) 19:15:22 ID:???
手元にはオラコーしかないんやわ…スマンコ('A`)ノ

select
   tf10.ID
  ,tf10.TYPE
  ,tf10.UP_TIME
-- ,tf01.UT_RANK
from
  table_foo tf10 join
  (select
     rank() over(order by max(tf00.UP_TIME) desc) as UT_RANK
    ,tf00.TYPE
    ,max(tf00.UP_TIME) as MAX_UP_TIME
   from TABLE_FOO tf00
   group by tf00.TYPE
  ) tf01 on tf01.TYPE = tf10.TYPE
order by
   tf01.UT_RANK asc
  ,tf10.UP_TIME desc
  ,tf10.TYPE asc
  ,tf10.id asc
;

901NAME IS NULL:2006/09/23(土) 22:00:53 ID:1epsOh50
お願いします。
CGIからMySQLを操作しています。

[t1]
id1 | id2 | ...
1    1
1    2
2    1

[t2]
id1 | id2 | ...
1    1
2    1

(id1,id2)はUNIQUEですが、実際にはさらに複数のテーブルをINNER JOINしています。
t2(id1,id2)に存在しないt1(id1,id2)を抽出したいのですが、
例えばid1=1の場合の結果は

SELECT t1.*,t2.id2 AS a1
FROM t1 LEFT OUTER JOIN t2 ON t1.id1 = t2.id1 AND t1.id2 = t2.id2
WHERE t1.id1 = 1;

id1 | id2 | a1 | ...
1   1   1
1   2   NULL

この結果をさらにサブクエリーかCGIでa1 == NULLを抽出するという方法しかないでしょうか?
それらしい結果は返ってくるけど、外部結合の使い方がイマイチわからないです。
902NAME IS NULL:2006/09/23(土) 22:52:08 ID:???
>>901
>この結果をさらにサブクエリーかCGIで

ん?where句に追加するだけじゃないのか?
SELECT t1.id1,t1.id2
FROM t1 LEFT OUTER JOIN t2 ON t1.id1 = t2.id1 AND t1.id2 = t2.id2
WHERE t1.id1 = 1 and t2.id1 is null;
質問の意味を読み違えてたらスマン。
903901:2006/09/23(土) 23:25:09 ID:???
>>902
普通にwhere句に追加するだけだったんですね・・・
WHERE t1.id1 = 1 and t2.id2 is null;
で望む結果が得られましたので、データを増やして検証してみます。
ありがとうございました。
904NAME IS NULL:2006/09/24(日) 00:04:18 ID:XMj5nZBr
MySQLにて、複数のレコードをINSERTするときはVALUES以降の値をカッコで
括ってカンマ区切りで複数レコードを並べることによってクエリ一発で出来るのですが、
UPDATEでも複数レコードをクエリ一発で更新することは出来るのでしょうか?

いろいろ調べたけど、1度に1つのレコードを更新する例文しか見つかりませんでした。
905NAME IS NULL:2006/09/24(日) 00:40:11 ID:???
わかんないけど、更新する値が複数あるってことは
where句も複数必要になるからその辺の関係でわ?
906NAME IS NULL:2006/09/24(日) 00:40:48 ID:???
あ、値じゃなくてレコードです。ゴメン('A`)
907NAME IS NULL:2006/09/25(月) 09:50:05 ID:???
>>904
同じ値に更新するなら複数選択される条件があればいい
違う値なら無理
908NAME IS NULL:2006/09/27(水) 09:25:43 ID:eq022I/L
古い順(ASC)で並んだ結果から最後の5行だけ取り出したいときってどうすればいいでしょうか?
いつもは全体の件数を取得->件数-5のオフセットで取得してるんですけど、2回もクエリ送るのが低効率な気がして。。
MySQL4.0なんでサブクエリ使えないんです。
909NAME IS NULL:2006/09/27(水) 10:34:38 ID:???
まず何故『新しい順(DESC)で取った最初の5行』にしないのだ
910NAME IS NULL:2006/09/27(水) 10:40:35 ID:???
そうすると
9
8
7
6
5
の順番で表示されるからです。
5
6
7
8
9
の順で行きたいんですけど。。
911NAME IS NULL:2006/09/27(水) 12:58:20 ID:???
可能ならプログラム側で逆にしたいところだな。
912NAME IS NULL:2006/09/27(水) 15:43:55 ID:???
まあ当然ではある
913NAME IS NULL:2006/09/27(水) 18:47:11 ID:???
え、4.0ってサブクエリ使えないの?
914NAME IS NULL:2006/09/28(木) 03:24:17 ID:???
4.1から。てかなぜ4.0?
915NAME IS NULL:2006/09/28(木) 12:12:58 ID:???
(……うちは3.0なので何も言わない……)
916NAME IS NULL:2006/09/28(木) 12:28:20 ID:???
(……言ってるじゃまいか……)
917NAME IS NULL:2006/09/30(土) 00:08:25 ID:???
イントラのWebでアクセス元のPCがどこの所属かを判定して表示内容を変える処理があります。
現在はポスグレでinet型をつかってますが、今度SQLServerにリプレースすることになりました。

現在のテーブル構成
bumon(int) | net_adr(inet)
------------------------
 1            | 192.168.1.0/24
 2            | 192.168.2.0/24
 3            | 192.168.3.0/24
 4            | 192.168.4.0/24

現在発行しているSQL
select bumon from table where net_adr>>=jspで取得したアクセス元のIP

新テーブル構成
bumon(int) | net_adr(varchar) | net_mask(varchar)
-------------------------------------------
 1            | 192.168.1.0        | 255.255.255.0
 2            | 192.168.2.0        | 255.255.255.0
 3            | 192.168.3.0        | 255.255.255.0
 4            | 192.168.4.0        | 255.255.255.0

SQLServerではinet型がないのでネットワークアドレスとネットマスクを別カラムで持つことになりました。
ここでどんなSQL文を書けば今までと同じ結果が取得できるでしょうか。
アクセス元のIPアドレスの取得方法は同じくjspです。 
918高木:2006/09/30(土) 12:04:52 ID:???
-- 給与が30万円以上で,部署名が研究開発の人の名前をON句を使って求める
SELECT
従業員名,
給与,
部署名
FROM
従業員 JOIN 部署
ON 従業員.部署NO = 部署.部署NO
WHERE
従業員.給与 >= 300000 AND
従業員.部署NO = 20;

従業員名 給与 部署名
---------- ---------- --------------
藤井 300000 研究開発
桜井 300000 研究開発

上記と同じ結果をサブクエリを使って求めたく思い
以下のSQLを発行したのですが、うまくいきません。
どこが拙いのかご教示ください。

-- サブクエリを使って、給与が30000以上で部署が研究開発の人を求める
SELECT
従業員名,
a.部署名,
給与
FROM
(SELECT
部署名,
部署NO
FROM
部署) a,
従業員
WHERE
給与 >= 300000 AND
a.部署NO = 20;

従業員名 部署名 給与
---------- -------------- ----------
藤原 研究開発 385000
高橋 研究開発 345000
藤井 研究開発 300000
林 研究開発 900000
桜井 研究開発 300000
919NAME IS NULL:2006/09/30(土) 13:10:59 ID:???
>>918
最後のWHERE句がおかしいと思われ

WHERE
給与 >= 300000 AND
a.部署NO = 部署NO AND
部署NO = 20;
920高木:2006/09/30(土) 13:50:14 ID:???
>>919
ありがとうございます。うまくいきました。
ただ、a.部署NO = 部署NO を a.部署NO = 従業員.部署NO としないと
「ORA-00918: 列の定義が未確定です」というエラーが起こりますが。
921NAME IS NULL:2006/09/30(土) 17:10:46 ID:???
>>920
レコード数が多い方をサブクエリにして先に絞り込んだ方が良いと思うけど
従業員数程度なら関係ないか

SELECT 従業員.従業員名, a.部署名, 従業員.給与
FROM
( SELECT 従業員名, 部署NO, 給与
FROM 従業員
WHERE 給与 >= 300000 AND 部署NO = 20 ) a,
従業員
WHERE a.部署NO = 従業員.従業員NO;
922NAME IS NULL:2006/09/30(土) 17:15:51 ID:???
>>918は間違い、適当に編集してたら混乱した

SELECT a.従業員名, 部署.部署名, a.給与
FROM
( SELECT 従業員名, 部署NO, 給与
FROM 従業員
WHERE 給与 >= 300000 AND 部署NO = 20 ) a,
部署
WHERE a.部署NO = 部署.従業員NO;
923NAME IS NULL:2006/10/01(日) 10:50:31 ID:???
<table1>
id | コード1 | コード2
--------------
1 | 1 | 3
2 | 2 | 3
3 | 1 | 1
4 | 2 | NULL

<table2>
コード | 商品
----------
1 | みかん
2 | りんご
3 | バナナ

から

1 | みかん | バナナ
2 | りんご | バナナ
3 | みかん | みかん
4 | りんご |  NULL

を取り出すのはどうしたらいいのですか。
table2を2回参照する部分がわかりません。
Mysql5.0 使用しています。
924NAME IS NULL:2006/10/01(日) 12:19:26 ID:???
>>923
select table1.id, a.商品, b.商品
from table1, table2 a, table2 b
where table1.コード1 = a.コード and table1.コード2 = b.コード
925NAME IS NULL:2006/10/01(日) 12:30:20 ID:???
メモリを節約したいならこうかな

select a.id, a.商品, b.商品
from
(select table1.id, table2.商品, table1.コード2
from table1, table2
where table1.コード1 = table2.コード) a, table2 b
where a.コード2 = b.コード
926NAME IS NULL:2006/10/01(日) 13:06:01 ID:???
これでメモリ節約になるDBMSって何?
927NAME IS NULL:2006/10/01(日) 13:34:04 ID:???
展開する手間を掛けさせてるだけのような希ガスる。
928NAME IS NULL:2006/10/01(日) 13:38:39 ID:???
DBMSの最適化機能でなんとかなるのかもしれんが
サブクエリに分けた方が扱う結果セットが小さくなるから
メモリは節約されると思うが
929NAME IS NULL:2006/10/01(日) 13:56:52 ID:???
Aテーブルに入っている文字列XがBテーブルで値Yを与えられているとき
BテーブルでYを持つAテーブルの文字列Xのみを取り出したいときはどう指定すればいいのでしょうか
例えばアルファベットで

<文字>
フィールド1|略|フィールド52
------------------------
a|略|Z

a〜Zまで文字列を入れてあり

<音>
フィールド|略|フィールド52
------------------------
母音|略|子音

母音か子音かの値を入れてあったとして
母音だけ取り出すときの指定です
930NAME IS NULL:2006/10/01(日) 14:13:29 ID:???
>>929
そもそもテーブル設計間違ってるぞ
文字と文字種のフィールドを持つテーブルが一つありゃいいんじゃないの?

a|1
b|2
:
z|2
931NAME IS NULL:2006/10/01(日) 14:26:53 ID:???
>>930
元々<文字>テーブル的なテーブル(ラテン行aとギリシャ行αを一緒の列に入れて対応させてるような感じ)がいくつかあったのですけど
そこから条件に合う一行の一部(ラテンの母音)を取り出すのにこういう形にしたのですが

やっぱり元テーブルから作り直す(ラテン文字と音テーブル、ギリシャ文字と音テーブルみたいに)方がいいですか
932NAME IS NULL:2006/10/01(日) 14:36:07 ID:???
>>928

>>924だろーが>>925だろーが、NestedLoopJoinに落ちるならどっちも
たいしてメモリ喰わんだろう。
つか逆に、最適化が下手なDBMSだと>>925はサブクエリの結果セットを
メモリ上にまるまる保持してしまう可能性があるんでない?
933NAME IS NULL:2006/10/01(日) 14:41:16 ID:???
>>931
それってめちゃくちゃ扱いづらいだろ
もともと同じ目的のものを別フィールドに52個も並べてるんだから

直せるなら直した方がいいんじゃないか
934NAME IS NULL:2006/10/01(日) 14:49:06 ID:???
>>931
直す場合のテーブルだけど文字ごとに分ける必要がないなら一つでいいと思うよ

|文字グループ|文字|音|

文字グループは{1ならギリシャ文字、2ならラテン文字}
文字は{A-Za-z後知らん}
音は{1なら母音、2なら子音}

こういうテーブルならたとえば「ギリシャ文字の母音を探す」なら

select 文字 from 文字テーブル where 文字グループ = 1 and 音 = 1;

ですぐもってこれる
935NAME IS NULL:2006/10/01(日) 14:54:18 ID:???
>>930
>>933-934
ありがとうございました
とりあえず直す方向でやってみます
936NAME IS NULL:2006/10/03(火) 02:31:14 ID:???
MySQLを使用しています。
同じ内容の行を削除する最もスマートな方法を教えてください
よろしくお願いします。
937NAME IS NULL:2006/10/03(火) 05:57:50 ID:???
>>936
そんな質問じゃ答えられんがな
仮にテーブル名t1、カラムはc1, c2, c3で、キーなし
重複行を削除という話だとしよう
キーがある場合はもう少し工夫が必要だが

1.別テーブルを作成
create table t1_tmp (select * from t1 group by c1, c2, c3);

2.作成したテーブルと交換
rename table t1 to ti_backup, t1_tmp to t1;

3.不要ならti_backupを削除

メリットは、結果を確認できることと、元に戻せること。
どうせこんなことやるのはメンテの時1回だけだろ
938NAME IS NULL:2006/10/03(火) 08:03:58 ID:???
>>937
超感謝、愛してるぜマイハニー
939NAME IS NULL:2006/10/03(火) 10:09:02 ID:???
A=1であり、『B=2 かつ C=3』でない
というWHERE文はどのようになるでしょうか?

WHERE A=1 AND !(B=2 AND C=3)
であってますでしょうか?
940NAME IS NULL:2006/10/03(火) 11:08:41 ID:Nw6npmkF
http://www.res-system.com/item/415

↑コレを、(副問い合わせではなく)値を明示して実現するにはどうすればいいでしょうか?
具体的には

key1|key2
----+----
A | 1
A | 2
B | 3
C | 1

というテーブルで、「A-3とB-2とC-1だけ検索したい」のです。
key1 in ('A', 'B', 'C') and key2 in (1,2,3)
だと、全部検索対象になってしまいますし……。お知恵をお貸しください。
941NAME IS NULL:2006/10/03(火) 11:10:32 ID:???
>>939
実際にやってみた?
WHERE A=1 AND NOT (B=2 AND C=3)
でどうか
942940:2006/10/03(火) 11:12:23 ID:???
↑若干間違いでした、すいません

誤:A-3とB-2とC-1だけ検索したい
正:A-2とB-3とC-1だけ検索したい

まぁ、引っかからないのは読み飛ばしたいので、別に間違いではないのかもしれませんが……。
943NAME IS NULL:2006/10/03(火) 11:20:06 ID:???
>>942
えっと、、、よくわからないが
WHERE (key1, key2) IN (('A',2),('B',3),('C',1))
とかでいいのかな?
944NAME IS NULL:2006/10/03(火) 11:23:41 ID:???
>>940
WHERE (key1 = A AND key2 = 2) OR (key1 = B AND key2 = 3) OR (key1 = C AND key2 = 1)

リンク先の方法がダメな処理系もあるな。例えばMSSQLにはINのサブクエリは1列だけの制限がある。
945940:2006/10/03(火) 11:34:42 ID:???
早速のお返事ありがとうございます。

>>943
通らないっす……(T_T)

>>944
それっきゃないっすか……(T_T) ちょっと条件の数が多い(100前後)なので、どうしようかなぁ……。
ちなみにPostgreSQLではOKなようです>INのサブクエリに複数列
946NAME IS NULL:2006/10/03(火) 11:50:43 ID:???
>>945
そっか。
>>943のはPostgreSQL8.1だと通るけどな。
947NAME IS NULL:2006/10/03(火) 11:51:12 ID:???
ってそう書いてあったか、スマン
948NAME IS NULL:2006/10/03(火) 16:50:38 ID:???
1から順に足す関数ってありますか。
5なら15、10なら55って求められるようなの。
949NAME IS NULL:2006/10/03(火) 18:02:27 ID:???
汎用的なのは無いんじゃないか。作るのは簡単
950NAME IS NULL:2006/10/04(水) 12:59:52 ID:???
select (n+1)*n/2 from dual;

こんなん?
951NAME IS NULL:2006/10/04(水) 17:18:06 ID:???
>>950

天才現る。
952950:2006/10/05(木) 00:55:24 ID:???
>>951
いあ、昔読んだ話でピタゴラスだか何だかが子供の頃に
思いついたアルゴリズムって事で覚えてただけなんよ…。
自分で思いついたんならえらいんだけどね('A`;)
953NAME IS NULL:2006/10/05(木) 01:15:01 ID:???
ガウスだろ
954950:2006/10/05(木) 02:02:58 ID:???
>>953
おおう。確かにwikipediaでガウス調べたら書いてたよー。
誰だったか思い出せなくて気持ちわるかってん。ありんこ('A`)ノ
955NAME IS NULL:2006/10/05(木) 09:24:18 ID:???
ちゅうか高校数学1じゃないのか?
956NAME IS NULL:2006/10/05(木) 11:35:43 ID:???
PostgreSQLなのですが、
・あるテーブルtable_aが存在していないとき、table_aの作成と初期データの
INSERTを行なう
・table_aがすでに存在するときは、table_aの作成と初期データのINSERTを
行なわない(初期データのINSERTをスキップする)
といったことを実現するにはどのように記述すればいいのでしょうか。
957NAME IS NULL:2006/10/05(木) 12:17:00 ID:???
>>956
なんでそんなことを、、、というのはともかく
PL/pgSQLを使えばできるかな?
SQLの範囲外なのでPosqgreSQLのスレで聞いてね
958NAME IS NULL:2006/10/05(木) 23:29:54 ID:???
>955
小学校のときの「たのしいさんすう」って算数のノートに載ってたよ。
959NAME IS NULL:2006/10/06(金) 10:06:47 ID:???
>>956
pg_tables だったか、そういう名前のシステムテーブルをselectしてtable_aの存在確認を行うといい。
960NAME IS NULL:2006/10/06(金) 21:13:06 ID:bDRzLVyV
すまんおしえてくれ。
テキストボックスが4つくらいあってその中に文字入れて
DBから抽出したいんだが。
WHERE〜ANDで結ぶとテキストボックスに全部入力値がないと
抽出できないじゃん。
空欄のテキストボックスはスルーして入力された単語のみで
抽出するにはどうすればいいの。。。
961NAME IS NULL:2006/10/06(金) 21:52:29 ID:???
世にある検索の複数指定の多くがラジオボタンとかプルダウンってところから
察しろって気がするが。
962674:2006/10/06(金) 21:55:20 ID:???
VBAでそういうの作ったけど、SQLと全然関係ないじゃん。
まぁSQLステートメントの部分がって無理やりなら言えなくも無いけど。
963NAME IS NULL:2006/10/06(金) 22:05:43 ID:bDRzLVyV
>>961
なるほど、自分で入力した文字列だと
確実じゃないしね。確かに言われてみるとプルダウンとかが多いですね。


いくら調べてもわからなくて。
やはりDBから、元から値を取得して選ばせたほうがいいのかな。

それでも複数テキストボックスから抽出ってできるんでしょうか?
964NAME IS NULL:2006/10/06(金) 22:10:02 ID:???
SQLにテキストボックスなんてないぞ
いったいなんの話をしておるのだ
965NAME IS NULL:2006/10/06(金) 22:11:12 ID:???
環境がわからんから答えにくいんだが、WEBアプリとかだと
テキストボックスに検索条件をユーザーに入力させるのは
セキュリティ上かなり、アレなんだが・・・。

出来る出来ないの話しなら、そりゃ動的にSQL生成するか、
非常に無駄っぽいサブクエリがテキストボックスの分だけ
走る様に組んどけば可能だろう。
966NAME IS NULL:2006/10/06(金) 23:34:14 ID:???
IF テキストボックス1.TEXT <> "" THEN
    SQL = SQL & " AND 項目1 = " & テキストボックス1.TEXT
ENDIF

IF テキストボックス2.TEXT <> "" THEN
    SQL = SQL & " AND 項目2 = " & テキストボックス2.TEXT
ENDIF

VBなんて10年ぶりだ。

967NAME IS NULL:2006/10/06(金) 23:48:00 ID:???
むかしこのスレで、似たような話題が出て
おもしろいSQL紹介している人がいたよ。
過去ログ調べたら出てきた。

↓の312あたりから。
http://2ch.dumper.jp/0005090373/

968NAME IS NULL:2006/10/07(土) 06:00:19 ID:???
>>967
参考になった
彼のスレの313がなんでまともに動くのかわからんけど
323ならなるほどって感じ
そういえば最近のCodezineに3値論理の記事が出てたね

ttp://codezine.jp/a/article/aid/532.aspx
969NAME IS NULL:2006/10/07(土) 06:21:58 ID:???
てかMySQLじゃ動かねえなこれ
理屈は(unknown AND age < 20) is not falseはたしかになるほど
970NAME IS NULL:2006/10/07(土) 08:56:51 ID:???
>>964
すみません、Webアプリかにあるテキストボックスです。

>>965
セキュリティー上では良くなのですか?
勉強になります。

>>966
それをクリックイベントのところに記述するんですね!
項目っていうのは列名ですよね。
やってみます。

>>967
それはわたくし当てですか?
見てみます。
971NAME IS NULL:2006/10/07(土) 19:18:08 ID:???
質問です。
状況によって特定のカラムだけ欲しい場合と、ほぼ全てのカラム(の情報)が欲しい
場合があると思います。このとき、selectに指定するカラムの数によって実行速度や
DB負荷などはどの程度違うものなのでしょうか?
1.) select foo from hoge;
2.) select foo, bar, baz, quux from hoge; (あるいは select * from hoge;)

もちろんテーブル構造やDB規模によって異なってくるとは思いますが、指定した
カラム数によってDBの動きがどうなるのかが知りたいのです。
数が少ないほどメモリの消費量が少ないとか、転送量が減るとか、あるいは
テーブルのデータはメモリ上に載るのでカラム数が増えてもあまり気にするほどの
差はでないとかそういう感じで。。。

972NAME IS NULL:2006/10/07(土) 19:34:21 ID:???
>>971
そんなことよりインデクスが効いてるかどうかの方が重要
200倍くらい速度が違う場合もある
973NAME IS NULL:2006/10/08(日) 02:21:01 ID:???
>>971
そりゃ 出たviewのトータルバイト数が少ない方が、
全てにおいてメリットばかりっすわ。
逆にデメリットはないんじゃないの。プログラマの手間増えるぐらいか。
974NAME IS NULL:2006/10/08(日) 06:59:08 ID:1t6iDKSI
ここで質問してる人は実は仕事で行き詰ってる人?
975NAME IS NULL:2006/10/08(日) 12:16:30 ID:???
そりゃそうだろう、他に何の用途がある
976NAME IS NULL:2006/10/08(日) 13:39:19 ID:???
>975
パズル好き
977NAME IS NULL:2006/10/08(日) 14:00:39 ID:???
答えてるのはほぼ間違いなく暇人だがな
978NAME IS NULL:2006/10/08(日) 16:03:44 ID:???
質問させてください。
Windows 2000 に SQL Server 2000 をインストールして使っていました。
OSのホスト名を変更したのですが、SQL Server に昔のホスト名が残ってしまいます。
(レジストリを検索しましたが、ヒットしませんでした。)

SQL Server は、ホスト名をどこで管理しているのでしょうか?
また、変更するにはどうすればよいのでしょうか?
979NAME IS NULL:2006/10/08(日) 17:09:15 ID:???
>>978
つ Microsoft SQL Server 総合スレ 4
980NAME IS NULL:2006/10/08(日) 18:07:57 ID:???
MySqlが多いみたいだが仕事で使うのか?暇人は同意。
981978:2006/10/08(日) 19:04:37 ID:???
>>979
そちらで質問させてもらいました。
誘導ありがとうございます。
982NAME IS NULL:2006/10/08(日) 19:53:17 ID:???
ウチのサーバはMySQL。でも何故か3.0
983NAME IS NULL:2006/10/08(日) 22:02:02 ID:???
素敵やん
984NAME IS NULL:2006/10/09(月) 02:07:53 ID:???
SQLとはちょっと違うのだが一つ質問。
プロセス間通信のかわりにデータベースをメッセージパッシングのためのキューとして使うのってなんか問題あるのかな?
アプリ同士のメッセージ交換にActiveMQとかCORBAを使わずに簡単にできる方法としていいのかなと思うのだが。
そもそもデータベースってシステム内のスケールがものすごく広いグローバル変数だよな?
985NAME IS NULL:2006/10/09(月) 06:33:31 ID:???
>>984
AS/400(今はiSeriesか)でも使っとけ。
システム(OS)がDB以外にもDTAQ,OUTQ,MSGQ,SYSLOG等の
数々のキューが用意されている。

DB使うのは悪くはないと思うけどプロセスの数が増えて
メッセージの応答やらセマフォとか考え出すと、
自前でDB部に対してコーティングするのが
ウザくなってくるので、メッセージキューなんかはOSまかせに
した方がプログラミングが楽だ罠。
986984:2006/10/09(月) 14:55:26 ID:???
>>984
×スケール
○スコープ
..................................org
987NAME IS NULL:2006/10/10(火) 02:50:06 ID:0dcODXjr
下記の条件で商品数を集計したいと考えています。

しかし、原価のフィールドがNULLの場合、3つ全ての条件にヒット
しないため集計対象となりません。

原価フィールドにNVL関数を使用すると集計できますが、
もっといい方法がないでしょうか?

「NOT」の使用方法に問題があるのでしょうか?

商品A.原価=100円
商品B.上記以外 かつ 原価=1円以上 かつ 売値=300円
商品C.上記以外

商品A>商品B>商品C(商品A、商品B以外の全て)


SELECT
SUM(CASE WHEN 原価 = 100 THEN 1 ELSE 0 END) AS 商品A,
SUM(CASE WHEN (原価 > 1 AND 売値 = 300) AND NOT 原価 = 100 THEN 1 ELSE 0 END) AS 商品_B,
SUM(CASE WHEN NOT (原価 > 1 AND 売値 = 300) AND NOT 原価 = 100 THEN 1 ELSE 0 END) AS 商品C
FROM
商品管理表


988987:2006/10/10(火) 03:09:06 ID:0dcODXjr
>>987の質問に関連して

下記条件では原価がNULLのレコードが
ヒットできませんでした。

WHERE NOT 原価 = 100


下記条件だとヒットします。
WHERE NOT NVL(原価,0) = 100

データがNULLの際には特別な扱いが必要なのでしょうか?
989NAME IS NULL:2006/10/10(火) 03:12:16 ID:wLuxOSg2
>>987
T−SQL、PL/SQLなら、
AND ISNULL(原価, 0) <> 100

DB2なら、
AND IFNULL(原価, 0) <> 100

考え方はいいね。こういう部下なら教えても意味がある。OTZ
990NAME IS NULL:2006/10/10(火) 03:14:58 ID:wLuxOSg2
>>988
あれ?分ってるじゃん。
NULLは何に対しても偽になるよ。
逆に言うと計算をキャンセルさせるロジックとしても利用できる。
991987:2006/10/10(火) 03:23:38 ID:0dcODXjr
>>989 >>990
回答ありがとうございました。
参考にさせていただきます。
992NAME IS NULL:2006/10/10(火) 03:32:55 ID:wLuxOSg2
>>991
どうしても0に変換したくないなら
AND (原価 <> 100 OR 原価 IS NULL)
って方法もあるけど、データ量が多い時にOR入れると遅くなるよ。
993NAME IS NULL:2006/10/10(火) 11:58:04 ID:???
TABLE A
+---------------------+----+--------+
| time | name |
+---------------------+----+--------+
| 2006-05-27 14:01:07 | apple
| 2006-05-27 14:01:07 | apple
| 2006-05-27 14:01:12 | banana
| 2006-05-27 14:01:00 | orange
+---------------------+----+--------+

TABLE B
+---------------------+----+--------+
| time | rw | name |
+---------------------+----+--------+
| 2006-05-27 14:01:05 | w | apple
| 2006-05-27 14:01:07 | r | apple
| 2006-05-27 14:01:09 | w | orange
+---------------------+----+--------+

というテーブルがあり、Bのrwをtimeの値が大きいものから抽出し、Aの同じnameのデータを持つ行に追加した結果を得たいのですが、どうすればよいでしょうか?
よろしくお願いします。
994NAME IS NULL:2006/10/10(火) 14:05:45 ID:???
次スレテンプレ

【帰ってきた】SQL質疑応答スレ 3問目

参考リンク
http://www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html
http://oraclesqlpuzzle.hp.infoseek.co.jp/
http://www.techscore.com/tech/sql/

前スレ:【帰ってきた】SQL質疑応答スレ 2問目
http://pc8.2ch.net/test/read.cgi/db/1141622643/l100
995NAME IS NULL:2006/10/10(火) 14:31:03 ID:???
サンキュー、そのままたてた

【帰ってきた】SQL質疑応答スレ 3問目
http://pc8.2ch.net/test/read.cgi/db/1160458216/
996NAME IS NULL:2006/10/10(火) 14:33:19 ID:???
>>993
よくわからん、追加した結果がどうなるかも書いてみて
997小倉優子 ◆en0rG2J.f6 :2006/10/11(水) 06:07:26 ID:???
998小倉優子 ◆en0rG2J.f6 :2006/10/11(水) 06:08:27 ID:???
999小倉優子 ◆en0rG2J.f6 :2006/10/11(水) 06:08:57 ID:???
1000小倉優子 ◆en0rG2J.f6 :2006/10/11(水) 06:09:28 ID:???
1000ならジュースでも飲むか
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。