質問テンプレート ニックネーム: 1日のオナニー回数: けつ毛生えているか:Y/N 質問:
A=1という条件 AND(B=1またはB=2)という条件で検索する場合 どうすればいいでしょうか? イメージ的にはこんな感じです。 SELECT * FROM table WHERE A = 1 AND (B=1 OR B=2); もちろんこれじゃ上手くいかないのですが・・・。
>>5 それでいくはずだけど。
どううまくいかないのか
7 :
NAME IS NULL :2006/03/08(水) 16:35:38 ID:Fp38/AxV
何で試して、どう上手くいかないの?
>>5 たぶん5の環境なら
〜 WHERE (A = 1 AND B = 1) OR (A = 1 AND B = 2);
ニックネーム: らーめん 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レコードが 表示されないんですけどどうしたらいいでしょうか?
10 :
9 :2006/03/10(金) 11:54:33 ID:???
自己レス。 select id from A left join B on A.id=B.id and B.suu>5 でいけました、すまそ。
AとBひっくりかえすとか。 もう解決したみたいだが。
>>9 どんな要件なのか詳細はわからないが大抵の場合は外部結合せずにサブクエリで
解決でき、かつパフォーマンスはよくなる。
どうしてもleft join じゃないとだめなのかどうかよく吟味してみるべし。
脱線スマソ
>>12 嘘?俺は逆にサブクエリは外部結合で解決でき、外部結合の方がパフォーマンスいいと思ってた。
まぁ、ルールベースのオプティマイザの時ね。
相関サブクエリは極力避ける。
>>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 だったらだめだけど・・
15 :
9 :2006/03/10(金) 15:41:38 ID:???
みなさんありがとう。
>>12 俺もサブクエリより結合のがパフォいいと思ってたけど違ったのか・・。
>>14 下の方はsuuが5以下だったらでませんでした。
上の方はいけたんですけど構文の意味がわかりません、教えてください^^;
Bdashってなんでしょうか? 一瞬マリオかとオモタ
16 :
9 :2006/03/10(金) 15:51:52 ID:???
すみません、たびたび自己すれです。 Bdashはサブクエリの別名だったんですね。 つまり left join 後に BテーブルじゃなくサブクエリのBdashというテーブルが参照される ということなんですね。 勉強になりました。^^
17 :
12 :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帰ってくるし断然早い。
>>12 だけど
>>17 それ、微妙だと思うよ。
その相関副問い合わせだと、仮にtblAに100万件データがあると
SELECTリストのselectが100万回が4つで計400万回実行される。
インデックスはってなきゃ、死亡確実だし、インデックスあっても、
400万回のIndexScanはどうだろう?
非相関副問い合わせなら1回の4つで計4回しか実行されないけど、
みんな相関副問い合わせのコストわかってないね。
>>12 だけど、
というか比較するものが微妙だったね。
今、tblA,tblB共に100万件でOracleで試してみた。
・id列にインデックスなし
外部結合の方が圧倒的にはやい。(まぁ、インデックスなしはレアケース)
・id列にインデックスあり
外部結合:約10秒で最初の1件、約40秒で全件フェッチ完了
サブクエリ:約1秒で最初の1件、約90秒で全件フェッチ完了
まぁ、最初に書いたように、比較する対象、最初の1件か全件フェッチかで
変わってくるね。
21 :
12 :2006/03/10(金) 17:46:52 ID:???
>>19 検証どもです。
なんか盲目的に間違ったこと信じこんでたっぽいですね俺(汗
手元にあったMSDEでカラム数5個程度で1万件同士のテーブルで
やってみたら外部結合の方がコスト確実に低いし…_| ̄|○
>>13 です。
まぁ、そもそもケースバイケースだよね。
最初の1件を重視するか全件フェッチの時間を重視するかで変わってくるよ。
ユーザーと対話する画面とかなら、最初の1件返ってくる時間が短い、サブクエリの
方がいいと思うし、バッチとかなら、全件フェッチの時間が短い外部結合がいいと思うし。
俺もいい勉強になった。
まぁ、でも、最初に書いたように、全件フェッチするとなると、相関サブクエリは
レコード数増えるとレコードごとに相関サブクエリが実行されるので、何気に
コストがかかるってこと。
レコードごとに相関サブクエリが実行される、って、nested-loop joinのことか? index scanされたnested-loop joinは多くの場合最も速いし、そうでなくても 破綻が少ないと思うがなぁ。 それと、「外部結合」も「相関サブクエリ」もSQLの表現の話だけど、イマドキの DBMSは字面と実際のアクセスプランが一対一対応するわけじゃなし。 特に、相関サブクエリはプランナの技術が行き着いていて、内部的には ほとんどjoinと同じに扱われていると思うが。
>>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ならどうなるか知らんが、多分、無理だと思う。
mysqlのユーザ名に 数字のみやハイフンって使えるのでしょうか? マニュアルみてもちょっとよくわからんかったとです。
プランナの技術が行き着いてるとは随分、かしこいRDMSを使ってるんだな。 俺的には、まだ、中学生のレベルだと思う。一人前になるにはまだまだ。 人間の脳をなめすぎだよ。人間なら簡単にサブクエリを外部結合に変換できるけど、 それをコンピュータで簡単にできると思っているとは。 コンピュータができるのは単純なお決まりパターンしか変換できないよ。
>サブクエリを外部結合に変換 するなんて、まさに >単純なお決まりパターン。 なんだけど。
ぐたぐた言う前に実際に試してみろ。
オマエモナ
ヒント:
>>24 で実際にサブクエリが外部結合に変換されてない
世の中、RDBのかわりにExcelでデータを管理してる人がすごく多いんですけど、 いったい、なんでなんでしょうか?
33 :
NAME IS NULL :2006/03/14(火) 23:19:39 ID:wdw0js8n
Excelの画面が広くていろんなことができるからさ
34 :
NAME IS NULL :2006/03/14(火) 23:24:35 ID:kSfSoeFw
Excel vs RDB
Excelなら、VBAで個人で開発でき、いちいち、SIに仕事頼む必要もないし、 金もかからんからね。
ExcelとRDB比較するのは馬鹿のやること
同意。
でも、現実に本来DBでやるべきことを、Excelとマジカルなマクロを多様してやってるところって多いよ。 実際、現業務の分析とかでExcelシート渡されること多いし、マクロってなんつうかわからんし。w 関心するよ、へーこんな風にして集計したり、切り出したり・・・。 SQLなら・・・。
んでシステム組むと使い勝手悪い自由度低いと言われるんだよな
そういうユーザには自転車と車の違いを説明してあげよう
せめてアクセスを使えばいいのにな
43 :
NAME IS NULL :2006/03/16(木) 16:41:42 ID:nPRizLu0
自転車の例でいうと、自分専用にカスタムチューンしたロードレーサータイプだな。 それで好きなら車は不要な場面多いし。w
ただしABSもエアバッグもついてませんよ ってかw
45 :
蒸せ :2006/03/16(木) 20:34:02 ID:tLmkQ+0B
自転車にエアバッグついてても怖いんだけど…
47 :
NAME 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に一行追加する方が良いのでしょうか?
月 |肩書きid |肩書名 | 本文 通常はこのようにしておき、旧番号を残し、新規番号を追加する。 ただし、会社組織では組織ルールの方を優先させるから 組織のトップの方針に基づき設計しなければならない。
そういう使い方をしたいマスタには適用開始年月日と適用終了年月日を持たせる
postgresql8系使ってます。 SQLで任意ユーザの(若しくは自分自身の)所属するグループを取得する関数ありますか?
51 :
50 :2006/03/17(金) 20:57:59 ID:???
>>50 SELECT * from pg_group
SELECT * from pg_user
この辺で解決させました。
52 :
47 :2006/03/17(金) 23:17:24 ID:???
>>48 ,49
ありがとうございます。
趣味グラマーで勉強中なので
お二人のやり方を両方試してみます。
>>49 さんのやり方でいくと
例に挙げたようなマスターの更新(追加)と、
単純な肩書き名の訂正(上書き)が発生することを考えると
間違えて上書きしないようなロジックまで作らないといけないとか
プログラムって難しいですね。 > スレ違い
>>48 さんのでも肩書き名を「科長」とか間違えている時に
データを作られると修正が面倒だし.... > これもスレ違い
うーん、考えることがいっぱいだ。
53 :
NAME IS NULL :2006/03/19(日) 11:30:03 ID:w7DK1yew
今度、SQLを扱うことになったため勉強中の初学者です。 【所属テーブル】 ※実際には文字ではなく数字で管理している 名前|所属クラブ -------------------- 高橋|野球部 高橋|サッカー部 高橋|音楽部 鈴木|野球部 鈴木|秘密警察 斉藤|野球部 山田|サッカー部 山田|音楽部 ジョン|野球部 ジョン|サッカー部 ジョン|海外通販番組愛好会 というようなテーブルがあったとします。 このとき、「野球部とサッカー部の両方に所属している者の名前」 は、 どのように取得すれば良いでしょうか。 (この場合、「高橋」と「ジョン」が取得できればよい。) 「野球部 *または* サッカー部のどちらか、または両方に所属している者」という条件なら DISTINCT を付けるだけで理想の結果が得られたのですが……。 なお、システムはMySQL 3.23 (サブクエリやUNIONが使えない)、 1日のオナニー回数は2回、ケツ毛ありです。
SELECT 名前 FROM 所属テーブル WHERE 所属クラブ = '野球部' OR 所属クラブ = 'サッカー部' GROUP BY 名前 HAVING COUNT(*) > 1 MySQLはよくわからんけど、↑ではダメ?
55 :
NAME 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)側でカンマで区切って配列に格納しています。 一定期間の間ユーザが増減することはないので変更作業は気にしなくていいのですが、 こういう方法が一般的なのか、あるいはもっとスマートな方法が使われているのでしょうか? 「項目テーブル」ではなく、アカウントに対して項目を指定する「ユーザテーブル」を作ればいいのでしょうが、 入ってくるデータの関係上、「項目テーブル」のほうが入力しやすいのでこのような感じになっています。
普通に 項目, アカウント hoge, sato hoge, takahashi hoge, kato foo, ito foo, sato foo, kato foo, izumi でよいと思われ。
所属テーブル=名前×所属クラブ なので 除数リレーション= 所属クラブ --------- 野球部 サッカー部 とした場合 所属テーブル÷除数リレーション= 名前 --------- 高橋 ジョン このような演算を関係演算のひとつ、商演算という。 SQLでの書き方はいくつかあるのでググってみそ。 それと、商演算には割り切れるもののみを求めるもの(この場合、 野球部とサッカー部「のみ」に所属する名前を求める)と、そうでない ものの二種類があるので注意。
58 :
53 :2006/03/19(日) 13:24:10 ID:???
>>54 氏&
>>57 氏
お早いアドバイス、ありがとうございます。
これから試してみようと思います。
>>55 氏
なんか私と似たような話題になってる気がします(笑)
データベースの接続確認に使えるような NOP のような汎用的な SQL ってないですか?
60 :
NAME IS NULL :2006/03/19(日) 19:47:06 ID:yWTQ8jHa
SQL SERVER2000ですが、日付データが現在の日時の間なら データを返すwhere条件式ってどうやって書くのですか? DATEDIFF(d,GETDATE(), 日付)であってますか?
61 :
60 :2006/03/19(日) 20:00:52 ID:???
取れました。 あとRandomで取得する関数ってありますか?
>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: データベースはすでにマウントされています。
ORACLEからマニュアルをDLしてくれば? エラーリファレンスとSQLリファレンスと管理者ガイドとか。
>>64 NOMOUNTでCREATE DATABASEするんだべ
OracleでいうDATABASEと他のRDBMSのDATABASEは別物というのを知ったほうがいいかも。 CREATE DATABASEなんて、Oracleではわかってる人が使うものだと思う。
Oracleは1インスタンス1データベースなんでCREATE DATABASEは大概インストール時に終わってる。 DDLは処理系依存が大きいからOracleの専用スレで聞いたほうがいい。
生徒テーブルに得点カラムがあったとして、その得点による生徒数の分布を求めたいのですが、 こういったことはSQLで可能なのでしょうか?
>>69 得点1点ずつでよければ簡単に。
SELECT 得点, COUNT(*) FROM 生徒 GROUP BY 得点
71 :
70 :2006/03/22(水) 13:32:14 ID:???
SELECT 得点, COUNT(*) AS 生徒数 FROM 〜 のほうがよかったかな
72 :
69 :2006/03/22(水) 14:26:42 ID:???
>70 ありがとうございます。 質問の説明が不足していました。一点ずつではなく、下記のような範囲で結果を求めたいです。 0〜10点 -- 1人 10〜20点 -- 4人 20〜30点 -- 5人 ・ ・ ・
>>72 それだと、 10 点の人は 0〜10 と 10〜20の両方にカウントされるけどそれでいいの?
UPDATE HOGE SET TOTAL=(SELECT SUM(LENGTH) FROM HOGE WHERE 条件1) WHERE 条件2 で条件1に引っかかるレコードがない場合に 0 を設定してやりたいんですけどどうしたら良いでしょうか? TOTAL が NOT NULL 制約なのでこのままだと「NOT NULL 制約に違反してます」と出ます。
75 :
69 :2006/03/22(水) 15:40:06 ID:???
>73 ですね。。。 以下のような結果を求めたいです。 0〜9点 -- 1人 10〜19点 -- 4人 20〜29点 -- 5人 ・ ・ ・
SELECT 得点/10*10||' - '||得点/10*10+9,count(*) FROM 生徒 GROUP BY 得点/10; これだと0件が出ないか。 CASE文でカウントするのがよいかも。
>>74 SUM(LENGTH)
を
coalesce(SUM(LENGTH), 0)
でどうか。
>>77 オオ うまいこといきました。なるほどね。
>>76 ||って文字列の連結か何か?
自分の環境でやってみても上手くできないんだけど、なんかそういうの詳しく解説してるサイトとかないですか
あーすみません、|| はもしかしてPostgreSQL方言か・・・ おっしゃるとおり文字列の連結です。
oracleにもあるんじゃ。 演算子の方言は調べにくいので困る。
|| の文字列連結って ISO/ANSI 仕様だけど?
83 :
NAME IS NULL :2006/03/25(土) 12:40:30 ID:/SPcXai6
こういうシステムはこういう組み方にするといい、みたいな、 データベースの組み方の定石とかを勉強できるサイトってありますか? SNSをつくってるんですが、いまいちデータベースの組み方がわからなくて。。。
84 :
NAME IS NULL :2006/03/25(土) 12:40:43 ID:/SPcXai6
こういうシステムはこういう組み方にするといい、みたいな、 データベースの組み方の定石とかを勉強できるサイトってありますか? SNSをつくってるんですが、いまいちデータベースの組み方がわからなくて。。。
うわっ連投すいません
ここはSQLスレであって、 DBの構築や テーブル設計のスレではありませんぬ
良いテーブル設計なんて何やるかで千差万別なんだから定石なんてありようがない。
88 :
NAME IS NULL :2006/03/26(日) 14:59:09 ID:f0EsOhhE
オラクルで順序を作成する時に増分値をマイナスにしたときの デフォルトの開始値を教えてください。 僕の本には1と載っているんですが-1なんですか?
ここはSQLスレであって(ry
>>88 デフォルトは1では。
増分が -1なら、1,0、−1、−2となるのでは?
というか、デフォルトをあてにせず、
START WITH 句で指定しては?
91 :
NAME IS NULL :2006/03/27(月) 22:24:25 ID:G/iM8KCO
テーブル名に日付使えないですか?060329みたいなの 日付ごとにテーブル作りたいのですがなにかよい方法はありませんか?
作れば良いんでない? 日付のカラムを設けて1テーブルにするのが一般的だと思うんだが...
>>91 毎回日付のテーブル名でDDL組み立てて流すだけじゃだめなの?
DDL実行できるかどうかは環境(RDBMS, ミドルウェア)による。
94 :
91 :2006/03/28(火) 00:11:17 ID:???
>>91 >>92 ありがとうございます。
テーブル作成時にテーブル名もしくはカラム名が数字だけだとsyntax errorがでるので
質問してみました。
1テーブルに・・・ですか、なるほど。
月ごとにテーブルを作成して日付のカラムでやってみようと思います。
データにはIDと時間を入れるつもりです。
指定した日付・時間+ID(商品の内容)でIDを抽出したいのです。
商品のテーブルは別に作成し商品内容でしぼりこみできるようにしたいのです。
またか まったく同じカラムのテーブルを複数作る考えをする人が後をたたないな まあ好き好きかもしれないが、テーブル名まで意味のあるデータにしても メリットないぞ。まああとで気がついたらマージすればいいか
96 :
NAME 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') 教えてください。
メモリの許す限り
俺の許す限り
99 :
NAME IS NULL :2006/03/28(火) 11:08:27 ID:hOm5gZpT
つうか、そんなこと考える必要のあるINにすることを調べる暇あったら、代案考えるよな。 ミドルウェアとかの仕様もかむんじゃないのか?SQL文として許容される長さが2Kとかあるから。
100 :
NAME IS NULL :2006/03/28(火) 12:45:35 ID:+mR6V9Y6
データベースに入れた住所を県名で文字検索で検索しているが、 「京都」で検索したとき「東京都」まで引っかかるのでなんとかしたい。 住所の項目には、『京都府京都市中京区二条通堀川西入二条城町・・』とあるものも、 ただ単に『京都』と書いてあるだけのものもあるので 「京都府」で検索するのでは上手くいかない。 まず「東京都」を別の文字AAAなどに置き換えて、 置き換えたデータを「京都」で検索すれば上手く行くと思うが、 そういった処理はSQLで、出来るのか、まあはどうすれば良いか分からない。 MySQLを使っています。アドバイス求む。
>>100 はじめから都道府県だけでも別フィールドにする。
それ以下は合併とかあるから、あとはまとめてでもいいかもしれない。
それで検索するにしても、条件をもうちょっと詳細にしたほうがいい。 京都で始まるのか、京都が含まれててかつ東京都ではないものなのか、 京都の左が東以外、なのか
103 :
100 :2006/03/28(火) 13:46:33 ID:+mR6V9Y6
>>101 そのご指摘はもっともなことなのですが、
既にこれで運用しててデータも1万件ぐらいいれたので。
多少の誤差は起きても良いので入力のとき簡単なようこうしたのですが、
「京都」で検索したとき「東京都」が猛烈にヒットしまくって困ってます。
前方一致じゃ駄目なの?
105 :
96 :2006/03/28(火) 15:10:45 ID:FaApuw4t
106 :
100 :2006/03/28(火) 16:20:18 ID:+mR6V9Y6
>>104 企業の所在地が書いてあって営業所とかも含め、複数の住所が書いてあることもあるのです。
【兵庫県神戸市なんとか。京都府京都市・・・。・・・】ってな感じで。
なので前方一致では上手くいきません。
SQLでできる仕事じゃねーよ、それ。 ヒットした物の中から例外を除外する処理をしこしこ書くしか無いでしょ。 「福岡」→「上福岡」とか、「山口」→「山口町」とか、 チェックしなきゃならん物がどれほどあるか知らんけど。
できるけど、条件があいまいだから。
109 :
NAME IS NULL :2006/03/28(火) 17:07:29 ID:AmrQ8SKW
仕様がはっきりすれば正規表現を使えばいい
110 :
100 :2006/03/28(火) 17:36:12 ID:+mR6V9Y6
「福岡」→「上福岡」とか、「山口」→「山口町」とか、は 少ないから別に入ってもそんなに問題にならないからいいのですが。 京都→東京都だけはヒット数が多すぎてなんとか処理しないと使い物にならんのです。 「京都→東京都」だけ解決で出来ればいいです。
複数の住所が入ってて、京都と東京都が両方入ってる場合もあるしな “京都”単独で抜き出すための条件を書いてみてよ
[^東]京都 ぐらいしか思いつかん…orz
複数の住所が同じカラムにあるのなら、別のテーブル作って別処理で 入れていけばいいし、ついでに都道府県の判別もしてこういうカラムに 入れていくようにすれば、いざ検索するときは単純なSQLで済むし、 今後のためにもそうするけどなあ
複数の住所が1つのカラムにある=アトミックでない 標準的なSQL(SELECT)じゃむりぽ。
SELECT ADDRESS FROM JYUSHO_TBL WHERE ADDRESS LIKE '%京都%' AND ADDRESS NOT LIKE '%東京都%'
「京都府京都市なんとか。東京都千代田区なんとか」
WHERE ADDRESS LIKE '%京都%' AND (ADDRESS LIKE '京都%' OR ADDRESS LIKE '%。京都%')
郵便番号は入ってないのですか?
119 :
NAME 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つのカラムに二つの事実がある場合にはこれはもう
データベースとして問題があるから、思ったようにデータは取り出せないな。
MySQLだから答えにくいってのもあるんだよね ズバリ答えても使えなさそうで 専用スレで聞いた方がいいかもしれないよ
郵便番号も無くて住所しかないなら select distinct case when address like '%東京%' then null else address end address2 from jyuusho where address like '%京都%' order by address = null limit 1, 999999
122 :
NAME IS NULL :2006/03/30(木) 09:18:28 ID:WLIUzmVz
典型的に無意味なSQLの議論だな・・・。 すでにあるからしょうがないでその糞テーブルを使い続けるのか・・・。w それによる生産性の低下、実現困難になるデータの集計など考えたら、再設計だと思うが。
上司がこれで良いと言ったらこれが正しいのだ。
まぁ、一応上司にデメリット説明して、それでもいいと言うなら、責任とってもらえばいいじゃん。
すいません質問させてください。 SQLSeverで、URLの絞りこみを行いたいのですが、 「/」6つ目までの文字列を返すsql文は書けるものでしょうか?
126 :
NAME IS NULL :2006/03/30(木) 18:09:51 ID:DzbucjDX
まぁ、客先のテーブル設計にああだこうだ言い張るのもうっとうしがられるしな。 提案しても意見が通るとは限るまい。
127 :
NAME IS NULL :2006/03/30(木) 19:28:39 ID:ynO9LlOb
設計の悪いテーブルほとSQLのいい演習にはなる
誰が良い事言えといった
129 :
NAME IS NULL :2006/03/31(金) 09:22:00 ID:t8urZYae
でもそんなSQLの知識は普通は不要だな。 きちんとした仕事をしてる人は、アクロバチックなSQLは知らない。 パズル自慢してる奴はろくな仕事をしていないってこと。 本当に出来る人(火消しとかに突っ込まれる人)って糞設計があったら、こねくり回さずに捨てるよな。 所詮屑は磨いても屑だから。
それでも何とかするのがプロ 現場で動いて何ぼだよ
捨てれるかどうかは状況によりけりだな。趣味で作ってるデータベースならいざ知らず。
>129 >126
133 :
NAME IS NULL :2006/03/31(金) 12:26:02 ID:viY9dnFH
134 :
125 :2006/03/31(金) 12:31:23 ID:???
>>133 レスありがとうございます。
charIndexのことでしょうか?
最初に試したのですが、6回目のヒットを返すと言うことが出来ませんでした…
135 :
NAME IS NULL :2006/03/31(金) 13:14:34 ID:ovwj//lb
と MySQL のエキスパートが申しております
137 :
NAME IS NULL :2006/03/31(金) 17:42:16 ID:viY9dnFH
138 :
NAME IS NULL :2006/03/31(金) 22:13:13 ID:HHIOs9rj
>>129 >本当に出来る人(火消しとかに突っ込まれる人)って糞設計があったら、こねくり回さずに捨てるよな。
まじめに読んで損した。
シッ! 本人はまじめに書いてんだから
実務を知らない学者先生は理想論を唱える。 しかしながら、現場では無形の理想よりも形ある現実を優先させる。
誰が良い事言えといった
良い事か?
糞しかしらない末端は、それが全てだと思ってる。 糞仕様・糞実装を幾ら直しても、客の用件満たさないんだよ。 とくにDB周りは、致命的な設計ミスはその延長で作っても糞は糞。 ここで現場じゃどうしようもないと言ってるやつは、いつもチキンレースしてるだけ。
>>143 × 用件
○ 要件
カッコつけてても漢字知らんだけでヴァカに見えwww
おまえんとこはエンジニアふぜいが口出すのか。 エスカレーションも知らん会社にお勤めとはこりゃ悲惨だな。
146 :
NAME IS NULL :2006/04/02(日) 03:05:07 ID:SxF3YPE4
現在カラムが100ほどあるのですが、カラムをさらに100ほど追加し 1つのカラムに対してSELECTかけるとすると 現在のカラム数100と追加して200とでは処理速度に影響はありますか?
環境、システム構成とかOSとかによって処理性能が変わってくるので 一概に結果にどのように影響するかはわからない。 規模にもよるが、単純な比例ではないし、エラーで停止することもある。 答えを得るには、ターゲットで実際に動かしてみるしかない。
PARAM01、PARAM02、… とかいうオプション項目がひたすら並んでるならともかく 今まで大手銀行や保険やってきたが 1 テーブルにカラム 100 って見た記憶がないなぁ。
149 :
超初心者 :2006/04/02(日) 23:02:56 ID:WwyuTBf+
実はアクセスでがんばってきたのですが、SQLじゃないと そろそろだめだと、思い、無料のをダウンロードしてみたのですが、 テーブルやクエリなどの作りかたは、買った本でわかったのですが、 アクセスのようなフォームやレポートの作り方がないのです。 もしかして、SQL Server 2005というのは、必要なレコードの結果 だけをテーブルのリンク?みたいにしてアクセスのフォームで みるものなのでしょうか?
はい。データベースエンジンってのはそういうもんです。 SQL Server は知らんけど普通 GUI は付いておらず C, VB や Java なんかの 他の言語で作ります。
151 :
超初心者 :2006/04/02(日) 23:45:57 ID:WwyuTBf+
NAME IS NULL さん返事をありがとうございました。
日付を主キーとしたテーブルで、任意の日付に最も近い日付を前後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です。
153 :
152 :2006/04/03(月) 04:08:52 ID:???
最古(新)レコードを基準にすると面倒なことになりそうなので、やっぱり2クエリでやろうかと思います。失礼しました。
ニックネーム:ポプラ 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|
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に同じのが来ないように何かしら並べ替えできるというのが前提ですが。
日付型にしないのはなんで?
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
159 :
NAME IS NULL :2006/04/03(月) 18:51:23 ID:PWDWeczB
160 :
NAME IS NULL :2006/04/03(月) 19:42:34 ID:b8wx+sXJ
10:30〜15:00みたいに時間範囲を1つのカラムで表現できますか? 12:00のように指定時間で抽出したいのですが。。
>>160 RDBMSによると思うけど、普通無理なんじゃないかな。
TIME INTERVALってのがあったとしても、あくまでも時間間隔で、時刻から時刻じゃないから。
>>159 なんで焦りすぎなんだね?いいことじゃないか。
で、君はまず何の勉強から始めるつもりだね??
その本をちらっと見たが、HTML DBアプリを作るとかあるが、
ちょっと他の本の方がいいと思うぜ。HTML DBアプリなんて仕事で使ってるとこみたことないし。
CREATE TABLE HOGE(D INTEGER); INSERT INTO HOGE(D) VALUES(10301500); SELECT * FROM HOGE WHERE ((D / 10000) <= 1200) AND ((D % 10000) >= 1200); -- SQL で余剰ってどう書くか知らんけど。
164 :
NAME IS NULL :2006/04/03(月) 22:14:03 ID:A4wZsWSB
2006-1-1 てな多数のデータを 2006-01-01 に変えたいんですが、よい方法はないでしょうか? SQLの仕事ではない?
>>164 > 2006-01-01
これはDATE型? それとも文字列?
一旦、DATE型にキャストしてさらに文字列型に変換するといけると思うが。
ex)pgsql
SELECT '2006-1-1'::date::text;
>>164 基本的なUPDATE構文
変換は文字列関数を使う
ただし文字列関数は方言が激しいのでDBのリファレンスをよく見れ
はじめて、こちらで質問します。 code ------ 02 02 というテーブルがあったとして、 結果としては code COUNT ------ ------- 01 0件 02 2件 というふうに、実際には存在しない値も表示したい場合、 どのようなSQL文を作るべきでしょうか? code値の'01'が、他のテーブル値だったら外部結合にするだけで簡単なんですが、 文字列でしかないのです。 どうかご指導お願いします。
結合用のテーブルを作ればいいじゃん。
169 :
NAME IS NULL :2006/04/04(火) 09:27:29 ID:jEqObLh/
そもそも文字列でしかないって何処に01が存在するの? DB上?ロジック上? DB上なら外部結合で出来そうだし、ロジックだったらそれを通して取った後に加工するかしかないでしょ?
集計に関して悩んでます。 例えば 製品ケーキは原材料 小麦粉2個と卵1個とリンゴ3個を使ってます。 製品プリンは原材料 卵4個とオレンジ2個を使ってます。 ケーキ7個と、プリン4個の注文が入った場合、それぞれの原材料の数量をカウントする集計方法は、テーブルA(製品)とテーブルB(原材料内訳)を元にしてテーブルC(原材料エントリ)を作成し集計する方法がいいのでしょうか? それとも、他に方法があるのでしょうか?
171 :
NAME IS NULL :2006/04/04(火) 17:50:07 ID:GyIWhKO+
TableCはViewとかSelect結果でOKなんでしょ? 製造業のBOMの考え方そのものだけど、1階層なら普通にできると思うが。
172 :
NAME 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万件近くあり消去対象の文字が多いため何度も消去させるには少し時間がかかってしまうのです・・・
列の足し算はSUMでできたんですけど。 列の掛け算はどうやってやるんですか。
>>173 どんな掛け算を想定しているかわからないけど、一般論ではストアドファンクションを自前で作るしかないでしょうね。
掛け算だと、あっという間に数値の範囲を越えるから、その点だけ注意。でも、たぶんSUMのようには使えない。
SELECT EXP( SUM( LN( hogehoge ) ) ) みたいなので求まるだろうけと、あっという間に数値の範囲を超えるのは同じやね。 あとオーバーフローしないまでも誤差とか。
>174-175 さんのでサクッっと解決できました。 どうも、ありがとです。
まぁ、掛け算してもいいけど、0のデータを1件だけ入れとけ
質問お願いします Aテーブルのa句、かつ Bテーブルのb句から検索するにはどうすればいいでしょうか? select * from A where a & select * from B where b みたいな感じです
a, b って条件? SELECT * FROM A, B WHERE a AND b つーことか?
181 :
NAME IS NULL :2006/04/07(金) 10:29:52 ID:kx08W7Yf
日本語をまず・・・。
182 :
179 :2006/04/07(金) 10:47:25 ID:???
すいません、条件でした。
>>180 それだとa, b両方の条件に一致するデータになりませんか?
>>182 =179
もしかして、UNIONのことかな。
select * from A where a
union
select * from B where b
184 :
183 :2006/04/07(金) 10:50:35 ID:???
書き忘れ。UNION使うときは、個々のSQLが返すSELECTリストを一致させることを忘れずに。
UNIONとか
186 :
185 :2006/04/07(金) 10:51:52 ID:???
ウヘ 被ったスマソ
187 :
179 :2006/04/07(金) 10:59:11 ID:???
>>183 あ、それに非常に近いです、
ただおっしゃっている select リストが一致しなければ
ならないのが厳しいっぽいです。
カラム名が異なるので・・・・
説明が不足してました、すいません
目的は「データを表示したい」ではなく、
「該当のデータが存在するか」を調べたいと考えています。
188 :
NAME IS NULL :2006/04/07(金) 11:10:00 ID:IwmuPLeT
>>187 >カラム名が異なるので・・・・
カラム名に別名を与えることを知らない。
>「該当のデータが存在するか」を調べたい
EXISTSくらい調べれば出てきそうなものだが。
それ以前に情報を後出しするな。いちばん嫌われる。
存在確認だけならSELECT二回実行でもよさそうなものだが
190 :
NAME IS NULL :2006/04/07(金) 11:37:04 ID:IwmuPLeT
ある時点での存在確認なら、2回SQL投げるのはよろしくないのでは? たまたま更新とかが入ったらまずいし。
確かに… UNIONとSELECTで結果行が1行でもあれば存在、とか。
ちなみにWBCでボブを降板させられなかったのはUNIONの存在があったからである トリビアァァ
193 :
NAME IS NULL :2006/04/07(金) 13:00:02 ID:ecrvSKWK
195 :
NAME IS NULL :2006/04/07(金) 14:08:07 ID:LNBtOaeS
あーな賂愚
DROP DATABASE hoge_* で hoge_abc や hoge_def を一気に削除したいのですが、 上手くいきません。 間違ってるところあったらよろしこです
>>196 コマンドラインだけじゃフツーにムリでしょ。
DROP DATABASE hoge_abc;
DROP DATABASE hoge_def;
…
と記述したSQL文をバッチで走らすしかないのでわ?
>>196 1.テーブル名を取得できるディクショナリを見つける
2.SELECT 'DROP DATABASE '||TABLE_NAME FROM うんちゃら WHERE TABLE_NAME LIKE 'HOGE_%'
3.2とファイルに書き出す
4.書き出したファイルをSQL実行する
これが普通のやり方かな?
初歩的な質問だと思いますが、副問い合わせで得た値をUPDATE文のSET句に使うことはできますか? UPDATE emp SET salary = ( SELECT MAX(salary) FROM emp WHERE empno = 123 ) WHERE empno = 456; 見たいな事をしたいのですが。
>>200 RDBMSによる。環境あるならやってみるのが一番。
MySQLですがだめでした。
UPDATE emp,emp as emp2 SET salary = max(emp2.salary) where emp2.empno = 123 and emp.empno = 456 みたいなことは出来ないのかな?
>>203 それってwhere句がどこにかかってるかわからんよ。
205 :
NAME IS NULL :2006/04/09(日) 17:24:30 ID:ZDhYCRCX
お知恵をお貸しください。 テストの点数によって、「優良可不」の評価をつけたいとします。 #評価テーブル [評価]|[点数_以上]|[点数_以下] ------------------------------- 優|90|100 良|80|89 可|60|79 不|00|59 #成績テーブル [氏名]|[点数] ------------------------------- あああ|66 いいい|95 の2つのテーブルを用意し、 あああ|可 いいい|優 というように、成績評価ができるSQLは作れるでしょうか?
select 氏名,評価 from 成績テーブル,評価テーブル where 点数 between 点数_以下 and 点数_以上
207 :
205 :2006/04/09(日) 17:36:54 ID:???
早速お返事いただきありがとうございます。 あっというまに解決してしまいました。 知識不足をさらしてお恥ずかしい限りです・・・
208 :
NAME 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も問題なくレコード作成されるのですが 何故でしょうか?
209 :
NAME 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 などで検索してみましたが、有益な情報が見つけられなかったので。 よろしくお願いします。
oracleならnvl()使え 他ならcase〜when〜使え
列B,列C が同じ型かつ、どちらか一方が必ずnullであるなら select 列A,列B from テーブル where 列B is not null union select 列A,列C from テーブル where 列C is not null これでもいいよ 俺ならnvlだな
>>208 エラーメッセージ等の内容がわからないとなんとも。
権限は大丈夫?
214 :
208 :2006/04/10(月) 12:36:36 ID:???
>>208 ありがとうございます。
エラーメッセージすらでないのです。
$resultにはResource id #5 などと帰ってきています。
権限については同じ$dbhandle にてSELECT文は実行できましたので
問題ないと思うのですがいかがですか?
215 :
208 :2006/04/10(月) 13:54:11 ID:???
orz すいません。。。。。 ×$spl ○$sql の記述ミスでした。。。 ;y=ー(゚д゚)・∵. ターン
216 :
NAME 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 〜
サブクエリにして、外で計算
218 :
NAME IS NULL :2006/04/11(火) 12:36:31 ID:nLSgyURu
質問です。 違うデータベース名のテーブルとの結合はできますか? やり方を教えていただけませんでしょうか。 --- DBnameA --- --- DBnameB --- | --table1-- | | --table2-- | | No | | No | | name | | value | --------------- --------------- table1とtable2の結合がしたいです。
RDBMSによるんじゃねの? SQL Serverはできるが。
220 :
NAME IS NULL :2006/04/11(火) 12:58:20 ID:3o22UbSY
>>218 DBMSは?
違うDBってのは起動マシンとかも違うのか?
221 :
NAME IS NULL :2006/04/11(火) 12:59:15 ID:nLSgyURu
外部からSQL Serverに接続してます。 具体的にどうすればよいですか?
んな感じ select name,value from DBNameA.dbo.table1 table1, DBNameB.dbo.table2 table2 where table1.No=table2.No
223 :
218 :2006/04/11(火) 13:10:36 ID:nLSgyURu
できました! ありがとうございます!
224 :
NAME IS NULL :2006/04/11(火) 16:31:04 ID:36H0vpy0
全レコードのカラムAのデータをカラムBにコピーするような方法はありますか? 一ずつ読み込んで入れていくのが妥当でしょうか?
あります
226 :
224 :2006/04/11(火) 17:16:38 ID:???
>>225 ありがとうございました。
UPDATEでできたんですね、助かりましたぁ!
>>225 ちゃんと答えてやらないと、わかんない奴になっちゃうよ
>>224 UPDATE tablename SET カラムB = カラムA
1つずつ読み込むとかの「手続き」は、RDBMSまかせ。
228 :
224 :2006/04/11(火) 17:47:28 ID:???
>>227 ご親切にどうもありがとうございます!
まだDBいじりはじめた所で^^;;
がんばって勉強します。
postgresqlでデータベースの操作権限をあるユーザーのみに許可したい場合どうすればいいのでしょうか。 grant/revokeでテーブル単位の権限付与は出来たのですがデータベース単位では出来ませんでした。 mysqlでいうところの GRANT ALL ON hoge.* TO hoge_user@localhost に当たる事をしたいと思っております。
質問させて頂きます。 oracleで以下のSQLを実行したときと同等の結果を出力するSQLを ACCESSで作りたいのですがどのようにすれば良いでしょうか。 SELECT 1,2,3 from DUAL UNION ALL SELECT 4,5,6 from DUAL テーブルは何も使用しないことが条件です。 DUALに相当する機能があれば出来そうですが、わかりませんでした。
>>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
>>231 すばやい返事ありがとうございます。
自前でダミーの表を用意すればよかったのですね。
おかげで上手く動きました。
これでいろいろ過去の資産が流用できます。
すんません質問いいでしょうか テーブルAにABC三つの列があって A列昇順でかつ中身が空のやつを先頭に持ってきたいのですが SELECT A,B,C FROM Table_A ORDER BY A,B,C ってやるとうまくいかないっぽい なんかいい方法ないでしょうか?
>>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的には順序の保証はないのだろうけど。
>>234 どうもありがとう!
ちょっとやってみまつ
>>235 IsNull か NVL で、
列を変換しちゃったら?
でも、データ量多いと、激烈に遅くなるけど・・・。
237 :
NAME IS NULL :2006/04/14(金) 12:07:35 ID:yImA1Zrj
SELECT A,B,C FROM Table_A ORDER BY A Is nullA,B,C
こんにりは。 キー|名前 | 交通費 ーー+ーーーー+ーーーーー 1|小泉 | 1000 2|ブッシュ| 50 3|フセイン| 300 4|ブッシュ| 1500 5|小泉 | 500 ーー+ーーーー+ーーーーー 交通費の合計が最大の人物の名前を求めるにはどうしたらいいですか?
交通費が同じ人がいるならmax使ってでんでん。 いないなら、交通費を降順にソートして最初の一件を取り出す、というのが手っ取り早い。
「交通費の合計が最大」じゃまいか?
あう
242 :
238 :2006/04/15(土) 19:21:13 ID:???
select キー,名前,合計select キー,名前,sum(交通費) from 秘密会談 group by 名前,キー order by sum desc limit 1; でできました! やっぱりlimitがいいんですかね。maxはこういう時には使わないのが定石ですか?
243 :
238 :2006/04/15(土) 19:24:38 ID:???
あう、242だと確かに交通費の合計が同じ人がいるとまずいですね。 View使わないと無理ですか?
>243 1クエリでっつーんなら、 インラインビューか EXISTS使った相関サブクエリかな。
245 :
NAME 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では、文字列を加工した場合というのは、別名はつけられないのでしょうか。
DB2スレへどぞ〜
as がネェな。ケツの穴でも突っ込んどけ
248 :
245 :2006/04/16(日) 16:50:55 ID:???
246> DB2スレがあまり動きがなかったようなので、こちらで質問させて いただきました。 247> 回答ありがとうございます。 文字列を加工しない場合、asがなくても別名指定できていたんです。 加工する場合はいるということでしょうか? とりあえず、DB2スレで質問してみます。ありがとうございました。
MAX() のような集計関数を CREATE FUNCTIONで自作したいんですけど、 自身のテーブルを取得するにはどうしたらいいですかね。
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のようにするしかないんでしょうか?
251 :
NAME 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
252 :
NAME 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
253 :
NAME IS NULL :2006/04/18(火) 08:35:24 ID:JdZlOdJq
ありゃりゃ…もうダメだ…
>>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
でどうよ?
255 :
NAME IS NULL :2006/04/18(火) 22:57:03 ID:BgW55tF/
postgresqlなんですけど text形式のカラムに - をデフォルトで入れたいのですが エラーで設定できません。なにか方法はありませんか?
CREATE TABLE X(A TEXT DEFAULT '-') で何か不都合でもあるのか?
257 :
NAME IS NULL :2006/04/19(水) 02:27:21 ID:0RBlEwHY
誰か教えてください
259 :
NAME IS NULL :2006/04/19(水) 02:50:50 ID:0RBlEwHY
テーブルのデータをCSVファイルに出力する方法を誰か教えてはくれませんか? よろしくお願いします。
おーい、エスパー お呼びだぞー
261 :
251 :2006/04/19(水) 06:07:55 ID:???
>254 ちょっと例題を単純にしすぎてしまったんですが(くっついちゃってるし)、 列Aは降順というだけで必ず1づつ減ってる訳ではないんです。すまん。 DBは Pervasive.SQL 2000i つうのなんだけど、ためしに>251のデータで テーブル作って>254のSELECT文やってみたらエラーになっちゃった。
>259 ODBC設定してExcelかAccessでインポートして、CSV形式でアウトプットする。 この回答で満足できないのであれば、環境ぐらい示せ。 おいらはエスパーではないし、ここの住人も大概エスパーではない。。
ORACLE 8.16 で WINですが、 SQLで 2006/02/15 に半月を加算したいのですが +15では 2006/03/02になってしまいます。 大の月小の月に 半月や1/3月を加算するのには どんな考え方したらいいんでしようか? 関数などで対応可能でしょうか?
265 :
NAME IS NULL :2006/04/19(水) 16:31:32 ID:++s2VMjx
つうか、貴方の半月の概念って教えて欲しいよ。 3/16に半月足したら3/31?4/1?
>>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日と月末がすべてのポイントであって、
それ以外は仕様として却下なので算出する機能も付与しない。
こんなもんなら、実現できるっしょ?
グループウェアとかスケジューラだったら、これで十分。
この定義に賛同しないやつはペルソナノングラータってことで・・・。
>265 さん 4/1になります。 ただ 今回の件は 締日(5日、10日、15日、20日、25日、 末日) に半月や 1/3月を足して集金日を算出したいのです。 2/15に+15したら 3/2になってしまったら半月後にならないので 2/28になってほしいのです。
そう組め 以上
>>267 集金日が不定日って、業務的にどうなんよ?
一定法則で固定日で法則付ければにすればすむことじゃねーのか?
固定法則にせずに、あえて15とか定数を日数を加算するのは、なんの意味があるんだ?
もうね、SQLとかプログラミングとかじゃなくて、
業務分析とリエンジニアリングが必要なレベルだと思うね。
その要求仕様つくったやつが、馬鹿すぎの基地外だわさ。
ふつうは、そんなことできません!って、要求受けるときに
断るか、別提案をしてるね。してない時点で、もう、k;えじゃヴぃあだfsだ・・・。
そんな要求受けちゃって作ってるPGの方、大変だね。
あとでバグの責任、おしつけられちゃうよ。
ご愁傷様。
まで読んだ
>半月や 1/3月を足して集金日を算出したい 半月の場合と1/3月の場合があるって事か? 締日 集金日A 集金日B 05日 当月20日 当月15日 10日 当月25日 当月20日 15日 当月末日 当月25日 20日 次月05日 当月末日 25日 次月10日 次月05日 末日 次月15日 次月10日 こういう事?
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
>
>>266 お時間を割いていただいて恐縮です。
パッケージソフトの仕様で
月2回締とか3回締とか出来るようになっているんですが
集金日は1回しか設定できないようになってるんです。
定数15は2回締めはマスタに15という定数が3回締めは10が
入ってたんで便宜的に使ってたというのが実際です。
で、もうサポートも切れかかっているしベンダーとも疎遠なので
エンドユーザーの馬鹿が考えているわけなんですが。。。
でも 商習慣では月に2回締めて2回集金や3回締めて3回集金
などは結構あるとは思うんですが 特殊なんでしょうかねえ
考えられる条件を全て割出してFUNCTIONを作ろうかなと今は
ぼんやり考えています。
おさわがせしました。
math を music に改ざんされてセキュリティ的な不具合があれば NG。 単に表示がおかしくなるとかユーザの不利益になるだけなら OK。 てか (1) と (2) ってユーザから見える見えない関係ないじゃん。
>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じゃ無くなってきましたね。
そういうときは、締め日と集金日を対応させたテーブルを 別に用意して結合させるとよいよ
277 :
NAME IS NULL :2006/04/19(水) 18:46:03 ID:uBoJgKdo
>>274 ありがとうございます。
>てか (1) と (2) ってユーザから見える見えない関係ないじゃん。
サンプルで書いたのでそうなってしまいました。
たとえば、ユーザによってmusicしか見せないとかの条件が増えると、
>math を music に改ざんされてセキュリティ的な不具合があれば NG。
が効いてきます。
>>276 わかりました!!
集金予定のカレンダーテーブルみたいなのを作れば
いいんですね。
解決できそーです。 ありがとうございました。
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
>>278 だから「一定法則」って言ったんだけど・・・。
言葉が足りなかったね・・・。
「締切日-集金日マスタテーブル」みたいなものを作れ!
だったね。
っていうか、それさえも考えてなかったってことね・・・・・。
俺の言葉と思考と配慮が足りなかったっす・・・。
ごめんなさい。
281 :
NAME 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レコードでセレクトするという方法 はあるのでしょうか?
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 となるってことか?
という前提で 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'
284 :
NAME IS NULL :2006/04/21(金) 10:45:31 ID:CX6yg83T
Postgresスレでも書いたのですが反応がないので、こちらで質問させて下さい。 連番のプライマリIDをふる時に、numeric(n)とvarchar(n)のどちらのほうがいいでしょうか。 感覚的には文字列比較のvarchar(n)より、数値比較のnumeric(n)のほうが 速くていいのではないかと思うのですが。 うちの昔のシステムはなぜかvarchar(n)で0詰めなんですが、何か意味があるんでしょうか。
>>284 文字列連番は0パディングとかで順列に並ぶけど、それってもともと数値だからってことだよね?
だからnumericのほうが良いかと。
あなたのとこの旧システムのことなんかは知らん。けど、自分が経験したのでは、汎用機との
データ交換のため、数字→文字列変換が頻出するので相手のレコード定義に合わせて文字列に
したことがあります。
286 :
NAME IS NULL :2006/04/21(金) 11:09:33 ID:tbOfvmy1
>>285 >文字列連番は0パディングとかで順列に並ぶけど、それってもともと数値だからってことだよね?
はい、そういうことです。
理由がない限り、numericにします。
そのほうがシーケンスで連番をとったときの処理も少しだけだけど楽だし。
ありがとうございました。
NULLで検索するにはどうすればよいでしょうか? 指定カラムに何もデータが入っていない行を抜き出したいのです。
291 :
NAME 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 ステートメントを、データ取得操作と組み合わせることはできません。」 と出るのですが、構文としておかしいですか? 戻り値を変数に入れて返したいのです。
output パラメータにデフォルト値指定できるんだっけ? なんにしても SELECT @PRICE=TANKA, @QUANT=SURYO FROM SYOHIN WHERE HINCD=@HIN_CODE この部分だけ見れば別に問題は無いので、 一度他の変数で受け取ってからoutputパラメータに入れるとか試してみれば?
>>293 PostgreSQL スレで馬鹿晒したからってこっちまで荒らしに来るなよw
(´,_ゝ`)プッ
297 :
NAME IS NULL :2006/04/22(土) 18:46:43 ID:YssWFDXh
299 :
297 :2006/04/22(土) 19:10:02 ID:???
>298 JAVAで組んでると思うのでスレ違いですが、JAVAのこと分からないので コチラで質問投げてみました。 趣味グラマーの自分でもこんな作り方したことない&見たことないし、 SQLインジェクションとか考えたらこんな作り方しないですよねぇ。
300 :
NAME 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かけているようです。 もっといいやり方がありましたらご教授ください。
301 :
NAME 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番目だけに行いたいのですがよい方法はありませんか?
>>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);
303 :
300 :2006/04/23(日) 08:42:15 ID:???
SQL-SERVERって書いてるな・・・。 すまそ。 SQLServer2005ならROW_NUMBERサポートされてるっぽいが。
304 :
302 :2006/04/23(日) 08:45:53 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 とかになっちゃうけど、実際どっち?
306 :
NAME 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が最大の行と結合したいです。
307 :
NAME 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パラメータのない↑のストアドの戻り値を取得するには どのような記述になるのでしょうか?
アーカイブログを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');
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です。どういうクエリーを書いたらいい でしょうか。
>>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
311 :
309 :2006/04/24(月) 10:50:12 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
313 :
NAME 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です。宜しくお願いします。
>>300 そんなにレコード数が多くないなら、
#Tempで一時テーブルにInsert Into〜 Select して、
その#TempにIdentity列を生成して、通番を確保して、
その通番列と比較する、って方法もあります。
ただ、これって、一時テーブルを毎回生成するので、
複数のクライアントから連続して投げ込まれると、
サーバが大変だったりします。
でも、レコード数が少ない場合は、結構有効な手段ですよ。
>>313 都道府県別にGroupしてMax値をとるサブクエリを埋め込んだ、
もとのテーブルの値と比較するクエリをつくれば、
いっぱつで出てこない??
で、313さんにしつもん。
最大値を持つ同じ都道府県のレコードが複数あったらどうすんの?
select * from table where (都道府県, 数) in ( select 都道府県, max(数) from table group by 都道府県 )
317 :
NAME IS NULL :2006/04/25(火) 11:48:24 ID:2WcMpKNa
ある検索システムなんですが、検索に正規表現を使えるようにしようかと思っています。 このシステム自体はどのDBMSでも(小さな修正程度で)対応できるようにしたいと思っています。 ですが、SQL標準には正規表現検索機能はなく、各DBMSが独自に拡張しているものですよね。 だから正規表現検索に対応していないDBMSもあるかもしれないわけです。 で、実際問題、正規表現検索に対応していないDBMSというのはあるのでしょうか?
正規表現検索はDBの独自拡張なので、使用方法はまちまちだし 検索できないDBもいっぱいある さらに、DBの正規表現検索は全カラムを走査するのでひたすら遅い だから普通は検索用indexを別に用意する
319 :
NAME IS NULL :2006/04/25(火) 14:12:49 ID:2WcMpKNa
>>318 うん。で、正規表現検索に対応していないDBMSとは
具体的にどれでしょうか。
320 :
NAME IS NULL :2006/04/25(火) 15:14:13 ID:9aFhrn60
321 :
NAME IS NULL :2006/04/25(火) 15:21:36 ID:2WcMpKNa
>>321 は、馬鹿なうえに師匠も友達も居ないから2chで質問するわけで。
323 :
313 :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 都道府県、数
これで合っていると思うのですが、どうでしょうか。
>>321 >このシステム自体はどのDBMSでも…
具体的にどれとどれに対応すんの?
話はそれからじゃない?
データベース関連の会社で働いている方、 でデータベースにデータを入力する仕事ってどのぐらい金とってる? お客に一番大変なところはエクセルに入力させて、カラム20で3千行というか3000件で、 客の知らないソフト使って裏でコピペして流し込むだけで、幾ら取っている?
それがSQLに何の関係が。
スレがないからご迷惑を承知で聞いています。なにとぞ緊急の要件上お答えくださらぬか。。。。。
緊急だということが、SQLに何の関係か。
食いつくな、おしゃぶり暇か?知らないならほっとけ、ペイペイには、わかるわけないから
何語?
ヒント: 縦読み
おまえおしゃぶり暇人?かって
>>325 は、馬鹿なうえに師匠も友達も居ないから2chで質問するわけで。
その他は、馬鹿なうえに師匠も友達も居ないから2chで質問のレスをするわけで。
ツマンネ
へえ。 それで?
知ってる。リアルタイムで見てたから。 で?
平静を装っているレスほど、必死なのがミエミエってことだ。
> プライマリIDをふる時に、numeric(n)とvarchar(n)のどちらのほうがいいでしょうか。
340 :
NAME 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)のどちらのほうがいいでしょうか。
548 NAME IS NULL 2006/04/20(木) 18:32:27 ID:gTr1CKh8 質問させて下さい。 プライマリIDをふる時に、numeric(n)とvarchar(n)のどちらのほうがいいでしょうか。 感覚的には文字列比較のvarchar(n)より、数値比較のnumeric(n)のほうが 速くていいのではないかと思うのですが。 うちの昔のシステムはなぜかvarchar(n)で0詰めなんですが、何か意味があるんでしょうか。
342 :
NAME 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% みたいな使い方をしたいのですがどうでしょうか?
b.NAME% が無理 oracleだと b.NAME || '%' とかすりゃいける
344 :
NAME IS NULL :2006/04/29(土) 22:23:17 ID:7TpjCHZg
>>313 ,323
PostgreSQLならdistinct on使えばいいんじゃあるまいか。
select distinct on (都道府県) * from table order by 都道府県, 数 desc, 値;
345 :
NAME 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で繋げる以外に短く書ける方法はありませんでしょうか?
>>345 標準的なSQLでは無理です。
hogeやhageの位置が明確なら、別の列にしておけば、IN句で一致を見ればいいんですが、
たぶんそういう構造のデータじゃないんだよね?
in条件の中でLIKE条件を使うことはできないのですか?
>>347 できませんよ。INはあくまで()内の列挙のなかから一致するものを探す処理。
もちろんIN句の中に正規表現が書ける素敵RDBMSもあるかもしれませんが、寡聞にして知らず。
>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
350 :
349 :2006/05/01(月) 22:25:56 ID:???
あ、>349 は >346の「別の列にしておく」案が使える場合って感じで 見てくれるとありがたい。
351 :
sql :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より高い会社の名前をあげよ。 という問題なのですが、複雑すぎて、よくわかりません。 教えてください。お願いします。
>>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も同じように段階的に考えれば解けるはず。がんばれ。
353 :
NAME 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 を出力して、あとはロジック側でうまいことまとめ上げるのが正しいのでしょうか。
>>353 SQL、つまりRDBでは原則として元になるタプルも、結果として得られるものも、カラムは
アトミックである必要があります。その意味で、お求めの結果は、ご自身で書かれている
ようなSQL外の処理が正しいかと。
ただクライアント/サーバで、その処理がクライアントで頻出するなら、なんとかサーバで
処理したいですよね。
と、偉そうに書いてて具体的な処理は思いつきませんでしたとさ。ごめんなさい(´・ω・`)
tagname の数が決まってるなら出せる
356 :
353 :2006/05/02(火) 18:48:08 ID:XQqSpU3B
>>354 さん
さすがにid, config, tagsetを得るSQLを投げて、
結果の各行に対してtagsetに対応するtagを得るSQLを投げなきゃならんのか、と
最初はそう思っていたので… ← 初心者過ぎ
SQL外で処理する方が正しそうですね。ありがとうございます。
>>355 さん
tagnameはユーザが任意で設定可能なんですよ… orz
357 :
NAME IS NULL :2006/05/10(水) 13:53:41 ID:osiC7ill
358 :
NAME 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になる形で取得したいのですが、どのようにすれば良いのでしょうか?
>>358 外部結合。処理系で書き方が微妙に違う。
from topics left outer join comments on topics.id = comments.topic_id
360 :
358 :2006/05/12(金) 04:41:49 ID:???
>>359 おぉ!そんなふうにやるんだったんですね!
MySQLでそのままの構文でいけました!
で、また一つ問題点がでてきまして、コメント0件のトピックもきちんと取得できたものの、count(*)の項目が「0」ではなく「1」になってしまいます。
1件と0件を識別するうまい方法はないものでしょうか?
361 :
358 :2006/05/12(金) 05:02:09 ID:???
自己レスです。
count(comments.id)にしたらできました。
>>359 さん、どうもありがとうございました。m(_ _)m
362 :
358 :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; よろしくお願いします。
coalesce(max(c.posted_time), max(t.posted_time))
364 :
358 :2006/05/12(金) 14:04:16 ID:???
>>363 まさにそんな感じのが欲しかったんです!
(実際にはcoalesce(max(c.posted_time), t.posted_time)でうまくいきました)
どうもありがとうございました!!
365 :
NAME IS NULL :2006/05/12(金) 16:30:21 ID:GztnNXkK
5,7,15,16,99,200... みたいな不連続な数値の入ったフィールドがあって、それを 1から始まる連続した数値になるようにUPDATEしたいのですが、 どうすればいいのでしょうか? MySQL+Perl+DBIです。
366 :
NAME IS NULL :2006/05/12(金) 16:36:40 ID:Yg59p/eg
日付カラムと時刻カラム分かれているときに、 ○日○時から×日×時までのデータを取得するにはどうすればいいのでしょうか?
簡単な備品管理DBを作ってるんですが, カテゴリAに入力する項目が「名前」「場所」「備品番号」 カテゴリBに入力する項目が「名前」「値段」「購入年月」 カテゴリCに入力する項目が「場所」「使用者」「現在状況」 だった場合, データの登録テーブルには「ID」「column1」「column2」「column3」 のようにフィールドを定義して, カテゴリ定義テーブルには「カテゴリID」「カテゴリ名」 カテゴリ情報テーブルには「カテゴリID」「column1のタイトル」「column2のタイトル」「column3のタイトル」 のようにDBを作成したんですが,何かもっとスマートな方法はありますか?
368 :
367 :2006/05/12(金) 18:44:13 ID:???
>>367 データの登録テーブルに「カテゴリID」が抜けてました.
「SELECT * FROM 備品」で並べたいのか? 備品{ID, カテゴリID} カテゴリ定義{カテゴリID, カテゴリ名} A備品{ID, 名前, 場所, 備品番号} B備品{ID, 名前, 値段, 購入年月} C備品{ID, 場所, 使用者, 現在状況} 備品{ID, カテゴリID, 名前, 場所, 備品番号, 値段, 購入年月, 使用者, 現在状況} カテゴリ定義{カテゴリID, カテゴリ名}
特定のフィールドの現在の値にSを付けたいんですが、 どんなSQL文を使えばいいでしょうか? ちなみに mysql です
SELECT ('S' || FOO) AS SFOO FROM BAR
372 :
370 :2006/05/15(月) 03:26:39 ID:???
>>371 レスありがとうございます。
UPDATE を使う必要性はないんでしょうか?
>>372 一時的にSの付いた値が欲しいのなら
>>371 でいいし、
Sの付いた値に更新(UPDATE)したいのなら、
UPDATE bar SET foo='S'||foo;
374 :
370 :2006/05/15(月) 14:49:19 ID:???
>>373 ありがとうございます、
しかし、なぜか上手くいかないのです。
上の例は bar テーブル、foo フィールドですよね?
SETが上手く機能していないようです。
mysqlなら update bar set foo = concat('s', foo);
データベースサーバにあるファイルをPL/SQL経由でアクセスに渡したいのですが どういう風にすればよいでしょうか?(データパンプの結果をアクセスに送ろうとしてます)
377 :
NAME IS NULL :2006/05/17(水) 11:52:10 ID:/bcXyhaw
多分ORACLEだと思うけど、マニュアルで調べろ、ファイルアクセス用のパッケージがあるよ。 そもそもですれ違い。
378 :
NAME IS NULL :2006/05/18(木) 20:15:30 ID:F00yGgO9
DBに一番最後に追加したデータを取りたいのですが、 これを取る方法って無いでしょうか? last_index_rowid()は今回の接続の最後の行数が分かるだけですので使えません。 いつの接続かは不明だけど、一番最後に追加されてるデータの内容を知りたいのです。 Indexはつけていますが、対象は一つずつあがるタイプではないですし歯抜けがあるため 使えません。 DBはSqliteです。 どうかよろしくお願いします。
素直に datetime(または date と time の2つ) か timestamp 系のフィールド作って 更新時刻をログするのが確実なんじゃね?
380 :
NAME IS NULL :2006/05/18(木) 20:30:28 ID:F00yGgO9
>>379 それはログテーブルを作って、トリガーで最終更新だけを入れておいてそこのデータを使って
読み書きするってことでしょうか?
SQLだけでDB内のデータを四則演算してから出力する方法はありますか? id a b ------- 0 10 20 1 15 20 このようなDBがあった時、id毎にa+bを求め id ans ------- 0 30 1 35 と出力したいのです。
事故解決しました。 スンマセン
オラクルのPL/SQLの質問です。 例外処理でEXCEPTIONのあとによくみかける RISE;って何してるんですか?
>>383 RAISEちゃうの?ここのスレにはなじまないからオラクルスレへ
たびたびすみません。 複数のテーブルで求めた列の和を、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 こういう結果を得たいのです。
先に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してください。
387 :
NAME IS NULL :2006/05/20(土) 21:01:36 ID:iy7XMW5q
年度 店舗 個数 金額 ... 上みたいなDBから指定した年度で、店舗ごとの千円未満の商品の個数の合計、 千円以上1万円未満の商品の個数の合計、1万円以上の商品の個数の合計を 出したいんですが。
>387 SELECT 年度, 店舗, 商品 SUM(個数) 個数, SUM(CASE WHEN 金額 BETWEEN 1000 AND 9999 THEN 個数 ELSE 0 END ) 千円以上,個数, SUM(CASE WHEN 金額 > 9999 THEN 個数 ELSE 0 END ) 一万以上,個数 FROM てーぶる
>>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
相関サブクエリーについて、理解できない部分があるので教えてください。 以下のような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なのですか?
INは右辺が集合体になるときに使う。 =は右辺がスカラーのときに使う。
>388 GROUP BY ぬけてっぞ…。
393 :
390 :2006/05/21(日) 20:27:42 ID:???
>>391 教えていただきありがとうございます。
S.商品コード IN [結果セット] としたとき
[結果セット] が集合体になるのはなんとなく理解できるのですが
結果セットが 0 件の場合は、どのように扱いになるのかが知りたいのです。
このような場合を IN の右辺値を直打ちした場合
S.商品コード IN (NULL)
のような感じになるのでしょうか?
これで S.商品コード = NULL を評価した結果、不定になるという考え方で間違いありませんか?
(ちなみに、S.商品コード IN () では構文エラーになりました)
>393 INを使ったとき、 右辺の集合の件数が0件だろうが1億件だろうが、 左辺の値がそこに含まれていたらTrue そうでなければFalseだ。 S.商品コード IN (NULL) とは違う。 これはNULLというデータが1件ある集合体だ。
395 :
390 :2006/05/21(日) 22:46:53 ID:???
いろいろとありがとうございます。 S.商品コード IN [サブクエリーの結果セット = 集合A] とした場合、結果セットが 0 件であれば集合Aは空集合となり その空集合には S.商品コード と等しい値は含まれないため必ず FALSE になる という考え方をすればいいのですね。 ずっとモヤモヤしてたんですがスッキリしました。 ありがとうございました。
397 :
NAME 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) ; どこがいけないのか分かりません。 よろしくお願いします。
398 :
NAME IS NULL :2006/05/24(水) 13:06:53 ID:MDtixMev
lunch.priceをselectにそのまま入れるのが悪いだろ。selectには入れるな。 あと、havingでmax(lunch.price)でやってるのに、何でgroup byにlunch.priceをやると havingは全く意味ないだろ と、いうわけで全てにおいてダメなSQLってことで終了
SQL2000のINDEXDEFRAGで一時的に排他ロックが起こる事に対して、 何で排他ロックをするのかって理由を教えてほしいのですが…っ 漠然とイメージでしかわからなくて、参考文献とか見ても載ってないんですよね
400 :
397 :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('福井','石川','富山')
;
こんな感じにしてみたのですが、解答には近くなっているでしょうか?
402 :
NAME 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」が間違っているのでしょうか?
>>402 うまくいかないのが、構文エラーなどで実行できないのか、期待してるデータが削除されないのか
はたまた人とのコミニケーションがうまくいかないのか・・
>>402 hogeがテーブル名になったりカラム名になったりしてるから、例示が悪い。
それではわからんよ。
・サブクエリが使えないDBMSである
406 :
NAME IS NULL :2006/05/26(金) 16:44:18 ID:ANkJk1m3
下は ・テーブル名 フィールド名 etc・・ ・スコア設定テーブル (省略) ・期間中出現回数検索テーブル プライマリキー スコア設定テーブルプライマリキー#これを複数入れたい。 検索期間 登録日時 こんなテーブルがあって、上に書いてあるように「期間中出現回数テーブ」ルの一つのレコードに 「スコア設定テーブルプライマリキー」を複数設定(可変)にしたいのですがどのようにフィールドを設定すればいいですか? MySQLを使用するので、一つのフィールドに複数項目入れられる型も使えるのですが、 今後違うデータベースに移行する可能性もありSQL全般で使用可能な方法で構築したいです。 どなたか良い方法があったら教えていただけると嬉しいです。
407 :
NAME 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のみでやる方法はあるのでしょうか?
>>407 SELECT name FROM table AS T1 WHRER rw='r' AND NOT EXISTS (SELECT * FROM table WHERE rw='w' AND name=T1.name);
409 :
NAME IS NULL :2006/05/27(土) 16:40:52 ID:bNSDh8D4
410 :
408 :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'のみってのが発生しえないときのみと限定されるが、 データのばらつき次第ではこちらの方が速そう。
411 :
NAME 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に追加できる ようにしたいのですが,どうするのが一番賢いやり方でしょう?
412 :
NAME 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 これはどういう理由からなのでしょうか?回避策とかありますかね?
初歩的な質問になります。 同じようなテーブルが2つあって今はSQLを2つで実行していますが whereに指定する条件文が同じなので 1つのSQLにまとめられないかと思ったんですが どのように書けば良いでしょうか? よろしくお願いします。
>>413 SQLのテーブル名だけ変えたいってこと?それとも一緒にSELECTしたいってことかな
まとめなくてよいというか、 まとめることに意味が無いと思ったんですが どうでしょうか?
一緒にselectしたいです。 別のプログラムの中に組み込んで使ってるので SQLが2つだと無駄に長くなってしまう気がしたのです。
unionの結果セットに対してwhere使う。 効率悪そう。
>>411 正規化
>>412 0x5C問題かな? 詳しくはMySQLスレで聞くほうがいい。
>>417 WHERE したあとUNION (ALL) した方がよくね?
まぁ、SQL2つをUNIONで一つにしても長さはかわらん、つーか増えるがw
419 :
418 :2006/05/30(火) 12:27:26 ID:???
補足ってか蛇足。 WHEREとUNIONの順序なんて、昨今のDBなら プランナやオプチマイザが勝手に判断してくれそですね。
複数表を一緒にSELECTしたいって時点で、 ・見かけ上の型にとらわれて、データの持つ意味を見失っている ・同じ意味を持つデータが複数表に分裂・重複してる(設計が悪い) と、思ってしまいました。 実際やるなら、みなさんが言ってるUNIONでしょうね。
回答ありがとうございました。 まとめない方が良さそうみたいなのでこのままやってみます。 もう1つなのですが、前述の条件に加えて selectで指定するものも一緒でもやはりまとめない方がよいでしょうか?
ケースバイケースだよ、それは。
423 :
NAME IS NULL :2006/05/30(火) 18:23:38 ID:+JwpeOWp
>>418 ありがとうございます。MySQL板で聞いてきます
424 :
NAME IS NULL :2006/05/30(火) 18:24:40 ID:+JwpeOWp
Mysql板なんてないわ。(-o-;
作れw
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を起動できるでしょうか?
適切なスレに行ってください。
質問です。 ■旧会員テーブル 会員番号,氏名 1,山田 太郎 2,山田花子 3,西村 博之 4,福原愛 ■新会員テーブル 会員番号,氏名 1,田中太郎 2,山田 太郎 3,西村博之 4,今夜山田 この様に苗字と名前の間に半角や全角のスペースがある状態で 旧会員テーブルと新会員テーブルの両方に存在している人の、 新会員テーブルの会員番号(2と3)を出力するには、 どの様なSQL文を書けば良いのか教えてください。
>>428 DBによっては正規表現による置換をサポートしたものが有りそうだが、
replace(replace(Oldtable.name,' ',''),' ','') = replace(replace(Newtable.name,' ',''),' ','')
こんな感じで空白を排除した氏名で結合しちゃえばいいんじゃね。
ところで氏名にカタカナがあったりするとその全角半角の違いとか出てきそうだし、
やっぱ入力の前に統一処理した方が良さそうだな。
ただ、空白削除すると苗字と名前の区切りが判りにくくなる名前の人も居るだろうけど。
430 :
428 :2006/05/31(水) 22:50:19 ID:???
>>429 ありがとうございます。
ORACLEのPL/SQLなんですけど
それでやってみます。
なんで福原愛なんだろう……
例えば 日付 名前 20060511 AAA 20060515 AAA 20060527 AAA 20060423 BBB 20060510 BBB 20060601 BBB のような日付が違うだけで名前が重複するような所から 日付が最新の各名前を取ってきたい場合どのように書けばよいのでしょうか?
433 :
NAME IS NULL :2006/06/02(金) 14:44:39 ID:o5lzJQYZ
>>432 select 名前, max(日付) from table_name
group by 名前
ありがとうございます。
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の位置が気に入らない。 わがままで申し訳ありませんが、もしこのような要求を満たせるようなソフト をご存知でしたら、ご教授いただきたくお願いいたします。 #ソフトウェア板の方が良かったでしょうか……?
436 :
NAME 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の位置が気に入らない。 わがままで申し訳ありませんが、もしこのような要求を満たせるようなソフト をご存知でしたら、ご教授いただきたくお願いいたします。 #ソフトウェア板の方が良かったでしょうか……?
CSEで試したら、お好みの状態になっている気がする
んだんだ 積み木 だね
439 :
NAME IS NULL :2006/06/02(金) 22:56:48 ID:o6G0qQ0K
同じ主キーのレコードを、 まだcommitしてない別のトランザクションから それぞれinsertしたら、どうなる? どのタイミングでエラー?
>>439 DBによって違うだろ。
PostgreSQLはMVCCが効いてエラーにならんし。
>>439-440 PostgreSQLはよく知らないが、共有ロック方式でもマルチバージョニング方式でも
書き込み動作同士は普通に排他ロックがかかると思うけどな。
トランザクション1でinsert
トランザクション2が同じキーでinsertした時点でロック解除待ち
トランザクション1がcommitしたらトランザクション2はキー重複エラー
トランザクション1がrollbackしたらトランザクション2のinsertは正常終了
442 :
440 :2006/06/03(土) 07:38:57 ID:???
あースマソ、updateと勘違いしてた。
>>440 に書いたのは間違い。
PostgreSQLでも
>>441 と同じはずです。
つうか3分あれば実験できるよな 実験しないで聞こうなんて輩は開発に向いていn(ry
444 :
436 :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か……。
ともあれお二方には大変感謝しております。どうもありがとうございました。
Oracle9i+UNIXでテーブルの内容をCSVに出力したいのでSPOOLを使おうと思っています。 ただ、そのままだとcharやnumber型の項目が全て固定長で出力されます。 例えば4バイトのchar項目で項目未設定の場合は、[, ,]と、半角スペース4バイト分が 出力されてます。同様に数値型はその型の最大バイト桁が前スペース埋めで出力されます。 (100だと[, 100,]となります) 型に合わせて出力するためこうなるのでしょうが、これを前後スペースなしの可変長で出力 する事はできないのでしょうか。SELECT句でTRIMをかけてもダメでした。 一旦CSV出力用の全項目がvarchar2型のテーブルにコピーした上でやるしかないのしょうか。。。
446 :
445 :2006/06/03(土) 11:08:31 ID:???
すいません。自己解決しました。。。
447 :
NAME IS NULL :2006/06/03(土) 13:21:31 ID:gFdCglmk
住所テーブルを作成しようと思うのですが、一般的に↓くらいの領域で大丈夫ですか? 県 → char(8) 市区郡 → char(20) その他 → char(50)
PostgreSQL にして text 型にすれば OK
449 :
447 :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 '%東京都%'
>>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件ですし。
また最近では「日本国東京都」なんて書く人もいますから、結局人の目で確認
せねばなりませんが。
s/日本国//g;
DISTINCTって select DISTINCT AAA, BBB, CCC みたいに書くとどれに適用されるんですか?
>>452 普通はタプルに効くから、AAA,BBB,CCCの組み合わせでは。
はじめまして よろしくご教授お願いいたします。 概要:SQL-serverのデータベースに300,000件(30万件)のデータを BCPコマンドを使用してアップロードした時に、インポートは うまく行きません。 事象:エラーの内容は、1件目から、日付項目にエラーと出るのですが、 実際はデータ的に問題ありません。 (※@ 既にそのデータは、ローカル間の環境での試験には成功しています。) (※A 200,000件(20万件)のデータでのサーバー間での環境では成功しました。) 懸念:今回、失敗したのは、@のサーバから、BCPコマンドをたたいて、 AのサーバのDBにデータをインポートします。 ローカルのPCでの作業ではうまく行ったで、サーバー間の環境では うまく行かないため、何かしら制限があるのかと思いました。 やはり、サーバー間同士だと、なにかしら、数の制限があるのでしょうか? SQL-serverのデータの許容範囲の設定のところは十分クリアできるデータサイズです。 いろいろ、試行錯誤したんですが、わかりません。 どなたか、知識ある方は教えていただけると、助かります。 すみません。m(_ _)m
455 :
NAME 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>
>>454 スレ違い
つ Microsoft SQL Server 総合スレ 4
>>456 了解です。 失礼しました。 m(__ __)m
>>455 要件の日本語がちょっとおかしいのは、考え方がおかしいからだと思う。
強引にそのままSQLにするなら、
SELECT * FROM テーブル
WHERE (商品, 登録日, 品目) IN (
SELECT 商品, 登録日, MIN(品目)
FROM テーブル
WHERE ( 商品, 登録日 ) = ( SELECT 商品, MIN(登録日) FROM テーブル GROUP BY 商品)
GROUP BY 商品, 登録日 )
一時表使うとかしたほうがいいと思うけど。てか、推移従属とか入ってない?
>>458 サブクエリの中のサブクエリとの比較、=だけどINに訂正します
指定したテーブルの全項目に対する問い合わせを簡単に行う方法はありませんか? イメージ的には、 select * from 'TABLE' where * like '%hoge%' のように考えています。 よろしくお願いします。
>>460 ありません。
RDBでは各項目はアトミックで独立したものが原則。
共通の条件で…ってのは、共通の要素を内包しているということですから、この原則に反しています。
462 :
460 :2006/06/07(水) 13:50:46 ID:???
>>461 理由まで書いて頂き、納得しました。
プログラム側でSQLの発行の仕方を考えます。
ありがとうございました。
463 :
800 :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 |
464 :
800 :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文で済ませたいのですが、無理でしょうか? 分かりにくいかとは思いますが、どのようにクエリを出せば良いかご教授願えればと思います。 よろしくお願い致します。
>>463-464 名前欄は800でまた質問するってこと?w
ご希望の結果を得るには、OUTER JOINについて調べてみてください。と、ヒントだけ。
【売約テーブル】 【在庫テーブル】 予約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です。どうかご教示ください
>>466 抽出結果の上2行と下2行は性質が違う問い合わせなので、
別に求めてUNION ALLで連結することをすすめる。
468 :
463 :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 です...
質問なのですがSQL*Plusでuser_constraintsを使い制約を見ようとするとズラーっと出てきてしまい、最初の方が消えてしまいます 特定の表の制約だけを見たり、消えないように表示することなどは可能でしょうか? 学校のPCなので環境や設定は変えられません
470 :
NAME IS NULL :2006/06/08(木) 09:25:03 ID:zVJdgrU1
よろしくご教授お願いいたします って普通に使う?
>>469 WHEREでTABLE_NAMEを指定するとかset spoolでファイルに吐き出すとか
473 :
NAME 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);
さきに注文テーブルとユーザテーブルを結びつけて、それを商品テーブルと結合するときに、結合条件に加えちゃったらよさそう。
474 :
463 :2006/06/08(木) 21:30:01 ID:???
>>473 遅くなりましたが、レス有難うございます。
なるほど結合させたテーブルと結合とかも出来るんですね。
勉強になりました。いろいろ試してみます。
475 :
455 :2006/06/08(木) 23:31:00 ID:???
>>458 一時表作るパターンのも作ってみたのですが、
教示していただいたsqlのほうが性能良かったです。
ご教示ありがとうございました(感謝)。
476 :
NAME 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
DBMS固有のお話は、そっちのスレへどうぞ。
その、そっち、をおしえて
479 :
476 :2006/06/09(金) 14:17:49 ID:???
質問、Oracle 総合 sessionというところ移しました。
MySQL 4.1.15 (XP) varchar(50) default nullに設定していても、そこにindexを設定するとnullは入らなくなるんですか?
481 :
NAME IS NULL :2006/06/09(金) 21:06:36 ID:6nTbXVX3
下位10件の取り方がわかりません。 TOPを使って上位10件取るのは簡単ですが その逆って関数のようなものはないのでしょうか?
483 :
481 :2006/06/09(金) 22:30:11 ID:???
やってみたら出来ました でも、パラメータとして@IDなどをwhere条件式に入れるとエラーが・・・orz
何が言いたいんだかさっぱりだ。 エラーが出るなら逆順にソートしなくてもエラー出るだろ
SELECT DISTINCT ON (n, nb) n, nb, other FROM result_linpack;
>>486 dクス。
でも、そもそもまだDISTINCTとDISTINCT ONのきちんとした仕様を
ちゃんと理解できてないオレガイル。
もう一回、おさらいしてきます。
488 :
NAME IS NULL :2006/06/12(月) 14:14:54 ID:A68TTZqN
テーブルのキーとして、コンピュータIDというものがあります。 いまテーブルにはコンピュータIDが1の行がひとつだけあります。 この行の内容をコンピュータID=2、コンピュータID=3としてコピーする場合は どのようなクエリを書けば宜しいでしょうか。
insert into TABLE select 2 as コンピュータID,〜 from TABLE where コンピュータID=1 insert into TABLE select 3 as コンピュータID,〜 from TABLE where コンピュータID=1
490 :
NAME IS NULL :2006/06/12(月) 14:59:59 ID:A68TTZqN
>>489 速レスありがとうございますた。
それでやってみようと思います。
491 :
NAME IS NULL :2006/06/12(月) 23:54:41 ID:FXISZQXM
駄スレですいません。 SQLの初歩的な質問をしたいのですが、この板でよろしいでしょうか?
駄スレとは何だこの野郎
select COUNT(*) from TABLE; のCOUNT句(関数?)って、単独でしか使われないんでしょうか? select COUNT(*), col1, col2 from TABLE; select COUNT(col1), col2 from TABLE; といったことは出来ないんでしょうかね? PostgreSQLでは、SQL自体がエラーになりました。
>>493 よく考えてごらん。
何の数を数えてるの?
group byを併用
496 :
493 :2006/06/13(火) 22:21:55 ID:???
>>494 うーん、SELECTの結果に、常に特定のカラムのカウント値を入れておきたい、
というようなことは、ナンセンスなんですかね。。。
>>495 ありがとうございます。group byを調べてみます。
>>496 Oracleの分析関数使えば、特定のカラムのカウント値入れることは可能だ。
>>497 それだとOracle依存になりませんか?
SQL-92だか99だかで標準だと、select句で使えるcountは1つなのかな。。
調べてみます。
だから、何の数をかぞえてんだ。 試しにテーブルとデータを用意して、自分の求める結果を 書き出してみな。
重複する行を集計するクエリで、下の二つのうち どちらの方が早いのでしょうか? 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
>>500 インデックスとオプティマイザによる。
1のSQLだと、2に置き換えて実行するRDBMSって多いんじゃない?
だって1は相関で、馬鹿正直にやったらURIAGEを何度も全件検索しなきゃならない。
だったら2で一気に出したほうが正解。
もちろんインデックスとかで、1が有利になるケースは十分考えられる。
実験結果に明示的な差がないなら、件数を増やして再試験するか、
実用上、問題がないならどっちでもいいんじゃない?
>>500 SHYOUHINって商品マスター的なテーブルじゃないんだな。
単純にBROUP BY code とした場合、どのくらいの行数になるんだろうか?
何分の1とか極端に少なくなるのだったら、1.のexists述語を
HAVING句へ持っていったほうが速そう。
>>501 が言うように
URIAGE.codeにインデックスが効かなきゃダメだけど。
>>500 「SHYOUHIN」なんてローマ字は止めて欲しいんだがな…。
まあ500がカラム名を決めたわけじゃないのかもしれないが。
コード| 名前 |タイプ |有効 | 順位 -------------------------------------------- 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を使えばもっと簡単にできるかと思うのですが、なかなかうまく書けません。 簡潔にいく方法はありますでしょうか。
このスレでFAQ化している題材だよ。
506 :
NAME IS NULL :2006/06/18(日) 14:31:09 ID:hiv9Xv4W
JAVAでSQLがベストですか?
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 そのままの名前使ってるわけではないので・・・
>>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
509 :
NAME 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
510 :
502 :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なら「う」もヒットしたいんじゃ?
mysqlのselect文中で、最近7日間のうちに更新されたレコードだけを取り出すときはどうすればいいでしょうか? timestampのカラムはありますが、これを使えますか?
512 :
509 :2006/06/20(火) 22:19:43 ID:???
>>510 そうなんです。
再帰的に結合すると、階層が固定なら読めるんですが
不定だったらやっぱり無理ですかね。。。
プログラム内でごりごりツリーを検索するしかないかな。
ありがとうございます
>-- ところで、グループコード=1なら「う」もヒットしたいんじゃ?
そのとおりです(><)
513 :
NAME IS NULL :2006/06/21(水) 09:22:10 ID:ub7tfZIU
>>510 標準でもSQL99だっけ?Withかなんかで実現可能になってるはず。
@IT に記事があったような。
ただ、準拠してるDBMSは少ないけど。
質問があります。 テーブルからランダムに1個レコードを取得しようとしています。 ただ、全部のレコードが同じ確率でではなく、 例えば全部で10レコードあったとして、1個目が30% 2個目が20%…というように それぞれ選ばれる確率が異なるようにしたいのです。 こういう場合、どのようにしたらいいのでしょうか?
>>514 SQLで書けるかな?書けてもかなり制限が強い(ランダムは数値のみとか)+冗長で処理が遅い
ものになりそうな気がする。まともに考えてないから、確言はできませんが。
素直にアプリケーション処理またはストアドプロシージャを使うのがよろしいのでは。
516 :
514 :2006/06/21(水) 17:11:13 ID:???
>>515 レスありがとうございます。
なるほど、SQLでどうにかしようとは考えない方が良さそうですね。
ストアドプロシージャというものを知りませんでしたので、
検討してみようと思います。どうもありがとうございました。
517 :
502 :2006/06/21(水) 23:25:39 ID:???
>>513 WITH RECURSIVE っすね。実装したDBってあるんでしたっけ。
最近PostgreSQLしか使ってないし、しかも8.0まででいまだにメインは7.2か7.4系なんで...
昔は早く実装してくれりゃいいなと思ってたが、connectbyを使ったり、入れ子型にしたり
してしのいでたからすっかり忘れ(ry
select count(*) count from tbl_1 aliasにcountって使うのって何か問題ある?
>>518 RDBMSによっては予約語扱いされてるかも。だから汎用性はないね、って問題だけかと。
関係ないけどaliasするならASを書いてくれるほうが、個人的には好き。
521 :
518 :2006/06/23(金) 12:59:11 ID:???
>>519 レスTHANKS。
そーいや、大文字と小文字にこだわる人結構いるのかな?過去にもあがってそ。
where派
WHERE派
やっぱ予約後は大文字だろ、とか。
Where派とかもいそうだけど。
おいらはどっちでもいいだろ派。ま、区切りのスペースは一つがいいよなとは思うけど。
522 :
NAME IS NULL :2006/06/23(金) 13:01:59 ID:XClUlwys
DBMSによっては、SQLの実行キャッシュで大文字小文字を区別するようなのがあったような。
>>522 Oracleがキャッシュしだした頃(Oracle7だよね)、そういう仕様だったね。今の仕様は知らない。
524 :
NAME IS NULL :2006/06/25(日) 01:27:24 ID:i+iXipeb
フィールドの結合についての質問です (かなりアホな質問だと思います) FIELD1:文字列 FIELD2:文字列 この二つのフィールドを結合するさい、AccessVBAでやっていたときは ずっと [FIELD1]&[FIELD2] みたいな書きかたをしていました 最近たまたまDelphiからAccessのmdbをいじる機会があり 文字列をくっつける場合は MyStrSQL:=MyStrSQL+・・・・ な感じで、&ではなく+を使うと知りまして じゃあフィールドをくっつける場合はどうなんだと & + 両方ためしたら、結果はどっちもOK どっちも動くんだからどっちでもいいというのもやっぱり不安で どっちが正しいのか知りたいなと
>>524 > & + 両方ためしたら、結果はどっちもOK
スレ違いの予感
ID ユニーク Date 日付型 2006-06-25 Text テキスト型 mysqlで、↑のようなテーブルを作りました。 これを、年月ごとの件数を取得したいと思い悩んでいます。 Select count(ID), Date From テーブル Group By Date これだと年月日ごとになるし、どうにかして、年月ごとの件数として 取得できないものでしょうか?
>>526 Select count(ID), EXTRACT(YEAR_MONTH FROM Date) From テーブル Group By 2;
Group byにカラム番号指定していいかどうかは自信がない。。
>>528 ありがとうございます。
期待通りの結果が得られました。
>Group byにカラム番号指定していいかどうか
試してみたところ大丈夫でした。けど、一応ASつけて別名で指定しました。
530 :
NAME 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
table1 --- key1, key2, data table2 --- key1, key2, quantity 上記のようなテーブルがあったとして、table2 を key1 と key2 で Group By して、 Sum(quantity) を取ります。その結果と、table1 を結合したいのですが、 どんな SQL を書けばよいのでしょうか?
>>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)
533 :
NAME 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
>>533 ストアドプロシージャ、または、ユーザープログラム側で動的SQL生成をしましょう
>>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の方がましなことに気づく俺・・・
>>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が使えないのかな?これは。どういう条件か
わからんとね。
537 :
NAME IS NULL :2006/07/03(月) 07:24:40 ID:3bEKjJDE
ド初心者です、お助けください。 このSQL文の意味を誰かご指南ください。 SELECT商品.商品番号,商品名,価格+消費税 FROM商品.販売実績 WHERE商品.商品番号=販売実績.商品番号 AND商品LIKE"%パソコン%" よろしくおねがいします。
ピリオドとカンマがごっちゃになってる気がするが・・ FROM句のはカンマじゃない? ANDの後は商品名じゃない? 販売実績テーブルの商品番号が含まれる 商品テーブルのうち、商品名に"パソコン"が含まれるものを 商品番号、商品名、価格(税込み) の順番で取り出せ。
539 :
NAME IS NULL :2006/07/03(月) 13:30:11 ID:KGeeSO0Z
ありがとうございました。 ANDの後は商品名でした。参考になりました。 感謝します。
540 :
NAME 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 ・・・・
日付用のフィールドに全角数字プラス「月」「日」ですかい。
MSDEのストアドについてですが、スレッドのSleepのように他の処理にCPUパワーを 割り当てることコードは描けないのでしょうか、CPUパワーが20%程度で動いてる システムが、集計処理を走らせると100%になり全体に影響を与えてしまうので こまってます。担当者は、Sleepみたいな処理は無いというのですが、どうなんでしょう。
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
>>543 MySqlがどうかわからないけど標準的なupdate文じゃね?
UPDATE 表 SET a=a||b, b=a||b
これ使えねえの?
>542 5分スリープ waitfor delay '00:05:00' でもうまくCPUパワーが他所行くかはわかんないや
>542 SQLServerスレに投げたほうがいいとは思うが…。 集計処理用と、通常処理用のDBを別に作成し、 別インスタンスでそれぞれ立ち上げておき、 それぞれのインスタンスに対してCPUの割り当てをすればいいかと。 詳しくは、BooksOnlineで「CPU インスタンス」あたりで研削してくで。
547 :
NAME 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'; こう書いたら余計なレコードが残ってるのか、セッションが切れてるはずなのにわらわら取れてたまげました。
>547 Status = 'ACTIVE' じゃだめ?
>>548 Statusってマニュアルとかいろいろ見たけど
ActiveとInactiveの差がよく分からないっす。
550 :
NAME IS NULL :2006/07/10(月) 17:48:20 ID:H/gE7eDk
SQL-SERVERです。 ストアドで引数や変数などの値によって ORDER BY 項目を変えたいのですが可能でしょうか?
>549 INACTIVEはKILLEDと同じで消去予定マークつき 最近ACTIVEだった、くらいの感じかと
>550 できるよ。CASE式使えや。 つかさ、何でSQL Serverスレできかねーのかな?
554 :
NAME IS NULL :2006/07/11(火) 09:03:51 ID:jBZOO1gG
>>551 って今試しにSQLPlus3個立ち上げて試してみたら
SQL実行中のやつがACTIVEで残り2つがINACTIVEでした…
通常はつながってるけど実行中でないやつがINACTIVEだとしたら
INACTIVEだけど実際はセッションが切れてる(幽霊状態)ってありうるんでしょうか?
555 :
542 :2006/07/11(火) 13:15:43 ID:???
>>545 , 546
知識に足がかりになるものがなかったため助かります
ありがとうございます
>554 ごめん。マヌアル読み間違えますた。551はナシでお願いします ACTIVEとINACTIVEは、どっちも接続状態で、 違いはトランザクションがあるか無いか、ですな。 で、クライアントが落ちているにもかかわらず、PMONが認識してなくてプロセスが残る問題 はクライアントのハングしたタイミングによって起こるそうなので ACTIVEでもINACTIVEでもどっちでも幽霊になる可能性はあるです。 INACTIVEで消えない事例は「セッションがINACTIVE」でOTN掲示板検索(いっぱいあったyo)。
>>556 サンクスです。OTN掲示板も検索かけたのですが
検索ワードのせいかうまく引っかからなかったようです。
とりあえず幽霊になることがあるということがわかりました。ありがとうございました。
558 :
NAME IS NULL :2006/07/11(火) 22:50:42 ID:Qj/HyKb+
複合主キーの片方のみをwhere区内で条件に指定した場合、索引は機能しますか? 例えばorderテーブルがあり主キーがorder_no,branch_noで定義されているとします。 このテーブルを検索する際に order_no = 1 もしくは branch_no > 5 のような条件を指定した場合です。
559 :
NAME 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, 明日の日記, おれ, まだ書いてない
>>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を使えば可能だと思うが、スレ違い。
561 :
559 :2006/07/12(水) 03:02:22 ID:???
ありがとうございます!name固定でいけるか検討してみます。 あと、PL/pgSQLも勉強してみます。
しかし、そもそも固定ならそんな構造にはしないのではないか
大至急教えてください オラクルのある項目に日本語のデータが入ってるんですが これがDEC漢字コードらしい これってCONVERT関数とか使えば読めるんですか?
564 :
NAME IS NULL :2006/07/13(木) 23:07:18 ID:/Wsv+rKy
ここはSQLについて聞くところだから文字コードは余所で聞いてね
>>563 Oracle Rdb(旧DEC Rdb)じゃないOracle(ああややこしい)にDEC漢字で
登録できたんだっけ? もしOracle自身がDEC漢字をサポートしている
のであれば、SQLで変換かけなくてもドライバなりツールなりが
サポートしてくれると思うけど。
566 :
550 :2006/07/14(金) 14:11:48 ID:6Om5TVuD
>>552 ありがとうございます!!
SELECT にCASEを入れてそれをORDER BYにして出来ました。
が
さらにこの形で昇順降順が切り替えることはできますでしょうか。
567 :
Q :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を使いたいからなんだけど。
>>567 select一発厳しいような。というか無理かな。
>567 PostgreってOracleのCONNECT BYみたいなのなかったっけ? それがありゃできるんだけど。
>>550 だからSQL Serverスレで聞けと…。
そういう複雑な要求を満たすために
一時テーブルとかいう便利なものがあるんだよ。
>>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 名前,日付 || '〜'||
以下同じ
572 :
571 :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);
573 :
Q :2006/07/15(土) 10:52:06 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] を取得したいのです
575 :
NAME 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"のような順番で取りたいのです。
お知恵をお貸し下さい… テーブル構造は 条件文字列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を書きたいのですが, どうやったらよいのか悩んでいます。 こうやったらいいよ,というアイデアいただけませんでしょうか。
>>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', ソート項目)
>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かどうかチェックして何か(例えば空文字とか)に置換するという 処理をかませばよいかと。
580 :
579 :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
581 :
NAME IS NULL :2006/07/18(火) 21:57:37 ID:dogqYQ0g
timestamp型の列にインデックスを張るのはおかしい?
582 :
NAME IS NULL :2006/07/18(火) 22:04:25 ID:P4U1S9qY
SQLについて 複数の前方一致(LIKE)のやり方をしたいのですが、どなたか教えてください。 'A'と'B'が先頭にあるデータを取得したいのですが・・・ よろしくお願いします。
584 :
NAME IS NULL :2006/07/18(火) 22:16:53 ID:P4U1S9qY
SELECT SEQNO from テーブル名 WHERE 列名 LIKE 'A%' 上記は"A"の前方一致かと思いますが、それにプラス"B"の前方一致も 取得したいのですが・・・ どうすればいいですか?
SELECT SEQNO from テーブル名 WHERE 列名 LIKE 'A%' or 列名 LIKE 'B%'
586 :
NAME IS NULL :2006/07/18(火) 22:33:58 ID:P4U1S9qY
ありがとうございます。
>>581 timestampは処理系で意味が全然違う。
ANSI SQLのtimestampはただの日付時刻型だから索引をつけてもおかしくはない。
MySQLやMS SQLのtimestampはレコードの更新のたび変化するので索引はつけない。
しかしANSI SQLはなんで既に出回っている処理系で別の意味で使ってそうな名前をわざわざつけたのか不思議だ。
588 :
NAME IS NULL :2006/07/18(火) 22:52:09 ID:DAvgl4if
未熟者ですが、教えてください。 A表とB表に同一の項目1があります。 ただし、A表の項目1にしかない値を拾いたいのですが どのようなSQL分になるのでしょうか?
DBなんだかしらないけど 集合演算でいけるとおもふ
590 :
NAME 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 ----------- ----------
591 :
NAME 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 ----------- ----------
592 :
576 :2006/07/19(水) 00:10:27 ID:???
>>580 ありがとうございます,チャレンジしてみます
>>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がベストかな。
オラクル9、selectで取ってくる項目にビット演算ってできるんですか?
595 :
NAME IS NULL :2006/07/20(木) 22:07:58 ID:EYMkKJPJ
初歩的な質問で申し訳ないのですが、今日たまたま select 0 A from 表(どんな表でもかまいません)の結果が A 0とAは任意のものでかまいません ---- 0 0 0 0 . .(表のデータ数だけ0を表示) . となることを知りました。 この仕組みが気になって仕事中ずっとネットで調べてみたのですが、 どこにも見当たりませんでした。 この仕組みについて説明しているサイトや書籍があれば教えて下さい。
0 を A という名前の列として条件無しで選択するので 0 のみを出す。 構文レベルの問題。
>>595 実は、0 と A の間に AS が省略されてる
これでわかる?
598 :
595 :2006/07/21(金) 08:26:31 ID:bTn+n/rQ
〉〉596 〉〉597 参考になりました。ありがとうございます!
599 :
595 :2006/07/21(金) 08:27:26 ID:bTn+n/rQ
〉〉596 〉〉597 参考になりました。ありがとうございます!
600 :
NAME 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/
姉ちゃんをオカンに置き換えてお楽しみください
いや、妹に置き換えて
また騙されたなお前ら というのが出てくる気がするのでスルー
どこで質問していいかわからなかったのですが 一応データベース使ってますのでここで質問させてください。 素朴な疑問です。 ショッピングカートを作成中ですが、 例えば在庫数が5個の場合、 カートに入れた時点で在庫を減らしたほうがいいのでしょうか? それとも売れたあとに在庫を減らしたほうがいいのでしょうか? よろしくお願いします。
カートに入れた時点で個数を減らすとセッションタイムアウト時なんかにもとにもどしたりとかしなきゃならない。 日時バッチで商品の個数が同期取られるならたいした問題じゃないとおもうけど。 大きいショッピングサイトとかだとこれが多いかな? 購入時点で個数を減らすと0個になってその時点でカートに入れてる人が買えなくなる。 申し込み画面で御取り寄せになりますが・・・みたいのを出せばまぁ問題ない(?)けど。 在庫切れで購入完了しちゃった人にはメールを手動で送るみたいなこともやったことがあるなぁ。
607 :
NAME IS NULL :2006/07/24(月) 00:06:59 ID:UbIRhfM+
なるほどです。 勉強になりました。
608 :
NAME 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の値となる) なにか良い方法はないでしょうか? ご教授ください。よろしくお願いします。
>>608 Oracleローカルな質問はOracleスレへ。
それ以前に何がやりたいのかさっぱりわからないから質問の文章も吟味してくれ。
610 :
NAME 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については別に必要ないです。
>>610 リスト構造のレコードセットはRDBではサポートしてない。
確かネットワーク型DBでサポートしてたかな。
どうしてもやりたければこんなテーブルになる。
create tabel listtable (id int primary key, data varchar(..), next_id int)
普通は親子レコードの子がリスト構造を持つことが多いので、
全部読み込んで変更があれば番号振りなおして全部書き出す。
お願いします。 <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 一応これで動いたのですが、コスト面などから根本的に改善すべき点などはないでしょうか?
>>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;
614 :
612 :2006/07/27(木) 17:07:51 ID:???
>>613 なるほど、シンプルの方が自分自身も分かりやすいですね。
オプチマイザについても調べてみます。
ありがとうございます。
615 :
610 :2006/07/28(金) 00:29:16 ID:???
>>611 SQLで実現しようとすると結構無理しないとならないんですね。。なるほど、よく分かりました。
ありがとうございましたー!
UPDATE database SET ShippedDate = 'aaa' WHERE @ShipptedDate IS NULL; このSQL文の@にはどんな意味があるのでしょうか?
変数じゃないの?
超初歩の質問ですが宜しくお願いします。 さくらインターネットでサーバをレンタルし PHPmyAdminで***というDBとtesttableというテーブルを 作成しました。 書籍に添ってユーザーを作ろうと下記コードを実行したのですが 上手くいきません。 ご助言をお願いします。 grant select, insert, update, delete on ****.testtable to testuser@localhost identified by '1234';
619 :
NAME 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 などのように出来るのですが…。 どなたかご教授していただけると幸いです。
620 :
619 :2006/07/29(土) 12:49:14 ID:???
自己レス >過去の株価の平均 特定の日付以前とかやると複雑そうなので、そのコードの「株価全ての平均」とさえ比較できればokです。
>>619 SELECT * FROM 株価テーベル AS T1
WHERE 株価 > (SELECT avg(株価) FROM 株価テーブル WHERE コード=T1.コード AND 日付<T1.日付);
>>620 上のSQLから
AND 日付<T1.日付
を取れば桶。
622 :
621 :2006/07/29(土) 13:10:56 ID:???
株価テーベルってなんだ...orz
623 :
619 :2006/07/29(土) 13:39:33 ID:???
>>621 様
ご回答どうもありがとうございます。
が、何回試しても上記のSQL文を投げると、CPU使い切ってマシンがフリーズします orz
620の発言で
「特定の日付の株価が、過去の株価の平均を超えているコードを抜き出す」
を
「特定の日付の株価が、そのコードの株価の平均を超えているコードを抜き出す」
としたつもりなのですが、上記のSQL文だと、この「特定の日付」をどこで指定すれば良いのでしょうか。
624 :
621 :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 よりは負荷が少ないと思うが、相関サブクエリなんで
ループしていることには代わりがない。
625 :
621 :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'が「特定の日付」な。
626 :
619 :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秒ほどで処理できました。まだ速く出来そうですが、とりあえず出来るので良しとしようかなと。
お世話になりました。
Microsoft SQL Server 2005 Express Edition with Advanced Services と言うのをインストールしたんですけど、これ 簡単にExcelデータのインポートって出来ないのですか?
>>626 MySQLは使ったことないけど、
select code, price as _price from stock where date='2006-07-28' group by code
は意味的に変。(RDBMSによってはエラー)
テーブルの主キー/一意制約については書いていなかったけど、
もし(code, dete)で一意になるなら、group byは不要。
629 :
619 :2006/07/29(土) 22:04:36 ID:???
>>628 ご指摘ありがとうございます。
テーブルには主キーや一意制約はつけていませんでしたが、おっしゃるように (code,date) で一意になります。
group by をはずしましたところ、わずかに速くなりました。
難しいですね。頭がこんがらかります。
630 :
619 :2006/07/29(土) 22:06:54 ID:???
手続き型言語と勝手が違うのに戸惑いますが、SQLも味があって楽しいですね。
631 :
NAME IS NULL :2006/07/30(日) 20:23:26 ID:UiZ0TjBd
VARCHAR2で定義してある項目に、 文字列の '0A' を HEXの '3041' ではなくて '0A' で登録したいときってどう書くの? (オラクル10g)
>>631 なにを言いたいのかよくわからないけど、
無理やり翻訳すると「改行コードを入れたい」ってこと?
633 :
631 :2006/07/31(月) 00:37:40 ID:62b3ohlt
改行だけでなく、英数字漢字も全部文字コード入力されて 文字列としてSQLへ渡されてきますので そのまま文字コードとして登録したいのですが
ああ、16進数の文字列が送られてくるから、それを文字コードとして文字に変換したいってことね で、質問の答えはわかりませんw(おい
>>633 一般的なSQLじゃなくて、関数で実現する。
細かい要求がよくわからんので答えは書かないが
to_char()、ascii()、convert()、chr() あたりを組み合わせてみれば
あと、to_number() もかな
組み合わせても無理だろ
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> テスト?エラー処理?それっておいしい?
あ,2Byte文字も('A`)シラネ
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;
フロントで変換して渡せよw
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以降のようです。 よろしくお願いいたします。
643 :
NAME IS NULL :2006/08/02(水) 00:50:00 ID:p6iinng0
>>635 hextoraw/rawtohexじゃだめ?
644 :
NAME IS NULL :2006/08/03(木) 22:13:08 ID:bA92EII+
>>642 1グループの項目数は必ず4つ固定なの?
それなら思いつく方法もあるけど、項目数が可変だとちょっと難しそう。
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列以下が帰ってくることはわかってるのですがなにかうまい方法はないでしょうか?
>>645 「判定する」の意味やhogejogeとhogehogeの関係がわからないのでそこには触れないけど、
hogejogeのa_timeに索引が付いてないという話じゃないの?
mysql5.0でvarchar binaryで設定したカラムに対して大文字、小文字を区別せず 検索するにはどうしたら良いのでしょうか。
648 :
619 :2006/08/04(金) 11:12:26 ID:???
>>647 select * from テーブル where cast(列 as char) like '%検索文字列%'
同一の定義がされてるテーブルが10個あります。 全てのテーブルからデータを引き出したい場合、どうSQLを書くのが効率的でしょうか? SELECT * FROM `table1`と `table2`と`table3`と.....`table10` WHERE `id` LIKE 'test%'; みたいな感じの流れなんです UNIONだと遅いので、。。(LIKE 'test%'が遅いとかではないです。)
やりたいと言ってることを実現するにはユニオンオールしかないと思うが… てか、書いてるクエリーとやりたい事が違うやん。
651 :
NAME IS NULL :2006/08/04(金) 12:58:41 ID:rRh5kdDw
UNIONだと遅いの根拠が不明だが。
>>644 >>642 の例は、適当に書いたので、そこまでは気が回りませんでした。
項目数は可変というのがよく分かりませんでしたが、たぶん可変です。
GroupIDを主キーとしたTableは、約2万行です。
これに対して、例で示したTableの行数は、約1万行です。
あれから色々試して、結局該当する行を全て取得するSQLを書き、PHP側でくっつける
ということでやりたいことはできました。(重くなると覚悟してたけど、思った以上に速かった)
ということで、やりたいことはできたのですが、MySQL側でできるならコードを書き直したい
と思ってますので、何か案があれば教えて頂きたいと思います。
653 :
649 :2006/08/04(金) 16:37:15 ID:???
えっと、全てのテーブルを検索対象にしたい、ということです。
SELECT * FROM TABLE1 WHERE 条件 UNION ALL SELECT * FROM TABLE2 WHERE 条件 UNION ALL : と先に絞りこんでからUNION ALLすればいいんでない? 主キーの重複がないor重複がOKならUNION ALLが速いよ。
655 :
649 :2006/08/04(金) 18:39:46 ID:???
>>654 ありがとうございます。
WHERE句の訂正には全ての部分を変えなきゃいけなくなりますね。。
WHERE句を一つだけで、っていう方法はあるのでしょうか?
>>655 SELECT * FROM
(SELECT * FROM TABLE1 UNION ALL SELECT * FROM TABLE2 UNION ALL ..) x
WHERE 条件
まともな処理系なら
>>654 と同じプランで動くと思うのだが、要プラン確認。
サブクエリで中間表を作ってるようならあきらめよう。
どんなDBつかってるか知らんが、 union くらいオプティマイザが最適化してくれるぞ。 普通に結合しろ。 否定しているが、like 'test%' が遅としか思えないんだが。
658 :
649 :2006/08/04(金) 19:32:07 ID:???
>>656 なるほど、、わかりました。
ありがとうございます。
>>657 like 'test%'はWHERE句のサンプルとして使わせていただきました。
UNIONとサブクエリについてもう少し調べてみます。ありがとうございました。
659 :
644 :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;
660 :
644 :2006/08/04(金) 21:17:41 ID:???
テーブル名はテストで作ったやつなので、適当に書き換えて。
661 :
647 :2006/08/05(土) 00:34:18 ID:???
>>648 さんありがとうございました。
カンピューターでasciiにキャストとかやってました。
MySQL4.0でOracleのrank()関数のような集計関数のようなことをしたいのですが、全く思い浮かびません。 アプリケーション側で処理するしかないのでしょうか。。?
>>662 4.0ということは、サブクエリなしだよね。
それだと厳しいな。。
MySQLで1万件くらいデータ扱おうと思ってるんですけど大丈夫でしょうか? もし大丈夫でしたら、目安として何件くらいまで大丈夫でしょうか?
10001件
667 :
619 :2006/08/06(日) 20:14:12 ID:???
>>664 >>666 さんのおっしゃるように、なにをもって「大丈夫」するかが分かりませんが…。
私に関して言えば30万レコードでも「大丈夫」です。
何故ここで100人という定番ボケが出ないッ!?
669 :
619 :2006/08/08(火) 02:27:09 ID:???
>> 664 100人までは大丈夫です。
じゃあ、イナバの「大丈夫」はどういう意味だ? 100人乗っても全壊はしないが、多少屋根がヘコむ、とかあるかも。
物置として使うには何の支障も無い、かな
673 :
619 :2006/08/08(火) 23:40:50 ID:???
社長が「大丈夫」と言えば大丈夫です。
MySQL 4.1.12 Datacode,wrkDate、、、、、、といったテーブル hage があり、Datacode,wrkDateの2つを主キーとしています。 この中から、あるDatacodeについて最新のレコードから100件前のレコードを引っ張ってきたいんですけど、 どうsqlを書けばいいのか教えてください。 毎日入ってくるとは限らないので単純に100日前の…とすることが できないんです。 ちなみにその件数が100件以上あることは確認しています。
>>674 wrkDateの昇順でレコードに連番割り当てて、その連番が「100」のレコードを選択する、という内容でいいのかな?
それなら可能だと思うが。
>>675 レスどうもです。すいません、?です。その例だと、100に当たるのが最新の日付のレコードだという事になると
思うんですが、、はて?です。
最新は1もしくは0だろ
678 :
675 :2006/08/11(金) 16:04:56 ID:???
ああ悪い。「降順」じゃないと最新日付が先頭に来ないな。 「降順に並べて100番目のレコード」でいいか? よければ次サンプルのせるよ。
679 :
NAME IS NULL :2006/08/11(金) 17:33:50 ID:2h6D2tc6
オフセット指定のROWと、 オフセット指定しない場合のトータルのROWの数を セットで取る方法ってありますか? よくある、「全検索結果〜件中の〜件を表示しています」 みたいな処理なんですが。 いまは、よくわからないので、 select hoge_id from hoge; → 全部獲って、行数をカウント select hoge_id from hoge offset = 100; → 表示用に欲しい限定行 みたいな感じでやってるんですが、おそらく間違ってるんだろうなあと思いつつ やり方も調べ方もわからず強引に上記の方法でやってまつ。
680 :
674 :2006/08/11(金) 19:59:20 ID:???
681 :
675 :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;
682 :
675 :2006/08/11(金) 22:59:24 ID:???
しまった。不等号逆だ。 ×:「WHERE H2.wrkDate < H1.wrkDate」 ○:「WHERE H2.wrkDate > H1.wrkDate」
これじゃ駄目なの? select * from hage where Datacode = 適当な値 order by wrkDate desc limit 100,1;
684 :
NAME 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だけ抽出したいのですが、 これはどうしたらよいのでしょうか?
>>684 HAVING でいいかな?
SELECT data FROM table GROUP BY data HAVING count(data) >= 3;
とか
686 :
NAME 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が該当し、抽出したい)、
せっかく教えていただいたのですが、応用できません><;
最初からこう聞けばよかったです。
687 :
NAME 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)を抽出したいのでした。。汗
>>687 select data from (select discinct data,data2 from table ) group by data having count(data) >= 3;
まちがえた × discinct 〇 distinct
690 :
NAME IS NULL :2006/08/12(土) 16:39:16 ID:49/4QN7u
>>688 Every derived table must have its own alias
というエラーが出ます。><;
>>690 ) と group の間に、 AS foo 入れてみたらどうよ?
・・・ table ) AS foo GROUP BY ・・・
692 :
NAME IS NULL :2006/08/12(土) 17:14:32 ID:49/4QN7u
>>691 できました!
ありがとうございます
これって自己結合とはまた違うんですよね?
教えていただいた事を参考に勉強します
該当スレが見つからなかったのでこちらで質問させてください。 他に適当なスレがありましたら誘導お願いします。 小規模なショップの通販サイト制作をしているんですが 商品や顧客等のIDが必要なら適当につけてくれといわれました。 (個人経営でもともとそういう管理をしていないのです。) このとき、管理上わかりやすいマイルールでつけちゃっていいのか、 それとも一般的なルールや、推奨されている規則などはあるものでしょうか。 また参考になるようなサイトなどありましたらおしえてくださいm(_ _)m
>692 >688の方法は自己結合ではなくインラインビューというです。 'インラインビュー'とか'副問い合わせ'でググってみたらそれなりにわかるとおも。
695 :
693 :2006/08/12(土) 18:54:59 ID:???
MySQLを使用しています。 auto_increment で 1,2,3.... のように自動的に値を増やしていくことができますが、 abc0001,abc0002,abc0003.... のように増加させることは可能でしょうか? 可能な場合方法をご教授くださいませ。
小分類コード(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 小分類コード こんなのを考えましたけど
>>696 No用テーブルを作成、内容は
フィールド1:abc
フィールド2:1
新しいNoを発行するたびに、フィールド2にauto_incrementで更新し
目的のフィールドにフィールド1 & フィールド2 を格納すればOK
699 :
674 :2006/08/14(月) 20:39:38 ID:???
>>681 遅くなってすいません。う〜ん、どうしても
Every derived table must have its own alias
というエラーが出ます。><
>>683 さんのやり方だとMysql限定だけど出来るんですけどね。
700 :
NAME IS NULL :2006/08/14(月) 21:44:52 ID:iI6Ye70+
質問です。 オラクルの勉強がしたいのですが、 オラクルってフリーで使えるソフトはないのですか? あと、買わなくては使えないとしたら、学割とかはないのでしょうか? いくらくらいしますか?
702 :
NAME IS NULL :2006/08/14(月) 22:00:44 ID:w+MP73iN
>>699 ビューにエイリアスがついてないってエラーだから、FROM句のインライン・ビューに適当な別名つけてみたら?
>>699 Every derived table must have its own alias
これを和訳してみろよ。どうすればいいか一発でわかるぞ
704 :
NAME 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です。 よろしくご教授おねがいします。
705 :
NAME 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 よろしくおねがいします。
706 :
NAME 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の順で取り出したいということです。 よろしくお願いいたします。
707 :
NAME IS NULL :2006/08/16(水) 00:06:32 ID:t8b87dJx
>>704 日付に歯抜けはないと考えていいの?
歯抜けがないことが保証されているなら、スカラ・サブクエリでいける(Accessってスカラ・サブクエリが出来ればだけど)。
1日の次が3日だったりして歯抜けがあると難しそう。
>>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;
いい方法じゃなくてチョット面倒だな。
709 :
708 :2006/08/16(水) 00:20:38 ID:???
あー、Accessだったんか、
>>708 が動くかどうか知らん。
710 :
NAME IS NULL :2006/08/16(水) 00:50:00 ID:BAkG8Mau
データベースを自分で作って勉強がしたいのですが、 どんなソフトを使うといいですか? やはりオラクルでしょうか?それともマイSQLでしょうか?
>>710 大金投資していいならオラクル、無料でやりたいならMySQL
>>711 何のために勉強するかの方が大事だろ。
それにオラクルだってただで手にはいるし。
「データベースを勉強する」のが目的なら MySQL やら PostgreSQL でいいんじゃね? Access でもいいかもしれんね。 「Oracle を勉強する」のが目的なら話は変わるけど。
勉強して仕事に役立てたいとか言うよこしまな奴ならオラクル 真にデータベースのことを勉強したいというピュアなハートの持ち主(死後)ならオープンソースだな。
MySQL5.1で全文検索機能を利用しようかと考え phpMyAdmin経由で、該当フィールドの「全文」フルテキストキーで操作しようと試みてみたのですが ボタンアイコンが白色になって、押せない状況です いろいろ調べてみたのですが解はみつかりませんでした プライマリーキー、インデックスボタンは問題なく押せます 原因をご存知の方、お願いいたします
716 :
NAME IS NULL :2006/08/16(水) 18:37:12 ID:bgyWbXAC
>>715 このスレの範疇じゃないよ、DBMS別のスレへどうぞ。誘導できないけど。
717 :
715 :2006/08/16(水) 21:58:13 ID:???
そうなのですか・・・・ JaneDoeStyleで見る限り、DBMS系はこの板しかなさそうですが どこで質問しればいいのでしょうか、途方に暮れるばかりなり
この板にもMySQLのスレはいくつかあるのだが。
719 :
704 :2006/08/16(水) 22:21:03 ID:aSzkfV70
>>708 サンクス!すごスキルっすね
そうなんですよ、休日とかも考えなくちゃいけなくて、それは次のステップと
考えてました。
そのままaccessじゃ動かないすけど、十分ヒントになります。
自作関数とか組み込んで考えてみます。
引き続き解る人、レスまってます。(_ _)
720 :
NAME 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 マネーを稼ぐといいですよ!!!
>>717 ここはSQLのスレであって、MySQLのスレじゃないんだよ。
SQLで、あるカラムの値がが全レコードの同カラムの中で 何番目の大きさかを出したいのですが、そういう命令ってあるんでしょうか? 一旦全部表示させないとダメですか?
>>722 それ以下の数をカウントするんじゃダメか?
ちょっと条件があいまいなんで、こんなもんで
>>722 要はランキング出したいんでしょ。
OracleとかならRANK関数がある。
なくてもできるけど。
725 :
NAME IS NULL :2006/08/18(金) 02:33:08 ID:XpaUcx/2
質問です。 SQL2000を使用し色々と勉強をしているのですがアタッチやデタッチ等を使って 自作のアプリケーションにデータベースを持たせる等、色々と試していくなかで データベース名が""のデータベースが出来上がってしまいました。 そのデータベースを削除や名前の変更をしようにもデータベース名が""のデータベースが あるために削除することは出来ないというエラーがでます。 どなたか同じ状態になった方はいないでしょうか? ぐぐってもなんの情報もなく途方にくれています。 ""のデータベースに名前を再度付ける方法や削除する方法をご存知の方が おられたら知恵を貸してください… ""データベースが出来てからテ当該SQL内でばタッチアタッチや削除、 データベースの新規作成やテーブルの追加も出来ないのでバックアップを取ることも 出来ないので再インストールだけは避けたいです。
>>725 いろいろ見当違いな操作をしたのだろう。ここのスレで聞くのも見当違いだから誘導しておく。
つMicrosoft SQL Server 総合スレ 4
727 :
uyu :2006/08/18(金) 04:49:27 ID:2u2zhENw
民主党は“全て中国の言う通り”がモットー。
公明党は創価学会とともに日本を朝鮮のものにしようとしてる。
創価学会は日本の大手メディアを間接支配していて、 社民党は朝鮮総連とともに拉致の存在を否定し、被害者の活動を妨害した。
共産党は北朝鮮に関して社民党と同じ。それに加えて反自衛隊・反米である。
朝鮮総連と民潭は日本を解体して朝鮮にしようと参政権を狙っているし、
統一教会は売国政党の社民党を支援している。
☆朝日新聞などは中国と朝鮮の代弁者、つまり日本最大手の売国新聞だし、
日教組は基本理念のレベルから反資本主義・反体制であり、残る自民党にも中国の顔色ばかり窺っている者が潜んでいるのである。
今後は『人権擁護法案』成立を契機に公明党は民主党に鞍替えして連立し、 実質外国人与党が誕生して第二期工作の完結となるのが彼らの筋書きである。 (今、実際にそのように動きつつある)
そうすればあっという間に外国人参政権を成立させて日本の国政は全て
朝鮮人が牛耳り、朝鮮に歯向かう日本人の政治介入する隙間を残さない
新たな制度が完成することだろう。
そしてこれらの売国組織に必ず関与し、彼らの侵略行為の結果において
最も利益を享受する立場にあるのが『在日朝鮮人』である。
http://hisazin-up.dyndns.org/up/src/14540.wmv 在日特権の真相にせまる21.68MiB
728 :
NAME 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でなんとかできるのでしょうか。 苦肉の策としてデータを取り出した後にプログラム側で変形しているのですが、 これだと最終的な行数が最後までわからないのが難点です。。
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 つかえ。
730 :
728 :2006/08/18(金) 17:18:35 ID:???
>>729 ありがとうございます。
じっくり読み解いてみます。
エンジン書くのを忘れてました。
mysql3.23なのできびしそうですね。
DBの変更も視野に入れて考えてみます。
731 :
SS :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句でカーソルのパラメータを 使いたいときどうするかという点です。 どうかよろしくお願いします。
関数に渡さないときの GROUP BY ってどのような結果になるのでしょうか?
>>731 like '%' | pcd | '%'
pcd が文字列でないなら、to_char などで変換する
おっと、すまん文字列結合は || だった。 like '%' || pcd || '%'
>>733 SELECT の中で SUM とか MAX を利用しない場合、という事です。
>>738 mySQLは通るんだ。確かにこの制約はうざすぎるからオラクルも何とか汁。
今SQLを触れる環境にいないのでお尋ねします date型のデータに対して、グループ関数のcountは使えるんでしたっけ? 例 select count( 誕生日 ) from テーブル名 みたいな感じで・・・・ どなたかご教授おねがいします。
>>740 SUMは知らんがCOUNTはOK。NULLじゃない誕生日のROWを数えてくれる。
(名前)(出社時間)(退社時間)で、時間はあるときからの経過秒であらわしているとします。 A,100,200 B,250,300 C,220,400 B,310,450 こうしたときに、0〜500の間で誰も働いていない時間帯(例では0〜100、200〜220、450〜500)を探す場合、なにか良い策はないでしょうか?
>>742 まず。0〜500のレコードを持つテーブルを用意する。
なくてもSQL内でレコードを生成できるのなら不要。
そんでもってNOT EXISTS指定で
上の連番 BETWEEN 出社時間 AND 退社時間
でおk。
744 :
NAME 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を発行してみたら、条件に該当する行が複数あるはずなのに 常にそのうちの一件しか更新されないのです。 どうかよろしくおねがいします。
745 :
NAME IS NULL :2006/08/21(月) 04:29:10 ID:w6gheO/i
質問です。MYSQL+phpMyAdminを使用しています。 サーバーを借りていて引越しのためデータを 旧サーバーからSQL文でエクスポートしたのですが 150M程あるので新サーバーでインポートしようとすると phpMyAdminのインポートの制限?が2M程しかないので インポートできない状況です。 初心者質問とは思いますがどなたか助けてください............orz
>>745 ツール使えばいいんじゃないですか?(よくわかりませんけど)
ちなみに僕も質問させてください。
テーブルAにcode,name,mailというカラムがあります。
これをnameで並び替えてさらにcodeで並び替えたいのですがどのような構文になるでしょうか?
よろしくお願いします。
>>747 ありがとうございます。
nameだけ逆に並び替えるにはどうしたらいいでしょうか?
ORDER BY name desc ,code asc asc は省略可能
750 :
SS :2006/08/21(月) 10:57:11 ID:tkf6SvHw
>>735 ありがとうございました。ほんとに助かりました。
PL/SQL中のSQL文なのでリテラルと変数を||でつなげると思ってません
でした。精進します。
751 :
745 :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
であってますでしょうか?
752 :
745 :2006/08/21(月) 18:04:17 ID:???
>新サーバでSHHでMYSQLにログイン の SHHはSSHの間違いです...
>>751 スレの範疇からずれているので、続きはこっちで頼む。
つ MySQL 総合 Part9
754 :
745 :2006/08/21(月) 18:35:07 ID:???
>753 了解です。
>>744 BをUPDATEしたいんだよな?
update B set B.name = 'hoge' from A.B where A.id = B.id and A.type = 1
756 :
NAME 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両方をヒットしてしまいます。 良い方法がありますでしょうか…。 よろしくおねがいします。
757 :
NAME IS NULL :2006/08/21(月) 23:27:42 ID:wNsZV2I0
ここはバカばっかしだから他所で聞いたほうがいいよ
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 手元に試せるのないので、適当書き。
759 :
756 :2006/08/22(火) 00:52:54 ID:wh12vBXx
>>758 どうもありがとうございます。
自分でも試行錯誤してみたのですが、INTERSECTというのでいけたかもです…。
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でできそうな気がしています。 どうやればうまくいくかアドバイスいただければ嬉しいです。
>>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()があったりする。
>>760 >>761 とは別の解
SELECT *,(SELECT count(*) FROM goods WHERE goods_catid=T1.cat_id) AS 商品個数
FROM category AS T1 WHERE cat_id=カテゴリーID;
最後のWHERE句を省くとカテゴリーとそれに属する商品個数の一覧が取れる。
763 :
NAME 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
重複とかどうするのかな。 ↓で動くと思うけどDBによるかも SELECT * FROM table WHERE (a,c) IN (SELECT a,max(c) FROM table GROUP BY (a))
765 :
760 :2006/08/22(火) 20:31:44 ID:???
>>761 ありがとうございます。
cat_name, cat_descriptionを取得するためにmax関数をかけて、どれかひとつ
抽出するということですよね。
こういう方法があったんですか。
>>762 ありがとうございます。
すごくすっきりです。こういう方法もあったんですね。便利そう。
でも、MySQL4.0系を考えているので、サブクエリが使えないのです。残念。
みなさん、ありがとうございます。勉強になります。
>>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
じゃだめなん?
767 :
NAME IS NULL :2006/08/24(木) 02:13:52 ID:0aY0kvJv
Accessにてクエリーを作成する機会があり SQLを直接入力して動かしていたのですが、コメントが入力できないのです。 コメント行は先頭に「--」だと思い込んでおり、 コメントを書きたい場合はどうするんでしょうか
>>767 思い込みは良くない。ACCESSはそういうもの。
適当な誘導先が見つからないが、ビジネスsoft版あたりか?
769 :
760 :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
770 :
NAME 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文を発行したら良いのでしょうか?
>>770 group by したときに、
min() とか max() とかの関数を使わないで素のカラムを指定すると、
グループにまとめられた行のうちのどれの値が出てくるかは不定っぽい。
サブクエリで該当のtaimestampでも抽出することになるんだろうけど
3.xではできないので作業用のテーブルにでも一度吐き出すしかないんじゃないか。
スレッドタイプの掲示板群を作る場合、どんなテーブルの構成が一番いいのでしょうか?? 今考えているのは 1ジャンルごとに1テーブル すべて1つのテーブル、bbs_seqでジャンル分け(DB掲示板ならbbs_seq = 2など) です。 皆さんならどんな構成にしますか?
773 :
770 :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が空の値を返しました。(例えば行が空とか).
774 :
770 :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
775 :
NAME IS NULL :2006/08/26(土) 11:28:56 ID:PyZeKlHK
SQL Server 2000で、外部結合を大量に使った時間のかかるSELECT文があります。 このSELECT文のテーブル結合部分を事前にVIEW一つにまとめておいて、 SELECT文ではその結合したVIEWから取得した場合、 かかる時間は短くなりますか?
>>775 早くはならない。
VIEWはプランや処理速度にはなんら影響を与えない。
ストアドならプランニングの分だけ速くなる。
すいません、初心者なのですが頭こんがらがってきたので質問させてくださいorz 売上テーブルという表に、品物名、売上日、売上個数というフィールドがあり、これに対して SELECT [売上日],SUM(売上個数) AS [一日売上個数] FROM [売上テーブル] WHERE [品物名] = 'リンゴ' GROUP BY [売上日] とやって、一日ごとの売上個数を出したのですが、この結果からさらに 一日の売上個数の平均を出すやり方に悩んでいます。 返って来た結果にたしてAVGとかかましたいのですが、うまくできません。 副問い合わせかな?と思ってやると、複数行返ってきてしまうのでIN使うのかなって 考えてるんですが・・・いい例も見つからなくて困ってます。 ヒントだけでもよければ教えてください、お願いしますm(_ _)m
WHEREの後ろじゃなくてFROMの後ろにも副問い合わせってできるんですね・・・。 SELECT AVG([一日売上個数]) AS 平均 FROM ( SELECT [売上日],SUM(売上個数) AS [一日売上個数] FROM [売上テーブル] WHERE [品物名] = 'リンゴ' GROUP BY [売上日] ) で、できました。スレ汚しごめんなさいorz
779 :
NAME 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; が一番高速な方法ですか?
>>779 何を言っているんだお前は。
使わないものをselectして何の意味があるんだと小一時間。
>>781 のリンク先より
>flgbitやcount(*)を得るのは仕方がないんですね。
select count(*)の結果も要らないのか…。
ほんとに何のためにselectしているのか興味がある。
まず、何があればいいのかを書いてくれ。 SELECT NULL なら NULLが得られるが満足か?
とりあえず
>>779 =
>>781 が狂っていることだけは確かだ。
DBについて質問する前に、「質問の仕方」を質問したほうがいい。
>>775 SQLServerはマテリアライズド・ビューは持っているだろうか?
それ使うと速くなる。ただしビューというよりほとんど中間テーブルみたいなもんだが。
786 :
NAME IS NULL :2006/08/28(月) 00:20:33 ID:oU4+KMyd
787 :
NAME IS NULL :2006/08/29(火) 18:47:21 ID:BhUCBw9m
バイナリラージオブジェクトからは検索できないのですか? それともデータベース依存ですか?
結合について質問です…(´Д`;) 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 この差がわからないのです… 結果が変わりますか?
訂正です…(´Д`;) 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 です
1対多のテーブル、MAINとDETAILがあって、DETAILの検索条件に合致する (重複のない)MAINのレコード数を知りたいのですがSQLの書き方がわかりません。 例えば SELECT COUNT(MAIN.KEY) FROM MAIN, DETAIL WHERE MAIN.KEY = DETAIL.MAIN_KEY AND DETAIL.CATEGORY = 3; だと、DETAILのレコード数と同じ数が返ってきます。 どなたか教えてください。よろしくお願いします。
>>790 count(DISTINCT main.key)
他同じ。
792 :
790 :2006/08/30(水) 16:05:09 ID:???
>791 動作確認とれました。 助かりました。ありがとうございました。
SQL Serverで UPDATE [テーブル] SET [対象日付カラム] = getdate() として、日付を一括更新した場合、 全ての対商行の[対象日付カラム]の値は同一になると保証されるんでしょうか? ※仮に100万行のデータを作って一括Updateしてみましたが、全て同一の値になっているようでした
794 :
NAME 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 : :
>>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 以外にユニークになるキーがあるならこの応用で対応できる。
ユニークなキーが無い場合はカーソル使って対応。
not null 制約が表制約構文では許可されていないのには、 どのような背景というか哲学というか、 そのようなものがあるのでしょうか?
>>796 質問が哲学的で良くわからないから具体的に
だって表に対する制約じゃないじゃんよ。
>>796 具体的に、どうやって表に対してNotNULLを適用したいのか言ってみてくれ。
799 :
794 :2006/09/01(金) 20:45:14 ID:???
>795 ありがとうございます。 使用しているのはAccess2000ですので、ROW_NUMBER()は有りませんでした。 id1,id2は当然のようにユニークではなく、他にユニークなキーも存在しません。 掲示したミニマムコードの部分だけをROW_NUMBER()の使える物に切り出して 連番を更新した後に、Accessに戻すことで対応してみようと思います。
>>796 なぜ主キー制約や一意キー制約と違って、列制約でしか指定できないのかってこと?
NOTNULL制約は1項目で完結するからじゃないの。
主キー制約や一意キー制約は複数項目も有りで別レコードとの関係もあるし。
あとから制約を追加する時に addじゃなくてmodify使わにゃならんよね。
掲示板に書き込まれた最後のデータを表示するような場合、 SELECT 書き込み内容 FROM 掲示板テーブル WHERE 書き込みタイムスタンプ = MAX(書き込みタイムスタンプ); とするとMAX(書き込みタイムスタンプ)の部分が通りません。(MySQL4) どうすればよいのでしょうか?
803 :
802 :2006/09/03(日) 17:16:11 ID:???
たまたま人に教えてもらえました。 ごめんなさい。
>>803 どのように解決したのか具体的に書かないと。
CASE文で、FILE1.Aが1なら'あ'、2なら'い' それ以外ならFILE1.Bを とかは可能ですか?
>>805 いまいちよくわからんけど普通に可能なんじゃない。
oracleではテーブル名の一文字目に記号は使えるの? ダブルクォーテーションで括るってのは別にして。
質問よろしいでしょうか。 重複したレコードを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があってるかどうかも自信はなくて。
809 :
NAME 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を取ったとき、表の上の方にあるデータが 残るということでよいのでしょうか?
>>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の最小値が選択される保証はない。
すいません質問させてください。 行いたい処理: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 どのように記述すればよいのでしょうか。
812 :
NAME IS NULL :2006/09/06(水) 13:54:18 ID:8AGGOxSN
重複データを取り除きたいのですが、重複しているデータの内、 キー番号の若い方のレコードを採用したいと思っています。 select distinct 項目1, 項目2 from テーブル1 と、実行すると、重複は取り除けますが、キー番号の若い方が取得できているか、 また、1レコードの全ての項目を取り出すことができません。 何か良い方法は無いでしょうか。。。
814 :
812 :2006/09/06(水) 14:22:35 ID:8AGGOxSN
あ、すみません。 SQLSERVER2003を利用していて、DISTINCT ONが利用できないのです。。。
815 :
810 :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;
816 :
810 :2006/09/06(水) 14:28:28 ID:???
被った。
>>812 SELECT min(キー番号),項目1,項目2 FROM テーブル1 GROUP BY 項目1,項目2;
じゃダメ?
817 :
812 :2006/09/06(水) 16:53:53 ID:8AGGOxSN
うおお〜〜!! おしいっす!! もうちょっとでいけそうなのですが、GroupByに含む必要の無い項目もあるんです。。 集計する必要の無い項目があるので、それもなんとか取り出せないかなと。。。 キー番号, 項目1,項目2の他に、集計する必要のない項目(項目3とか)があるため、これをどうしようかと。。 サブクエリとか使えば、とれそうな気がするのですが。。。
818 :
808 :2006/09/06(水) 21:03:30 ID:???
>>810 ありがとうございます。
無事やりたいことができました。
SQL Serverにて、 ID|値|累計 --------- 1|10|10 2|14|24 3|26|50 4|90|140 のように値から累計を取りたいのですが SUM(hage) OVER(ORDER BY hoge)とかは無理でした。 累加した値を取るのは、サブクエリを使うしかないのでしょうか?
>>819 集計関数で使えるのはOVER (PARTITION BY だけでORDER BYの指定は出来ない。
サブクエリを使ってくれ。
>>820 ありがとうございます。
Oracleならいけるっぽかったんで、SQL Serverに代替がないかと探してたのですが
やっぱり無理なんですね。
重そうですけどサブクエリでやります。
822 :
810 :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);
日付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だけしかない空のレコードが作られてしまいます。 何かヒントでもあればご教授お願いします。。。
(+)の意味を理解しているのかどうか。 異なる日付でIDが同じレコードが存在するのか?
>>824 どのテーブルもID+申し込み日でユニークだと考えていいのか?
それともTB2, TB3 はID+申し込み日+申し込み内容(コース)+クーポンフラグでユニークなのか?
外部結合にLEFT (OUTER) JOINの書式は使えないバージョンなのかい?
827 :
NAME IS NULL :2006/09/07(木) 13:48:18 ID:nPkemtCV
>>822 バッチリですた。
う〜ん。柔軟に考えられませんでつた。
ありがとうございます。
質問させてください。 nameに「鈴木」「佐藤」「高橋」が入ってるとします。 order by nameだと「鈴木」「佐藤」「高橋」で並び変わるとします。 これを「高橋」「鈴木」「佐藤」の順で並び替えるにはどうしたらいいでしょうか?
829 :
828 :2006/09/08(金) 07:31:37 ID:???
ちなみにnameには「鈴木」「佐藤」「高橋」以外のデータは入りません。 要するに、自由に並び替えしたいのです。 どうかよろしくお願いします。
no name -------- 1 高橋 2 鈴木 3 佐藤 というテーブルを別に用意しておく
831 :
828 :2006/09/08(金) 12:08:23 ID:???
質問の仕方が悪かったようですみません。 1,2,3で並び替えたり2,1,3や3,1,2など 要するに、自由に並び替えしたいのです。 よろしくおねがいします。
あくまでもSQLでなんとかしたいなら name s1 s2 s3 s4 〜 -------------------- 鈴木 1 1 2 2 〜 佐藤 2 3 1 3 〜 高橋 3 2 3 1 〜 からs#を使い分けるしかないだろ。
833 :
828 :2006/09/08(金) 12:41:45 ID:???
あ、すみません。 SQLでできました。
834 :
NAME IS NULL :2006/09/08(金) 14:53:11 ID:fYwGASlo
つうかさ、
>>828 みたいなのは、やりたいことを論理的な日本語で説明してくれよ。
それすらできないのに、どうやってSQL書くのさ。
836 :
NAME IS NULL :2006/09/09(土) 00:16:05 ID:CMzEgnKw
質問します。 oracleでは空文字はNullと見なされると学びました。 char型だと長さを満たすだけの空白で埋めますよね。 で、char(1)とすると''も' 'も' 'となって格納され、 比較時に末尾の空白が無視され空文字となり、 is null で検索できると思ったのですがうまくいきません。 私は何を勘違いしているのでしょうか?
char(1)のフィールドは、nullか何か一文字入ってる状態にしか出来ないじゃないか? 俺はcharなんぞ使わんので知らんけど。
>>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
VARCHAR2とCHARの違い。 長さ0の文字列があるDBMSと、VARCHAR2での長さ0の文字列=NULLのオラの違いじゃないの?
>>836 色々勘違いしてると思うけど、君の基本がコボルベースなのか、
Javaベースなのか、VBベースなのか、そもそも始めてのコンピューターなのか
どれ?
>比較時に末尾の空白が無視され空文字となり、 ここが間違い。 CHARは長いほうに合わせて空白がパディングされて比較される。 Oracleの空文字はあくまでNULLとして扱われて空白がパディングされることは無い。 CHARの後方空白を切り捨てるのはクライアントのプログラムが読み取るときのオプション動作じゃなかったっけ。
842 :
NAME IS NULL :2006/09/09(土) 11:17:17 ID:Iy8PAeCd
フィールド名を1個目としてしまいました。 僕は大馬鹿野郎ですか?
>>841 まぁ、君が正解だと思うけど、
空白が埋められて比較される空白埋め比較が行われるのは、
CHARとCHARやNCHARやテキストリテラル同士の比較の場合のみ。
CHARとVARCHAR2の比較は空白で埋められない非空白埋め比較が行われる。
>CHARの後方空白を切り捨てるのはクライアントのプログラムが読み取るときのオプション動作じゃなかったっけ。
これはその通りだね。クライアントのプログラムの種類による。
>CHARとVARCHAR2の比較は空白で埋められない非空白埋め比較が行われる。 昔のことなんだけど、Ver.8.0.5のときにこうならなくってハマッた覚えがあるんだ。 どっちかの型をあわせてやらないと比較できなかったんだよ。 それってバージョンによって違うのか、それともオプションによるのかな?
TRIM すれば NULL になるからいいじゃない
SELECT 1個目 FROM mytable; で、結果が 個目 1 1 1 1 1 1 1 ってなってしまいます。
それは、SELECT 1 AS 個目 FROM mytable; だから
昨日からハンドブック片手に勉強始めた超怒急初心者です。 ここで質問よかったかな。。 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つ表示できてるのですが スレに新しいコメントを書き込んでもデータが更新されずに スレに一番最初に書き込んだ日時と本文のまま固定されて しまっております。。 スレ毎の最新の書き込みを表示するにはどうしたらいいでしょうか?
>>848 本当にそうなったのか?
実際のデータ数例と実際のSQL出してみてよ
850 :
849 :2006/09/11(月) 14:32:36 ID:???
つーか、やっと意味がわかった・・・ SELECT threadid, comment, MAX(date), name とかでどうか。
しかし MySQLはこんな書き方で許されるのか。 もうちょっと工夫がいるかもしれんな
853 :
NAME 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 ・ ・ よろしくお願いします。
どういう結果がほしいのか書いてくんろ
イヤです
>853 「両方に存在する」の存在する条件が不明なのと 「最大値」が何の最大値なのか不明なのとを はっきりさせれ。
857 :
NAME IS NULL :2006/09/12(火) 10:43:14 ID:1QTPaM/W
>>852 group by 句に指定していないカラムを select できるなんていう
変態仕様に頼っているからだろ。
dateがなにがでてくるかはランダム サブクエリで獣医が5位以内にしたら?
859氏ありがとうございます! Group By句にcommentを追加して 投稿最新日時、スレ毎の最新コメント、ユーザー名で区分する コメントチェッカーをサイトに載せることが出来ました。 おかげさまでスッキリしました! 860氏も参考になりました。ありがとうございます!
テーブル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種類あるからだめなのかな?
それをOKにするRDBMSってどれ?
select 列B,count(列B),min(列C) from テーブル1 って、列Cが文字型でもいのかな?
それは別にかまわんが、GROUP BY 無しでそれいけるのか? MySQLか何か?
日付、名前、点数の表があります。 名前が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 表); とやっていますが、本当はどうすればいいのでしょうか?
867 :
NAME IS NULL :2006/09/17(日) 08:07:03 ID:qBdk3wJz
本当は?って。 それはそれでよいんじゃないの? DBMS毎で若干性能出る方法はあるから、DBMSさらせばさらに回答つくでしょ。
868 :
NAME IS NULL :2006/09/17(日) 09:22:07 ID:jvVMt5Re
SQLの高速化についてのまとめサイトみたいなとこないかな?
>868 もしチューニングサイトがあったとしても、 データベースの構成やデータの持ち方で変わるんだから、 結局のところ試行錯誤するしかないよ? おいらが知ってるのは、基本的には ・ORよりUNIONが速い ・INよりEXISTSが速い とかいう程度で、上記も実際のデータに当てはめてやってみなくちゃわからんってことぐらいかなぁ。
870 :
NAME IS NULL :2006/09/17(日) 09:58:35 ID:qBdk3wJz
>>869 まあ、知識として、いかにHDDアクセスをなくすかってのが基本でしょ。
あと、下手に知識が入った辺りでやらかすのが、自己満足の複雑な結合。
その結果、2表の総当りとかいう馬鹿な結合が出て、データ件数の掛け算で性能劣化。
>>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 表.日付 = 抽出表.最新日付;
>>871 相関サブクエリにした方が、多くの場合最適化がうまくいくよ。
>870 そだね。 クエリをみるのも大切だけど、 データベースのテーブルレイアウトにインデックス、 キャッシュヒット率とかのリソースをみるほうが重要だし。
OracleでSyslogにかいてるところに通知したい ってどうすればいい?
SQL ServerやMySQLの質問がまぎれることはあるが Oracleは珍しいな。 SQL関係無いのでOracleスレでどうぞ
876 :
NAME 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を取り出したいのですが。
877 :
NAME IS NULL :2006/09/20(水) 18:51:09 ID:JrAxKI9g
物凄く初歩的な質問くさいんですが。 下記の用な成績データがあったとして、自分の順位(3位)を知るには どうすればよいんでしょうか? 100 90 80 <- 自分はここ 70 60 DBはMySQLです。
>>876 状況によって書き方換わるけど、WHEREで102以上を指定して
その中からmin()を持ってくればいいと思う。
minはORDER BY とLIMITの組み合わせでもいける
>>877 順位=その値より大きいものは何件あるかだから、
WHERE で絞ってcount()すればいい。
順位をいっぺんに出すのはもうちょっと工夫がいる
883 :
NAME 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値とやりたいのですがうまく抜けないのですみませんが教えてください。
>>883 あなたのおっしゃるIndex値って、いわゆる「行番号」に相当するものかしら?
>>885 csvで書き出してExcelで読み込ませるとか、どーよ?
indexに行番号なんてあるの? tree構造だとばかり思ってたべ。。。
>>883 下のやり取りでなんとなくわかった気がするが、、、、
例えば、hoge順に並んでいるものの100番目を取り出したいなら
SELECT * FROM table ORDER BY hoge LIMIT 1 OFFSET 99
とかやればいい。
あと、一つずつ取り出して何かやるってんならカーソル作ってFETCHしたらいいかと
もう一つ。 RDBSにはデータの格納順という概念は存在しない。 だから単一の行だけ取り出してもそれが何番目かということは知ることはできない。 (1つ取り出したのだから、順不同なデータの1番目、とは言える) 必ず選択条件と並び順を決定しなくては、何番目のデータとは言えない。
いまだに883の意味がわかりません><
>>893 では、ヒントを。
文章中の「Index」と「Index値」は別の意味で使われている。
もちろん「番号」と「Index値」も別物だ。
この点に注意してもう一度読み直してみよう!
そこまでして読まないといけない使命があるわけでもないし。w
896 :
893 :2006/09/23(土) 00:17:36 ID:???
>>894 やっとわかりました。ありがとうございます!!
とある番号項目の値を指定して、
その項目でソートした場合の
先頭レコードからの行番号をとりたいってことですね。
じゃ、おやすみなさい。
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
>>897 id | type | up_time | last_up_time_byId (last_up_time_byId は idで最大の日付)
という表があったら出来るのはわかる?
あとはサブクエリで。
MySQL4.1でどの程度サブクエリが使えるかはわからないから自分で調べてくれ。
>>897 きわめて妥当な結果だと思うけどどういう結果が欲しいの?
ソートの優先順位が違うなら、それを入れ替えればいいじゃん
SELECT * FROM table_foo ORDER BY type, up_time DESC;
手元にはオラコーしかないんやわ…スマンコ('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 ;
901 :
NAME 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を抽出するという方法しかないでしょうか? それらしい結果は返ってくるけど、外部結合の使い方がイマイチわからないです。
>>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;
質問の意味を読み違えてたらスマン。
903 :
901 :2006/09/23(土) 23:25:09 ID:???
>>902 普通にwhere句に追加するだけだったんですね・・・
WHERE t1.id1 = 1 and t2.id2 is null;
で望む結果が得られましたので、データを増やして検証してみます。
ありがとうございました。
904 :
NAME IS NULL :2006/09/24(日) 00:04:18 ID:XMj5nZBr
MySQLにて、複数のレコードをINSERTするときはVALUES以降の値をカッコで 括ってカンマ区切りで複数レコードを並べることによってクエリ一発で出来るのですが、 UPDATEでも複数レコードをクエリ一発で更新することは出来るのでしょうか? いろいろ調べたけど、1度に1つのレコードを更新する例文しか見つかりませんでした。
わかんないけど、更新する値が複数あるってことは where句も複数必要になるからその辺の関係でわ?
あ、値じゃなくてレコードです。ゴメン('A`)
>>904 同じ値に更新するなら複数選択される条件があればいい
違う値なら無理
908 :
NAME IS NULL :2006/09/27(水) 09:25:43 ID:eq022I/L
古い順(ASC)で並んだ結果から最後の5行だけ取り出したいときってどうすればいいでしょうか? いつもは全体の件数を取得->件数-5のオフセットで取得してるんですけど、2回もクエリ送るのが低効率な気がして。。 MySQL4.0なんでサブクエリ使えないんです。
まず何故『新しい順(DESC)で取った最初の5行』にしないのだ
そうすると 9 8 7 6 5 の順番で表示されるからです。 5 6 7 8 9 の順で行きたいんですけど。。
可能ならプログラム側で逆にしたいところだな。
まあ当然ではある
え、4.0ってサブクエリ使えないの?
4.1から。てかなぜ4.0?
(……うちは3.0なので何も言わない……)
(……言ってるじゃまいか……)
イントラの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
>>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: 列の定義が未確定です」というエラーが起こりますが。
>>920 レコード数が多い方をサブクエリにして先に絞り込んだ方が良いと思うけど
従業員数程度なら関係ないか
SELECT 従業員.従業員名, a.部署名, 従業員.給与
FROM
( SELECT 従業員名, 部署NO, 給与
FROM 従業員
WHERE 給与 >= 300000 AND 部署NO = 20 ) a,
従業員
WHERE a.部署NO = 従業員.従業員NO;
>>918 は間違い、適当に編集してたら混乱した
SELECT a.従業員名, 部署.部署名, a.給与
FROM
( SELECT 従業員名, 部署NO, 給与
FROM 従業員
WHERE 給与 >= 300000 AND 部署NO = 20 ) a,
部署
WHERE a.部署NO = 部署.従業員NO;
<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 使用しています。
>>923 select table1.id, a.商品, b.商品
from table1, table2 a, table2 b
where table1.コード1 = a.コード and table1.コード2 = b.コード
メモリを節約したいならこうかな 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.コード
これでメモリ節約になるDBMSって何?
展開する手間を掛けさせてるだけのような希ガスる。
DBMSの最適化機能でなんとかなるのかもしれんが サブクエリに分けた方が扱う結果セットが小さくなるから メモリは節約されると思うが
Aテーブルに入っている文字列XがBテーブルで値Yを与えられているとき BテーブルでYを持つAテーブルの文字列Xのみを取り出したいときはどう指定すればいいのでしょうか 例えばアルファベットで <文字> フィールド1|略|フィールド52 ------------------------ a|略|Z a〜Zまで文字列を入れてあり <音> フィールド|略|フィールド52 ------------------------ 母音|略|子音 母音か子音かの値を入れてあったとして 母音だけ取り出すときの指定です
>>929 そもそもテーブル設計間違ってるぞ
文字と文字種のフィールドを持つテーブルが一つありゃいいんじゃないの?
a|1
b|2
:
z|2
>>930 元々<文字>テーブル的なテーブル(ラテン行aとギリシャ行αを一緒の列に入れて対応させてるような感じ)がいくつかあったのですけど
そこから条件に合う一行の一部(ラテンの母音)を取り出すのにこういう形にしたのですが
やっぱり元テーブルから作り直す(ラテン文字と音テーブル、ギリシャ文字と音テーブルみたいに)方がいいですか
>>928 >>924 だろーが
>>925 だろーが、NestedLoopJoinに落ちるならどっちも
たいしてメモリ喰わんだろう。
つか逆に、最適化が下手なDBMSだと
>>925 はサブクエリの結果セットを
メモリ上にまるまる保持してしまう可能性があるんでない?
>>931 それってめちゃくちゃ扱いづらいだろ
もともと同じ目的のものを別フィールドに52個も並べてるんだから
直せるなら直した方がいいんじゃないか
>>931 直す場合のテーブルだけど文字ごとに分ける必要がないなら一つでいいと思うよ
|文字グループ|文字|音|
文字グループは{1ならギリシャ文字、2ならラテン文字}
文字は{A-Za-z後知らん}
音は{1なら母音、2なら子音}
こういうテーブルならたとえば「ギリシャ文字の母音を探す」なら
select 文字 from 文字テーブル where 文字グループ = 1 and 音 = 1;
ですぐもってこれる
MySQLを使用しています。 同じ内容の行を削除する最もスマートな方法を教えてください よろしくお願いします。
>>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回だけだろ
A=1であり、『B=2 かつ C=3』でない というWHERE文はどのようになるでしょうか? WHERE A=1 AND !(B=2 AND C=3) であってますでしょうか?
940 :
NAME 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)
だと、全部検索対象になってしまいますし……。お知恵をお貸しください。
>>939 実際にやってみた?
WHERE A=1 AND NOT (B=2 AND C=3)
でどうか
942 :
940 :2006/10/03(火) 11:12:23 ID:???
↑若干間違いでした、すいません 誤:A-3とB-2とC-1だけ検索したい 正:A-2とB-3とC-1だけ検索したい まぁ、引っかからないのは読み飛ばしたいので、別に間違いではないのかもしれませんが……。
>>942 えっと、、、よくわからないが
WHERE (key1, key2) IN (('A',2),('B',3),('C',1))
とかでいいのかな?
>>940 WHERE (key1 = A AND key2 = 2) OR (key1 = B AND key2 = 3) OR (key1 = C AND key2 = 1)
リンク先の方法がダメな処理系もあるな。例えばMSSQLにはINのサブクエリは1列だけの制限がある。
945 :
940 :2006/10/03(火) 11:34:42 ID:???
早速のお返事ありがとうございます。
>>943 通らないっす……(T_T)
>>944 それっきゃないっすか……(T_T) ちょっと条件の数が多い(100前後)なので、どうしようかなぁ……。
ちなみにPostgreSQLではOKなようです>INのサブクエリに複数列
ってそう書いてあったか、スマン
1から順に足す関数ってありますか。 5なら15、10なら55って求められるようなの。
汎用的なのは無いんじゃないか。作るのは簡単
select (n+1)*n/2 from dual; こんなん?
952 :
950 :2006/10/05(木) 00:55:24 ID:???
>>951 いあ、昔読んだ話でピタゴラスだか何だかが子供の頃に
思いついたアルゴリズムって事で覚えてただけなんよ…。
自分で思いついたんならえらいんだけどね('A`;)
ガウスだろ
954 :
950 :2006/10/05(木) 02:02:58 ID:???
>>953 おおう。確かにwikipediaでガウス調べたら書いてたよー。
誰だったか思い出せなくて気持ちわるかってん。ありんこ('A`)ノ
ちゅうか高校数学1じゃないのか?
PostgreSQLなのですが、 ・あるテーブルtable_aが存在していないとき、table_aの作成と初期データの INSERTを行なう ・table_aがすでに存在するときは、table_aの作成と初期データのINSERTを 行なわない(初期データのINSERTをスキップする) といったことを実現するにはどのように記述すればいいのでしょうか。
>>956 なんでそんなことを、、、というのはともかく
PL/pgSQLを使えばできるかな?
SQLの範囲外なのでPosqgreSQLのスレで聞いてね
>955 小学校のときの「たのしいさんすう」って算数のノートに載ってたよ。
>>956 pg_tables だったか、そういう名前のシステムテーブルをselectしてtable_aの存在確認を行うといい。
960 :
NAME IS NULL :2006/10/06(金) 21:13:06 ID:bDRzLVyV
すまんおしえてくれ。 テキストボックスが4つくらいあってその中に文字入れて DBから抽出したいんだが。 WHERE〜ANDで結ぶとテキストボックスに全部入力値がないと 抽出できないじゃん。 空欄のテキストボックスはスルーして入力された単語のみで 抽出するにはどうすればいいの。。。
世にある検索の複数指定の多くがラジオボタンとかプルダウンってところから 察しろって気がするが。
962 :
674 :2006/10/06(金) 21:55:20 ID:???
VBAでそういうの作ったけど、SQLと全然関係ないじゃん。 まぁSQLステートメントの部分がって無理やりなら言えなくも無いけど。
963 :
NAME IS NULL :2006/10/06(金) 22:05:43 ID:bDRzLVyV
>>961 なるほど、自分で入力した文字列だと
確実じゃないしね。確かに言われてみるとプルダウンとかが多いですね。
いくら調べてもわからなくて。
やはりDBから、元から値を取得して選ばせたほうがいいのかな。
それでも複数テキストボックスから抽出ってできるんでしょうか?
SQLにテキストボックスなんてないぞ いったいなんの話をしておるのだ
環境がわからんから答えにくいんだが、WEBアプリとかだと テキストボックスに検索条件をユーザーに入力させるのは セキュリティ上かなり、アレなんだが・・・。 出来る出来ないの話しなら、そりゃ動的にSQL生成するか、 非常に無駄っぽいサブクエリがテキストボックスの分だけ 走る様に組んどけば可能だろう。
IF テキストボックス1.TEXT <> "" THEN SQL = SQL & " AND 項目1 = " & テキストボックス1.TEXT ENDIF IF テキストボックス2.TEXT <> "" THEN SQL = SQL & " AND 項目2 = " & テキストボックス2.TEXT ENDIF VBなんて10年ぶりだ。
てかMySQLじゃ動かねえなこれ 理屈は(unknown AND age < 20) is not falseはたしかになるほど
>>964 すみません、Webアプリかにあるテキストボックスです。
>>965 セキュリティー上では良くなのですか?
勉強になります。
>>966 それをクリックイベントのところに記述するんですね!
項目っていうのは列名ですよね。
やってみます。
>>967 それはわたくし当てですか?
見てみます。
質問です。 状況によって特定のカラムだけ欲しい場合と、ほぼ全てのカラム(の情報)が欲しい 場合があると思います。このとき、selectに指定するカラムの数によって実行速度や DB負荷などはどの程度違うものなのでしょうか? 1.) select foo from hoge; 2.) select foo, bar, baz, quux from hoge; (あるいは select * from hoge;) もちろんテーブル構造やDB規模によって異なってくるとは思いますが、指定した カラム数によってDBの動きがどうなるのかが知りたいのです。 数が少ないほどメモリの消費量が少ないとか、転送量が減るとか、あるいは テーブルのデータはメモリ上に載るのでカラム数が増えてもあまり気にするほどの 差はでないとかそういう感じで。。。
>>971 そんなことよりインデクスが効いてるかどうかの方が重要
200倍くらい速度が違う場合もある
>>971 そりゃ 出たviewのトータルバイト数が少ない方が、
全てにおいてメリットばかりっすわ。
逆にデメリットはないんじゃないの。プログラマの手間増えるぐらいか。
974 :
NAME IS NULL :2006/10/08(日) 06:59:08 ID:1t6iDKSI
ここで質問してる人は実は仕事で行き詰ってる人?
そりゃそうだろう、他に何の用途がある
>975 パズル好き
答えてるのはほぼ間違いなく暇人だがな
質問させてください。 Windows 2000 に SQL Server 2000 をインストールして使っていました。 OSのホスト名を変更したのですが、SQL Server に昔のホスト名が残ってしまいます。 (レジストリを検索しましたが、ヒットしませんでした。) SQL Server は、ホスト名をどこで管理しているのでしょうか? また、変更するにはどうすればよいのでしょうか?
>>978 つ Microsoft SQL Server 総合スレ 4
MySqlが多いみたいだが仕事で使うのか?暇人は同意。
981 :
978 :2006/10/08(日) 19:04:37 ID:???
>>979 そちらで質問させてもらいました。
誘導ありがとうございます。
ウチのサーバはMySQL。でも何故か3.0
素敵やん
SQLとはちょっと違うのだが一つ質問。 プロセス間通信のかわりにデータベースをメッセージパッシングのためのキューとして使うのってなんか問題あるのかな? アプリ同士のメッセージ交換にActiveMQとかCORBAを使わずに簡単にできる方法としていいのかなと思うのだが。 そもそもデータベースってシステム内のスケールがものすごく広いグローバル変数だよな?
>>984 AS/400(今はiSeriesか)でも使っとけ。
システム(OS)がDB以外にもDTAQ,OUTQ,MSGQ,SYSLOG等の
数々のキューが用意されている。
DB使うのは悪くはないと思うけどプロセスの数が増えて
メッセージの応答やらセマフォとか考え出すと、
自前でDB部に対してコーティングするのが
ウザくなってくるので、メッセージキューなんかはOSまかせに
した方がプログラミングが楽だ罠。
986 :
984 :2006/10/09(月) 14:55:26 ID:???
>>984 ×スケール
○スコープ
..................................org
987 :
NAME 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 商品管理表
988 :
987 :2006/10/10(火) 03:09:06 ID:0dcODXjr
>>987 の質問に関連して
下記条件では原価がNULLのレコードが
ヒットできませんでした。
WHERE NOT 原価 = 100
下記条件だとヒットします。
WHERE NOT NVL(原価,0) = 100
データがNULLの際には特別な扱いが必要なのでしょうか?
989 :
NAME 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
990 :
NAME IS NULL :2006/10/10(火) 03:14:58 ID:wLuxOSg2
>>988 あれ?分ってるじゃん。
NULLは何に対しても偽になるよ。
逆に言うと計算をキャンセルさせるロジックとしても利用できる。
991 :
987 :2006/10/10(火) 03:23:38 ID:0dcODXjr
992 :
NAME IS NULL :2006/10/10(火) 03:32:55 ID:wLuxOSg2
>>991 どうしても0に変換したくないなら
AND (原価 <> 100 OR 原価 IS NULL)
って方法もあるけど、データ量が多い時にOR入れると遅くなるよ。
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のデータを持つ行に追加した結果を得たいのですが、どうすればよいでしょうか? よろしくお願いします。
>>993 よくわからん、追加した結果がどうなるかも書いてみて
^
^
^
1000ならジュースでも飲むか
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。