1 :
NAME IS NULL :
2006/10/10(火) 14:30:16 ID:U8kssbc7
3 :
NAME IS NULL :2006/10/10(火) 18:08:03 ID:SmWQiBwg
ある変数のデータの中でn番目に大きなもの(小さいもの)を選択したいのですが、 どうしたらよいですか。エクセルだとlarge(n,変数名)という関数があるのですが。
4 :
3 :2006/10/10(火) 18:12:11 ID:SmWQiBwg
忘れていましたが OS:WindowsXP 使用ソフトはAccessで、かなり古い97です。
>>1 SELECT
'乙'
FROM
ALL_OBJECTS
/
6 :
NAME IS NULL :2006/10/11(水) 10:29:15 ID:lKBGPFvL
cd date value1 value2 --------------------------------- 1 2006/09/01 1 1 1 2006/09/02 2 1 2 2006/09/02 3 1 ↑のようなデータから、全てのcdのdateが最新の行を抽出するには どうすればいいのでしょうか。 上の例だと、下の二行を抽出したいのですが。 1 2006/09/02 2 1 2 2006/09/02 3 1
FAQ
9 :
NAME IS NULL :2006/10/11(水) 21:40:36 ID:Qe2UBQfX
FROM句はトランザクションテーブルを一番右に、それに付帯する各マスタを左に並べると早いってのは本当? 駆動軸がどうとか
>>9 試してみればいいのでは?
DB2とかだと小さいテーブルはメモリ参照って具合に最適化するけど、
OracleやPostgreがそうだとは限らんし。
>>9 ネタが古いw
てか古いオラクルでも順番だけで駆動テーブルが決まる訳じゃないし。
そんなくだらない知識よりまず実行計画の読み方から勉強した方がいいよ。
質問です。 各店舗の商品で最も価格が高いもののリストを抽出したいのですが うまいやり方が思いつきません。 テーブル構造とサンプルは以下のような感じです。 店舗ごとに並んでいる商品が違ったりもします。SHOPとITEMの組み合わせは一意です。 同じ価格の場合はITEM番号の大きいほうが優先されます。 SHOP | ITEM | PRICE | --------------------------- A | 1 | 10 A | 2 | 30 A | 3 | 30 B | 4 | 600 B | 5 | 400 B | 6 | 200 C | 2 | 5 C | 4 | 15 C | 5 | 10 D | 8 | 900 D | 10 | 800 D | 12 | 1000 (取得したい結果↓) SHOP | ITEM | PRICE | --------------------------- A | 3 | 30 B | 4 | 600 C | 4 | 15 D | 12 | 1000 最初は強引に SELECT SHOP, MAX(PROCE) 〜 で取得した結果と元テーブルを結合して 店舗ごとに最も価格の高い商品リストが作れたのですが、価格が重複している場合は レコードも重複してしまうので困りました。さらにMAX()で元テーブルと結合するのは かなり重そうだし、そもそもこのやり方自体間違っている気がするので…
>>12 オラクル(たしか9i以降)ならGROUP BYで、
MIN() KEEP (DENSE_RANK FIRST/LAST〜)が使えるんだが、他のはワカラン。
一方ロシアはNOT EXISTSを使った。
16 :
NAME IS NULL :2006/10/15(日) 23:02:40 ID:e8jqgW9b
>>12 論理としては、「重複して困った」というその集合を、
さらにSHOPで集計してITEMのMAX取ればいいだけなんだけど、
ビューとか使ってたら当然重くなるね。
一気に2重3重の副問合せ書いて効率良く絞るとか、
ストアドで途中で一時テーブル使いながら単純化し、最後に結果を返すとか、
どうやると高速にできるか勉強した方がいいと思う。
>>12 サブクエリ使えば簡単だろ
select * from (select * from T1 order by PRICE desc) TMP_T1 group by SHOP;
忘れてたITEMもソートしないとな select * from (select * from T1 order by ITEM desc, PRICE desc) TMP_T1 group by SHOP;
19 :
NAME IS NULL :2006/10/16(月) 01:16:54 ID:zQ3wf1ji
>>18 それ何のDB?もしできたとしても超亜種だと思う。
普通こうだよ。
SELECT
T1.SHOP, MAX(T1.ITEM), MAX(T1.PRICE)
FROM T1
INNER JOIN (
SELECT
SHOP, MAX(PRICE) AS PRICE1
FROM T1
WHERE 〜
GROUP BY SHOP
) T1_P
ON T1_P.SHOP = T1.SHOP
AND T1_P.PRICE1 = T1.PRICE
WHERE 〜
GROUP BY T1.SHOP
20 :
NAME IS NULL :2006/10/16(月) 05:32:58 ID:EmB35BHi
select 1 from 〜 この列選択リストの「1」って何ですか?
>>19 MySQLだけどどこか特殊な構文ある?
値の出し方がトリッキーなのは認めるけどね
>>20 定数。数値。算数における基本単位。1+1の1。
>>21 19じゃないけどMySqlと聞いて納得。でもMySqlと断りをいれるべきだろ。他のやつでは動きすらしないよ。
>>24 へーそうなんだ
もしかして最後のgroup byのところが問題かな
group by TMP_T1.SHOP ならどう?
>>25 いや、select * のとこ。もちろん列名書いても無理。
これでITEMやPRICEの逆ソートされた最初の値返してくれるのはMySQLだけ。
つまり他のDBだとfrom 句にサブクエリ使えないってことか? そりゃ不便だな
違うよ group by 使ったときは、選択リストにはgroup byに指定した項目か集計関数しか使えない。
29 :
NAME IS NULL :2006/10/16(月) 10:29:20 ID:zQ3wf1ji
ほー。MySQLってすげーな。 Limit も、他のDBからすれば夢みたいな機能だけど。 将来は標準規格の方に入るかな。 でも集合の定義としてちょっと変だから、集計関数として追加されるかな。 SELECT TOP * ならぬ、 SELECT TOP(*) とか。
つーか、こんなアホなのが許されるのがおかしい。 りくつにあってないだろ
まー、group by の時にselectに*が許されてもいいじゃん。とは初心者の頃激しくオモタな。
>>16 ...いや、おまいも自己流じゃなくてちゃんと勉強した方がいいと思う
33 :
NAME IS NULL :2006/10/17(火) 00:29:23 ID:KyI1Tz1l
>>32 さあ…ケースバイケースだから、あれでいいかどうかは実際の場面でないと分らない。
他社が数分かかるものを数秒にすることはよくあるよ。
34 :
超初心者です :2006/10/17(火) 13:08:36 ID:???
VC++6.0でお勉強しているものです。 まったくの初心者です。 SQLサーバーをVCから呼び出すコードがわからなくてとても困っています、調査能力のない自分が悪いのですが、行き詰っています。 どなたか接続の仕方を教えてもらえるとこの一週間が進みます。 ODBCでの接続で、探しています。
複数テーブルの指定列から最大値を求めるにはどうしたらいい? 例えば、hoge1のid列とhoge2のid列から最大値を求めるとか
38 :
NAME IS NULL :2006/10/17(火) 15:40:22 ID:s0a+dHjv
>>35 SELECT MAX(ID) FROM (
SELECT ID FROM HOGE1
UNION
SELECT ID FROM HOGE2
) T
ていうか、求めたいのが「ID」って名前なのが気になる。一意保証の危うい設計やめれ。
質問 SQL Server 2000 + Access 2002(XP)VBAの環境下でシーケンシャルデータを 最も効率的にInsertするにはどうしたらよいですか? 当然bulk insert などの一括挿入も検討されるがUTF共有自体が許可されない環境です。 みなさんの考えをお聞かせください。(.NETを使うと簡単すぎだし、解決にならんので office2002+VBAの環境下でお願いします(アセンブリも))。
>40 hogeとかfooみたいなもんじゃないの?
>>41 通信の遅い環境で、INSERT文を100行分ずつ束ねて送信したことはあるけど。
その時はVPNじゃなくてASPに対して送信だったので、HTTP POSTの限界考慮して区切った。
限界がないなら全行分まとめて送信してみれば?
44 :
big :2006/10/18(水) 08:19:32 ID:9//4oqjS
DBAビギナーです。 Oracle Data Pumpの使用についてご教示 ください。 スレ違いかもですが。。 【Oracle バージョン】:10.2.0.1.0 【OS】:Windows Server 2003 Enterprise Edition Version 5.2.3790 SP1 【実行スクリプト】: impdp usernm/pw tables=emp directory=dp dumpfile=dp_test.dmp logfile=dp_test.log なのですが、どうしても下記のエラーが出てしまいます: ----------------------------------------------------- ORA-31626: ジョブが存在しません ORA-31637: ジョブjobnm(ユーザーusernm)を作成できません ORA-06512: "xxxxxx", 行nn ORA-06512: "xxxxxx", 行nnnn ORA-39080: Data Pumpジョブのキュー"xxxx"および"xxxxx"の作成に失敗しました ORA-06512: "xxxxx", 行nn ORA-06512: "xxxxx", 行nnnn ORA-00832: Streamsプールは作成されませんでした。自動的に作成することはできません ----------------------------------------------------- 何か間違い、見落としている点等あるのでしょうか? どなたかお解かりになる方、よろしくお願いいたします。
>>44 >スレ違いかもですが。。
わかってるなら・・・
見たこともないSQLだ・・・
>>38-39 サンクス
PostgreSQL8.1.4だけど、
GREATEST ( MAX(HOGE1.ID), MAX(HOGE2.ID) ) FROM HOGE1, HOGE2
とすると、どちらかのテーブルに行が無い場合、結果が出ないね…
48 :
NAME IS NULL :2006/10/18(水) 13:45:07 ID:CntbNDNh
>>48 それ駄目。ぜーッ怠惰目。UNIONでできるものはUNIONで。速度が全然ちがーう。
一概に言えんと思うが。 DBMSによっても違うし、インデックスの適用によっても違うし。
51 :
NAME IS NULL :2006/10/19(木) 11:36:50 ID:rYPEA4U9
>>49 は?
完全外部結合に命をかけたファーアーバードを知らんのか?
Oracle データベースで CREATE DATABASE AAA; CREATE DATABASE BBB; CREATE DATABASE CCC; として AAAの中でCREATE TABLE ・・・ とかAAA内での管理者権限ってあるの?なんて権限? BBB,CCCはアクセスできません。
53 :
NAME IS NULL :2006/10/19(木) 15:19:18 ID:SHleJobA
>>52 まず、日本語で何をしたいのか説明しろ。
それにすれ違い。ORACLE限定ならばORACLEスレへ。
54 :
NAME IS NULL :2006/10/20(金) 11:29:59 ID:Rf9Ei9dc
質問です。MYSQLを使用しています。 フィールドAとフィールドBのどちらかに条件値が存在する行を フィールドCでorder by したいのですが、インデックスの作成で困っています。 select * from table where A = 'hoge' or B = 'hoge' order by C ↑だと、orを使うのでインデックスが使用できませんよね? データ数が非常に多いので何とかインデックスを使用したいのですが 良い方法はないでしょうか?なお、AとBには同一値は入りません。
>>54 orを使ってもインデックスは使用されるんだけど、MySQLはダメなんか?
サブクエリが使えるバージョンかどうか知らんが、
SELECT * FROM
(SELECT * FROM table WHERE A='hoge'
UNION ALL
SELECT * FROM table WHERE B='hoge')
ORDER BY C;
だとどお?
56 :
NAME IS NULL :2006/10/20(金) 22:24:40 ID:Rf9Ei9dc
>>55 explainやってみてるんですが、orだと駄目っぽいんですよね。
さらにバージョンが4.0.26なんでサブクエリも使えませんでした。
SELECT * FROM table WHERE A='hoge' UNION ALL SELECT * FROM table WHERE B='hoge' ORDER BY C; これでどお?ネストする必要無いはずだが。
SQL Server と MY SQL の違いってなんですか?
今日はいやに佐賀の話題が多いな 何かあったのか?
ニュー速+行け。すぐ分かる。
佐賀ってどんな意味ですか? SQL Server と MY SQL は使い方はかわらないのですか?
63 :
NAME IS NULL :2006/10/21(土) 14:06:20 ID:zFcqxEeh
>>57 動きました。explainしてみたところ設定したindexも
使用されているようです。ありがとうございました。
64 :
NAME IS NULL :2006/10/21(土) 15:52:56 ID:vg/WQ1gp
ここで聞くのが適切かどうかわからないのですが…(違ってたら誘導していただけるとありがたいです) PL/SQLに関する質問です。 PL/SQLで複雑なプログラムを作ったときに、どこかでエクセプションが発生してしまった際に それがどこで発生したか簡単に調べる方法はあるでしょうか?(つまり1行ずつトレース文を はさむような事をせず)
65 :
NAME IS NULL :2006/10/21(土) 19:36:01 ID:0YEftnXD
>62 SQLの使い方は違う。 どうちがうかをかたるのはこのスレの範疇ではないから 別のスレにおききなされ。
66 :
NAME IS NULL :2006/10/21(土) 19:38:10 ID:0YEftnXD
しまったまとめて送信すりゃよかったあるよ >64 EXCEPTIONのCATCHの仕方でドコで発生したかがわかるようになるよ。 詳しくは、Oracleのスレでお聞きなされ。 PL/SQLはSQLも使うけど、君の聞いているコトはOracle固有のお話だから。
68 :
NAME IS NULL :2006/10/22(日) 15:26:56 ID:m4udQEN9
Windows XPで Microsoft SQL Serverを使っています。 テーブルAにフィールドがいくつかあり、 そのうちのフィールドB(NULL許容)UNIQUEとしようとしています。 そうすると、フィールドBがNULLのデータが1つしか入れられなくなりました。 やりたいことは、フィールドBは、「NULLまたはユニークな値」なのです。 値が入っていればユニークでなければいけないが、NULLなレコードは複数あってもよい、 というのがやりたいのです。 テーブルの属性の設定などでは無理なのでしょうか?
>68 テーブルの制限でユニーク値を求めるストアドプロシージャを使えばいいんじゃないの? あと、ここはSQL Serverのスレじゃないから。 続きをしたければSQL Serverのスレでヨロ。 なんか交通整理ばっかりしているなぁ、おいら。
漏れの中の常識ではKEYとなるフィールドはNULL禁止って イメージがあるのだが、最近はそうでないのか? テーブル設計の人がNULLの意味を理解していないじゃないかと思うけど。
71 :
68 :2006/10/22(日) 18:21:33 ID:???
失礼しました。SQL Serverのスレがあったんですね。 移動します。 ちなみにフィールドBはユニークですが、キーのフィールドは別にあります。
んなら外部制約でも使えばって気がするが・・・。 SQLServerで使えるか知らんが。 使えないから質問しているのか…。ガンガレ
あれ、UNIQUE制約ってNULLは複数あっても化。
>>68 の期待する制約だと思うんだが、SQL Serverってそうじゃないんか。
DB2だとNULL可のフィールドはUNIQUE制約できんぞ。
だよねぇ。たしかにNULLは入るけど一つだけ、ってのが欲しいと思ったことも あるけど、普通の仕様はNULL複数可だと思うが。 ところでSQLServerがそんな動作するってことは、is nullにもindexが効くって事か。 それはそれで便利かもしれん。
>>75 便利かも知れんがNULLがINDEX含まれるって事は
NULL判定する分、検索がトロくなる印象があるんだが。
つか、DB2だとNULL禁止つけたほうが動作が高速化
するといわれているので、漏れはKEYにはNULL禁止な設計するし、
普段からマメにNULL禁止にしているなぁ。
それってNULLは値だっていってるようなもんだな
78 :
73 :2006/10/22(日) 21:18:49 ID:???
>>73 な様なことを書いておきながら、SQL ServerでもUNIQUE制約でNULLは複数可って
仕様になっていると思ってて、きっと
>>68 の勘違いじゃって考えてんだが、
このスレにはSQL Server使いがいないんかw
>>76 KEYに使われるようなカラムは当然のこと、それ以外でもなるべくNOT NULL制約は
かけておいた方がいいよな。NULLを許可すると便利なときもあるけど、
集約関数ではCOALESCEを挟まなきゃなんなくなるし。
>78 おいらは>69でSQL Server使いだけど、 そもそもUNIQUE制約つけるのに、 NOT NULLじゃないなんてありえねーなんて思ってるし。 NULLオッケーってするなら、UNIQUE制約はTABLEにつけるんじゃなくて、 実装するのが運用ラクじゃねーの?って考えですわ。
80 :
NAME IS NULL :2006/10/23(月) 13:11:01 ID:xbTShaHm
mysql標準付属の関数としてis_nullなどははあるようですが、is_numericやis_stringのような関数はありませんか?
82 :
NAME IS NULL :2006/10/24(火) 10:57:03 ID:NVuTF5PR
>>79 一般的なDBでは索引が設定されているフィールドにNULLが使われた場合索引にNULLは含まれない。
このため where data1 = 100 なら索引が使われるケースでも、
where data1 is null の場合はデータ部のフルスキャンになるのでパフォーマンスの問題が発生する。
一方、SQLServerの場合は索引にNULLを含むので、where data1 is null でも索引が使われる。
その代償としてユニークな索引の場合NULLもユニークである必要が出てくる。
SQLserverがこういう仕様なのは古いバージョンのSQLServerがNULLをブランク1つとして扱っていたからで、
それとの互換のためにこうなっているものと思われる。
それでもそろそろオプションで切り替えがきくようにしてもらいたいものだ。
84 :
NAME IS NULL :2006/10/24(火) 14:02:54 ID:153RAHGk
SQLのDBを市販のバックアップソフトを使ってテープやDISKにバックアップする事って 出来ますか? 初心者でスマソ 教えてください
>>84 できる。それ以上のことはスレ違いだから、お前の使ってるDBの専門スレへいってくれ。
86 :
73 :2006/10/24(火) 15:50:14 ID:???
>>83 > その代償としてユニークな索引の場合NULLもユニークである必要が出てくる。
あいやーそうだったのか。そりゃ失礼した。
>>68 >>79 貴方の考え方は概ね同意だが、各自の考え方とUNIQUE制約の仕様は切り分けてね。
配列のi番目の要素を削除したい場合って hoge[1:i-1] || hoge[i+1:n] みたいなやり方しか無い?
VIEWについてよく分からないんだが、 PostgreSQLのドキュメントにはVIEWが参照される度に問い合わせが実行されるとある つまり、ある問い合わせにおいて、よく参照する問い合わせ結果はTABLEに格納した方がいいってこと?
89 :
NAME IS NULL :2006/10/27(金) 17:35:24 ID:7Yc/x2jD
90 :
NAME IS NULL :2006/10/27(金) 17:35:27 ID:7xxX9trU
cd date value1 value2 --------------------------------- 1 2006/09/01 1 1 1 2006/09/02 2 1 2 2006/09/02 3 1 ↑のようなデータから、全てのcdのdateが最新の行を抽出するには どうすればいいのでしょうか。 上の例だと、下の二行を抽出したいのですが。 1 2006/09/02 2 1 2 2006/09/02 3 1
91 :
NAME IS NULL :2006/10/27(金) 18:24:46 ID:j+JTiTDC
オラクルの8iで結合にjoinのANSI標準って使えないの? なんか、8iにもバージョンがあるけど、もう9にならないとダメ?
>>90 「何 度 目 だ ナ ウ シ カ」
>>91 9iから。マニュアル嫁。
gas117bunt740 質問です。 SQLサーバを使ってるんですが、 1レコード500前後のフィールドがあるテーブルがあるとします。 ここから1000レコード、全フィールドを取り出す場合に 最速な方法ってどんなのがありますか? select * from でやってるのですが、*指定は時間がかかると聞いたので 1つ1つ指定しようと思ってもSQL文が長くなってしまいます。 ストアド使ったり、とか何でもいいのでどなたか良い方法を教えてもらえませんか?
94 :
93 :2006/10/28(土) 12:21:01 ID:???
一番上の文字列は無視してください ゴメンナサイ
*でいいじゃん
時間かかるったって人間に判別できるレベルじゃないだろ。 実行前の解析時の問題だし。
97 :
93 :2006/10/28(土) 14:03:47 ID:???
>>95 、
>>96 即レスありがとです。
テストプログラム作って試してみたら、客から要求されるスペックぎりぎりなので
他の方法があれば試してみようと思ったのであります(本当は10万レコード取得する必要有り)。
ちなみに、いささかスレ違いになるかもしれませんが
ハードウェアのスペックを、
XP、ペン4 3GHz、メモリ512、から
XP 64bit、デュアルコア(conroe?)、メモリ2GB
とかに変えたら結構変わりますか?相性とかの問題で一概には言えないのは分かりますが。
SQLサーバへのアクセスはスレッド化してやってて、CPU使用率が100%になっています。
以上、長文失礼しますた
>>97 出力先はファイルなんだよね?
SQLはチューニングの余地無し?
だとしたらボトルネックはハードディスクだろうからそっちを早くしたら?
>>97 ・テーブルが丸々収まるだけのメモリを積め
・joinするな
・sortするな
あと、例えば20万件のテーブルから1000件取り出す場合と10万件取り出す
場合では最適な方法が変わる。
それから、CPU100%になってるのはクライアント側じゃないよな?
>>97 SQLServer2000で64ビット化は8Gバイト越えたあたりから効果が出た。
それほど細かい単位でテストしたわけではないが、6Gバイト以下なら
32ビットで/3GB オプション+AWEの方がパフォーマンスがよかった。
101 :
93 :2006/10/29(日) 16:20:58 ID:???
レス遅れました。 みなさんありがとうです。 >>出力先はファイルなんだよね? 500フィールド*10万レコード取得しますが、ファイル出力は1回です。 なので、ハードディスクの影響は小さいと思います。 >>SQLはチューニングの余地無し? >>joinするな、sortするな あと今回使うのはみなさんが思っているよりもひたすら簡単なSQLなので JOINもSORTもありません。 ですのでSQLのチューニング(インデックス、クラスタ化など)とか、 構文の変更は効果が薄いと思っていました。 >>CPU100%になってるのはクライアント側じゃないよな? うーん、ネットワーク経由のアクセスではなく、1台のPCにSQLサーバとアプリケーションを 積んで動かします。 テストプログラムでは、SQLサーバが30%、アプリケーションが70%って感じでCPUを使ってました。 >>テーブルが丸々収まるだけのメモリを積め >>32ビットで/3GBオプション+AWEの方がパフォーマンスがよかった やはり、メモリを増設するのがスピードアップに欠かせないみたいですね。 みなさん、ご丁寧にありがとうございました。とりあえずハードの性能を上げてから、 客に「色々試したが原理的に難しい」とかなんとか言っておきます。 お世話になりました。ノシ
*が時間がかかるって本当だろうか? カラムを列挙する方がそのパースとチェックに時間がかかりそうだ。 *ならテーブルのスキーマやサブクエリの指定から持ってくればそれで終わり。
103 :
NAME IS NULL :2006/10/30(月) 00:59:06 ID:qwh4pYn3
create or replace view v as select a, b from ( select a,b from table_a -- (1) union all select a,b from table_b -- (2) ) ; のような構造のVIEWで、問い合わせ時は select * from v where a = :1; と することがわかっている場合、(1)と(2)は全部問い合わせされてしまう のでしょうか? それだと無駄なのであらかじめ (1)と(2) も where a = :1 で抽出されている と良いのですがそのような方法はありますでしょうか?
>>103 >それだと無駄なのであらかじめ (1)と(2) も where a = :1 で抽出されている
通常はそう。気になるならプランを確認しなされ。
テーブル hoge1 | id : int4 | level : int4 | テーブル hoge2 | idpath : int4[] | … | hoge2.idpath[ hoge1.level ] = hoge1.id の条件のものをテーブル hoge2 から SELECT または、DELETE するにはどんな方法がある?
106 :
NAME IS NULL :2006/10/30(月) 09:52:55 ID:mzvVOSKf
OracleでWITH句ってあるっぽいんだけど 誰か意味と文法教えてくださいorz
>>105 それは配列か?
そういう疑問が出るって事は、お前が使うべきものじゃないってことだ。
>>106 インラインビュー定義。
書き方は確か
WITH
IVIEW AS(
SELECT ~ FROM ~
)
SELECT ~ FROM IVIEW
こんな感じだったかな。複数定義も可。少しはマニュアル嫁。
>>107 配列
SELECT * FROM hoge2 h2 INNER JOIN hoge1 h1 ON h2.idpath[ h1.level ] = h1.id;
他に効率のいい方法はある?
110 :
NAME IS NULL :2006/11/01(水) 01:26:57 ID:wuXOdbma
質問です。 NULL以外のものだけ、まとめることは可能でしょうか? 例: data value 1 1 2 2 3 null 4 null 5 2 6 1 ↓↓↓ data value 1 1 2 2 3 null 4 null ※まとめた際のdataはminだろうがmaxだろうが、値が残れば何でも構いません。
UNIQUE制約でのNULL扱い(複数許可)を考えれば、
>>110 でGROUP BY valueとしたとき
NULL値でまとめられてしまうってのは、チョットつじつまが合わない...かな。
>>110 SELECT min(data),value FROM Table WHERE value IS NOT NULL GROUP BY value
UNION
SELECT data,value FROM Table WHERE value IS NULL;
112 :
NAME IS NULL :2006/11/01(水) 04:01:59 ID:1j/d4EoT
助けて下さい!! MySQL5.0の環境設定がどうしてもできません…
114 :
NAME IS NULL :2006/11/01(水) 11:53:40 ID:wuXOdbma
Oracleのストアドプロシージャとファンクションについてなんですが、 ストアドプロシージャはINSERT、UPDATE、DELETEなどを断続的に実行するもので、 ファンクションは複雑なSELECT文の結果を戻り値として取得するのものであるという認識でいいんでしょうか。 あと、ファンクションの内部ではINSERT、UPDATE、DELETEは使用できないのでしょうか。 よろしければ助言をお願いします orz
>>115 ここは、DB版の案内所なのか?
つ Oracle 総合 Session6
ストアド関連は標準が無いに等しいので一般的な話で言えばその通りで、
更新は出来ないことにしている実装が多い。selectでこっそり更新してたらややこしいだろう。
>>115 プロシージャとファンクションの違いは戻り値を返すか返さないかの違いのみ。
どちらでもSELECTだろうとINSERTだろうとCREATEだろうとなんでも可能。
>>116 すいません、SQLに関しての質問なのでこちらがいいと思っていました。
DBMSによって実装の違いがあるのですね。
OracleのFUNCTIONの実装について調べてみます。
>>117 最初はそう思っていたのですが、以下のようなファンクションを定義したら、
実行時に「ORA-14551: 問合せの中でDML操作を実行することはできません。」と出ました。
CREATE FUNCTION fnc_test(test IN VARCHAR2) RETURN NUMBER AS
BEGIN
FOR i IN 0..1000 LOOP
INSERT INTO test(id,name)VALUES(i,'N' || i);
END LOOP;
COMMIT;
END;
なお、まったく同じ内容でストアドプロシージャを定義したら、正しく実行されました。
>>118 それは実行の仕方に問題があるんでないの?
SELECT文の中で呼んでるとか?
これ忘れたころに出てくんだが なんとかならんのか? cd date value1 value2 --------------------------------- 1 2006/09/01 1 1 1 2006/09/02 2 1 2 2006/09/02 3 1 ↑のようなデータから、全てのcdのdateが最新の行を抽出するには どうすればいいのでしょうか。 上の例だと、下の二行を抽出したいのですが。 1 2006/09/02 2 1 2 2006/09/02 3 1
>>118 実装によって違うというのはそういうこと、
OracleはFunction内でデータの更新を許していない。
他のではOKだったり、selectで使わない限りOKというものがある。
123 :
NAME IS NULL :2006/11/03(金) 00:23:25 ID:GYI4IqD6
SQLからカレンダー情報を取得することはできないでしょうか? 例えば2006年11月の日付全てを取得したい date 2006-11-01 2006-11-02 2006-11-03 2006-11-04 ・ ・ ・ 2006-11-30 みたいな感じです。
ソフトやバージョンによるのかもしれないが、SQLは結構アバウトな検索条件でも想定通りに動いてくれたりする。 date>='2006-11-01' とか。
普通の方法かどうかはしらんがこうじゃねーの? select * from hoge where YEAR(DATE) = 2006 and MONTH(DATE) = 11 ちなみにDB2な。
日付のレコードが既にあるんじゃなくて生成したいんじゃないの?
入力ファイルもなしでSQL一つで任意の一ヶ月分insertするって事? 出来るなら漏れも知りたいんだが。 漏れはJavaのCalendarクラス使いながら任意の月のカレンダーを insertするアプリ作ったことはあるけどさ。
128 :
123 :2006/11/03(金) 09:38:55 ID:GYI4IqD6
はい、データがあるわけではなく、生成したいんです。 やはり無理なもんなんでしょうか。
0から30までを返してくれる関数なり、テーブルを作っておけば、 なんとかならんわけでもない。
レコードを生成する手もあることはあるがDB依存になる。 ORACLEならDUALにCONNECT BYを使うとか。PL/SQLで表関数を自作するとか。 どっかの適当なテーブルかディクショナリービューから引っ張ってくるのが一番楽だが。 そして適当な数のレコードを確保したらSELECT句で日付型の'2006/11/01'に ROWNUMとかの行カウントをもつ疑似列を足せばいい。
アプリ側でやるとか、前もって日付テーブルを作っておくとかの方が後々楽だと思うのですが
>>131 アプリに頼るとは貴様それでもSQLerか!
どんなことでも1つのSQLでやる!それがSQLerだ!!!1111
SELECT TO_DATE('2006/11/01')+DAY FROM ( SELECT 1 DAY FROM DUAL UNION SELECT 2 DAY FROM DUAL UNIOM : UNION SELECT 31 DAY FROM DUAL ) D WHERE TO_DATE('2006/11/01')+DAY < TO_DATE('2006/12/01'); むりくり
学校でデータベース入門みたいな授業取ったんですが、変なプリントだけですすめる授業で ついていけません・・・初心者向けの解説サイトかいい本ってないでしょうか? CREATEなんたらの辺でつまづいてます
SQLの絵本
>>134 10日で出来る〜とかのシリーズでRDBについてもあるから家のPCにMySQL入れて、本読みながら実際に操作してみるのが
よろし
変なプリントってどんな感じの?
138 :
NAME IS NULL :2006/11/04(土) 14:11:40 ID:07MrGocL
質問させていただきます。 一つのフィールドに複数の外部キー(数は可変)を入れたいのですが、 どのようにテーブルを組めば良いでしょうか?
意味が解らんが、ひとつのフィールドに制約を複数つけるって事か? 事例を具体的に汁。
一つの列に複数のデータを入れるって事? だとしたら止めとけ。列はアトミックじゃないといかん。
141 :
138 :2006/11/04(土) 23:23:56 ID:07MrGocL
>>139 すみません。。
一つのフィールドに複数のデータを入れたいんです。。(MySQLのENUMやSETみたいな。)
>>140 そうなんですが、こういう時ってみなさんどうしていらっしゃるのか知りたくて。。
別にテーブル作ってなんとか出来ないかな、と考えていますが方法がおもいつきませんorz
Genre Name -------------------- A りんご A ぶどう B いちご B おっぱい B みかん C かき じゃ駄目なの?
143 :
138 :2006/11/05(日) 00:55:50 ID:???
>>142 !!!!!
アッ――全然思いつきませんでした。。
本当にありがとうございました。
144 :
NAME IS NULL :2006/11/05(日) 00:55:48 ID:D+FbnAE+
すいません、Oracleのcreate databaseとcreate tablespaceのサンプルってどっかにありませんか? ネット上探しても文法は載っててもsqlそのものは置いてなかったりなんで・・。
関係モデルのときのデータモデルの概念について、データ構造・操作演算・インテグリティ制約 について説明せよって問題で、データ構造はデータモデルの要素間の関係を定義するもの、 操作演算はデータ構造に対しての操作のことでそのうちデータベースにするものってのは わかった(あってるのかな?)んですが、インテグリティ制約ってのが ググってもちゃんとした説明が見つからず何なのかわかりません・・・ インテグリティってのは完全性って意味だからデータベースが完全じゃなきゃいけないって 制約・・・?教えてください
>144 マニュアルにあるサンプルじゃ足りないって話なら、 何が足りないのか明確にして、 Oracleスレに行きませう
3階層アーキテクチャって内部層 概念層外部層 でいいんですか?
SQLだけで3階層アーキテクチャするのかと。
ビューを使用したことがないのでビューというものがよく分からないのですが ストアドと比べ、ビューを利用するメリットって何かあるのでしょうか? パラメータが設定できない簡易ストアドと考えればいいのかな?と
>>149 違いました?じゃあなんのことでしょう・・・
>151 違うも何も、SQLっていうのはただの言語。 ここで3階層アーキテクチャって何?って問うのが意味不明。 ム板にいってらっしゃい。
>>150 ビューのメリットをどう捕らえるかは人それぞれだけど、
ウチの近所ではテーブルのテーブル名は英語表記で
ビューのテーブル表記を日本語にしてたりするな。
プログラマーは英数字でゴリゴリとコーティングして、
クライアントはAccess,Excelでアクセスするから日本語って感じ。
ストアドはバッチ処理で使っている。
すいません、質問がありあす。 実験的に、レビューサイトみたいなものを作ろうかと思っていまして データベース全体の設計を考えているんですが、ちょっと路頭に迷っています。 例えば、漫画を題材に作るとしたら テーブル名 ドラゴンボール 評価項目(フィールド) キャラクター ストーリー 演出 レビュー投稿者(レコード) キャラの得点 ストーリーの得点 演出の得点 というような感じで、漫画の種類ごとに、テーブルを増量していけば、いいのでしょうか? 一日中、考えていたのですが、なかなか結論が出ません。 もし、先輩達が作るとしたら、どのようにしますか?教えてください。
○テーブル名 漫画マスタ 漫画ID 漫画名 ○テーブル名 レビュー 漫画ID レビュー投稿者 キャラの得点 ストーリーの得点 演出の得点 ○テーブル名 レビュー集計 漫画ID レビュー件数 各平均〜 レビュー数が少ないなら集計テーブルはいらんかも。 あんまりよくはないが漫画マスタに集計値を持つのも可。 レビュー投稿者が登録制ならレビュー投稿者マスタもあった方がいい。
マスタってどういう意味?
157 :
154 :2006/11/06(月) 07:37:24 ID:???
>>155 そのような考え方も、あるのですね。
こっちの方が、将来的に増えるテーブルの数も極力抑えることが、出来そうです。
とても参考になります。
漫画IDの概念を持たせて、表示させたいページへ、細工すればいいわけですか。
まだ、一つのレコードにID属性を与える方法や、具体的に表示させる方法も
わからないので、考え方が間違えているかもしれませんが、
何となく構図みたいなものが、つかめてきました。
お年玉で買った参考書を持って、学校でもっと勉強してきます。
ありがとうございました。
>>157 >そのような考え方も、あるのですね。
つーか、データをテーブル名に持たせるとこで終わっとる
>>158 こんなDB設計あがってきたら
設計者ぶんなぐってやる所だなw
160 :
NAME IS NULL :2006/11/07(火) 20:22:18 ID:URmt18+L
質問です。 テーブルfooから、フィールドcodeの最も大きい値の フィールドnameを取得するSQLを作ってみたのですが もっとDBに負荷のかからない方法がありますでしょうか? TABLE foo code name 0001 AAAA 0002 BBBB 0003 CCCC SELECT MAX(CODE), NAME FROM foo A ( SELECT MAX(CODE) AS CODE FROM foo ) B WHERE A.CODE = B.CODE
161 :
NAME IS NULL :2006/11/07(火) 20:33:54 ID:yW4ILo2h
>>160 テーブルのサイズにもよるが、こっちのがいいんじゃないかな。
君のやり方だと、一度メモリ上に中間テーブルBが作られるだろ。
SELECT name
FROM foo
WHERE code = (SELECT MAX(code) FROM foo);
162 :
NAME IS NULL :2006/11/07(火) 20:40:57 ID:URmt18+L
163 :
NAME IS NULL :2006/11/07(火) 21:56:37 ID:esrXqfnU
一つの項目の中に、10001,10002,10003...20001,20003,20004...30001,30002,30003,....とある中から ○万台中の各最大値を取り出したいのですが・・・わかりません凹○ ヒントになるサイト等ないでしょうか、よろしくお願いします
>>163 SELECT max(num) FROM Table GROUP BY trunc(num,-4);
165 :
164 :2006/11/07(火) 22:42:51 ID:???
truncが使えるかどうかワカランので補足 要は千以下を切り捨てた値でGROUP BY num/10000 をint型にキャストした値でも桶。
166 :
NAME IS NULL :2006/11/07(火) 23:30:40 ID:JIU7J0zh
質問です。 mysql 上なのですが、グループごとに項目番号をつけて出力したいのですが、 どのようにしたらよいのでしょうか。
167 :
NAME IS NULL :2006/11/07(火) 23:57:41 ID:pACtuQaW
MySQLを使っています。 カラム numに100が入っていて、update でこの値に100を足したい 場合どすればいいですか? ※num を 200にしたい。
update table set column = column + 100 じゃ駄目なの?
>>168 出来ました!
ありがとうございました。
172 :
NAME IS NULL :2006/11/09(木) 15:08:23 ID:Wrn+ZO8y
hogeテーブルのカラムAをhogeテーブルのカラムBにまるままコピーしたいのですが この場合どういったSQL文を書けばいいのでしょうか? 素直にselectとupdateを件数分だけ繰り返すしかないのでしょうか? 件数が多いので一括コピーみたいなことが出来たら楽なのですが… データベースはpostgres7.4を使用しています。
>>172 UPDATE hoge SET B = A;
>>173 テストDBで教えていただいたSQLでうまく出来ました
ありがとうございます
データベースってC:\mysql\dataでしか作れないの? E:\Web\につくりたいんだが
>>175 SQL関係無いので、MySQLのスレでお願いします
>>177 その前に、DBMS=SQLと思ってるのを何とかした方がいいぞ。
179 :
NAME IS NULL :2006/11/09(木) 21:21:55 ID:C9bV7Hin
TABLE1、TABLE2それぞれ最大1レコードしか存在しない場合、 下記のSQLを発行したところ、TABLE1、TABLE2どちらかが レコードカウント0の場合、クエリー結果もレコード0となって しまいます。 2つテーブルのうちいずれかのレコードが0の場合でも結果を 返す方法はないでしょうか? SELECT NVL(A.FIELD1,' '), NVL(B.FILED2,' ') FROM TABLE1.A, TABLE2 B
180 :
NAME IS NULL :2006/11/09(木) 21:53:49 ID:lmWNdE2f
質問です。 あるテーブルAがあり、そこにはID,名前があります。また別のテーブルBがあり、そこにはAのIDとその値段が書かれています。しかしテーブルAにある全てのIDに値段がついているわけではありません。 この状況で僕はテーブルAの値段のついているものとそうでないものを受け取るsqlを書こうとしています。欲しいのは名前と値段がついているかついていないかのフラグです。 そこで僕はテーブルAの行を1行ずつforでまわしてそのIDがBにあるかを調べてあったら1、なかったら0を返すストアドプロシージャを作りました。 これをこれを使って上記の結果を返すsql書くにはどうしたらいいでしょうか?わかる方いらっしゃったら教えて下さい。よろしくお願いします。
181 :
NAME IS NULL :2006/11/09(木) 22:04:09 ID:C9bV7Hin
>>180 これじゃだめ?
値段がNullのレコードが値段無し、それ以外が値段有り。
SELECT
A.ID,
B.値段
FROM
A,
B
WHERE
A.ID = B.ID(+)
182 :
180 :2006/11/09(木) 22:15:16 ID:lmWNdE2f
>>181 早速のレスありがとうございます。でもそれだと駄目なんですよねぇ。sql結果を使うアプリのほうが0 or 1しか駄目な仕様なんです。僕が一つ思いついた方法が以下です。
declare @id
declare @flag
declare test cursor for
select ID from A
fetch next from test into @id
open test
while @@fetch_status=0
begin
@flag = exec <IDがBにあるか調べるプロシージャ> @id
insert into C(
id, flag
) values (
@id, @flag
)
fetch next from test into @id
end
close test
deallocate test
このように一度IDとflagをCテーブルに入れてから取り出す方法です。
insertできるならそれを結果として出力できる方法もあるのかなと思うのですがないのかなぁ…。
183 :
NAME IS NULL :2006/11/09(木) 22:33:27 ID:C9bV7Hin
>>182 その方法(ストアド)ではできないんでしょうか?
詳しくないので、私なら下記のSQLでCテーブルのデータを入れます。
INSERT INTO C
(
SELECT
A.ID,
CASE WHEN B.値段 IS NULL THEN 0 ELSE 1
FROM
A,
B
WHERE
A.ID = B.ID(+)
)
>>179 SELECT
NVL(A.FIELD1,' '),
NVL(B.FILED2,' ')
FROM
TABLE1 A FULL OUTER JOIN TABLE2 B;
185 :
182 :2006/11/09(木) 23:10:06 ID:lmWNdE2f
186 :
NAME IS NULL :2006/11/09(木) 23:27:57 ID:C9bV7Hin
>>184 ありがとう御座います。
もうひとつ質問させてください。
TABLE1とTABLE2がそれぞれサブクエリーの場合はどうしたらいいでしょうか?
FULL OUTER JOINを使用すると、missing keywordとなってしまします。
TABLE1 → (SELECT MAX(FIELD1) AS FIELD1 FROM TABLE_3)
TABLE2 → (SELECT MAX(FIELD2) AS FIELD2 FROM TABLE_4)
187 :
184 :2006/11/10(金) 00:24:14 ID:???
>>186 すいません。もしかして
>>184 も動かない?試さずに書いてしまいました。
ポスグレだと↓みたいにしないとだめだった。オラクルはちょっと環境がないので未確認です。
SELECT
NVL(A.FIELD1,' '),
NVL(B.FILED2,' ')
FROM
TABLE1 A FULL OUTER JOIN TABLE2 B
ON 1=1
188 :
NAME IS NULL :2006/11/10(金) 02:51:49 ID:WvgQViKV
現在まったく同じ構造のテーブルが2つ、TABLE_2005とTABLE_2006がありまして、 それぞれに該当する年のデータが入っています。 この2つのテーブル両方からitem_idが26のものだけを拾ってきたいのですが、 SELECT * FROM TABLE_2005, TABLE_2006 WHERE TABLE_2005.item_id = 25 OR TABLE_2006.item_id = 25 とやっても何もかえってきません。 両方のテーブルから指定したitem_idの行を全て返すにはどうしたらいいのでしょうか。
189 :
NAME IS NULL :2006/11/10(金) 04:00:12 ID:3FgvYcaH
>>188 UNIONを使えばテーブルの結合ができるよ。
SELECT
*
FROM
TABLE_2005
WHERE
TABLE_2005.item_id = 25
UNION
SELECT
*
TABLE_2006
WHERE
TABLE_2006.item_id = 25
190 :
NAME IS NULL :2006/11/10(金) 04:02:13 ID:WvgQViKV
日付と時刻関数を使って、 過去一週間の日付をすべて返すにはどうしたらいいんでしょうか? 日付を記録したフィールドがあるので、 一週間分のデータをWHERE を使って検索したいのですが・・・
id val ------------ 1 100 2 200 3 300 4 400 SELECT id FROM tbl HAVING val = MAX(val) 最大値を持つ行を取り出したく 上記のSQL文を使ってみたのですが・・・駄目でした。 何がよい手はありませんか? MySQL 4.0.26
193 :
NAME IS NULL :2006/11/11(土) 08:16:07 ID:QhU9wHgR
>>191 current dateみたいな関数が使えるかマニュアルを見れ。
>>192 SELECT id,MAX(val) FROM tbl GROUP BY id HAVING val=MAX(val)
では駄目なのか?
194 :
NAME IS NULL :2006/11/11(土) 18:16:11 ID:VWYitA5m
すみません、
>>188 ですが、再度UNIONについて質問させてください。
UNIONで結合したテーブルから上位10件のみを拾ってきたいのですが
SELECT TOP 10 * FROM
(
(SELECT * FROM TABLE_2005 WHERE item_id = 25)
UNION
(SELECT * FROM TABLE_2006 WHERE item_id = 25)
)
とやるとエラーとなって実行されません。
DECLARE @TEMPTBL TABLE(user_id INT, friend_id INT, friend_message NVARCHAR(128))
INSERT INTO @TEMPTBL (user_id, friend_id, friend_message)
(
SELECT user_id, friend_id, friend_message FROM TBL_FRIEND_LINK_0
UNION
SELECT user_id, friend_id, friend_message FROM TBL_FRIEND_LINK_1
)
SELECT TOP 10 * FROM @TEMPTBL
のように、テーブル変数を使うしか方法はないのでしょうか?
>>194 いろいろ試していたのをそのままコピペしてしまったので
あ、列名がむちゃくちゃになってしまいました。
すみません
select top 10 * とかテーブル変数とか、どこの方言だ?
____ / \ /\ キリッ . / (ー) (ー)\ / ⌒(__人__)⌒ \ select top 10 * とかテーブル変数とか、どこの方言だ? | |r┬-| | \ `ー'´ / ノ \ /´ ヽ | l \ ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) | / / / |r┬-| | (⌒)/ / / // だってお!!!!!wwwwwwwww | :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) / ヽ / `ー'´ ヽ / / | | l||l 从人 l||l l||l 从人 l||l ヽ -一''''''"~~``'ー--、 -一'''''''ー-、 ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ____ /_ノ ヽ、_\ o゚((●)) ((●))゚o /::::::⌒(__人__)⌒::::: \ | |r┬-| | (⌒) 答えられないならレスしてんじゃねえよwwwwwww | | | | | ノ ~.レ-r┐、 | | | | | ノ__ | .| | | \ `ー'´ /〈 ̄ `-Lλ_レレ  ̄`ー‐---‐‐´
>194 エラーを書いてくんないかな? そこにヒントがあるはずなんだけど。 あと、その二つのテーブルレイアウトはまったくいっしょなのかな。 多少の桁数違いぐらいならいいけど、カラムの順番が違うとかだとアウトだよ。 違うのなら、後で書いているDECLARE文つきのUNION使ったSELECT文のように ちゃんとカラム名書いてやったらいいんじゃないの?
202 :
NAME IS NULL :2006/11/11(土) 23:50:52 ID:JmoTKbEE
iddate 12006-11-10 22006-11-09 42006-11-03 32006-11-03 62006-10-10 52006-10-09 こんな表があるとします。並び順は「date DESC, id DESC」です。 この表を「SELECT * FROM tbl WHERE id = 3」で検索したとして、 その前後のID(この例でいうと前:id=4, 後:id=6)を同時に取得したいのです。 こんなことは可能でしょうか?
203 :
NAME IS NULL :2006/11/11(土) 23:52:13 ID:JmoTKbEE
ごめんなさい。表がずれました。もう一度。 id date 1 2006-11-10 2 2006-11-09 4 2006-11-03 3 2006-11-03 6 2006-10-10 5 2006-10-09 こんな表があるとします。並び順は「date DESC, id DESC」です。 この表を「SELECT * FROM tbl WHERE id = 3」で検索したとして、 その前後のID(この例でいうと前:id=4, 後:id=6)を同時に取得したいのです。 こんなことは可能でしょうか?
>>203 WHERE id=n OR id=n-1 OR id= n+1
ではいかんのん?
205 :
NAME IS NULL :2006/11/12(日) 00:26:46 ID:h3d66FlB
>>204 ORDER BY date DESC, id DESC
なんです。
またレコードが削除されることもあります。
まずソートして、連番振って、id=3の連番を取得する。 上とは別に同じようにソート・連番ふったインラインビューに 連番 between 取得連番-1 and 取得連番+1 with使うとシンプルにはなるが重そうだな・・・
可能だがすんごい無駄っぽい。俺が思いついたヒントだけ。
SELECT * FROM (SELECT
(SELECT count(*) FROM tbl WHERE T1.date <date OR (T1.date = date AND T1.id<id)) AS cnt,
* FROM tbl AS T1)AS T2;
とりあえずこれで整列後の通し番号cntが付く
id=3のときcntを求めて(サンプルだと3)前後のcntを含めるように
WHRER句を足せば桶。相関サブクエリがいくつできるやら...
あー、当然id,dateでユニークな場合な。
ここまで書いて
>>206 さんにさき越されたw
208 :
207 :2006/11/12(日) 00:44:18 ID:???
あ、チョット違うかな。一応1行で取得できるともう。
んでも
>>206 さんが言うようにテンポラリシーケンスかなにかで
連番振って2段階の方が速いかもしれん。
209 :
206 :2006/11/12(日) 01:13:58 ID:???
おれも横着せんとSQLで書くか・・・ WITH TMPV AS( SELECT ROWNUM SEQ, * FROM ( SELECT * FROM TBL ORDER BY DATE DESC, ID DESC ) SELECT T1.* FROM TMPV T1, TMPV T2 WHERE T1.SEQ BETWEEN T2.SEQ-1 AND T2.SEQ+1 AND T2.ID = 3 眠いから細かいとこまであってるかわからん。 インラインビューよりマテビューにして行連番を主キーにした方がいいかも。 じゃ寝るノシ
Postgresqlで、 LIST OBJ LIST no| name id | LIST_no no | name ---------- ------------ → ------------ 1 | みかん 1 | 2 2 | りんご 2 | りんご 2 | 4 1 | みかん 3 | すいか 3 | すいか 4 | ぶどう 4 | ぶどう という風に、 「select LIST_no from OBJ where ID='1'」のnoだけ常に先頭にしつつ、 条件外のものは2位以下にno順でLIST表をソートする方法が思いつきません。 ご教示頂けると有難いです
>>204-209 みなさんありがとうございます。
連番をふる方法は素晴らしいのですが、件数が増えてくると遅そうなので、
SQLerとしては失格ですが、ロジック側でSQLを3回実行する方法にしました。
1回目:SELECT * FROM tbl WHERE id = 3;
2回目:SELECT id FROM tbl WHERE (date = '[1のdate]' AND id < '[1のid]') OR (date < '[1のdate]') ORDER BY date DESC, id DESC
3回目:SELECT id FROM tbl WHERE (date = '[1のdate]' AND id > '[1のid]') OR (date > '[1のdate]') ORDER BY date, id
※ひょっとしてサブクエリを使えば1行で実行も可能だったり?
>>210 愚直な俺はこんなのしか思いつかないが。もっといいやり方があるかも。
select * from LIST where no = (select LIST_no from OBJ where ID='1')
UNION ALL
(select * from LIST where no not in (select LIST_no from OBJ where ID='1') order by no);
>>210 SELECT CASE id WHEN 1 THEN 0 ELSE no END,* FROM OBJ ORDER BY 1;
noが1以上でしかない場合だけどな。
すまん、LISTとOBJを結合するの忘れてた。 SELECT CASE id WHEN 1 THEN 0 ELSE no END,LIST.* FROM LIST LEFT JOIN OBJ ON LIST.no=OBJ.LIST_no ORDER BY 1;
外部結合してソートするといいよ。
2000/01/01と2005/0101の二つの値から 各年(00,01,02,03,04,05)を得たいのですが、どういう感じになるのでしょうか
なんか、先日からこんな質問多いな。 基本的にSQLではデータを生成するもんじゃない。 既にあるデータを抽出したり集計したりするもんだがな。
219 :
194 :2006/11/13(月) 11:03:58 ID:z5bCqrg8
>>196 Microsoft SQL Server 2005 Express EditionのTransact-SQLというものみたいで、
一般的なSQLではないみたいでした。
>>201 メッセージ 102、レベル 15、状態 1、行 7
')' 付近に不適切な構文があります。
としか表示されません。
テーブルレイアウトはまったく同じで、カラム名指定しても同じ結果でした。
実行したクエリは下記のとおりです。
----------------------------------
use my_table
go
SELECT item_id, item_name FROM
(
SELECT item_id, item_name FROM TABLE_2005
UNION
SELECT item_id, item_name FROM TABLE_2006
)
----------------------------------
( )でくくるなど、いろいろ試してみましたが、どうしてもうまく動きません。
Transact-SQLというのは、他データベースでは動かないようなので
あまり使いたくないので、なにかヒントがあれば宜しくお願いします。
>>211 目的のもの、目的未満で最大のもの、目的より大きくて最小のものの3つでいいじゃん
>>219 LIMITは使えないの?
ソートはしてるだろうと思うから省略で。
SELECT item_id, item_name FROM TABLE_2005
UNION
SELECT item_id, item_name FROM TABLE_2006
LIMIT 100
初級シスアドレベル以下の知識なんだけど SQLに興味もって勉強しようと思います。 んで、勉強するにあたって何かソフトを用意しようと思うんだけど ACCESSとかオラクルとか買えば、SQLの勉強できる?
>>222 キミの現在のスキル次第。
とりあえず、MySQLとかPostgreSQLとかを使っても勉強できる
>>223 シスアドのテキストでしかSQLを見たことがないので
スキルは0です。
MySQLやPostgreSQLってフリーソフトみたいなので
まずはこれを使って勉強したいと思います。
ありがとうございました。
いや、SQL以外のスキルね。 インストールしたりツール使ったりできればフリーで試せるかなと。 まあがんばって
>219 SELECT item_id, item_name FROM ( SELECT item_id, item_name FROM TABLE_2005 UNION SELECT item_id, item_name FROM TABLE_2006 ) TBL ^^^^ >221 SQL Server系にLIMITはない。 今回の要件だとTOP句でいける。
>224 君の文章から察するに、Windowsに突っ込む気なら、Postgreはやめといたほうがいいとおもう。 多分トラブルシューティングに時間がかかりすぎて勉強どころじゃないと思う。 MySQLかMSDN、Oracleでも勉強用のフリーのがあるから、そっちのほうがいい。
Postgre? MSDN?
テーブルのフィールド名を返す関数はありますか?
230 :
210 :2006/11/14(火) 00:40:06 ID:???
>>212 union allってのがあるんですね。
これでいけました。ありがとうございます。
>>213-214 こちらは少しトリッキーな方法ですね。
order by 1というやり方は初めて知りました。勉強になります。
SQL以前の話だけど、「select * 〜」と全フィールド指定か、フィールドを列挙するじゃないですか。 なんで除外したいフィールドって指定できないんだろ。
意味が無いから
いや手前に-付けたらできるだろ。
>233 それは引き算っていうんだよ。 つーか、SELECTの英語の意味わかってるよな? SELECTっていう単語には「除外」だとかそういう意味はないの。 どーしてもやりたいんだったら、「除外」を表現する句を実装したエンジンを作ればいい。 がんばれ。
preg_match見たいな 正規表現の文字列抽出は可能でしょうか?
236 :
NAME IS NULL :2006/11/15(水) 06:27:11 ID:ROBlrBon
perlスクリプトからユーザを作成・権限設定するにはどのようにすれば 良いのでしょうか。 `mysqladmin -u root --password=pass create NEW_DB`; これでデータベースの作成はできたのですが、GRANTを使用できる方法が 思いつきません。
237 :
236 :2006/11/15(水) 08:12:32 ID:???
自己解決しました。 mysqlデータベース内のuser/db/hostテーブルを書き換えで。
238 :
NAME IS NULL :2006/11/15(水) 14:34:03 ID:tGEekk8B
mysqlで、二つのカラムがユニークでないとinsertを許さないといったことは出来るでしょうか? カラムのuniqueが二つ揃わないと駄目みたいな設定は出来ないのでしょうか?
>>234 >つーか、SELECTの英語の意味わかってるよな?
>SELECTっていう単語には「除外」だとかそういう意味はないの。
〜以外を「選択」したいといっているんだがバカかアホかどっちだ。
>>238 MySQLで可能かどうか知らんが、
CREATE TABLE T1 (
c1 int,
c2 int,
UNIQUE(c1,c2)
);
こんな感じでできるんじゃないかなと。
出来なかったら別構文かもしれないので
MySQLスレで聞いた方が早そげ。
>>210 に対する
>>212 のSQLについて皆さんにチョット質問。
>>212 のSQLで
>>210 さんが期待する結果がほとんどのDBMSで得られるのは
間違いなさそうなんだけど、本来のSQLではUNION ALLする時点で、前後の
クエリから返ってくる順序は保証されないはずだったと思う。
例えばUNION ALLじゃなくてUNIONのみだったら、重複チェック及び削除を
速くに行うためにソートしてからUNIONするので、
>>212 なら後ろのクエリの
ORDER BY は無駄になってしまう。UNION ALLの場合は、そのような必要が
ないので"たまたま"
>>210 が期待する結果が得られるが...
もうほとんど半仕様的になってて気にしなくてもいいような気もするが、
皆さんはどぉお?
※このレスで
>>212 さん気に触ったらごめんなさい。他意はございませんので...
242 :
238 :2006/11/15(水) 17:18:19 ID:tGEekk8B
>>240 ありがとうございます、その構文でいけそうです。
SQL SERVER 2000 でALTER TABLEが構文エラーになります。 変更しようとする前のFIELD_1の制約は varchar (255)です。 で、 ALTER TABLE [AAA] MODIFY ( [FIELD_1] varchar (1024)); 何が悪いのかさっぱりです。
スレ違い および マニュアル読め
ケチややっちゃ。 ちょっと教えてくれたらいいのに。 知らんのちゃうか。
>239 SELECTには「〜以外を」という意味はまったく含んでないといっているんだが。
つーかさ、SELECTが除外をサポートしたとして、 後でテーブル設計が変更になってカラムが増えたり減ったりしたら 逆に使いにくいだけだと思うんだが。 INSERT INTO HOGE SELET * -カラム... なんて処理があった日には悲劇がまってるし。
SELECT おっぱい -Aカップ FROM インターネッツ
>>241 俺もUNION ALLの前→後の順序は保証されてないと思う。
UNION ALLは「ソートしない」というだけだからたまたまそうなるだけ
だから
>>212 のSQLではソートしているとは言えないんじゃないだろうか
すいません、基本的なことかもですが質問してもいいですか? SELECT 文で、列数がたくさんあるので、全部列挙したくないんですけど たとえば、「列5以外の全部の列を列挙する」ときに どういった構文が使えますか? SELECT * FROM TABLE; だと全部列挙してしまうし・・・ よろしくお願いしますm(__)m
>>250 藻前は5個ほど前の発言も読めないなら2chで発言しない方がいい。
>>248 それ言うなら
select おっぱい from アイドル where ブラのサイズ > Aカップ
とかだろ。
だからSELECTで除外は意味不明と小一時間(ry
テーブルのレコードを更新する際に、いずれかのフィールドに同じ値(文字列)が 入っているレコードは差分をとった上で、統合するということをしたいので すが、どのように記述すればよいのでしょうか? データベースはSQLiteを使用しております。
プライマリーキーに文字列使うのってどうなのかな。 クエリーで頻繁に他のテーブルとマッチングさせるとき やっぱり数値に比べてパフォーマンス落ちますか? 気にするほどじゃないのなら良いのですが。
ありがとうございます。試してみますね。
256 :
NAME IS NULL :2006/11/16(木) 12:20:39 ID:mhu4nRZG
質問させてください。 MySQL4.1で下記のようなテーブルがあり tbl id sum 1 12 ←2^2 + 2^3 2 30 ←2^1 + 2^2 + 2^3 + 2^4 3 598 ←2^1 + 2^2 + 2^4 + 2^6 + 2^9 4 122 ←2^1 + 2^3 + 2^4 + 2^5 + 2^6 5 6 ←2^1 + 2^2 SELECT id FROM tbl WHERE 数学 = 値 とかで 値が2であれば2^2を含むものをSELECTしたいのですが どうしたら良いでしょうか?
>>256 WHERE (tbl.sum & POW(2, 値)) <> 0
とかは駄目?
確認はしていないから間違ってる可能性もあるが・・・
>>246 「〜以外を」という意味を含まないのと同時に、「〜を」という意味も含まないがな。
さらに言えば、SELECTが選択するのは行であって列ではないぞ。
日本語でおk
SELECT 文で除外は無理なんですね・・・知れませんでした↓ では、あるテーブルの列名を列挙するには、どうすればいいですか?
手で入力するか、ORマッパー使ってそういうクラスを自作汁
ADOで (VBAで作ったやつの一部) Dim wkRs1 As New ADODB.Recordset 'コレクションの名前を調べる方法 For i = 1 To wkRs1.Fields.Count MsgBox wkRs1.Fields(i - 1).Name Next
>>260 列名を持ってるディクショナリービューがある。
オラクルなら確かUSER_TAB_COLUMNSとかだったと思う。他はしらん。
>>257 お返事遅くなりました。
ありがとうございます。
ばっちりでした。
265 :
NAME IS NULL :2006/11/17(金) 10:46:59 ID:6Uf69TYK
MySQLで、特定のカラムの値の順番にレコードを取得して、並べて表示することはできたのですが、任意のレコードが何番目なのかという情報を取得することはできますか? できれば方法を教えてください。 現在は全データ取得してPHPで順番に回してカウントしてますが、明らかに効率が悪いですOTZ
266 :
NAME IS NULL :2006/11/17(金) 11:57:19 ID:2WkXRhEF
突然ですがご教授願います。 テーブルの指定項目に対して 全角・半角が混在しているかのチェックをしたい、 かつそのデータを抽出したいのですが 何か良い方法はないでしょうか。
SELECT (CASE flag WHEN 1 THEN 'ぬるぽ' ELSE 'ガッ' END) AS hoge FROM tbl GROUP BY hoge 上記のSQL文では「列名hogeは無効です」とエラーが出て実行できません。 CASEの実行結果でグループ化したい場合はどのようにすればいいのでしょうか?
SELECT * FROM ( SELECT (CASE flag WHEN 1 THEN 'ぬるぽ' ELSE 'ガッ' END) AS hoge FROM tbl ) GROUP BY hoge かな?
269 :
NAME IS NULL :2006/11/17(金) 14:29:48 ID:EPfzBoj4
>>250 残念ながらありません。
予め除外するフィールドが分かっている場合は、データを取得する
SQLで対応するのではなく、クエリー結果を格納する処理で対応し
た方がいいと思います。
270 :
267 :2006/11/17(金) 15:48:33 ID:???
>>268 うーむ、サブクエリ使わないと駄目なのか・・・
それで試してみます。ありがとうございました。
SELECT (CASE flag WHEN 1 THEN 'ぬるぽ' ELSE 'ガッ' END) AS hoge FROM tbl GROUP BY (CASE flag WHEN 1 THEN 'ぬるぽ' ELSE 'ガッ' END)
272 :
NAME IS NULL :2006/11/18(土) 02:01:20 ID:MmIzoEzY
どなたかご教示お願いします。 MySQL4.1で、複数フィールドに関して一意なものを取り出す方法はあるでしょうか。 A B ---------------------- 1 | 11111 | 22222 | 2 | 11111 | 33333 | 3 | 11111 | 22222 | 4 | 33333 | 33333 | A,Bの組で一意を決定し、レコード1,2,4を取り出す方法を探しています。 select Distinct(A,B) from table としたいところですが、怒られました。
274 :
NAME IS NULL :2006/11/18(土) 06:30:03 ID:8IZSUN/7
(A = 11111 && B = 22222) || (A = 11111 && B = 33333) || (A = 33333 && B = 33333)
MySQLだったら、過去のレスからしてこんなSQLが通るんじゃね。 SELECT * FROM Table GROUP BY A,B; 1,2,4と2,3,4どちらが取り出せるのかはしらんが...
連結すれば?
括弧は必要なの?
select distinct A,B from table ↑こうじゃないのか?distinctは関数じゃないぞ。
279 :
NAME IS NULL :2006/11/19(日) 05:06:16 ID:RPWkpia/
次のSQLの意味を出来るだけ詳細に説明しなさい。 SELECT名簿 氏名、 情報概論得点+情報実習点 FROM 名簿 成績表 WHERE 名簿 学生証番号=成績表 学生証番号 AND 科目 LIKE “情報%” ↑これらを実行するとどのような結果が得られますか? って事ですが、問題の意味すらわかりません。 助けて。。。。。
>>279 とりあえずシンタックスエラーってことでいいんじゃね?
282 :
NAME IS NULL :2006/11/19(日) 14:55:47 ID:FjZbaufY
>>274-278 ありがとうございます。distinct A, B でもいけるんですね。
distinctはAだけにかかると思ってました。
283 :
NAME IS NULL :2006/11/19(日) 21:48:18 ID:3hf8NU1A
新規質問です int型のフィールドbarを持ったテーブルfooがあるとします。 barの値が最も小さいレコードの行を取り出したい時 SELECT * FROM foo WHERE barが一番小さい; という意味になるクエリーはどのように書けばいいのでしょうか?
284 :
283 :2006/11/19(日) 22:17:01 ID:???
事故解決しましたスマソ SELECT * FROM foo WHERE bar=(SELECT MIN(bar) FROM foo);
DB板自治・質問・雑談スレに書いたのですが、ちと板違い だったようですので、こちらで質問します。 SELECT文のLIKE句で、”%”の文字は全角/半角、ともに あいまい文字列と解釈されてしまうようですが、 全角のパーセントそのものを条件として検索したい場合は どのように記述すれば良いのでしょうか。 TABLE_A COLUMN_A ------------- ABC % SELECT * FROM TABLE_A WHERE COLUMN_A LIKE '%'; 上記のようなテーブルとSQLがあった場合、LIKE句では 全角%が条件になっているため2つ目のレコードしか 取得したくないのです。 よろしくお願いします。
処理系やフロントエンドにもよるが、 '\%' か '\\%' でいけるんじゃね。
全角もそうだというのは処理系依存だと思うが、 LIKE でアンダーバーとパーセント記号は特殊な意味を持つのはその通り。 ANSI SQLではLIKE '\%' ESCAPE '\' とこんな感じじゃね。
SQLに付いて教えてください。 キーが2つあって 01 A 〜 01 A 〜 01 B 〜 01 B 〜 01 C 〜 02 A 〜 02 A 〜 03 B 〜 03 C 〜 となっている明細行に対して 01 A 〜 1 1 01 A 〜 1 2 01 B 〜 2 1 01 B 〜 2 2 01 C 〜 3 1 --------- 02 A 〜 4 1 02 A 〜 4 2 --------- 03 B 〜 5 1 03 C 〜 6 1 キー1, 2でGROUP化した上での明細行番号、GROUP内での 明細行番号を得る方法が分かりません。 カーソルを使って回すしかないでしょうか?
289 :
NAME IS NULL :2006/11/20(月) 16:25:01 ID:PAsvlASp
質問です MySqlでバックアップ(バックアップ用テーブルに同じ内容をコピー)で、1週間ごとに以下のクエリーを発行してるのですが、こんなんで問題ないのでしょうか? DELETE FROM backup CREATE TABLE backup AS SELECT * FROM table
購入履歴のようにユーザに対してレコードが蓄積されるテーブルがあります。 ユーザ毎に最新の30件以内の履歴のみを一括で取得したいのですが、どのようにSQLを 書けばいいのか悩んでいます。 テーブル構造は以下のような感じです。 ID(連番) | ユーザID | 購入日時 --- 0001 | user_1 | 2006/11/01 00:00 0002 | user_2 | 2006/11/11 00:00 0003 | user_2 | 2006/11/12 00:00 DBはOracleなのですが、ORDER BYやROWNUMなどでどうにか取得しようにも うまくいきません。どなたか良い方法をお願いします。
>>289 バックアップを消すのはバックアップが成功してからにしたほうがいいよ。
CREATE TABLE _backup AS SELECT * FROM table
DROP TABLE backup
RENAME _backup to backup
こんな感じで。
質問です。 現在MySQL 5.0.24aを使い、 Genre | Name -------------------- A | りんご A | ぶどう A | みかん B | りんご B | ぶどう B | いちご C | りんご C | みかん C | いちご 上記のようなDBをつくり、Name「りんご」、「ぶどう」を選択してGenre「A」、「B」を結果として返すSELECT文を作ろうとしています。 しかし、 SELECT * FROM test WHERE Name = 'りんご' AND Name = 'ぶどう' と書いても結果が返ってきません。 これはSELECT文の書き方が間違っているのでしょうか? それともSQLにはそのような選択の方法はないのでしょうか?
select Genre from test where Name = 'りんご' union select Genre from test where Name = 'ぶどう’ かな?
IN ('りんご', 'ぶどう') でもいい ANDは口語の「〜と」の意味ではなく、数学の「かつ」の意味だな。
297 :
293 :2006/11/20(月) 23:38:01 ID:???
>>294 ANDのかわりにORということでしょうか?
前それをやったときには、上記の例ですとCにも「りんご」が含まれているのでA、B、C全部返ってきたんです。
>>295 UNIONは初耳だったので調べてみました。確かにコレはいけるかもしれません。
ただ、同じフィールドで実行出来るのか気になります。とりあえず試してみることにします。
ありがとうございました。
298 :
293 :2006/11/20(月) 23:46:08 ID:???
>>296 SELECT * FROM test WHERE Name IN('りんご','ぶどう')
ということでしょうか?
試してみます。
INTERSECT じゃねーの?
300 :
293 :2006/11/20(月) 23:54:04 ID:???
>>299 UNIONがORに近いのに対してINTERSECTはANDに近いものなのですね。
ありがとうございました。
>>293 やりたいのは関係除算かな?
書き方はいくつかあるから、そのキーワードでググるか本探してみそ。
本だったら「プログラマのためのSQL」にわかりやすく説明されて太。
>>301 ちょっと関係除算がいまいち理解できなかったのでググってます。
自分がやりたいことは、検索の絞込み、とでも言うのでしょうか。
プログラムで、一回目のループで「りんご」を有するGenreを絞り込み、
二回目のループで「ぶどう」を有するGenreを絞り込み…
とやろうとしています。
一回目のループ結果から、SELECT * FROM test WHERE Name = 'りんご'
と入れてループの上に返せば、とりあえず「りんご」を有するGnereは絞り込めるのですが、
二回目、三回目と続けるとなるとANDでは出来なかったので…。
SELECT t1.Genre FROM test t1 INNER JOIN test t2 ON t1.Genre = t2.Genre WHERE t1.Name = 'りんご' AND t2.Name = 'ぶどう' これでどお?
304 :
290 :2006/11/21(火) 02:02:23 ID:???
>>291 row_number()はorder by句と一緒に使えるrownum程度の認識だったのですが
グループ毎の番号がつけられるなどの使い方は初めて知りました。
期待通りのクエリも実現でき、ありがとうございました。
305 :
289 :2006/11/21(火) 04:27:49 ID:j75IEcjK
>>292 亀レスすいません。
はぁ、なるほど。失敗したらおしまいですからね。
ありがとうございます、参考にいたします。
テーブルA,Bが下記のようにあったとします。 テーブルA: 名前 値段 --------------------- いちご 1円 みかん 1円 キャベツ 1円 トマト 1円 テーブルB: 名前 値段 --------------------- パイナップル 1円 みかん 1円 トマト 1円 さんま 1円 で、AとB両方にあるものだけ残したいんです。 みかん、キャベツがA,B両方にあるので、それ以外の行は削除します。 テーブルA: 名前 値段 --------------------- みかん 1円 キャベツ 1円 テーブルB: 名前 値段 --------------------- みかん 1円 キャベツ 1円 こういうことしたいのですが、SQL文で簡単にできるでしょうか。 よろしくお願いします。
あ、キャベツ両方にありませんでした。 すみません、書き直します。
>>306 (再投稿になります)
テーブルA,Bが下記のようにあったとします。
テーブルA:
名前 値段
---------------------
いちご 1円
みかん 1円
キャベツ 1円
トマト 1円
テーブルB:
名前 値段
---------------------
パイナップル 1円
みかん 1円
トマト 1円
さんま 1円
で、AとB両方にあるものだけ残したいんです。
みかん、トマトがA,B両方にあるので、それ以外の行は削除します。
テーブルA:
名前 値段
---------------------
みかん 1円
トマト 1円
テーブルB:
名前 値段
---------------------
みかん 1円
トマト 1円
こういうことしたいのですが、SQL文で簡単にできるでしょうか。
よろしくお願いします。
>>308 DELETE FROM TableA WHERE NOT EXISTS (SELECT * FROM TableB WHERE TableA.名前=TableB.名前);
DELETE FROM TableB WHERE NOT EXISTS (SELECT * FROM TableA WHERE TableA.名前=TableB.名前);
>>309 ありがとうございます!
同じじゃないのを削除するというかんじですか。
なるほどです。
311 :
NAME IS NULL :2006/11/21(火) 16:11:11 ID:b5GT0DJg
テーブルに word,word1,word2,word3,word4 といったフィールドがあります。 そして、新たにテーブルにレコードを格納する際に、すでに格納されているレコード のwordまたはword1と一致している要素があった場合、元からあったレコードと新たに 格納するレコードの差分をとって、元からあったレコードにプラスして結合するという ことをしたいと思っています。 しかし、これをSQLでどう記述すれば良いのかわからない状況です。よろしければ ご教授を願えないでしょうか?
レコードセットを使ってレコードセットを更新する事は出来ますか? 例えば、今、テーブルA・Bの2つがあるとして、 テーブルA:会社コード、商品コード、金額 テーブルB:会社コード、商品コード、商品名称、金額(ただしnull) となっている時に、BにAの金額をセットしてやりたいんです。 こういう時にEXISTを使えばいいのでしょうか?
313 :
312 :2006/11/21(火) 17:11:34 ID:???
すみません。 312はなんか自己解決しちゃいました。 ところで別件なんですが UPDATE TBL SET MAXNUM = (SELECT MAX(PAGE) FROM TBL T WHERE TBL.GRP = T.GRP GROUP BY GRP) みたいな、UPDATE文におけるサブクエリがうまく機能するのがどうにも不思議 でなりません。
>>312 UPDATE TableB SET 金額 = TableA.金額 FROM TableA WHERE TableA.商品コード=TableB.商品コード;
必要ならWHERE句に
AND TableA.会社コード = TableB.会社コード
も追加。
って書いてたんだけど、解決したのか。
315 :
312 :2006/11/21(火) 17:24:42 ID:???
>>314 すみません、
カ ー ソ ル 使 っ て 解 決 し た
だけなので、早速314氏の書き方を取り入れてみます。
質問です。 PHP5、postgresql8.1を用いて グループになっている以下のようにデータを入力したいと思っています。 しかしながら[group No.]によって行数が異なるデータです。 データはPHP5でクエリを実行する際に$Q[$a]=[value1][value2]の形になっています。 group No. (primary key) value1 value2 ----------- -------- ------ 1 りんご 12 かき 25 はなげ 9 このような時に[value1][value2]を配列で管理すれば[group No.]に連番を使うことが できるのでデータ入力や検索が簡単と思っているのですが他によい方法はありますか?
MySQL 5.0.27 をつかってます。 Table: Something { something_id, 要素いっぱい } Table: Something_history { pkey, something_id, timestamp } こんな2つのテーブルがあります。 Something は CVS からとにかくデータを SQL にあげたデータ群で、 それを別の database に正規化して格納するという作業をしています。 もともと処理したデータは消すつもりだったのですが、やっぱりとっておこう、 ということになり、どの row を処理したかを記録する table をつくりました。 何らかの理由で something_history には、 重複する something_id が記録される可能性もあります。 質問は、Something_history に記録された id 以外を、 Something から select するにはどうするの?ということです。 よろしくお願いします。
>>317 SELECT * FROM Something WHERE NOT EXISTS
(SELECT * FROM Something_history WHERE Something_history.something_id = Something.something_id);
319 :
317 :2006/11/22(水) 02:47:25 ID:???
>> 318 ありがとうございます。うまく行きました。
質問です SELECT employee_id, UPPER(first_name), UPPER(last_name), job_id FROM employees WHERE SUBSTR(first_name, 4) = 'n' ORDER BY job_id; SUBSTR関数を使いfirst_nameの4文字目がnの人物のみ 絞りたいのですが、うまくいきません。 何が原因なのでしょうか?
>>320 SUBSTR(first_name, 4, 1)
>>321 そこでしたか、こんな所でミスをorz
本当に助かりました、ありがとうございました。
323 :
NAME IS NULL :2006/11/22(水) 21:51:21 ID:lxFJMiKY
324 :
NAME IS NULL :2006/11/23(木) 16:37:25 ID:/q3dcXYj
プライマリキーについて、いまいち理解できていないので教えてください。 A,B,C,D というフィールドがあって、Aをプライマリキーとした 場合、Aにみかんという要素があるとして、みかんはBやCのフィールド では使うことはできるのでしょうか?
>>324 質問が漠然としすぎて答えられないんだが。
使えるといえば使えるが、そんなテーブル実際に使えないだろうに。
326 :
NAME IS NULL :2006/11/23(木) 16:50:06 ID:/q3dcXYj
>>325 ありがとうございます。
もうひとつお聞きしたいのですが、フィールドではなく、テーブル全体で
一意の要素というのを設定したいのですが、そういうのはどうすれば良い
のでしょうか?(nullを含んでしまうフィールドもあります)
>>326 いくつか方法があるが…
primary key (A,B,C,D) とか
unique A,B,C,D とか
SEQUENCE オブジェクトとか
IDENTITYプロパティとか
好きなのを使えばいいのでは。
DBによってnullだとkey指定できないのもあるので
詳しい事は各RDBのスレいって聞いてください。
>>323 たしかに「大量に」とか「複雑な」とか、曖昧すぎて意味がわからんな。
329 :
NAME IS NULL :2006/11/24(金) 03:42:00 ID:Sjq62Wnn
MySQL 3.23です。 名前|キー|値 -------------------- 鈴木|職業|会社員 鈴木|生年|1970 鈴木|出身|東京 山田|職業|会社員 山田|出身|大阪 というような構成のテーブルがあります。 ユニークな「名前」に対し、1個以上の「キー」および「値」が設定されています。 「職業」が「会社員」であり、かつ、「出身」が「東京」である人を抽出したいです。 (例で言えば「鈴木」が抽出されます) ここで私は SELECT 名前 FROM テーブル名 WHERE (キー='職業' AND 値='会社員') OR (キー='出身' AND 値='東京') GROUP BY 名前 HAVING COUNT(*) >= 2; というクエリを考えました。(最後の2は条件式の数) これはこれで一見問題ないように思えるのですが、 もっとスマートな方法、定番などありませんでしょうか? ちなみにMySQLのバージョンの関係で、サブクエリとかunionは使えないみたいです。
>>329 スマートな定番は、テーブルが
名前| 職 業 |生年|出身
鈴木|会社員|1970|東京
山田|会社員|(null)|大阪
の様になっていることなんじゃなかな。
まぁ、例として出しただけかもしんないけど。
SQLはそれでいんじゃない。職業に大阪とか出身に公務員って
入らないなら、キー=... は省いてもいけるが。
331 :
329 :2006/11/24(金) 04:07:43 ID:???
ありがとうございます。 >定番 まあ、そうなんですが。テーブル既にありきなもので。 >職業に大阪とか 大丈夫だとは思いますが怖いのでやめておきます(笑)
>>323 原文は、
Try to avoid complex SELECT queries on MyISAM tables that are
updated frequently, to avoid problems with table locking that
occur due to contention between readers and writers.
読み出し側と書き込み側の競合で発生するテーブルロックの問題を
回避するために、頻繁に更新されるMyISAMテーブルに対しては複雑な
SELECTクエリを実行しないようにする。
というわけで、訳がおかしいだけでなく妙な省略があるようですね。
334 :
329 :2006/11/24(金) 12:10:21 ID:???
>332 なるほど、自己結合ですか。検討してみます。 ただ、検索条件が増えると、結合の回数も比例して多くなってしまい、 速度などに問題が出てきてしまいそうな気がするのですが……。 もしかすると、私が考えているものと全然違う方法なのかもしれません。
>>329 あ、俺、今ちょうど似たようなことを仕事でやっている。
こんなのとか。
select a.名前 from テーブル a, テーブル b
where a.名前 = b.名前
and a.キー = '職業' and a.値 = '会社員'
and b.キー = '出身' and b.値 = '東京';
復問い合わせ使ってもできる。
select 名前 from テーブル
where キー = '職業' and 値 = '会社員'
and 名前 in (select 名前 from テーブル where キー = '出身' and 値 = '東京');
どっちが効率いいかは分からない。
336 :
NAME IS NULL :2006/11/24(金) 16:24:13 ID:/eEXwCce
DBMS、インデックス状況によって異なる。 前者の場合は、キーと値にそれぞれ or 複合でインデックスあれば、実データ検索しないと思う。 後者の場合、副問い合わせが必ず行われるので遅いような。
337 :
NAME IS NULL :2006/11/24(金) 16:43:07 ID:a70TfyFd
テーブル作成時に以下のようなエラーが出るのですが・・・ エラー : SQL logic error or missing database near "TABLE document_word": syntax error テーブル作成時のSQL CREATE TABLE document_word ( filename TEXT NOT NULL PRIMARY KEY, word1 TEXT,word2 TEXT,word3 TEXT,word4 TEXT,word5 TEXT); テーブルが作成できないのは何故なんでしょうか?
>>336 どちらにしろMysql3.xってサブクエリ使えないらしいし、
んでも流石にINやEXSTSでは使えるのかな。
つかえねぇと意味ないような...
>>337 TABLEの後ろの全角空白。最後のセミコロンも全角になってるが、
それは関係ないのか?
339 :
NAME IS NULL :2006/11/24(金) 17:38:28 ID:a70TfyFd
>>338 おっしゃるとおりで。ありがとうございました。
質問です。 date Val ------------------------------ 2006/11/01 00:00 20 2006/11/01 01:00 25 2006/11/01 02:00 30 2006/11/01 03:00 20 〜 2006/11/30 22:00 15 2006/11/30 23:00 20 2006/12/01 00:00 35 2006/12/01 01:00 15 この様なデータから date Val ------------------------------ 2006/11/01 580(1日の合計値) 2006/11/02 650(2日の合計値) 〜 2006/11/30 500(30日の合計値) の様に、1日の合計値が欲しいのですが どうすればよいでしょうか? 宜しくお願いします。
>>339 MySQL 3.23って確かキリスト的バージョンだったような気がするが...
何かの制約で3.23しか使えないってこと?
もし許される環境であればビュートリガストアドという
RDBMSの基本中の基本を抑えとる5.0を超推奨なんだが
>>338 >んでも流石にINやEXSTSでは使えるのかな。
>つかえねぇと意味ないような...
使えないよ。4 でも使えない。サブクエリは 4.1 から。
344 :
329 :2006/11/25(土) 22:22:26 ID:???
バイトの身分で、DBのソフト変えろとは言えんのです(笑) というか断られました。 現状で問題なく動いてるので、下手にバージョンアップしてトラブると怖いというか。 社員3名の会社で、システムが分かる人となるともっと少なくなるので。
>社員3名の会社で、システムが分かる人となるともっと少なくなるので。 社員が3人しかいないなら、むしろ全員システム詳しくないと組織としてどーかと思った。 誰かが病欠した時点でダメじゃん。ソレ。
346 :
NAME IS NULL :2006/11/26(日) 20:10:35 ID:tio4PAPQ
#SQL テーブルから引っ張っていたデータを 一行一行別テーブルに挿入することは 可能でしょうか? Selectではできたが、 一行ずつ(Insert)で、つまずいています。
>>346 よーわからんが、insert into hoge1,hoge2,hoge3 select * from ( select * from 〜
みたいな事ができるか?って聞いてるの?
ストアド作れ(w
とりあえず、そのSQLを晒してくれ。
349 :
429 :2006/11/26(日) 21:44:21 ID:???
>>346 Oracleの新らしいやつならマルチテーブルインサート使って、
1文で複数のテーブルに入れれた。他のデータベースでそういう機能なきゃ、
ストアド作るしかないね。
350 :
NAME IS NULL :2006/11/26(日) 22:27:28 ID:tio4PAPQ
BEGIN TRAN
INSERT INTO a(a) VALUES(@a) --(@a)を指定したい
COMMIT TRAN
>>348 のように定義していくしかないのでしょうか。
>>Oracleの新らしいやつならマルチテーブルインサート使って、
>>1文で複数のテーブルに入れれた。他のデータベースでそういう機能なきゃ、
>>ストアド作るしかないね。
ストアド作って、ループでまわすってこと?
>>350 なんか抽象的すぎて、わからんがテーブルaとカラムaと数値@aは
全て動的に変化するのか?
手抜きせずに具体的なテーブルの設計とSQLと、実現したい機能を
提示しろよ。
藻前の質問はエスパーでないと答えるのは難しい。
352 :
NAME IS NULL :2006/11/26(日) 23:01:59 ID:tio4PAPQ
SELECT * FROM a --(*1) WHILE(1=1) BEGIN BEGIN TRAN INSERT INTO a(a) VALUES(@a) --(*2) @b = @b + 1 COMMIT TRAN IF @b > 9 --(*3) BEGIN BREAK END END (*1)で取得したデータを (*2),(*3)を動的に変更させ、 Insertしていくことは可能か?
サブクエリが使えるDBならINSERT文一つで書けると思う。 ただ、どんな業務内容をRDBシステムにすると、 こんなテーブル操作が必要なのか思いつかんのだが。 これは根本的にテーブル設計が失敗してる例なのか? 一行目のSELECT *からしてアリエネーし、途中で現れる@bも 意味不明だし…。
テーブル分だけINSERT-SELECT文を書けないの? それと動的SQLは極力避けるべき。SQLはソースそのものなので、 ソースを動的に編集するというのは可読性がかなり落ちる。 テーブル名だけなら仕方ないが。
処理にもよるが処理をある程度共通化ライブラリしたくなるときは ストアドで動的SQL作るのはアリだと思うが。 つか、その為のストアドでもあると思うが。
356 :
NAME IS NULL :2006/11/27(月) 01:26:19 ID:BID+zT24
ありがとう。
357 :
NAME IS NULL :2006/11/27(月) 01:32:58 ID:BID+zT24
質問なんですが・・・ BEGIN TRAN --Update処理 IF @@ERROR<>0 GOTO PROBLEM COMMIT TRAN PROBLEM: ROLLBACK TRAN トランザクション処理を展開するとき、 GOTO文を使わなければ、ロールバック処理は できないのでしょうか? 何かいい方法はありますでしょうか?
>>357 ストアドプロシージャはDBMSで全く互換が無いからDBMSの名前はちゃんと書けよな。
MSSQLのTransact-SQLとして答えるがこれじゃいかんの?
IF @@ERROR = 0
COMMIT TRAN
ELSE
ROLLBACK TRAN
>>355 アリかもしれんが、そんな必要にせまられたことはめったにない。
ウンコ設計のシステム開発してんのか?
、
なにこの日曜プログラマ丸出しの初心者
「動的SQLを作るため」のストアドって。それがストアドの本来の目的じゃ、 クライアントでSQL組み立てるのとなんら変わりないわな。 ぷぷぷ
なんでこの人、一人だけで優越感に浸ってるんだろう・・・。
ヒント:相手が優越感にひたってるんじゃなくて、君が劣等感のかたまり。
頭のおかしいヤツがいるな。
365 :
NAME IS NULL :2006/11/29(水) 07:52:58 ID:qFMACpfa
日付、購入金額、購入者名の表から、各人が最後に購入した日に、一番多く費やした金額がいくらであったかを求めたいと思っています。 日付 購入金額 購入者名 27 3000 太郎 27 4000 二郎 28 5000 太郎 29 1000 太郎 29 1000 太郎 29 2000 花子 29 2000 花子 29 1000 花子 という場合であれば、 27 4000 二郎 29 1000 太郎 29 2000 花子 というものを得たいのですがどうすればよいのでしょうか? すぐ出来るだろうと思っていたのですが・・・数時間考えたのですが、私の力ではSQLで表現することが出来なさそうです。 MySQLを使用しているのですが、他に一時的な表を用意するしかないのでしょうか?
>>365 MySQLのバージョンが書いてないけど、サブクエリが使えるなら
こんなかんじでできるかな?
SELECT 日付, MAX(購入金額), 購入者名 FROM table main
inner join
(SELECT MAX(日付) 最終購入日, 購入者名 FROM table
group by 購入者名) sub
on main.日付 = sub.最終購入日 and main.購入者名 = sub.購入者名
group by 日付, 購入者名
367 :
365 :2006/11/29(水) 10:59:14 ID:???
>>366 どうもありがとうございます。
結合の問題だともよく理解していませんでした。
出直してきます。
368 :
NAME IS NULL :2006/11/29(水) 17:03:27 ID:FZUQz2Ny
↓URLに載せてあるERDを以下の仕様通りのSQL文に書き直したいのですが、
どのように書けば良いのでしょうか?
ttp://www.imgup.org/iup293818.jpg.html 仕様は
・すべてのIDはIntegerで設定
・すべてのNAME、TITLEは最高50文字まで入力可能に設定
・POS_DESC、BEN_DESCはvery long stringに設定
・Salaryはcurrencyに設定
・Phone NumberはStringとfixed length of 12に設定
・それぞれのテーブルに新たに、自分の好きなアトリビュートを二つ追加せよ。(ADDを使う)
>>368 SQL文って…CREATE TABLE文てこと?
ADDを使う、ってのはALTER TABLEってことかな?
370 :
NAME IS NULL :2006/11/29(水) 17:35:26 ID:FZUQz2Ny
>>369 はい。ERD自体はVisioで書いているのですが、
これと同じ仕様+それぞれのテーブルに好きなアトリビュートを二つ
で、SQL文(CREATE TABLE〜ですね)を書くみたいなんですがよく分かりません・・・
友人の研修課題らしいのですが、データベースの知識はまったくと言ってよいほどないので、
困り果てています。
>>370 こういう課題が出るって事は、ERDの読み方とかCREATE TABLE文の
書き方とか習ってると思うんだけど。まずは、ERDが読めないのか
SQL文が書けないのかどっち? それと、データベースの知識がない
のは、友人とあなたのどっち?
372 :
NAME IS NULL :2006/11/29(水) 18:23:08 ID:gkFpLiWZ
交通費には、バス代と電車代しかないとして、 交通費テーブル(日付,使用者,交通費種別,金額)から 交通費種別による総交通費テーブル合(日付、バス代、電車代、タクシー代) と取得するにはどうすればいいでしょうか。 日付 使用者 種別 金額 11/30 Aさん バス 200 11/30 Aさん 電車 150 11/30 Bさん バス 200 11/30 Bさん 電車 450 12/1 Bさん 電車 450 から 日付 バス代 電車代 11/30 400 600 12/1 0 450
クロス集計すれ。
374 :
NAME IS NULL :2006/11/29(水) 21:47:39 ID:dolUdZUS
table A に IDとAAを作り ID1にAAA、2にBBB、3にCCC、4にDDD というデータを入れました。 table B に ID Z1 Z2 Z3 Z4 を作り ZxすべてをTableAと結合させたいです table BのID1 に 1 3 2 4 と登録すれば AAA、CCC、BBB、DDD と表示できればと思っています。 なかなかうまくいかなくて、 この考え方が不味いのかなと思ったりしたり・・行き詰まっています。 SELECT文しだいで可能なのでしょうか。
テーブルBにテーブルAをLEFT JOINすればいいように思えるが、うまく行かないってことは違うんだろうなあ。 図示してくれると助かるぞっと。
376 :
NAME IS NULL :2006/11/29(水) 22:19:08 ID:dolUdZUS
テーブル A ID AA ── ─── 1 AAA 2 BBB 3 CCC 4 DDD テーブルB ID Z1 Z2 Z3 Z4 ── ── ── ── ── 1 1 2 3 4 2 3 3 3 3 3 1 3 2 1 4 1 1 1 2 /* 求める実行結果 */ ID Z1 Z2 Z3 Z4 ── ── ── ── ── 1 AAA BBB CCC DDD 2 CCC CCC CCC CCC 3 AAA CCC BBB AAA 4 AAA AAA AAA BBB こんな感じです。
>>376 SELECT B.ID, A1.AA as Z1, A2.AA as Z2, A3.AA as Z3, A4.AA as Z4
FROM B
JOIN A A1 ON B.Z1 = A1.ID
JOIN A A2 ON B.Z2 = A2.ID
JOIN A A3 ON B.Z3 = A3.ID
JOIN A A4 ON B.Z4 = A4.ID
378 :
368 :2006/11/29(水) 23:54:44 ID:???
>>371 レスありがとうございます。
私はERDはアクセス、Visioで書いてきたので分かるのですが、
SQLは実際に書いたことがないのでよく分からないです。(現在、ネット上のSQL関連サイトを見ながらやっています…)
友人は学生時代に初級シスアドは取っているのですが、コンピュータの言語はまったく勉強していない上、
データベースが専門外なのに研修でSQLを書く課題を与えられたらしく、私に相談をしてきました。
379 :
NAME IS NULL :2006/11/30(木) 01:56:21 ID:Lm+NGEnN
380 :
368 :2006/11/30(木) 01:58:13 ID:Lm+NGEnN
↑ すいません。368です。 ひとつのソースにまとめる為に ***************〜〜〜 TABLE*************** といった感じで区切りましたが、実際は別々に書いてあります。
381 :
368 :2006/11/30(木) 11:48:12 ID:bAhOQ6Un
382 :
NAME IS NULL :2006/11/30(木) 12:40:54 ID:yD5JcOlX
COMMITの逆ってなんでしたっけ?
ROLL PANNACHAN
>>377 で、できたあああああああああああああああああああああ
A1A2A3A4と作っていけば良かったんですね。
A1固定しかできないと思っていました。おはづかしい。
頭が少し柔らかくなりました。
385 :
NAME IS NULL :2006/11/30(木) 14:45:53 ID:uSFKhVrK
質問です。 下記のような表が出来たとします。 first_name second_name ------------------------------ brown white green black white brown black green pink red これを、同じ組み合わせは1つしか表示させないためにはどうしたらいいんですか? 例えば・・ first_name second_name ------------------------------- brown white black green pink red となるように・・。
MySQL使っています。 INT型のauto_incrementフィールドで、 普通は1,2,3... とINSERTしていくたびに順番に増えていくと思います。 0詰めの3桁のフォーマットにすることできるでしょうか? 001,002,003... こういう感じです。 よろしくお願いします。
386です。 自己解決しました。 ZEROFILLオプションがありました。
>>385 思いつきで、
SELECT * FROM Table AS T1 WHERE NOT EXISTS
(SELECT * FROM Table AS T2 WHERE T1.first_name=T2.second_name AND T1.second_name=T2.first_name)
OR T1.first_name<T2.second_name;
但しまったく同名の場合はまとめない、必要なら
GROUP BY (first_name,second_name)
を追加かな。
相関サブクエリを使わずに外部自己結合でも出来るな。
教えてください データーベースはAccessです。 ID 日付 商品コード 価格 1 11/29 100 900 2 11/30 100 1000 3 11/30 100 1010 4 11/30 200 2000 5 12/1 200 3000 のようなデータから商品コード毎の最新日付の価格(安い方)を取り出したいです。 上記データだと 商品コード 日付 価格 100 11/30 1000 200 12/1 3000 となります。 どのような処理をすればよろしいのでしょうか?
390 :
NAME IS NULL :2006/11/30(木) 16:23:22 ID:HKTYjIui
質問です。 Mysqlのテーブルにデータを追加するinsert文の中にループを組み込むことは可能でしょうか 例えば mysql_query("insert into table_1(ID_C)values while ($a < 4){ ('999'), $a++; } ('999')"); こんな感じで、$aの値が4になるまでテーブルのID_Cというカラムの中に999という データを入れるプログラムを作りたいんですけど上手く行きません。誰か教えてください
391 :
390 :2006/11/30(木) 16:26:15 ID:HKTYjIui
あ、すみません
>>390 はPHPの話です。
PHPスレで質問してみたんですけど、Mysqlスレで聞けと言われました。
392 :
NAME IS NULL :2006/11/30(木) 17:13:05 ID:uSFKhVrK
385です。 すみません、前の質問の書き方が悪かったんですが、自分で作ったコードで select faculty.name first_faculty_name, teaches.name second_faculty_name from faculty, course, section, teaches where (teaches.cdesc = course.cdesc and course.c_num = section.c_num and section.fss_num = faculty.fss_num) and (teaches.name != faculty.name); というのがあって(前の表は例えで質問したので、内容はこれとは全然違います)、 でも表示された結果に重複した組み合わせがあったんで、 その重複した組み合わせはどちらか片方のみを表示させるには何をコードに加えればいいのかという質問です。 ちなみにfirst_faculty_nameとsecond_faculty_nameが全く同じになる事はないです。
>>390 ここはMySQLのスレじゃないし、そのコードをMySQLスレに持っていくとPHPスレで聞けと言われるだろうな。
while ($a<4) {
mysql_query("insert into table_1(ID_C) values('999')";
$a++;
}
>>392 >>388 のSQLのTableの代わりに
>>392 のSQLをサブクエリとして突っ込めば桶。
カラム名はあわせなあかんけど。
394 :
NAME IS NULL :2006/11/30(木) 19:10:31 ID:uSFKhVrK
>>393 as T1 のところがエラーになって
「SQL command not properly ended」
ってなるんですけどなんででしょう?
395 :
NAME IS NULL :2006/11/30(木) 19:25:03 ID:FczYGQNu
mysql の show tables ってlimitきかないんだけど、バージョンが古いだけでしょうか? ものすごいたくさんあるテーブルをちょっとずつ見るのはどうしたらいいのでしょうか?
396 :
NAME IS NULL :2006/12/01(金) 09:32:49 ID:if/DbWjf
質問です。 where(それかhaving)句でcountを使いたいのですが、 selectのところにはcountの数を表示させたくありません。 それは可能ですか? エラーになってしまうのですが・・。
>396 自分のような初心者には HAVINGはともかく、どういう状況においてWHEREでCOUNTを使うのか分かりません。 ちょっと気になったので、もしよければ教えてください。
べたべた SELECT 列A AS A, count(列A) AS cnt FROM てーぶるA GROUP BY 列A HAVING count(列A) > 1
399 :
NAME IS NULL :2006/12/01(金) 15:28:40 ID:E463S5op
初心者と思うなら、入門本とかサイトとか見ろよ。 SQLの基本構文なんて1週間あればマスタできんべさ。
400 :
397 :2006/12/01(金) 17:21:53 ID:???
>399 自分の手元の入門書にはWHERE句で使う手法には一切触れてなかったんで、 特殊なテクニックなのかなとばかり。
401 :
NAME IS NULL :2006/12/01(金) 17:29:38 ID:vSVjo59R
こちらで質問するのが適当かどうかわからない素人です マイクロソフトのアクセスで、3000程度のデータが溜まったのですが、 文字列で検索をかけて、該当するデータを抽出するプログラムを作成してほしい場合、 どんなところにどのように依頼すれば良いのでしょうか? 数十人で使いたいのですが・・・よろしくお願いいたします。
やろうと思えば、スクリプトだけでもできるような おいしい仕事だw
WHERE句使わん入門書なんか そもそも入門書とは言わん
WHERE句でCOUNTの使い方がわからんっていってるんじゃないの。 俺もわからんが。てかそこでCOUNTが使えりゃHAVINGの存在意義が無いよ。
405 :
NAME IS NULL :2006/12/02(土) 11:39:51 ID:Tfx17Nq/
以下方法ではSQLが2度も実行されている。1度でやれ! a b 1 1 2 1 1 2 2 2 update t set a=3 where a=1; update t set b=3 where b=1; a b 3 3 2 3 3 2 2 2
指定フィールドの最大値+1、にUPDATEということは可能でしょうか? 現在はPHPに一旦渡してやってるんですが、 非常にだるいです。
>>407 え? こんな風なの? って、これ、できなかったっけ?
update xxxx set hoge = max(fuga)+1;
できないならこうとか?
update xxxx set hoge = (select max(fuga)+1 from xxxx);
>>396 where では count() って使えないんじゃない?
ああいう関数が使えるのは select か having の所だと思ったが。
で、実際どういうのを書いたらどういうエラーになったんだ?
合計売り上げ上位の人数を出したいんだが、方法ない? name | day | amount -------------------------------- sato | 2006-10-10 | 10 suzuki | 2006-10-10 | 5 tanaka | 2006-10-10 | 1 sato | 2006-10-11 | 20 suzuki | 2006-10-11 | 20 tanaka | 2006-10-11 | 1 sato | 2006-10-12 | 5 suzuki | 2006-10-12 | 5 tanaka | 2006-10-12 | 1 sato | 2006-11-01 | 5 suzuki | 2006-11-01 | 5 tanaka | 2006-11-01 | 1 みたいな感じで、10月の個人合計が30越えた人数を出したい。 可能かな?
>>413 SELECT count(*) FROM
(SELECT name FROM Table WHERE date_trunc('month',day) = '2006-10-1' GROUP BY name HAVING sum(amount)>30);
415 :
NAME IS NULL :2006/12/06(水) 13:30:36 ID:66Ngl6RX
テーブルに格納された文字列の置換についてお聞きしたいのですが。 テーブル:A word word1 word2 word3 果物 フルーツ fruit くだもの 本 書籍 書物 null テーブル:B phrase1 phrase2 phrase3 ああ いい うう 書籍 くだもの null テーブルBの最期に登録されたレコードのフィールドの値を、1つ1つ テーブルAに投げてヒットしたら、ヒットしたレコードのwordフィールドと 同じ値に置換したいのですが、どのようにすれば可能でしょうか? よろしければ、ご教授いただけないでしょうか?
SQLを聞いてるのか仕組みを聞いてるのかわからん ストアドにしてトリガで起動すればいいのでは
417 :
NAME IS NULL :2006/12/06(水) 14:18:29 ID:66Ngl6RX
>>416 出来ましたら、SQLを教えていただきたいのですが。。。
トリガを使わないのなら、最後に登録されたものが何かわかるようにしないと無理 で、Bのphase1 か phase2 か phase3 がAの何にヒット(ヒットって何?)したら Aのwordに何を入れるの?
419 :
417 :2006/12/06(水) 15:20:43 ID:66Ngl6RX
>>418 ヒット→該当するレコードがあるか
Aのwordに入れるのでなく、Aのwordの値に置換
です。
後から検索しやすいように一般的な単語に変換する、って感じなのかしら? 漢字やカタカナを全部平仮名に直して格納、とかは使い道ありそうだし。
まずはテーブルAを正規化すべてはそれからだ。 word word123 果物 フルーツ 果物 fruit 果物 くだもの 本 書籍 本 書物
423 :
413 :2006/12/06(水) 20:41:12 ID:???
>>414 出来た!!ありがとう。
下の行までは到達出来てたんだが、select2重にするだけでよかったのか…。
かなり、視野狭窄なまぬけだった。
課長視野狭窄
425 :
NAME IS NULL :2006/12/06(水) 22:14:11 ID:wAcTjtz2
MySQLなんですが、どうクエリ書けばいいのか分かりません... [ table1 ] id name --------------------------------- 1 A 2 B 3 C 4 D 5 E [ table2] id title table1_id --------------------------------- 1 title1 4 2 title1 1 3 title2 3 4 title3 1 5 title3 5 6 title4 4 ↑以降レコードが追加されていきます。 このようなテーブルがあって以下のようにtable1のどのnameに titleがあるかが知りたいのですが、 この場合該当しないB、C、Eも値なし(空)という結果で欲しいんです。 [ title1を条件にした結果 ] table1_id table1_name title --------------------------------- 1 A title1 2 B 3 C 4 D title1 5 E SELECT table1.id AS table_id, 〜〜 FROM table1 LEFT JOIN table2 on table1.id = table2.table1_id とか、それにGROUP BYとかしてみたんですが、 もうこれ以上すすめません.... どなたかご教示ください。お願いします。
where table2.title='title1' を付けるだけじゃ無いん?
427 :
425 :2006/12/06(水) 22:45:47 ID:wAcTjtz2
>>426 レスありがとうございます。
SELECT table1.id AS table_id, 〜〜
FROM table1 LEFT JOIN table2 on table1.id = table2.table1_id
where table2.title='title1'
ということですよね?
これだと
table1_id table1_name title
---------------------------------
1 A title1
4 D title1
になってしまうのでちょっと欲しいのと違うんですよ。
B、C、Eのレコードもtitleフィールドには値なしで欲しいんです。
すいません変な質問で。
どういう結果が欲しいのかわからんなぁ。
>>425 の3つめの表が欲しい結果なんかな?
429 :
425 :2006/12/06(水) 23:05:58 ID:wAcTjtz2
>>428 そうです!そのままズバリです。
>>427 の結果をもらってプログラム側で対応するのもいいんですが、
3つめの表のかたちで取れる方法はないのかと考えています。
430 :
428 :2006/12/06(水) 23:11:03 ID:???
>>429 細かいところは適当に
SELECT * FROM table1 LEFT JOIN (SELECT * FROM table2 WHERE title='title1')AS foo USING(id);
サブクエリも使えるMySQLなんかどうかしらんが。
431 :
425 :2006/12/06(水) 23:37:08 ID:wAcTjtz2
>>429 4.0系なのでサブクエリ使えません...すみませんバージョン書いてたつもりでした...
MySQL4.027の環境です。
サブクエリ使えれば良かったんですけど、ダメなので悩んでいた次第です。
せっかくお付き合い頂いたのに、ちょっとオチないといけなくなりました。
色々考えてくれて有難うございました。
また明日覗きますので何かアドバイスでもあれば、
適当に残しておいて貰えると助かります。
432 :
425 :2006/12/06(水) 23:39:39 ID:wAcTjtz2
433 :
428 :2006/12/06(水) 23:53:32 ID:???
USING(id)じゃダメじゃん俺...orz
>>431 SELECT table1.*,CASE title WHEN 'title1' THEN title ELSE NULL END AS title FROM table1 LEFT JOIN table2 ON table1.id=table2.table1_id;
これだと、table1.*の行が複数回出てきてしまうんだが、
MySQLなら、ここへGROUP BY table1.id を追加しても通るんだっけか。
ORDER BY table1.id,title も必要かな? なんかすんげぇぁゃιぃが。
SQL Serverだと SELECT table1.id AS table_id, 〜〜 FROM table1 LEFT JOIN table2 on table1.id = table2.table1_id and table2.title='title1' でいけるけど、MySQLじゃダメかね?
435 :
425 :2006/12/07(木) 14:10:52 ID:kGrXAXz9
>>428 >>434 アドバイス有難うございます。
おかげさまで欲しい結果が取れました!
>>428 GROUP BY 付けても通りました。
CASEってこんな使い方するんですね。勉強になります。
>>434 そのままMySQLでも使えました。
最後のand〜がポイントで、そこに気付きませんでした。
...ついWHEREとかで絞込もうとしてしまってハマリました。
今回はプログラム側の処理を楽にできるように、
こういう形でデータを受け取りたいと思ったんですが
実際レコードが増えた時の事考えるとこういうのダメなんですかね?
自分まだ経験が浅いのでどういうのが定石か分かっていないんです。
データベース側とプログラム側でどちらがどこまで負担するとか...
なにはともあれ勉強になりました。有難うございました。
列の射影について質問です。"SELECT 列A"では指定した列Aのみを 抽出しますが、逆に指定した列のみを抽出しないようにする命令は どう作ればよいのでしょうか?
>>436 少なくとも標準SQLにはない。
独自構文だとしても、主要なRDBMSにはないと思う。
LIKE で比較するパターンを列や SELECT から作るにはどう書けばいい?
超能力者に相談すればいいんじゃないかな。
なんでMySQL使いはVer4.xに拘泥するかねぇ MySQLはビュー・トリガ・ストアドが実装される5.0以降でないと はっきり言って使いモンにならんがな
442 :
NAME IS NULL :2006/12/10(日) 22:18:23 ID:A4HOrmPS
質問 Test1 t1 1 2 Test2 tt1 tt2 tt3 1 1 aa 1 2 bb -ココ 2 1 cc 2 2 dd 2 3 ee -ココ 結果 Test1とTest2を関連付けて t1 tt1 tt2 tt3 1 1 2 aa 1 2 3 ee Test2.tt2をmax関数で参照。 group by句の制約のせいで うまくいかない・・・。
そうですか
444 :
NAME IS NULL :2006/12/10(日) 22:53:11 ID:A4HOrmPS
MySQL 4.0 を使用しています。 SQL でテーブル内にデータが存在しない場合のみ入力する、なんてことはできるのでしょうか。 ユーザーのIDをプライマリキーで持っておき、新規IDの場合は追加するといったことがしたいのです。 はじめにSELECTで検索して無ければ追加すればいい話なのですが、一文だけでできる方法があれば教えてください。
ん4.0?サブクエリ使えない?ならあきらめれ。
スレ違いでしたら、ごめんなさい。 良くCGIで、都道府県をリストから選択するのありますが、 東京都選んだら、市町村もリスト選択できるようにしたいのですが、 都道府県の市町村までのなにか使いやすい データあるでしょうか? CSVでも何でも良いですが。 東京都 〜市,〜市,〜市,,, 北海道 〜市,〜市,〜市,,, 手書きで市町村書いてくとすごく大変ですが、 みなさんどこからデータ持ってきて使ってるんでしょうか。 よろしくお願いします。
452 :
NAME IS NULL :2006/12/11(月) 23:19:42 ID:jn2QwuJt
select count(数学点数) from 点数表 where 数学点数 = 100 group by 数学点数 select count(数学点数) from 点数表 where 数学点数 = 0 group by 数学点数 上記のように点数が100点と0点をカウントしたいんだけど 2つのselect文を1つにまとめるにはどうすればいいですか?
数学点数 = 0 or 数学点数 = 100 ですまんか?
454 :
452 :2006/12/11(月) 23:41:07 ID:???
>>453 0と100の場合で別々にカウントしたいんです。
or だと0と100の両方をカウントすることになりませんか?
>>454 >or だと0と100の両方をカウントすることになりませんか?
453じゃないが、ならんよ。やってみれ。
456 :
452 :2006/12/11(月) 23:53:07 ID:???
>>455 ありがとう。無知ですまそ。
ちなみに
数学100点と英語0点をカウントするとしたらどうすればいいですか?
>>456 UNIONでもサブクエリでもCASEでもお好きなのドゾー。
458 :
NAME IS NULL :2006/12/12(火) 15:45:39 ID:t9HsFvWX
プロ野球選手のデータを検索して出力するシステムを作っているのですが、2006年度の成績のデータをSQLに入れるとこまでは終わって、その後をどうすればいいか困っています。どなたか教えてもらえませんか?
>SQLに入れる ってなんだ。 >データを検索して出力するシステム を作ってるなら、まずは検索して出力するやつを作っては
CREATE TABLE s04e137book(id INT UNSIGNED PRIMARY KEY, title VARCHAR(100), price INT UNSIGNED); これを数値型のフィールドを基準にデータを並び替える問題を作成する問題とSQL そして識別番号が大きい順番から二つのレコードについて、値段を1000に変更するSGLを作成する方法 いまいちよくわからないので、ご指導願います
461 :
NAME IS NULL :2006/12/12(火) 20:59:43 ID:t9HsFvWX
>>459 MySQLにデータを入れるということです。
>>461 そこから先はアウトプットの世界
検索用のSQL作るのとODBCで接続出来るようにして
Webで吐き出すのがスタンダード
まあがんばれ
>>460 >並び替える問題を作成する問題とSQL
>変更するSGL
少し落ち着いてから出直せ
464 :
NAME IS NULL :2006/12/14(木) 12:02:22 ID:FlUI8LcX
SQLについて質問です(ORACLE 8i以上ならなんでも可) NULLだったら違う値を返す関数NVLがありますが SELECT NVL( COL1 , 'HOGE') FROM HOGEHOGE; 項目が数値の0だったら違う値を返す関数ってありますでしょうか? DECODE関数だと ELSEにあたる部分を記述しなくてはいけなくて。。 × SELECT DECODE ( COL2 , 0 , NULL , COL2 ) FROM HOGEHOGE; というのも、↓のようにCOL2の部分が計算式になっている場合に、ELSEに相当する部分に再度計算式を書くのが大変なので。 SELECT DECODE( 1+2-3 , NULL , 1+2-3) FROM HOGEHOGE; ↓のようなやり方、またはスマートにできるやり方ありますでしょうか。調べてみたのですが見つからなくてorz ○ SELECT HOGE_FUNC( COL2 , NULL ) FROM HOGEHOGE;
465 :
NAME IS NULL :2006/12/14(木) 13:31:32 ID:ApxXT0kl
SQLクエリで質問があります。映画と監督の情報が入力されたテーブルがあり、
以下の条件の下にSQL文を書いているのですが、思うように結果表示が出来ません。
映画、監督のテーブル:
ttp://deaikei.biz/up/up/3774.jpg.html パス:sql
条件)
MOVIEテーブルのLengthの平均値を求めて、Nominationsでグループ化した物を出力するのですが、
グループ化されるのは、Lengthが100分以上の映画と平均Nominationsよりもノミネートされている
回数が多いNominationsのみで、100分以下、平均Nominations以下の場合は省かれます。
用語の意味ですが、Lengthは映画の分数、Nominationsは何かの賞に何回ノミネートされたか、です。
466 :
NAME IS NULL :2006/12/14(木) 14:28:02 ID:ApxXT0kl
もうひとつ質問があります。 Movie Number、Movie Title、Movie Type、Director Name を表示する場合、 SELECT MOVIE_NUMBER, MOVIE_TITLE, MOVIE_TYPE, DIRECTOR_NAME FROM MOVIE, DIRECTOR WHERE MOVIE.DIRECTOR_CODE=DIRECTOR.DIRECTOR_CODE; 以外の文で表示させる事は可能でしょうか?
>>464 組み合わせでも無理なら
関数作ればいいのでは
SQLでレコードを取り出す際に、値がnull以外のフィールドを 取り出したいのですが、どう記述すれば良いのでしょうか?
IS NOT NULL
470 :
464 :2006/12/14(木) 18:45:23 ID:???
>>467 やはり関数作るしかないのでしょうか><
1つのSQL文でしか使わないため、ユーザー定義関数作るのもなんだかなっと思いまして。
471 :
468 :2006/12/14(木) 22:36:16 ID:???
>>469 SELECT IS NOT NULL FROM document_word WHERE name = 'PC';
このようにしたのですが、うまくいきません。↓のSQLでいうと、
どのようになるでしょうか?
SELECT FROM document_word WHERE name = 'PC';
whereのところに書く。
>>464 SELECT NULLIF(式1, 0) FROM HOGEHOGE;
・式1 = 0 → NULL を返す
・式1 ≠ 0 → 式1 を返す
注.式1に対しては NULL 値を指定することはできない。
式1がNULL値を返す事がありうる場合は以下の方法で回避可。
SELECT NULLIF(NVL(式1,0), 0) FROM HOGEHOGE;
>>466 SELECT A.MOVIE_NUMBER, A.MOVIE_TITLE, A.MOVIE_TYPE, B.DIRECTOR_NAME
FROM MOVIE A, DIRECTOR B
WHERE A.DIRECTOR_CODE = B.DIRECTOR_CODE;
あるいは
SELECT A.MOVIE_NUMBER, A.MOVIE_TITLE, A.MOVIE_TYPE, B.DIRECTOR_NAME
FROM MOVIE A
INNER JOIN DIRECTOR B ON A.DIRECTOR_CODE = B.DIRECTOR_CODE;
475 :
468 :2006/12/14(木) 23:34:57 ID:???
>>472 SELECT * FROM tablename WHERE fieldname IS NOT NULL
ということでしょうか?
でも、これだとフィールドにnullが含まれているレコードが抽出されなく
なってしまいますよね?
>>468 自分が何をしたいのかを「確実に」他人に伝える手段を身に付けてから出直せ。
477 :
468 :2006/12/15(金) 01:12:20 ID:???
>>476 えーとですね、
テーブル名:word
A B C D F・・・フィールド
PC IP UDP null null
TCP MAC ARP RIP null
として、PCという値のあるレコードを取り出す際に、null以外つまり、
フィールドA,B,Cのみを取り出したいということです。
>>477 SQLの範疇じゃないな。自分でNULLの分抜いてコレクションを作り直せ。
↓のような算数の問題をSQL文で計算したいのですが、頭がこんがらがって計算できません。。 分析関数を使って考えてみたのですが、前日のAを取得することができないです。(再帰処理?) どなたかSQLのパズルが得意な方ご教授ください。 COL1 COL2 20061211 2 20061212 5 20061213 2 20061214 10 20061215 3 A = 0.5 * AVG(過去3日間COL2) + 当日のCOL2 B = 0.5 * 前日のA + 当日のCOL2 ※前日のAがない場合NULL 結果 COL1 COL2 答え 20061211 2 20061212 5 20061213 2 20061214 10 20061215 3 0.5 * (11.5) + 3 = 8.75 20061216 8 0.5 * (8.75) + 8 = 12.375 ※20061214でA=11.5になるが前日のAがないため20061214はNULL ちなみに、ない頭振り絞って以下のような計算式を出したのですが、最初の1件だけ正しい値が取れるのですが 前日のAを元に計算してなくて。。 SELECT COL1,COL2, 0.5 * LAG_HEIKIN3 + COL2 FROM ( SELECT COL1,COL2, Lag(HEIKIN3) over(order by COL1) as LAG_HEIKIN3 FROM ( select COL1 , COL2 case when count(*) over(order by COL1) >= 3 then AVG(COL2) over(order by COL1 Rows (3-1) Preceding) end as HEIKIN3 FROM TBL1 ) )
>>479 20061215のA(翌16日の計算式にあるカッコ内の値)は5.8333.... じゃないのか?
SELECT col1,col2,
(
(SELECT CASE count(*) WHEN 3 THEN avg(col2)*0.5 ELSE NULL END FROM Table WHERE col1 BETWEEN T1.col1-'4 days'::INTERVAL AND T1.col1-'2 day'::INTERVAL )
+
(SELECT col2 FROM Table WHERE col1 = T1.col1-'1 day'::INTERVAL)
)*0.5+col2 FROM Table AS T1;
キャスト演算子がPostgreSQL表記になっているので適当に変えてくれ。
なお、col1はDATE型のつもり。必要ならそちらもDATE型へ変換してくれ。
481 :
480 :2006/12/15(金) 09:31:31 ID:???
あ、最初のサブクエリ(前日のAを計算している所)の後ろの方にある'2 day'は'2 days' のタイポ まぁ、そのままでも通るだろうけど。
482 :
480 :2006/12/15(金) 09:42:49 ID:???
もうチョット補足。
前日のAと言うのは、
「4〜2日前の平均*0.5+前日のCOL1」
と考えれば、
>>479 が出したSQLをチョット改造する程度でも
いけるんじゃないのかな?
見慣れないSQLなんではっきりとは知らんが。
483 :
479 :2006/12/15(金) 12:05:55 ID:???
ありがとうございます。 480さんのSQLだと ↓のような解釈になり 結果1のようになるような気がするのですが、どうでしょうか? カレント行の2日前〜4日前の件数が3件なら ( ( 2日前〜4日前の平均) * 0.5 ) + (カレント行の1日前 * 0.5) + (カレント行) 結果1 COL1 COL2 A B 20061211 2 20061212 5 20061213 2 20061214 10 20061215 3 (2+5+2)/3 * 0.5 + 10*0.5 + 3 9.5 20061216 8 (5+2+10)/3 * 0.5 + 3*0.5 + 8 12.33・・ すみません、それと私の説明が間違ってました。 ×A = 0.5 * AVG(過去3日間COL2) + 当日のCOL2 ○B = A = 0.5 * 前日のA + 当日のCOL2 ではAはどうやって求まるのかというと 最初に前三日分のデータが存在した場合のみ A=0.5 * AVG(過去3日間COL2) + 当日のCOL2 でAを求めます。 以降の行は A=0.5 * 前日のA + 当日のCOL2 になります。 また、結果も B=0.5 * 前日のA + 当日のCOL2 になります。 正しい結果は COL1 COL2 A B 20061211 2 前3行がないため NULL NULL 20061212 5 前3行がないため NULL NULL 20061213 2 前3行がないため NULL NULL 20061214 10 (2+5+2)/3*0.5 + 10=11.5 前日のAがないためNULL 20061215 3 前日のA * 0.5 + 3=8.75 8.75 20061216 8 前日のA * 0.5 + 3=12.375 12.375 むずかしい・・
484 :
480 :2006/12/15(金) 13:10:02 ID:???
あーあぁ〜〜〜あ゛ 再帰ってことじゃないけど、前行の値を保持しておかなきゃならないんでたぶんSQLでは無理。 少なくとも俺には無理。 ストアドつかえばLOOPさせるだけなんで、簡単にできるとは思うけど。
486 :
479 :2006/12/15(金) 13:39:55 ID:???
出来るかなっと思ってたのですが、考え始めたら嵌まっちゃって。。 やはりSQLじゃ無理なんですかね。お騒がせしました。
487 :
479 :2006/12/15(金) 14:07:46 ID:???
>>485 ググったけどわかりませんでした(泣)
移動平均とは
(カレント行 - 1) 〜 (カレント行 - 5とか6とか7とか)
の平均値を求めることであってますでしょうか?
それだと480さんのやり方で取得できると思うのですが。
それとももっと別のことなんでしょうか。。
SQL 移動平均 でググレカス
489 :
NAME IS NULL :2006/12/15(金) 19:15:56 ID:XBDMrFkG
たすけて下さい! 現在、レコードのNUMをDESCで表示させています。 ーーー TABLE BBS KEY NUM NAME COMMENT 1 96 あああ あーなんです 2 97 いいい いーなんです 3 98 ううう うーなんです 4 99 えええ えーなんです 5 100 おおお おーなんです ・表示 おおお おーなんです (任意の数で上下させる処理) えええ えーなんです (任意の数で上下させる処理) ううう うーなんです (任意の数で上下させる処理) いいい いーなんです (任意の数で上下させる処理) あああ あーなんです (任意の数で上下させる処理) ーーー しかし!順番をたまに手動で変えたい。 例えば「おおお」は3番目にしたいとかです。 おおお表示のhtmlにて 下げるキーをPOST等で二回押すとか、 もしくは下2を打ち込み下げる、 そのような感じで「おおお」の表示を3番目にさせる こういう事は可能でしょうか。 いろいろ調べてみたのですが、わからずで・・ 全レコードを取り出しNUMを全部書き換えるとかでおこなうのでしょうか、 取り出してから、php側で処理し直すとかするのでしょうか・・ 考え方がわからず 助けていただきたいです。 それとも98の位置にわりこませると、後はNUMが自動ずれるとか・・ よろしくお願いします。
初歩的な質問だと思いますがよろしくお願いします。 name1 name2 name3の重複したレコードを1つにまとめるSQL文おしえてください。
493 :
490 :2006/12/16(土) 04:11:45 ID:???
SELECT * FROM hoge GROUP BY name1 だと、name1だけをグループ化ですよね? name1 name2 name3の重複を取り除きたいです。 よろしくお願いしますm(_ _)m
それぞれ別のカラムなのか?
別のカラムだったらそれぞれgroup byした後にunionで結合すれば?
てすと
すんませ〜ん…… ちょっとおたずねしたいのですが DATE型の日付から曜日別にログを抽出するって可能ですか??? 例えば掲示板の書き込みをDBに保存するとして 日付をDate型で保存してるとします 土曜日の書き込みをすべて抽出したい場合 SELECT * FROM hoge Where Date=(この部分でWEEK=5みたいな) みたいな感じでお願いします 最悪WeekDayフィールドを用意して 書き込み時の処理で 土曜なら5とかでもいいんですが できればクールにやりたいので……
>>497 とりあえず使っているDBの名称くらいかいたらどうだ?
ちなみにDB2なら標準でそういう用途の関数がある。
そういう関数がないとあまりクール(?)にはできんと思う。
クールよりはエレガントだな。
500 :
490 :2006/12/16(土) 09:00:53 ID:???
>>494 それぞれ別のカラムです。
>>495 GROUP BY を UNION で結合してもうまくいきませんでした(重複が取り除かれてなかった)
ちなみにDISTINCT使うと表示するとき変なスペース(重複を取り除いた部分なのかな?)が表示されてしまいます。。
よろしくお願いします。
>498 すいません!忘れてました DBはmysqlです >499 まぁ いけてる ってことです
>502 ありがとう! そのヒントでもうちょっとがんばってみます
SQLserver2000使ってます。 M得意先のテーブルに得意先名という列があります。 得意先名の中に「山田株式会社 」といったように会社名の右側に 空白が入っている場合、一括でその空白を削除するクエリを教えてください。 rtrim関数で空白を削除した後の文字列を返すことはできると思うのですが updateで一括痴漢したいのです。どなたかご教授願えますか。
おれも痴漢したいな アッー
>503 select * from log where date_format(Date,'%w')=6 で 解決しました!!アドバイス感謝します!
507 :
NAME IS NULL :2006/12/16(土) 15:19:43 ID:FiTaYTiR
>491 ありがとうございます。489です。 別テーブルはどういう形で IDをKEYにして id、順序という形でしょうか。
>>507 そうだね。
で、LEFT JOIN とかして
ORDER BY 順序テーブル.順序
>>504 Update 得意先 Set 会社名 = Rtrim(会社名)でいいだろうに。
510 :
504 :2006/12/16(土) 21:22:07 ID:???
回答ありがとうございます。 やってみたんですがどうもだめです。 「山田株式会社 」といったように右側の空白が半角スペースだと rtrimで切り取ってくれるのですが 「山田株式会社 」といったように全角スペースが混じると 「山田株式会社 」と、何も変化せずに返されてしまいます。。。
そもそもそんなデータ入れるな
513 :
NAME IS NULL :2006/12/16(土) 22:18:23 ID:56UzO0+c
#SQL 集合関数(UNION)使う時って、 Selectの数をあわせなければ いけないのでしょうか?
YES
>513 数だけでなく、型も合わせなきゃダメだよ。
516 :
NAME IS NULL :2006/12/17(日) 14:56:50 ID:NLx29Tuk
517 :
NAME IS NULL :2006/12/17(日) 15:30:04 ID:NLx29Tuk
#TSQL LEFT JOINと LEFT OUTER JOINの 違いはあるのでしょうか?
518 :
489 :2006/12/17(日) 16:47:37 ID:8+QonOK/
>508 すこし別のアプローチでやってみました。 id numstr 0 21,12,13,14,15〜 1 43,54,57,43〜 2 555,666,444,333〜 idはカテゴリでくくり、numstrに文字列として格納してみました。 文字列をexplodeし配列からforeachで本テーブルから引っ張ってみました。 いろいろな角度からやってみるのは、とてもおもしろいです。 負荷という点で、どちらの処理が重いのか、ベストなのかとか 思ったり、色々とプログラムを楽しんでいます。ありがとうございました。
>517 ない
520 :
NAME IS NULL :2006/12/18(月) 07:23:02 ID:W84oHfQv
SQL識者の方、どうかご教授下さい! SELECT ***** AS num,user FROM user_table WHERE .... みたいな感じで、numを0から自動的に1づつ増やした値を取得って出来ますでしょうか? DBはMySQL4.0です。 よろしくお願い致します。
522 :
520 :2006/12/18(月) 20:14:41 ID:W84oHfQv
MAXって最大値を求めるんじゃ? MAX(num)のnumには何を入れればいいのでしょうか?
524 :
520 :2006/12/18(月) 21:45:19 ID:W84oHfQv
いや、実行してもエラーが出たもんで・・・。
>>520 _
だが、RDBMSによっては便利な関数があるかもしれない。
よって、MySQLで聞くほうが早い。
もしくはテンポラリーシーケンスを用意するか。
oracleならrownumがあるな。 SELECT rownum AS num,user FROM user_table WHERE .... MYSQLで使えるかどうかは知らない
527 :
520 :2006/12/18(月) 22:43:45 ID:W84oHfQv
>525 なるほど。 ありがとうございます。 今後のために参考にします。 >526 オラクル便利ですねぇ。 MySQLでは使えませんでしたorz 結局プログラム側でやった方が早いのでそうしました。 読み出して新しい配列に挿入するのはスマートではないと思いましたが、 SQLヘボマスターの俺には仕方のない事です。 ありがとうございました。
>>527 そもそも何がしたいのか良く判らんのだが、
連番を作って会員番号とかに使いたいって事なら、
オートインクリメントで良いんじゃないのかい?
MySQL4.0って内部結合使えないの?
530 :
520 :2006/12/19(火) 08:50:45 ID:MhqlDpzQ
>528 会員番号じゃないですよ。 最初は一覧表示からmember.php?user=****の様に 詳細を見れる様にしてたんだけど、これだと会員番号が丸出しだから member.php?list=0&area=1&etc=n... member.php?list=1&area=1&etc=n... って連番と検索条件をパラメーターで渡して、 limit 0,1 limit 1,1 とやってみようかと思ってやってみたけど、 ロジック的にどうなのか自信なくなってきた・・・orz 内容がSQLじゃなくなっちゃったな。 すんません。 >529 内部結合使えますよ
531 :
520 :2006/12/19(火) 10:38:08 ID:???
もはやSQLではなくなったので、webprog版に移動しました。 ありがとうございました。
DBの中身を一気にぶっこぬいてphp側で処理するのと ID単位でDBのレコードを1づつ引っこ抜いていく処理とでは どちらが負荷かかるのでしょうか。
>>533 d
結構レコード数が多いのですが(数千件)
レコードの順番管理としていい方法はないでしょうか。
順番テーブルから順番いれているフィールドを抜いて処理し
KEYIDでforeachで数千回SQL文流して書き込んでいくという形
でいいのでしょうか・・・。
数千件って少ないほうじゃないの
どっちも試してみたらいいと思うよ インタラクティブな処理で、ループで一回一回やるのなら かなりの待ち時間が発生するだろうな
すいませんが、教えてください。 あるレコードが別のレコードのIDを参照するような、 ツリー構造を表現するような↓のようなテーブルがあるとして、 rootなレコード(parent=0)に関連するすべてのレコードを 取得するにはどうしたらよいのでしょうか? id name parent -----+-----------+---------- 1 | rootA | 0 2 | rootB | 0 3 | A−1 | 1 4 | A−1−1 | 3 5 | A−1−2 | 3 6 | B−1 | 2 7 | A−2 | 1 8 | A−2−1 | 7 ・・・・ 上の例で言うと、rootAの関連するレコードとして、 idの1,3,4,5,7,8を一度に取得したいのですが・・・ DBはPostgreSQLの8.1です。 すみませんが、よろしくお願いします。
>>535 レコード毎の表示に他のDBからデータを
引っ張ってきてはhtml作成したりしてるのもあって
一件が重たかったりします。。設計まちがったかな・・
>>536 実はインタラクティブな感じで使用します。
検索サイトの検索結果の一つ毎に順番の上下ボタンがあると
イメージしてもらうとわかりやすいかもです。
>>537 WHERE name LIKE '%A%' じゃ駄目かな
542 :
NAME IS NULL :2006/12/20(水) 00:10:27 ID:gFXhyA0/
NVARCHAR2 呼び方は、なんと呼んでいるのでしょうか?
んばーちゃーつーに決まってるだろ
そうか。俺はてっきり、えぬばーきゃーに って呼ぶもんだと思ってたよ
545 :
NAME IS NULL :2006/12/21(木) 18:19:49 ID:M88ezNHc
userid -----+-- 112 | 231 | 331 | 41 | テーブルにこんな感じに入っててこの中から useridが一番大きいのを選択するにはどうすればorz(*useridはテキスト型です)
useridに入ってるのが数字だけなら、何の工夫もなく取得できそうな気がするわけだが。
なら、数値に変換してmaxで括ればすむじゃね。
もしくはorder byしておいて1件取得か。
大きいの定義が無いとな 文字コードとして最大でいいならそのままMAX 数字として大きいなら数値に変換してMAX 変換の仕方はRDBMSによる
551 :
545 :2006/12/22(金) 10:49:04 ID:???
たくさん返信ありがとうございます。
>>550 数字として大きいのを取り出したいんですが変換の仕方がいまいちよくわかりません。
色々探してCASTっていう関数使えばいけるのかなってとこまではいったんですが
うまくいきません。orz
使ってるのはmysqlです。
552 :
545 :2006/12/22(金) 10:57:45 ID:???
ちなみに rs = st.executeQuery("select MAX(CAST(フィールド名 as 型名)) from テーブル名 order by フィールド名"); こんな感じで使ったんですがだめでした。orz
MySQL よくしらんが、 + 0 とかで0足せば数字になるみたいだな、10進数ならそのままいけそう
555 :
545 :2006/12/22(金) 11:53:04 ID:???
クエリ式MAX(CAST(userid as UNSIGNED))の構文エラー:演算子がありません。 こんなエラーがでるんですがCAST関数の書き方間違ってるんでしょうかorz
name value ABC AXYZ ABC CXYZ 上記のようなテーブルで name count value ABC 2 AXYZ,CXYZ のように取り出したい場合どうすればいいでしょうか? SELECT name,value,COUNT(NAME) FROM table_A GROUP BY name,value ORDER BY name; ですとname,valueがバラバラになってしまいます。 GROUP_CANCATなるものがあるようですが、使用しているMySQLがMySQL 4.0.2xで 使用できませんでした。
>>557 1つだけの時はどう表示すればいいの?
3つ以上のときは?
559 :
557 :2006/12/22(金) 15:40:45 ID:???
name count value ABC 1 AXYZ か name count value ABC 5 AXYZ,BXYZ,CXYZ,DXYZ,EXYZ 可能であれば name count value ABC 5 AXYZ(3),BXYZ(2) こんな感じでしょうか? 不可能ならphp側の処理で逃げようと思ってました。
Webプログラミング板から誘導されてまいりますた。 n a b c ←フィールド名 ------- 1 o t t 2 o u t 3 s p p 4 s o p 5 s q p 上記のようなデータベースのテーブルがある場合に cフィールドの値が異なるものだけ1行ずつ取得したい、 つまり上の場合、1と3のaフィールドの値(oとs)だけ取得できれば良い、 という場合、スマートな取得方法はあるでしょうか? PHPを使用しておりまして、その際に上記を取得したいのですが、 PHP側の処理として思いついたのは、全行一旦配列として取得して、 cが重複する値を含む配列は重複分を削除、です。 ただ、これだとデータ量が多い場合にメモリを食って、すごい無駄な作業が多いかな と思っています。 SQL文でスマートに取得する方法のご教授どうかお願いします。
FAQ select a from tbl where n in ( select min(n) from tbl group by c )
1対多の関係にあるヘッダーテーブルと明細テーブルが有ります ヘッダーテーブル項目 日時 運転者 走行距離 明細テーブル 明細行番号 運賃 二つのテーブルを結合させて一覧表を作りたいのですが その際にヘッダーにある走行距離は明細行番号が1のレコードだけ表示して その他はnullまたは0を返すSQLって出来ませんか。 DBはアクセス97です。
〜 WHERE (複数行返る問合せ) LIKE パターン とすると「1行以上返る問合せがある」とエラーが出るんだが、どうすればいい?
>>562 CASE を使え
>>563 WHERE EXISTS (サブクエリ WHERE LIKE パターン)
それを避けるようにすればいいと思うよ やりかたは目的による
566 :
564 :2006/12/26(火) 14:19:16 ID:???
っと、 Access97でCASEが使えなかったらスマソ。 それと下は WHERE EXISTS (サブクエリ WHERE カラム LIKE パターン) な。
質問させてください マンションのデータベースがあり 各都道府県の登録件数を出すとき(例えば北海道500件、青森20件など) 47回SQL文発行しないといけないのでしょうか? もっと簡単な方法があると思うのですが、あったら教えてください。 お願いします。
>>567 SELECT 都道府県,count(都道府県) FROM マンションテーブル GROUP BY 都道府県;
>>568 ありがとうございます。その方法でできました。
しかし問題が…
高知県だけ取得できない…
570 :
569 :2006/12/28(木) 08:07:57 ID:???
default-character-set=ujisに変えて解決しました。m(_ _)mぺこ
571 :
NAME IS NULL :2006/12/28(木) 10:31:43 ID:qim9OQQX
使用データベース : postgres テーブル名 : test_tbl カラム id | name 上記条件のテーブルがあります、ここにカラムnameに重複が無い時にのみ インサートを実行し新しい値を挿入したいのですが 一文で書くことはできないでしょうか? caseを使えば出来そうな気がしたので、一度やってみたのですが 結果にインサート文が表示されるだけで出来ませんでした
uniqueの制約でもつけとけば、重複がなければinsertできるだろうし、 重複があれば例外が発生してinsert不可になる。 しかし、そういう事を一文で書く事に拘る心境が理解できんが。 普通にselectしてから後続処理を分岐させれ。
処理往復回数が増えることを嫌うのが"普通"。 SELECT COUNT(*)してUPD or INS ってのは典型的な愚図のプログラム。 INSERTが多いなら、INSERTで重複エラーでUPDATE、逆ならUpdateで更新0件ならINSERT。 で、君はなぜオラクルにマージが出来たと思うのよ。 そういうことを一文で書くこだわりをオラクルとそこに要望した数多の技術者は理解したけど、君は理解してないってだけでしょ?
まぁ、クライアントからSQL文を発行するときだけだわな。ラウントドリップの回数を気にするのは。
まあいろいろあるじゃん。 でもま、キーが確定してるのにそのキーのデータがあるのか無いのか わからない状況って変な気もするし、でもやっぱりそういうケースはある、よなあ
>>575 人の入力に対してはなんともいえないんじゃないの?
あと、マスタの洗い変え処理なんかでは良く出るよ。
元データとDBで、元に有りDB無しなら追加、・・・ってパターン。
元データの有無を一々確認するってのがSELECTするってことだろうけど、知らないで弾かせればいいじゃん。
そのための主キー設定だし。
577 :
572 :2006/12/28(木) 17:51:41 ID:???
漏れUDBでないDB2がメインだからマージなんて使わんし使えない(w しかしアレが特に便利な仕組みだと思わんけど。 あれで障害を発生させるOracle信者多いし。 Oracleを持ち出されてもアレが美しい設計思想とも思わんけど。 と言うかOracleは独自の我侭思想だな感じるが、コレは宗教論だからどーでもいい。 margeが時と場合によっては便利なのは認める。 検索対象とするカラムには索引をつけて、それに対して最小限のロックとなる selectを投げて、更新対象に正しくロックをかけて色々と判定してから更新する。 なければロックの影響のないinsertするってのが、使う側にとって影響の少ない更新方法だと思う。 なんでも一文ってオナニー技術者が使いたがるけどアフォが使うとアフォみたいにロックが かかるから、普通にコストベースでモノを考えて欲しい。
100万件のそういうデータがあったときに、100万回主キーでSELECTするんかい?
オマエは何を言ってるんだ
>571 ORACLEふうに書くけど、他のDBでもできそうな感じで。 insert into test_tbl select 'id', 'name' from dual where not exists (select * from test_tbl where name='name'); これで一発でいける。
PostgreSQLなら、 INSERT INTO 'id','name' test_tbl WHERE NOT EXISTS (SELECT * FROM test_tbl WHERE name='name'); でいける。
583 :
582 :2006/12/29(金) 06:25:58 ID:???
ゴメソ 寝ぼけてた。 INSERT INTO test_tbl SELECT 'id','name' WHERE NOT EXISTS (SELECT * FROM test_tbl WHERE name='name'); の間違い。
>>577 SELECTかけてロックって何かどんなデータベースを使ってても、すっきりコードがかけない
というか、なんかきもいんだよな。
普通にみんなやりそうなのが、
あるキーの範囲でSELECTする(ロック完了)。
10件返ってきた。
で、更新するために、同じキーの範囲でUpdateする。
で、これでOKそうに見えるが、SELECTとUpdateの間には時間差があるわけで、
この間に、他のトランザクションのよって、行が追加、コミットされ、
実を言うと、Updateされたのは11件(いわいるファントム行?)でした。
うぉー。
これを毎回適切に処理する必要があるか判断することやその処理には骨がおれる。
たぶん、みんな何も考えてないんだろうな。
気楽でいいや。
>>577 の続き、
いや、ただ、SELECTの件数保存しておいて、Updateの件数と違えうとき、ロールバックさせるのが手っ取りはやいね。
586 :
NAME IS NULL :2006/12/29(金) 11:53:45 ID:/nhPd5rf
>>584 ロック完了とかいっといて、更新時に書きかわってる?
書いてる内容が不明ですよ。
範囲指定のロックの場合2種類あって、
ひとつはヒットした(読めた)行に対してのみのロック。この場合は
>>584 のいってるファントムが発生する。
共有ロック式のDBMSの場合リピータブルリード分離レベルの場合のロックのかけ方。
もうひとつは指定された範囲、またはその範囲を含むページなどでロックをかける方式で、
読めなかった部分にもロックがかかるのでファントムは発生しない。
ロックのコストが高く、範囲指定のフィールドには必ず索引が必要としている処理系が多い。
共有ロック式のDBMSの場合シリアライザブル分離レベルの場合のロックのかけ方。
>>586 俺の表現不足かな?上記の例だと更新された11行(自分でロックした10行+ファントム1行)
>>587 そうそうその意味。俺はOracleしかみっちり触ったことないから、ページロックの事
詳しくなかったけど、その範囲のページでロックかけて、他のトランザクションによる
その範囲の行が挿入できなくなら、確かに問題ないな。
SQL文的には等価結合 (単純にテーブル1.フィールド=テーブル2.フィールドをWHERE句に追加) が非常に使いやすいのですが、 一方が存在しない場合に結果に含まれないのは困ります。 一方で外部結合は、JOIN句を使う必要があるため、 極力使いたくないです。 他に良い方法ないでしょうか。
八百屋は気楽に入れるので買いやすいですが、 一方、魚を売っていないのは困ります。 一方でスーパーは買い物籠を提げてレジにも並ぶ必要があるため 極力使いたくないです。 他に良い方法ないでしょうか?
outer join だとjoin句を使う必要があって inner join だとjoin句を使う必要が無いという意味がわからない。 innerにしろouterにしろ、join句でもwhere句でも書けるだろ
>>589 等価結合でもJOIN句つかえよ(笑
旧構文でJOIN句を使わず外部結合を表記することが出来るものがある。
where A *= B
where A = B (+) とか。余計わかりづらくなると思うがね。
>>590 コンビニ弁当だけで生きろ
593 :
589 :2006/12/30(土) 01:53:17 ID:???
>>590 たぶんバカにしてるんだろうけど、
そういう指摘の仕方ユーモラスがあって笑ってしまいました。
>>591-592 そうなんですね、MySQL関連の書籍には
結合関係が書いてあるものが少なく、
ネットで調べた断片的な知識でした orz
where A *= B
where A = B (+)
これ使いたいんですが、
MySQL4.0ではエラーが出てしまいます。
MySQL4.0でも使えるでしょうか?
594 :
NAME IS NULL :2006/12/30(土) 09:23:28 ID:e2tsG0Yb
>>593 ちゃんとSQL99の書式を使えとマジレス
595 :
NAME IS NULL :2006/12/30(土) 21:55:22 ID:uJEZ7tfY
SELECT文でASを2回以上使えますか? SELECT name AS 名前 age AS 年齢 FROM EMPROYEE の様な感じは大丈夫ですか?
ID、時間、部署という3つのカラムをSELECTしたいのですが IDはGROUP BYで、時間はその時の最大値MAXで、部署はそのままで抽出したいと思っております。 SELECT ID,MAX(時間),部署 FROM **** GROUP BY ID とすると部署がGROUP BY句に含まれていないため失敗してしまいます。 アドバイスよろしくお願いいたします。
>>596 IDと部署が1対1の関係なら部署もGROUP BYの条件に加えるか、MAX(部署)かMIN(部署)とでも指定しておく。
そうじゃないなら部署の抽出条件があるはずだからそれを示せ。
598 :
596 :2006/12/31(日) 00:30:34 ID:???
>>597 ご返事ありがとうございます。
抽出条件としましては
GROUP BY したIDで時刻がMAXのものを抽出しそれに紐づいている
部署をつけたいと思っております。
>>598 BROUP BYしたIDとMAX(時刻) で相関サブクエリ。
BROUP ってなんだよ...orz
601 :
NAME IS NULL :2007/01/05(金) 09:46:07 ID:ZLnsQKzx
カラムAとカラムBの平均でORDER BYしてSELECTしたいのですが どのようなSQL文になるでしょうか? よろしくお願いします。
>>601 select * from テーブル order by (カラムA+カラムB)/2
603 :
601 :2007/01/05(金) 11:50:11 ID:???
COMMENTなどのテーブルは作らないほうがいいのでしょうか? ブラウザでSQL実行したとき、CREATEやTABLEやCOMMENTなどの文字が赤く表示されていたので気になりました。
>>605 もうハゲてます。(24歳)
作っていいんですね。ありがとう!
table1 1ID(PK) | NAME -----------+------------ 1 太郎 2 花子 3 次郎 table2 2ID(PK) | 1ID | date |price -----------+-------+--------+------- 1 1 1/3 200 2 1 3 1 1/5 300 4 2 1/3 400 5 2 1/4 500 6 2 7 3 1/3 600 8 3 1/4 700 9 3 1/5 800 10 3 1/6 900 というデータから、 date | (太郎)price | (花子)price | (次郎)price --------+---------------+---------------+-------------- 1/3 200 400 600 1/4 500 700 1/5 300 800 1/6 900 という結果を算出するviewを作りたいのですが、可能ですか・・? postgresです。
608 :
607 :2007/01/06(土) 11:44:29 ID:WzBTUHcP
書き忘れました。 table1はマスタではなく、データは動的に増減します。 それにあわせてtable2もです。
609 :
607 :2007/01/06(土) 11:48:58 ID:???
ごめんなさい。よくみたらデータが動的に増えると、 算出したい結果の表のカラム数も増えて、viewは不可能ですね。。 sqlならわかるのですが、posgreで書くとすごく冗長になりません・? from句にsql3つ書いてleftjoinして、、と。 oracleなら(+)でいいのに。 トリッキーなことしてるんですかね・・?
610 :
NAME IS NULL :2007/01/06(土) 16:52:53 ID:PVXLuJDc
(select some_col from a_table ...) UNION ALL (select some_col from b_table...) のようなとき、a_table 又は b_table の結果が NULL になったら、(subquery のどれか一つでも NULL になったら) 結果も NULL にしたいのですが、 どういう方法があるでしょうか。一応 postgres を利用中です。
>>609 標準ではないかもしれないがPIVOT演算子がそれに近いのかな。
その手の演算はSQL直接でなくて、データ分析ソフトがカバーしてる例が多いな。
外部結合だけど、Oracleでもjoinを使う構文が標準になって、(+)は旧構文扱いになっている。
先に覚えたやり方が使いやすいというのはわかるが、Joinを使ったほうが結合関係がわかりやすい。
613 :
610 :2007/01/06(土) 17:53:18 ID:PVXLuJDc
>>612 失礼しました。「NULL になったら」→「空集合になったら」です。
つまり、subquery の UNION を取りたいが、ただし subquery のどれか
一つでも空集合だったら、結果も空集合になる、という操作をしたいの
ですが。
614 :
607 :2007/01/06(土) 19:25:09 ID:???
>611 >その手の演算はSQL直接でなくて、データ分析ソフトがカバーしてる例が多いな。 なるほど。 今回はSQLで書きます。。 それとSQLでやるとこんな感じになってしまうのですが、 もっとうまい方法ないですかね。。 改行数の関係でindexが見難いかもですが。 select dt.date,t1.price,t2.price,t3.price from ((( SELECTdate FROM table2 whereid = 1 order by date union SELECTdate FROM table2 whereid = 2 order by date union SELECTdate FROM table2 whereid = 3 order by date )dt left outer join (selectprice,date fromtable1 tt1,table2 tt2 wherett1.id = tt2.id andtt1.id = 1 )t1 on dt.date = t1.date ) left outer join (selectprice,date fromtable1 tt1,table2 tt2 wherett1.id = tt2.id andtt1.id = 2 )t2 on dt.date = t2.date ) left outer join (selectprice,date fromtable1 tt1,table2 tt2 wherett1.id = tt2.id andtt1.id = 3 )t3 on dt.date = t3.date >外部結合だけど、Oracleでもjoinを使う構文が標準になって、(+)は旧構文扱いになっている。 そうなんですか!! ここ4年くらい技術的なことから遠ざかってたので、新鮮な情報です。 やっぱ勉強し続けてないとダメですね。。
MySQLでアカウントごとにそれぞれ指定したデータベースにしかアクセスできないようにしたいのですが、 どういう権限の設定をすればいいのでしょうか?
616 :
NAME IS NULL :2007/01/09(火) 16:12:52 ID:XyyYfyk9
こちらでいいのかわかりませんが失礼します。 ある表から、PHPでチェックボックスを用いて(複数も可)選択し、 その選択した項目をMySQLでデータベース上で削除するという作業をしたいのですが、 チェックボックスの方のvalue(連番になっています)と データベース上のidなどの項目とに関連性がないため、 どうやって削除したらいいのかというのがわかりません。 何かいい方法はないでしょうか? 何かありましたら、よろしくお願いします。
>>616 いい方法はないのであきらめれ。
仕事なら外注して、勉強なら友達に相談汁。
>>610 WHERE EXISTS
(
select some_col from a_table ...
)
AND EXSITS
(
select some_col from b_table...
)
みたいな条件をくっつければいいんでは
620 :
NAME IS NULL :2007/01/10(水) 15:56:43 ID:tD4O0MUc
教えて下さい。 select で 「TableA を調べて、該当データが見つからなかったら TableB を調べる」といった事を スマートに実現するには、どのように書けば良いのでしょうか? select * from TableA where 条件 union select * from TableB where 条件 という、ブサイコな書き方をするか、VBA で2回レコードセットを開くくらいしか思いつきませんで・・・
621 :
610 :2007/01/10(水) 17:56:35 ID:???
>>618 >where exists () .. AND exists () ...
正攻法。
有り難うございます。やってみます。
>>620 「調べる」の意味がRowが欲しいのか、それともあるかないかだけ調べたいのか不明だが、
Rowが欲しいなら2回クエリを投げるのがもっともシンプル。
最初のにあれば2回目のクエリは不要になるなら効率も悪くない。
あえてunionを使いたいなら
select * from TableA where 条件
union all
select * from TableB where 条件 and not exists (select * from TableA where 条件)
623 :
620 :2007/01/11(木) 12:08:07 ID:???
>>622 ありがとうございます。
なるべくプログラム触りたくなかったのでなんとか良い方法を‥とおもいましたが、
やはり2回クエリ発行するほうが良いみたいですね。
union を使った方法だと余計にややこいので、クエリ2回投げるよう改良したいと
思います。 ありがとうございました。
EXISTSじゃダメなの?
625 :
NAME IS NULL :2007/01/12(金) 02:43:19 ID:ylSbXRrR
SQL習い始めのヒヨっこです。 以下のSQL文がわかる方教えてもらえませんか? 1,S2が売った部品を少なくとも1つ売った販売業者名を表示 2,2社以上が売った商品名一覧の表示 3,商品2を売っていない業者番号一覧の表示 4,販売業者S1と同じ所在の販売業者の表示 テーブル名;販売者 業者番号 販売業者名 所在 --------------------------- S1 Smith London S2 Jones Paris S3 Blake Paris S4 Clark London S5 Adams Athens テーブル名:商品 商品番号 商品名 色 重さ 製造元 ----------------------------------- P1 Nut Red 12 London P2 Bolt Green 17 Paris P3 Screw Blue 17 Rome P4 Screw Red 14 London P5 Cam Blue 12 Paris P6 Cog Red 19 London
626 :
続き :2007/01/12(金) 02:45:02 ID:ylSbXRrR
テーブル名;販売 業者番号 商品番号 販売量 ------------------------ S1 P1 300 S1 P2 200 S1 P3 400 S1 P4 200 S1 P5 100 S1 P6 100 S2 P1 300 S2 P2 400 S3 P2 200 S4 P2 200 S4 P4 300 S4 P5 400
> 1,S2が売った部品を少なくとも1つ売った販売業者名を表示
SELECT * FROM 販売者 WHERE 業者番号 IN (SELECT DISTINCT T1.業者番号 FROM 販売 AS T1 JOIN (SELECT * FROM 販売 WHERE 業者番号 ='S2')AS T2 on T1.商品番号=T2.商品番号);
> 2,2社以上が売った商品名一覧の表示
SELECT * FROM 商品 WHERE 商品番号 IN (SELECT 商品番号 FROM 販売 GROUP BY 商品番号 HAVING count(業者番号)>=2);
> 3,商品2を売っていない業者番号一覧の表示
SELECT * FROM 販売者 AS T1 WHERE NOT EXISTS (SELECT * FROM 販売 WHERE 商品番号='P2' AND 業者番号=T1.業者番号);
> 4,販売業者S1と同じ所在の販売業者の表示
>>625 の宿題。
(種族表) コード|種族名 ------------ 1|魚類 2|両性類 3|爬虫類 4|哺乳類 (登録データ) コード|番号|名前 --------------- 1|07010|さんま 1|07011|さけ 4|07012|ハムスター 2|07013|トノサマガエル などとなっているとします。このとき登録データ表の各種族別の登録数を知りたいのですが、合計数が0の種族も表示したい場合どのようなSELECT文を書けばよろしいでしょうか? 上の例では3:爬虫類の登録データがないのですが、「3:0個」というふうに表示したいのです・・・
SELECT A.コード,B.件数 FROM 種族表 A INNER JOIN ( SELECT コード,COUNT(*) AS 件数 FROM 登録データ GROUP BY コード ) B ON A.コード = B.コード
630 :
629 :2007/01/15(月) 21:47:05 ID:???
INNER JOIN じゃねえ。 LEFT OUTER JOINだ
631 :
629 :2007/01/15(月) 22:01:49 ID:???
あー、さらにNVLだかISNULLだかしないと件数がNULLだ。 SELECT A.コード,NVL(B.件数,0) FROM 種族表 A LEFT OUTER JOIN ( SELECT コード,COUNT(*) AS 件数 FROM 登録データ GROUP BY コード ) B ON A.コード = B.コード こうだ
>>629 ありがとうございます
いま確認できないので明日やってみます
633 :
NAME IS NULL :2007/01/17(水) 02:00:20 ID:BfO7MAF5
どなたか分かる方いましたら教えて下さい。 DB : PostgreSQL ID(PK) | NAME -----------+------------ 1 太郎 2 花子 3 次郎 このようなテーブルから IDが1と2と3のNAMEを、サブクエリを使わずに 項目名をAS等で変えるなど1列で取得できないでしょうか? NAME1 |NAME2 |NAME3 -----------+-----------+----------- 太郎 花子 次郎
>>633 要件がイマイチわからない。
テーブルの全レコードを繋げたいのか?
レコード数(つまり検索結果のカラム数)は動的なのか?
IDはシーケンスになってるのか?(NAMEXのXと対応しなきゃならんのか)
ポスグレなのにサブクエリ使えない理由は何か?
条件によっちゃ、出来ないと思うが。
MySQL4.0を使用しているのですが、 下のSQLでテーブルを作成した場合、 UNIQUE KEY によって「インデックス」されていることになるのでしょうか。 CREATE TABLE `table` ( `user` varchar(10) NOT NULL default '', `passwd` varchar(15) NOT NULL default '', UNIQUE KEY `user` (`user`), ) またインデックスされてないあるテーブルを インデックス化した場合、 インデックス化してなかったときに通っていたSELECT文 (例:SELECT table from user WHERE passwd='password') がインデックス用に修正しなければ、通らなくなる、なんてことは ないですよね? 2つ目の質問については自分が調べた限り問題なさそうですが、 念のため聞かせてください。 というのも現在あるデータベースの負荷が大きいので、 まずインデックスというものをクリアできているのか調べている状況で、 create index インデックス名 on テーブル名 (フィールド名); としてインデックスを設定したとして、 検索SQL文まで変えなきゃいけないことになると大幅な調整が必要になってしまうためです。 1つ目の質問については 色々ぐぐったのですが確実なことがわかりませんでした。 駄文ですが、ご教授お願いします。
636 :
NAME IS NULL :2007/01/17(水) 15:54:53 ID:J+VdbExh
インデックスの勉強しろよ。 その時点で2つめの質問はこっぱずかしくなるから。 1つめはMySQLの仕様の問題だからすれ違い。 昔はSQLServerが多かったが、最近はMySQLだな。 DBMSの名前としてのSQLxxxと、このスレが指しているSQL言語の違いが判らない初心者が多いのは。w
>>635 >インデックス化してなかったときに通っていたSELECT文
>(例:SELECT table from user WHERE passwd='password')
>がインデックス用に修正しなければ、通らなくなる、なんてことは
>ないですよね?
通らなくなることは無いけど
「インデックスを張れば勝手に速くなる」わけじゃなくて
・インデックスを張ることによって速くなるSQL文
・インデックスを張ってもインデックスが使われず、速度が変わらないSQL文
・インデックスを張ることで遅くなるSQL文
てのがあるから、どのみちインデックスを意識した書き方に書き換える必要がある。
影響が小さい部分については無視してもいいだろうけど。
638 :
NAME IS NULL :2007/01/17(水) 21:17:32 ID:BjRUYc3Y
MySQL 4.1だけど、3つのテーブルを left join したいんだけど、 どうやってかけばいいのですか? whereならかけるのですが。。
640 :
NAME IS NULL :2007/01/18(木) 01:40:13 ID:08DKmF0L
ORACLEに詳しい方々 ちょっと教えて下さい。 @ ↓のようなSQL文をファイルに出力したときに、 スペース埋めをしたいのに、タブで埋められてしまうときがあります。 どうしたら良いかわかる方がいたら教えてください。 select RPAD(a,12,' ') from table; A もう一つ教えてください。 ↓のようなSQL文をファイルに出力したときに、 スペースの部分が出力されません。(a,bのみ出力) どうしたら良いかわかる方がいたら教えてください。 select a,b,' ' from table;
641 :
NAME IS NULL :2007/01/20(土) 03:58:28 ID:wO82ibq/
>640 MySQLだと2番は問題ないなあ。(1番は調べてない) まだこのスレを見てるならOracleスレにでも聞いてきたら? ところで。 UPDATEは、WHERE句で指定した条件に一致するレコードが無い時はデータが更新されませんが、 一致するときはそのままUPDATEし、一致しない時はINSERT、つまりレコードを新規作成したいと思います。 どういう方法がスマートでしょうか? ちなみにMySQL 3.23です。 id INT UNIQUE, x INT, y INT, z INT (1)REPLACE idとxのみを指定した時、既にyやzにデータがあっても消える。 (2)ON DUPLICATE KEY UPDATE MySQL 3.23には対応してないっぽい。 (3)プログラム側でなんとかする 最終手段。
ハハハ、自分もそんな気はしてたんだ。
644 :
NAME IS NULL :2007/01/20(土) 23:40:53 ID:nSU7I88I
>>644 宿題っぽいな
select t2.装置名 as 装置名, t3.製品名 as セット製品名, t4.製品名 as 構成性品名
from セット構成 t1
join 装置 t2 on t1.装置番号 = t2.装置番号
join 製品 t3 on t1.セット製品番号 = t3.製品番号
join 製品 t4 on t1.構成製品番号 = t4.製品番号
646 :
NAME IS NULL :2007/01/23(火) 11:41:38 ID:FIn0GMHp
教えてください。 A,B,Cのテーブルがあって抽出条件にAに存在するIDと同じIDがBのIDもしくはCのIDに存在する場合は Aのレコードを表示するというSQL文を作成したいです。テーブルが2つだけの場合は SELECT * FROM A,B WHERE ID IN (SELECT ID FROM B WHERE ID) とすることで期待する結果を得ることができたのですが、テーブルが3つ以上に なった場合にどうしたらいいかわからず悩んでいます。 初心者なのでわけのわからない質問をしているかもしれませんが答えていただければ 幸いです。よろしくお願いしますm(_ _)m
647 :
NAME IS NULL :2007/01/23(火) 15:16:15 ID:B3ToTsu2
SELECT users.var_staff AS Expr1, seals.var_staff AS Expr2 FROM users INNER JOIN seals ON users.seals_id = seals.id というテーブルがあり、seals.var_staffに格納されている「hoge」という値(複数行有り)のみを users.var_staffにごっそりUPDATEしたいと考えています。 UPDATE users SET var_staff = 'hoge' WHERE (seals_id = (SELECT id FROM seals WHERE (var_staff = 'hoge'))) という式を作りましたが「サブクエリは複数の値を返しました・・・」とエラーが出ます。 何か足りないとは思いますがわかりません。 ヒントだけでもいいので教えてください
seals_id = を、IN かEXISTS にするとか
プログラム板で質問したら、こちらの板を案内されました。 次のようなデータ構造に対するRDBのテーブル設計について教えてください。 ・(ID、分類、値)のデータの組が数十万件あります。 ・「ID」はこのデータの組を一意に識別します。 ・「分類」は、このデータの組を階層化して分類する次のような文字列 例えばトップレベルの分類が"A"で次のレベルの分類が"B"、 さらにその次のレベルが"C"だとすると、"A.B.C" ・「分類」の階層は少なくとも1レベル以上で上限はありません。 ・「分類」の階層の数はデータの組ごとに異なります。 ・「分類」の文字列は、各階層ごとに辞書的順序で順序付けされています。 例えば、全てのデータの組を「分類」の順序でソートしたとすると、 順に、Aの属するもの、A.Aに属するもの、A.Bに属するもの、A.B.Aに属するもの、 A.B.Bに属するもの…、となります。ここで、Aに属するものは、A.AやA.Bなどに 属するものとは重複して属することはなく、Aには属するがA.AやA.Bなどには 属しないものとします。また、同じ分類に属するもの同士の順序は任意とします。 以上のようなデータ構造で、あるときにはトップレベルの分類だけでソートしたり、 あるときには、例えば分類A.Bだけは第三層まで見てあとは全て第二層までの 分類でソートする、あるいは、途中の階層にXの分類があるのみもの集計する、 といった具合に自由な階層構造でソートしたり集計したりしたいとします。 このような場合、どのようにテーブル設計をするのが良いでしょうか? あるいは、参考になるURLなどを教えていただければ幸いです。 よろしくお願いします。
>>648 INで出来ました!!
ありがとうございました!!
>>649 分類が文字の辞書順であらわせてるわけだから単純にID、分類、値のテーブル1つでいい。
IDを主キーで分類に非ユニーク索引設定。
>>651 レスをありがとうございます。
例えば、分類ごとの合計値が欲しく、A.B.CとX.Y.Zについては第四階層目の合計だが、
それら以外については第二階層目での集計が欲しい場合にはどのようになるのでしょうか?
あるいは、集計したい分類のリストが与えられているような場合はどのようになるのでしょうか?
>>652 select 集計関数( ... ) from table1 group by SUBSTRING(分類,1,4) where 分類 like 'ABC%' or 分類 like 'XYZ%'
union all
select 集計関数( ... ) from table1 group by SUBSTRING(分類,1,2) where 分類 not like 'ABC%' and not like 'XYZ%'
関数は処理系で違ったりするから調べてみてくれ。
話が抽象的過ぎて見えない。 長崎県長崎市、佐賀県佐賀市については町立小学校の生徒数の合計を出したいが それ以外の都道府県については市立小学校の生徒数の合計を出したい、とかそんなイメージ? ・id、分類、値を持ったテーブル ・自身の分類コードと、1つ上位の分類コードを持った階層管理用のテーブル ・集計条件を設定するテーブル をつくって管理すればいいんでは。
質問です。 登録してあるプロシージャやパッケージの一覧を見たいのですが、 それを取得できるSQL文はありますでしょうか?
656 :
NAME IS NULL :2007/01/24(水) 07:48:22 ID:1HbO06Nl
中河原、フォークリフトのブレーキに細工と聞いたが? 中河原、市会議員のコネで校に就職と聞いたが? 中河原、訓練生時代テストはカンニングと聞いたが? 中河原、裏口人生と聞いたが? 中河原、在日朝鮮人犯罪者組織・朝鮮総連創価学会の手先と聞いたが? 中河原、元々は出来損ないで、今は粉飾して立派に見せていると聞いたが? 中河原がなぜ首にならない。
657 :
NAME IS NULL :2007/01/24(水) 18:45:39 ID:8TpZMG18
where like で大文字が含まれてる物だけを抽出したいのですがどうしたら良いでしょうか?
where lower(カラム名) != カラム名
659 :
NAME IS NULL :2007/01/25(木) 11:51:17 ID:qmqni+7N
再帰(階層構造)的に処理を行いたいのですが、どうしてもSQLが組み立てられなかったので知恵をお貸しください ------------------ 本人 上司 給与 鈴木 100万円 山田 鈴木 斉藤 山田 ----------------- 鈴木さんの給与を100万円として、直属の部下である山田さんには8割の80万円を給与としてます。 さらに山田さんの部下である斉藤さんには山田さんの給与の8割である64万円を支給します。 というように、上司の給与をもとに本人の給与を求めるようなSQLとしたいのですが。。 ちなみに上司がいない鈴木さんがROOTであり、給与は明確となってます。 START WITH 、CONNECT BYでなんとかなると思ってたのですが解を得ることができませんでした。 RDBMSはORACLEを使用してます。
660 :
NAME IS NULL :2007/01/25(木) 13:03:18 ID:D7Zpx58m
得られないSQLをさらすとか。 方針はあってるからがんばってみるとか。
>>659 SQL99のCTEで再帰クエリを使うとこうなった。
START WITH CONNECT BYは使ったことがないのですまん。
with emp2(本人, 上司, 給与, level)
as
(
select 本人, 上司, 給与, 1 from emp1 where 上司 is null
union all
select emp1.本人, emp1.上司, cast(emp2.給与 * 0.8 as int), level+1 from emp1
join emp2 on emp1.上司 = emp2.本人
)
select * from emp2
>>661 with句で宣言した名前emp2を、同じwith句の中で使用することってできるのでしょうか?
ora-32031でwith句の問い合わせの参照先が不正ですと怒られてしまいます。。
ちなみに私は↓でループして給与を求めようとしたのですが、鈴木さんの部下までしか
給与が求められませんでした。
begin
for rec in (
select 本人, 上司, 給与 , level
from emp
start with 上司 is null
connect by prior 本人 = 上司
order by level
) Loop
update emp
set 給与 = rec.給与 * 0.8
where 上司 = rec.本人;
end Loop;
end;
/
663 :
659 :2007/01/25(木) 18:43:55 ID:qmqni+7N
↓のようにしたら欲しい結果は得られたんですが、どうみてもbatch処理でした。。 truncate table emp2; begin for rec in ( select 本人, 上司, 給与 , level from emp1 t1 start with t1.上司 is null connect by prior 本人 = 上司 order by level ) Loop INSERT INTO emp2 SELECT T1.本人,T1.上司, NVL(T2.給与,rec.給与) * 0.8 FROM emp1 T1 LEFT JOIN TABLE2 T2 ON T1.上司 = T2.本人 where T1.上司 = rec.本人; end Loop; end; / select * from emp1 where 上司 is null union select * from emp2
664 :
659 :2007/01/25(木) 19:24:44 ID:qmqni+7N
で、できました! 出来上がったSQLの簡潔さにどっと疲れがでました。。。 select 本人, 上司, 給与, CONNECT_BY_ROOT 給与 * power(0.8,level-1) from emp start with 上司 is null connect by prior 本人 = 上司
665 :
NAME IS NULL :2007/01/26(金) 23:47:08 ID:fnJFDcFV
OracleでどのカラムがPRIMARY KEYを取得できるSQLはありますか?
>>665 SQLはないがたいていViewでスキーマの情報は取れる。
あとはOracleすれで聞いてくれ。
SQLを始めたばかりの初心者です。 oo4oやADOを使用して、オラクルサーバーのデータをSELECT文でオラクル内の 複数のテーブルを結合してListViewで表示するプログラムを作成中です。 オラクルサーバーにメインデーターがあり 各クライアントにMDB形式でマスタデータがあります。 MDBのマスタデータにはたとえばですが、テーブル名 [商品テーブル] フィールド名[コードナンバー]、[商品名]... となっており、サーバーには、テーブル名[商品コード] フィールド名[コードナンバー]、[受注日]....があるとします。 クライアントからoo4oやADOを使用して、サーバーのデータをSELECT文でオラクル内の 複数のテーブルを結合してListViewで表示するのはできます。しかし [コードナンバー]は取得できるのですが、サーバーのテーブルには、 [商品名]がないためとうぜん表示できません。 この場合、オラクルから取得したデータをマスタデータのあるMDBに新しくテーブルを 作りそこに一度格納して再度ADOで結合処理して 商品名を表示する方法しか考えつかないのですが、 ほかに良い方法はありますでしょうか? ADOで接続MDBに保存再度ADOで接続して表示では レスポンスが悪いかなと思いまして... *VB6 winXP-pro オラクル9i
668 :
NAME IS NULL :2007/01/27(土) 10:42:33 ID:O+RfWf9V
>>667 なんでマスタデータをクライアントで管理してるのさ?
マスタデータをクライアントから参照する仕組みじゃなくて
Oracleサーバ側で管理する仕組みにした方がよくないか?
>>668 667です。たしかに私もマスタをOracleサーバ側で管理する
のが良いかと思いますが、このシステムを作り導入した業者
の仕様であり、マスタデータの管理場所を変更するとは不可
とのことです。
MySQL 4.1.11 日付テーブルが一つ date_tbl kyuujituflg は土日(休日)の時は"a"、平日はスペース workdate kyuujituflg 2007-01-04 " " 2007-01-05 " " 2007-01-06 "a" 2007-01-07 "a" 2007-01-08 "a" 2007-01-09 " " 2007-01-10 " " 〜 Aデータテーブル A_Data inputDate hoge hoge2 〜 2007-01-04 dddd sssss 2007-01-10 wwww ggggg とあった時に平日でA_Dataへの入力漏れを調べたいのですが、 どのように書けばいいのか教えてくだされ m(__)m この例だと 2007-01-04と2007-01-09が漏れている日付だという ことになるのですけど。
select workdate from kyuujituflg where kyuujituflg = " " and workdate not in (select inputDate from A_Data)
>>672 素早いレス、有難うございますm(__)m
実際にはないはずだがな〜と思いながらやってみたら、
1件漏れを発見してしまいました(^^;
テーブル:本 ISBN タイトル 出版社 定価 テーブル:売上 ISBN 売り上げ日 得意先名 数量 テーブル:得意先 得意先名 住所 郵便番号 こういう3つのテーブルがあったとして、 これらを自然結合すると、 ISBN タイトル 出版社 定価 売り上げ日 得意先名 数量 住所 郵便番号 となるんでしょうか? 単純に重複しないようにまとめるって認識してるんですが、あってるんでしょうか?
やっかいなことに、 ISBN タイトル 出版社 定価 ISBN 売り上げ日 得意先名 数量 得意先名 住所 郵便番号 となるます。
677 :
NAME IS NULL :2007/01/28(日) 12:03:29 ID:cfqNQTKv
MySQL4.0.24でクエリを書いていて、困ったことが出てきたのでご意見をお聞かせ下さい。 今、掲示板のデータを保存するテーブルtbl_bbsがあり、ここにsubjectとcontentsというカラムがあります。 この2つのカラムを連結させて、検索キーワードを基にLIKE演算子を使って検索したいのですが、 MySQL4.2.24ではインラインビューやビューがサポートされていません。 そのため、例えば SELECT concat(subject, IFNULL(contents, '')) AS sc FROM tbl_bbs; でsubjectとcontentsを結合したカラムは取り出せるのですが、これを基にLIKE演算子で検索することが出来なくて困っております。 インラインビューやビューが使えない場合、一度SELECTした結果をもとに検索をする場合は クエリを2回に分けるしかないのでしょうか??
mysqlは知らないけど、サブクエリを使わなければいい、ということであれば where concat(subject, IFNULL(contents, '')) like '%キーワード%' とか where subject like '%キーワード%' or contents like '%キーワード%' でいけるのでは
>677 やぁ、数週間前の俺。MySQLのバージョンは違うがな。(3.2…) 自分も最初は>678のような方法でやってたんだけど、 結局、検索用のテーブルを作っちゃったよ。
680 :
677 :2007/01/28(日) 13:01:11 ID:???
>>678 どうもありがとうございます。後者だと複数キーワードで検索するときにちょっと厳しいですが、前者でいけますね・・・なんでこんなに単純なことに気付かなかったんだろう。
複数キーワードになったときにクエリ文が異常に長くなりそうですけど。。。
>>679 検索用のテーブルを作っちゃうの、ありですね。そっちの方が早いかも!ありがとうございます。
681 :
NAME IS NULL :2007/01/29(月) 22:01:11 ID:2jSggXiy
IsolationがREAD UNCOMMITTEDで 2つ別々の接続で 同一キーにてInsertした場合ってどうなります? Tran A Insert a Tran B insert a てな感じで 競合の概念がいまだによくわかりません。
READ COMMITTEDの場合、TranBは先行したTranAがコミットかロールバックするまで待機。 もしコミットしたらキーの重複でエラーが発生する。 READ UNCOMMITTEDの場合、即座にキーの重複でエラーが発生する。
ただし待機する処理系も多いかもしれないな。 OracleだとUNCOMMITTEDを指定しても実際にはCOMMITTEDと同じ扱いになる。
684 :
NAME IS NULL :2007/01/29(月) 22:33:36 ID:2jSggXiy
>>682 ありがとうございます。
もうひとつ
例えば主キー以外の項目のある値
日付とかがあって
Insertの際にその日付の中からMAX+1の値をInsertする場合
(現状MAXが2007/01/01だとして)
TranA、TranBが上記のようなタイミングで発生した場合に
確実にあとの(2つめ)コミットが2007/01/03でコミットされるためには
ファントムインサートが発生しない、SERIALIZEでないと無理でしょうか?
こういう情報についての良書とかもあれば教えていただきたい。
>>684 難しい質問だにゃ。
Serializableで共有ロック方式の場合
(パターン1)
MAXで求まる値を10と仮定する。
TranAがMax値(10)を取得。Max以上がキー範囲の共有ロック(ネクストキーロックなど)となる。
TranAがMax+1(11)で新レコードを追加する。
TranBがMax値を取得しようとするがTranAのロックのため待機。
TranAコミット後TranB処理続行。
TranBがMax値(11)を取得。Max以上がキー範囲の共有ロック(ネクストキーロックなど)となる。
TranAがMax+1(12)で新レコードを追加する。
コミット
(パターン2)
TranAがMax(10)値を取得。Max以上がキー範囲の共有ロック(ネクストキーロックなど)となる。
TranBがMax(10)値を取得。Max以上がキー範囲の共有ロック(ネクストキーロックなど)となる。
TranAがMax+1(11)で新レコードを追加しようとするがTranBによるロックで待機。
TranBがMax+1(11)で新レコードを追加しようとするがTranAによるロックで待機。
デットロックのためTranAかBのどちらかが失敗となる。仮にTranBが失敗とする。
TranA新レコードを追加完了。コミット。
insert select は1文だからパターン1になることが保障されてる処理系が多いと思う。
マルチバージョニング方式のSerializable場合 (パターン1) TranAがMax(10)値を取得。 TranAがMax+1(11)で新レコードを追加する。 TranBがMax(10)値を取得。 TranBがMax+1(11)で新レコードを追加する。(注) TranAコミット TranBコミット (パターン2) TranAがMax(10)値を取得。 TranBがMax(10)値を取得。 TranAがMax+1(11)で新レコードを追加する。 TranBがMax+1(11)で新レコードを追加する。(注) TranAコミット TranBコミット 注:日付+値でユニークキーが設定されている場合はここで待機。TranAがコミットした時点で重複エラー
>>685 共有ロックのパターン1の最後2行訂正
TranBがMax+1(12)で新レコードを追加する。
TranBコミット
まとめると、キー範囲式の排他ロックをfor update構文などで指定できるDBMSなら対応できるが、
分離レベルで対応するのは不可能か失敗が発生する。あとはテーブルロックをかける手も無くはない。
MAX+1よりシーケンスやIdentity属性列を使うことをすすめる。
もっともMyISAMの更新は常にテーブルロックなのでID列はMAX+1で実装してたりする。
688 :
674 :2007/01/30(火) 01:16:03 ID:???
>>675 そうなんですか??
重複した属性を除去した結合演算を自然結合と言うのではないのですか?
>>676 さんとどちらが正しいのでしょうか?
それとも、私の書いた情報だけではどちらも正しいと言えるのでしょうか
rdb?
>>688 select ほにゃらら
from 売上 natural join 本 natural join 得意先
ほにゃららの部分は下のようにかけるわけだが、
1) select *
2) select 売上.*, 本.*, 得意先.*
3) select 売上.ISBN, タイトル, 出版社, 定価, 売り上げ日, 売上.得意先名, 数量, 住所, 郵便番号
1) に関してはどう出るかは処理系依存だろうな。MySQLは2)と同じ出方だと思う。
確実に結合した使ったキーのダブりを消したいなら 3)のように書く。
よくあるパターンだと思うのですが、意外に情報少なくて困ってます。 お願いいたします。 店テーブルと商品テーブルとお互いのIDを主キーにしたラインナップテーブルがあったとして 例えば商品4を扱っている店とその店が扱っている全ての商品を下のような形の配列で取得したいです。 [shop_id] => 1 [shop_name] => 店1 [item] => Array [item_id] => 1 [item_name] => 商品1 [item_id] => 3 [item_name] => 商品4 [shop_id] => 3 [shop_name] => 店3 [item] => Array [item_id] => 4 [item_name] => 商品4 [shop_id] => 6 [shop_name] => 店6 [item] => Array [item_id] => 2 [item_name] => 商品2 [item_id] => 4 [item_name] => 商品4 こんな感じの多重配列を取り出したいのですが、 今のところ、一回、店テーブルから商品4を扱っている店の列を副問い合わせして、取り出した後 その配列をまわし、もう一度ラインナップテーブルにSELECTを発行して上のような配列を得ています。 プログラム版で「内部的なSELECT回数は別としてSQL一発でいける」といわれたのですが どのようなSQLでいけるのでしょうか?いちおうpostgreSQLを使ってるのですが、だめだったらMySQLでも構いません。 また、上の例の、商品を扱ってる店をSELECTする方法ですが、商品が複数の時でも対応できるように (例えばid 4、5の商品を扱っている店) select * from 店テーブル where shop_id in (select shop_id from ラインナップテーブル where item_id in (4,5) group by shop_no having count(item_id) = 2); とやってるのですが、あんまり一般的じゃないでしょうか? もっとスマートな書き方があったらお願いいたします。 長文 and 駄文失礼します
692 :
691 :2007/01/31(水) 23:53:01 ID:+SZ2fAsV
うぎゃ あげ忘れました。 Janeに変えたらデフォでsageになってて・・・ お願いします
select lineup.shop_id, lineup.shop_name, item.item_id, item.item_name from lineup, item where lineup.item_id = item.item_id and lineup.shop_id in (select shop_id from lineup where item_id = 4) でいいんじゃね?
select shop_id,(select shop_name from 店テーブル where shop_id=ラインナップテーブル.shop_id), item_id,(select item_name from 商品テーブル where item_id=ラインナップテーブル.item_id) from ラインナップテーブル A where exists(select * from ラインナップテーブル where shop_id=A.shop_id and item_id=4) and exists(select * from ラインナップテーブル where shop_id=A.shop_id and item_id=5)
SQLの学習をしているのですが 「==」で列を連結する方法がわかりません おねがいします
||'=='|| とか?
697 :
NAME IS NULL :2007/02/03(土) 18:31:49 ID:ys+p5+nY
黒本のSQLやってんだけど 全く意味が分からん… 18pの例で SQL> SELECT * FROM 部署 ; って打つと 10 経理 東京 20 研究開発 名古屋 30 営業 大阪 40 管理 東京 って出てくるらしいが 俺がやると何度やっても 行1でエラーが発生しました。: 表またはビューが存在しません。 となってデータが全く表示されない
まずはテーブル作れ。サンプルテーブルとか付いてないのか?
699 :
NAME IS NULL :2007/02/07(水) 13:00:38 ID:8Sa1sPL2
ACCESSを弄っているのですが SELECT * FROM テストテーブル WHERE '日付/時刻' < '2007/02/07' で結果が返ってきません SELECT * FROM テストテーブル WHERE '日付/時刻' > '2007/02/07' だと全データが検索結果に表示されます 日付時刻以外の検索は上手くいっているのですが 間違っている箇所があれば指摘お願いします
>>699 日付/時刻 ってのはフィールド名?何でシングルクォートで囲んでるの?
あと、Access では、#07/02/07# と日付を書く場合もあるよ。
'日付/時刻'という文字列 と '2007/02/07'という文字列 の比較をしているんだから、正しい動作だな。 「日付/時刻」というのがフィールドならそれなりの扱いをしなきゃ
>>700 ,701
レスありがとうございます。
「日付/時刻」はフィールド名なのですが
間に/が入っているために動作がおかしくなります
>>702 Accessはようしらんがダブルクォート(")で括るとか、なんか試せば?
つーか、動作がおかしくなるようなフィールド名つけるほうが悪い。
704 :
236 :2007/02/07(水) 14:07:34 ID:IUHHkPFV
友達の好きな物テーブル 友達ID | 好きなものID -------------------- 5 | 1 -------------------- 5 | 2 -------------------- 5 | 5 -------------------- 5 | 8 -------------------- 1 | 1 -------------------- 1 | 2 -------------------- 1 | 3 -------------------- 好きな物が 1 と 8 が有る場合 友達id5のみを結果セットするにはどうすればよろしいでしょうか。 下記でやってもうまくいきません・・さっぱりです。 友達ID=autonum SELECT DISTINCT p.autonum as autonum, p.name1 as name1, p.name2 as name2, p.e_name1 as e_name1, p.e_name2 as e_name2 FROM 友達TBL p LEFT JOIN 友達の好きな物テーブル o2 ON p.autonum = o2.友達ID where o2.好きなものID like 1 AND o2.好きなものID like 8 ANDを使わず条件を一つだけにすれば出てくるのですが・・ アドバイスよろしくです。
705 :
NAME IS NULL :2007/02/07(水) 14:08:38 ID:IUHHkPFV
名前番号まちがえましたスマセン
706 :
NAME IS NULL :2007/02/07(水) 14:57:49 ID:WH4ReGmf
SQLServerで文字型で日付を持つ列と時間を持つ列があってこれを 日付型に変換したいんですけどいい方法あれば教えてくださいm(_ _)m 例えば A B 20060101 103040 ↓ 2006/01/01 10:30:40 のように。
>>704 最終的に欲しい結果のイメージがわからないのだが、AND を OR にするとかそう話じゃない?
>>706 あまりスマートな方法はない。
substringで yyyy-mi-dd hh:mm:ss の形に編集して
convert(datetime, '2006-01-01 10:30:40', 120)
>>704 意味ワカランがこんな感じか?
SELECT name FROM
(SELECT * FROM 友達TBL WHERE e_name=1)
JOIN
(SELECT * FROM 友達TBL WHERE e_name=8)
USING(name);
>>706 そのままキャストしてもダメかな?
SELECT cast(A AS DATE),cast(B AS TIME) FROM ...
709 :
704 :2007/02/07(水) 16:29:39 ID:IUHHkPFV
>707 or にすると 友達ID 1 もでてきちゃうのです。 >良く分からない 友達TBLと友達の好きな物テーブルというテーブルが二つあり 好きな物テーブルに 友達ID5と1リンゴ、ID5と2バナナ、ID5と5チェリー、ID5と8みかん と保存してます。 検索時に1リンゴと8ミカンを好きな友達を検索します。 それを満たしてる人の表示をさせたいです。 autonum name1 name2 ename1 ename2 5、東京、太郎、tokyo、tarou 31、大阪、次郎、osaka、jirou 分かっていただけたでしょうか。 もしくは、、やりかた(考え方)自体まちがってるのかな。
>>709 select * from 友達TBL p
where exists (select * from 友達の好きな物テーブル where 友達ID = p.autonum and 好きなものID = 1)
and exists (select * from 友達の好きな物テーブル where 友達ID = p.autonum and 好きなものID = 8)
711 :
NAME IS NULL :2007/02/07(水) 17:08:31 ID:WH4ReGmf
>>707 ありがとうございます!確かに少し長くはなりましたが期待する
結果を得ることがができました!!
>>706 説明不足ですみません。日付と時間をどうしても1つの列で
持ちたかったのでCASTだけではだめでした。ただCASTの存在
すら知らなかったのですが^^;、勉強になりました。
レス頂いた方ありがとうございますm(_ _)m
助かりました。
712 :
704 :2007/02/07(水) 17:15:42 ID:IUHHkPFV
>710 ぎゃぁ!できた!ありがとうございます! 検索方法として探す条件が10-20個になっても問題なさそうですか? もしかして皆もっと複雑で凄いのとかなんでしょうか SQLは使った事がなくて、 一般的なのかどうか皆目検討がつかない状態です。
>>709 >>710 で回答されちゃってるが、こんなのも思いついた。
SELECT P.* FROM 友達TBL AS P JOIN (
SELECT * FROM 友達の好きなものテーブル AS L1,友達の好きなものテーブル AS L2
USING (友達ID) WHERE L1.好きなものID=1 AND L2.好きなものID=8
) AS T1 ON P.autonum=T1.友達ID;
>>711 キャストが通れば足し算すればいいじゃん。
SELECT cast(A AS DATE) + cast(B AS TIME) FROM ...
MSSQLではdatetimeでcastを使うとシステムが適当に推論するので バージョンやロケールの違いで変換できなかったり違った意味に変換されたりする。 故にconvertが推奨。 日付時刻型はDBMS間で統一のとれてない部分のひとつ。 ANSI SQLでかなり後から標準化したのだが、キーワードが既存のものとかぶりすぎてどこもサポートに熱心じゃない。 日付時刻 timestamp、日付だけ date、時刻 interval なんだけど、timestampはデータの更新時に値が変更される機能を持つものが多いし、 dateはOracleでは日付時刻の意味。 普及させようとも思ったら既存のものと並存できるような名前と機能にしないとだめだと思う。
質問です。 こんなテーブルがあったとして、 SHOP | ITEM | ------------- A | 1 | A | 2 | A | 3 | B | 4 | B | 5 | B | 6 | C | 2 | C | 4 | C | 5 | D | 8 | D | 10 | D | 12 | この表は >12 の表を流用。 指定したお店の売ってる物を列挙するのは SELECT ITEM FROM TABLE WHERE SHOP==A で良いと思うのだけど、この結果を利用して 指定したお店と売ってる物がかち合うお店とかち合う商品を検索したい。 こういった、SQL の結果を利用してさらにSQLを作る方法を知りたいのだけど、 なんてキーワードでぐぐるといいのかが知りたい。 もひとつ基本的な質問。 インデックスっていうのは検索高速化のためのハッシュテーブル みたいな物と考えていいのかな。 たとえば ITEM の列にインデックスを設定したら、 ITEM|ROW 1 |1 2 |2,7 3 |3 4 |4,8 5 |5,9 6 |6 みたいなテーブルが裏でできてて、ITEM==4の行を検索するときに この表を参照して4,8行目を返す・・・みたいなイメージであってる?
答1 : 副問い合わせ、サブクエリー
717 :
NAME IS NULL :2007/02/09(金) 17:50:07 ID:Bf157FZO
MySQL 3.23.58 を使っています。 ID, DATE という2つのフィールドを持つテーブルがあるんですが、 DATEに入力されているレコードの日付毎に件数を求めるにはどうすればいいでしょうか? DATEには以下のような書式でレコードが入っています。 2007-02-07 22:26:44 そして残念なことにDATEフィールドはCHAR型なのです。 前10文字だけ取り出してそこでGROUP BYとかできるのでしょうか? よろしくお願いします。
自己解決しました。こんな感じで。 SELECT SUBSTRING(DATE, 1, 10 ) AS DATE, COUNT( * ) FROM __TABLENAME__ GROUP BY DATE;
group by の方もsubstring使わなくて平気なのかな
>>715 インデックスの方は違うな。
それだと、UNIQUE制約のかかったカラムでは意味を成さない。
>>719 平気
721 :
720 :2007/02/09(金) 18:55:55 ID:???
ゴメソORDER BYと勘違いした。
>>718 の場合、平気なものとそうでないものがあるはず。
PostgreSQLなんかは可能。
集合論が好きな人がRDBに向いてそうだなあ。
723 :
NAME IS NULL :2007/02/12(月) 10:51:31 ID:o/ZDMXEi
力を貸して下さい。お願いします。 下記の表で、←を付けた行のように 各ID1の中で、DATE1+TIME1が一番大きい行 を抽出したいのですが、いいクエリーが思いつきません。 [TABLE1] Key(ID1, DATE1, TIME1) ID1 DATE1 TIME1 VALUE1 ---- ---------- -------- ------ 0001 2007-01-01 12:00:00 AAAA 0001 2007-01-01 18:00:00 BBBB ← 0002 2007-01-01 07:00:00 CCCC 0002 2007-01-03 07:00:00 DDDD ← 0003 2007-01-02 04:00:00 EEEE ←
>>723 分析関数使えるDBなら分析関数で。
使えないならこんな感じか。
select * from TABLE1 A where
not exists(select * from TABLE1 where ID1=A.ID1 and DATE1>A.DATE1)
and
not exists(select * from TABLE1 where ID1=A.ID1 and DATE1=A.DATE1 and TIME1>A.TIME1)
725 :
NAME IS NULL :2007/02/12(月) 15:48:06 ID:COhphUXe
とても初歩的な質問で悪いのですがMySQLとPostgresSQLの両方をパソコンにインストールするのって やらない方がいいですかね? SQLのソフトのメモリの量とか実行のスピードとかよく分からないのでお願いします。
726 :
NAME IS NULL :2007/02/12(月) 16:03:19 ID:o/ZDMXEi
>>724 ありがとう。勉強になりました。
分析関数というのはMax()とかのことですよね?
自分は、Max()を使ってどうにかしようとしたのですが、力及ばずでした。
後学のために、Max()を使った場合のクエリーも教えて下さい。
# なお、使用しているDBMは、IBM UDBのDB2です。
>>726 MAX()でもできるんだろうけど、ランク関数みたいなやつのことです。
ID1ごとに順番振って順番が1のをもってくるとか。DB2は使えるみたい。
rank() over ( patition by ID1 order by DATE1 desc,TIME1 desc)
728 :
NAME IS NULL :2007/02/12(月) 18:45:35 ID:o/ZDMXEi
>>727 ありがとうございます。
恥ずかしながら、RANK関数、DENSE_RANK関数の存在を初めて知りました。
それらをキーワードに調べた結果、ID1毎のRANK一位のレコードを抽出する
クエリーは下記となりましたが、これで良いのでしょうか?
# 下記のSQLを発行して期待の結果が出てきたのは確認したのですが、
# これが最適かどうかに自信を持てないもので。。。
Select *
From (
Select T.*
, Rank() Over( Partition By ID1 Order By DATE1 Desc,TIME1 Desc) RANK
From Table1 T
) As S
WHERE RANK = 1
また、コスト(検索速度、検索負荷)的には先ほど(724)のクエリより、こちらの方が
良いと考えればいいのでしょうか?
クエリの書き方について質問です。ORACLE 10gを使用しています。 1・FROM句中で宣言したインラインビューは、(同じ)FROM句で他テーブルとのJOINができないようなのですが、 どうしても同一クエリ中に収めたい場合に何か手段はありますでしょうか? それともスキーマにVIEWを設定した上でその VIEWを用いるように対処しなくては実現は不可能でしょうか? 2・LEFT JOIN、RIGHT JOINの順序は、結合後にできる表に対して影響を及ぼさない認識でよいでしょうか?(よくない場合の反証を簡単に教えていただけると更にありがたいです) 3・INNER JOINはWHERE句と置き換えてしまってもよいでしょうか?また、置き換えてよい場合、例えばLEFT JOINする表にINNER JOINしている場合でも適用できますか?
>>730 試してないけど1番はサブクエリに別名をつけてないからとかでない?
おまいらSQL書くときのインデントってどうしてますか? 俺はなんとなく SELECT col1,col2.col3 FROM table1 WHERE col1='0001' みたいにSELECTのTを基準に中央揃えっぽく書いてるんだけど SELECT col1 ,col2 ,col3 FROM table1 WHERE col1='0001' っつーソースを見つけたんでなんとなく気になった。 あとOUTER JOINとかサブクエリのときはどうするのがわかりやすいのかな?かな?
733 :
NAME IS NULL :2007/02/17(土) 11:48:42 ID:rqmrrQP7
>>732 俺はTの後のスペースを中心にしてる。
. SELECT COL1
. ,COL2
. FROM HOGE
. WHERE COL1=1
. AND COL2=2
734 :
NAME IS NULL :2007/02/17(土) 11:49:15 ID:rqmrrQP7
表現できてねぇ
>733
変更があったときに、その行だけ入れ替えればいい、って発想ね。 確かにそうなんだけど、文頭に「,」が来るのはなんか嫌な感じ。
737 :
NAME IS NULL :2007/02/17(土) 14:33:05 ID:68lerIu8
>>736 後で検索列追加の場合に便利なんだよ、この記述
SELECT
A
,B
FROM
から
SELECT
A
,B
,C
FROM
への変更で、Bの列に影響なし、逆に削除も自己完結。
後ろについてると、最後の列の削除とかで前の列をいじるなど対応が必要。
まあ、とっても小さい話だけどね。w
>>737 だから、それはわかってるってww
でも、見た目がきれいじゃないから嫌いなのよ。
739 :
NAME IS NULL :2007/02/17(土) 14:38:55 ID:68lerIu8
まあ、私も列は麻雀のごとく列6個切りとかしてるけど。 意味(読んだときに切れると丁度良い句読点みたいな感じ)で切るときと、機械的に個数で切るときが併用
行頭にカンマがあったほうが「ここは前行からの続きですよ」という表現になって見やすい
741 :
NAME IS NULL :2007/02/18(日) 11:57:49 ID:STh+n8h3
テーブルの設計について質問です。 簡単な例として住所録を作ることを考えます。 1) 日本人、アメリカ人、などなど色々な国の人が登録される 2) 人物の基本情報(性、名、生年月日、国)は何人でも共通 3) ただし、国によって住所のフォーマットがばらばら 4) 日本人は都道府県市区町村だけど、 どっかの国の人は全然違う住所の表記法だとする 4)のような場合は、日本人は使わない列が出てきてしまいます。 C++とかの発想で言うと、 「人物テーブル」に人物クラスを入れたいが、 派生クラスである日本人クラスやアメリカ人クラスは、 それぞれ違うメンバー変数を持っている、という感じ。 こういうときって、 「人物テーブル」には基本情報だけを入れておいて、 国籍ごとに「日本人住所テーブル」、「アメリカ人住所テーブル」などを作り、 JOINさせるっていうのが普通でしょうか。 他に何かこうやればいいってやり方ありますか?
>>741 XMLデータベースでも使えば。
DB2とか。
>>741 あたりまえだけど、検索方法と件数、メインとなるデータに依存する。
都道府県や市、州などで検索したいなら、それ用のフィールドを用意するし、
そういう検索がないのなら、でかいテキストフィールドを用意しておいて、
その中に区切り文字を入れて突っ込む、という手もある。
データとして日本がほとんどなら、日本用の住所テーブルにアメリカや
その他の国の住所表記をカバーするフィールドを用意しておけばいいだろう。
メンテやらのことを考えると、別テーブルにするのはあんまりよくなさげ。
>>741 スーパータイプ/サブタイプの問題はここ数年のテクニカルエンジニア試験では
しょっちゅう出てきているので、まずは特定の実装に依存しない普遍的な
知識を得るためにその手の参考書を読んでみることをオススメする。
746 :
NAME IS NULL :2007/02/18(日) 18:10:18 ID:KAlPoj7C
SQLで、データに半角カナが混ざってるレコードを抜き出す処理って可能でしょうか?
747 :
741 :2007/02/19(月) 04:58:46 ID:???
>>742-745 ありがとうございました。
これといった王道はないようですが、
検索ワードがわかりました。
調べて自分の環境に最適なものを探してみます。
748 :
NAME IS NULL :2007/02/19(月) 15:04:00 ID:apNvUggO
対象期間内で連続したx日間(date型)データが存在する場合に対象データを抽出、 という処理を行いたいのですが可能でしょうか? ちなみにMySQLです。
749 :
730 :2007/02/20(火) 04:25:09 ID:???
>>749 一般的にはできるから、その出来ないSQLを晒したらいいと思うよ
あるテーブルAがあって、Aには、Bという列だけがあります。 B(DateTime型, unique) -------------------- 1/1 1/5 1/4 1/9 -------------------- このテーブルAにorder by Bをかけた上で、 -------------------- 1/1 1/4 1/5 1/9 -------------------- 各レコードの日付間隔をとって、 列を1つだけ持つ以下のような結果セットを返すことって SQL的には可能でしょうか?(SQL Server 2005) (int型) -------------------- 3 1 4 -------------------- ↑この結果セットの順番は別に1, 3, 4でも4, 3, 1でも3, 4, 1でも何でも構わないのですが・・・ ストアド使ってレコードを回しながら自前で処理するべきなのかどうか迷っています。 アドバイス、ヒント等いただければ幸いです。
>>751 SELECT (SELECT min(b) FROM A WHERE T1.b<b) - b FROM A AS T1;
>>752 試してみたら動きました。ありがとうございました。
SQLの凄さを実感しました。
754 :
NAME IS NULL :2007/02/21(水) 18:06:36 ID:fA2XFasj
Firebirdで下のTABLE1から ■TABLE1 JOB TIME TYPE ----------------------- A 2.0 X B 3.5 Y C 2.0 X A 1.0 X C 2.0 Y B 2.5 Z JOB TYPE=X合計 TYPE=Y合計 TYPE=Z合計 ------------------------------------------------ A 3.0 0.0 0.0 B 0.0 3.5 2.5 C 2.0 2.0 0.0 上記のような結果を取得したいのですが、こんなこと可能なんでしょうか。 ヒントでもよろしいのでご教授願います。
>>754 CASE文, GROUP BY, SUM関数
756 :
754 :2007/02/22(木) 08:12:49 ID:???
>>755 ありがとうございます。
CASE文のことは全然知りませんで助かりました。
質問です。 テーブル1のキーの上2桁で値を集約し、 テーブル2にデータを作成する処理をPLSQLで作ろうとしているのですが、 SQLでうまくデータをとれません。 テーブル1 ⇒ テーブル2 --------- --------------- キー 値段 キー上2桁 値段 100 10 10 20 101 10 20 30 200 30 テーブル1からデータを取得するときに、 select substr(キー,1,2), sum(値) from テーブル1 group by キー とすると、キー3桁で集約されてしまいます。 カーソル1:テーブル1からデータを取得、集約 ⇒1行ずつテーブル2にinsert するように実装しようとしたのですが、 そもそもSQL一発でsubstringした値で集約する ことはできませんか。
758 :
NAME IS NULL :2007/02/24(土) 02:31:13 ID:cpeo3iSw
すいません、質問させてください。 今、ストアドプロシージャを書いているのですが 複数の行にUpdateかけて、その後、そのUpdateが何行にかかったか調べたいのですが 何か変数みたいなのがあるのでしょうか?? たとえば、 Update table1 set 列1 = 1; って更新した後、列1=1という行は複数あるとき、当然複数の行が更新されるはずですが その後、その行の数を調べるには、SELECT COUNT(*)で調べるしかないのでしょうか?
759 :
NAME IS NULL :2007/02/24(土) 03:06:32 ID:RYL1/nEC
改行を除外した日本語文字列を取得したいのですが、どうしたらいいですか? 使ってるのはSymfowareとかいう奴です。
>>757 GROUP BY substr(キー,1,2);
>>758 普通のSQLなら発行したホスト言語側で何行影響を受けたかを
返す関数なりメソッドなりあると思うが、ストアド内部で知りたいのなら
そのストアドで使われている言語仕様次第だろうな。
>>759 replace関数ってないの?
なけりゃホスト言語でやるとか。
っていうか、あんまりSQLでデータ加工しない方が...
そもそもそゆ言語じゃないし。
761 :
757 :2007/02/24(土) 14:45:54 ID:???
>>760 select substr(キー,1,2) 集約キー, ←
sum(値)
from テーブル1
group by 集約キー
とすると、SQLエラーになってしまったので、
GROUP BY substr(キー,1,2);
は試していませんでした。
やってみます。
ありがとうございます。
自社の作業日報の集計を行おうとしてるんですが行き詰ってしまいお知恵をおかしください。 tableAは休日マスターテーブルで各日の就業時間を設定しています。 tableBは作業日報でそれぞれの作業時間を記録しています。 ●tableA A_DATE A_TIME ------------------------ 07/01/01 0.0 07/01/02 0.0 07/01/03 0.0 07/01/04 8.0 ●tableB B_DATE B_WORKER B_JOB B_TIME -------------------------------------------- 07/01/04 TANAKA A-205 2.0 07/01/04 TANAKA B-225 3.0 07/01/04 TANAKA N-301 4.0 07/01/04 MAKITA A-201 6.5 07/01/04 MAKITA B-300 7.5 07/01/04 SASAKI H-600 8.5 そこで各作業者の指定期間の残業時間及び休日出勤時間の合計を算出したいのですが なかなかうまくいきません。下のようなSQLで残業及び休日出勤のある日はリストアップ 出来たのですが、そこからどうしていいのかわからなくなってしまいました。 select B_DATE, B_WORKER, sum(B_TIME) from tableB B where B_DATE between '2007/1/1' and '2007/1/24' group by B_DATE, B_WORKER having sum(B_TIME)> (select A_TIME from tableA where A_DATE=B.B_DATE)
>>758 質問するときはDBの製品名も書いた方が良いです。
ちなみにオラクルはSQL%ROWCOUNT。ただし当然コミット発行する前な。
SQL Server なら @@ROWCOUNT 変数。
765 :
NAME IS NULL :2007/02/26(月) 21:41:22 ID:A5pvB6Dy
UNIXのPIDの親子関係のように、あるプロセスの子供、そのまた子供 といった具合に、どんどん再帰的に検索をかけることは可能でしょうか? PID | ProcessName | ParentPID といった構造のテーブルから検索したいです。
再帰(recursion)なの? ただの繰り返し(iteration)でもいい気もするけど。
>>766 再帰か繰り返しか・・・・と言われるとその違いが分からないのですが
繰り返しというのは要はストアドってことですよね?
>>765 がやりたいのは再帰だと思うよ。
WITH RECURSIVE に対応されてれば可能だったかな。
一部のDBでCONNECT BYとかconnectby(..)等で可能。
770 :
NAME IS NULL :2007/02/27(火) 14:10:56 ID:JvSY131s
order byについてお助けください。 Access2000を使用しています。 テーブルA、テーブルBがあり、 それぞれ日付とコードを持っています。 ---------------------------- テーブルA テーブルB ---------------------------- 日付 コード 日付 コード 07/02/04 2 07/02/01 2 07/02/05 1 07/02/02 1 07/02/06 2 07/02/03 2 これを、テーブルBにて 日付の古いコードが出現したコード順に テーブルAを取得したいのですが、 どのようにすれば取得可能でしょうか? ---------------------------- 得たい結果 テーブルA ---------------------------- 日付 コード 07/02/04 2 07/02/06 2 07/02/05 1 オラクルですと、order by に相関サブクエリが 使えるようですので以下のSQLでよさそうなのですが。 (オラクルで試してみたわけではないので間違っているかもしれません。。) ------------------------------------------------ select a.コード, a.日付 from テーブルA as a order by (select b.コード, min(b.日付) from テーブルB as b group by b.コード order by min(b.日付)); ------------------------------------------------ Access2000では構文エラーがでて 書き方がわかりません。 わかる方がいましたらご教授願います。
>>770 すみません。
サブクエリーの中では
order by 句は使えないようですね。
失礼しました。
772 :
NAME IS NULL :2007/02/27(火) 15:58:46 ID:FZHIf2Yf
少し考えれば使えないではなく、必要ないってなると思うが。
>>770 脳内でテキトーに考えたSQLだけど
select
a.コード,a.日付
from
テーブルA as a,テーブルB as b
where
b.コード = a.コード
order by
b.日付;
774 :
758 :2007/02/28(水) 04:53:23 ID:0s+wgT0M
>>773 ご返答ありがとうございます。
参考にさせていただき以下で出来ました。
------------------------------
select distinctrow
a.コード,a.日付
from
テーブルA as a,テーブルB as b
where
b.コード = a.コード
order by
b.日付,a.日付;
----------------------------
ありがとう御座いました!
2つ以上のレコードから重複を取り除きたい コード 住所1 住所2 1 東京都 中央区 2 東京都 新宿区 3 大阪府 中央区 住所1は東京都と大阪府 住所2は中央区と新宿区 を取り出したいのです。 どのようにすれば取得可能でしょうか?
distinct
たびたびすみません。
>>770 です。
出来たと思ったんですが、
データが以下の場合、
----------------------------------
テーブルA テーブルB
----------------------------------
日付 コード 日付 コード
07/02/04 2 07/02/01 2
07/02/05 2 07/02/02 1
07/02/06 1 07/02/03 2
07/02/07 1 07/02/04 1
07/02/08 2 07/02/05 2
07/02/09 2 07/02/06 1
07/02/10 2 07/02/07 1
07/02/08 2
----------------------------------
select distinctrow
a.コード,a.日付
from
テーブルA as a,テーブルB as b
where
b.コード = a.コード
order by
b.日付,a.日付;
----------------------------------
を実行すると
----------------------------------
コード 日付
2 07/02/05
1 07/02/07
2 07/02/10
1 07/02/06
2 07/02/04
2 07/02/08
2 07/02/09
----------------------------------
になってしまいます。
テーブルBの日付が最初に出現した
コードの順番にするにはどのようにすれば
良いのでしょうか?
わかる方がいましたらご教授願います。
----------------------------------
得たい結果
テーブルBにて07/02/04に コード=2が
あるので コード=2 を優先。
次に07/02/06にコード=1が
あるのでコード=1を追加。
----------------------------------
コード 日付
2 07/02/04
2 07/02/05
2 07/02/08
2 07/02/09
2 07/02/10
1 07/02/06
1 07/02/07
テーブルBをコードでGROUP BYして日付の最小値を取って、 それをサブクエリーとしてテーブルAとくっつければいいんでは
780 :
NAME IS NULL :2007/03/01(木) 21:04:24 ID:vN9pA/9v
誰か教えてください。 今日初めてSQLでデータ抽出してみました。 DBはオラクルでSQLPlusWを使ったんですが、抽出したデータをエクセルとか吐き出すことってできるのでしょうか? よろしくお願いします。
782 :
NAME IS NULL :2007/03/01(木) 21:52:58 ID:vN9pA/9v
>>781 ありがとうございます。
CSVでもアクセスでもエクセルでもなんでもいいんです。
誘導していただいたスレでも聞いてみます。
レコード挿入時に 表にキー1が存在しなければINSERT キー1が存在したら何もしない という処理をしたいのですが一度検索処理をしないで 行えますか? MERGEではキーが存在したら更新してしまうので・・
>>783 そのキー1が主キーなら、そのままINSERTを投げればいいのでは?
なかったら追加できるし、あったら例外が発生するから。
select 結果が下記のようなとき(c2でソートしています) c3の通算が 70以内 の行のみ表示するのはどのように書けばいいんでしょうか c1 | c2 | c3 ----+----+----- 133 | 626 | 50 <-- 通算50 52 | 524 | 19 <-- 通算69 522 | 473 | 2 <-- 通算71 11 | 341 | 19 <-- 通算90 上記の場合2行目までselectで抜き出したいです
>>785 select T1.c1, T1.c2, T1.c3
from t T1
join t T2 on T2.c2 <= T1.c2
group by T1.c1, T1.c2, T1.c3
having sum(T2.c3) <= 70
order by T1.c2
787 :
785 :2007/03/03(土) 10:41:15 ID:???
>>786 不等号が逆のような気もするが、その不等号結合なんて久方ぶりに見た気がす。
使う機会が少ないから、必要なときに思い浮かばね。
んで別解で出したりする。
SELECT * FROM T AS T1 WHERE 70>=(SELECT sum(c3) FROM T WHERE c2>=T1.c2);
789 :
785 :2007/03/03(土) 11:06:22 ID:???
>>788 不等号は逆なのは気づきました、
別解のほうが見てわかりますね。
790 :
785 :2007/03/03(土) 11:11:10 ID:???
>>788 別解でも欲しい情報は抜き取れましたが
すげーおそかったです。
小数点以下の値をそのままの形で出力したいのですが、指定の仕方がわからず悩んでいます。 下記のようにすると、スペースが入ってしまいます。 SELECT TO_CHAR(MONEY, '990.00') AS MONEY FROM DATA_BASE WHERE select_cd='M' 例 DBに格納されている値。→0.99 そのまま出力すると→.99 希望する出力→0.99 以上、よろしくお願いいたします。
TRIM(TO_CHAR(MONEY, '990.00'))
select c1,c2,c3 from ( select c1,c2,c3, sum(c3)over(order by c2 desc) as s1 from t ) where s1 <= 70
CREATE TABLE `user_tbl` ( `seq` int(11) unsigned NOT NULL auto_increment, `id` varchar(100) NOT NULL, `pass` varchar(100) NOT NULL, `title` varchar(200) NOT NULL, PRIMARY KEY (`seq`) ) TYPE=MyISAM ; このテーブルでidとpass,titleをINDEX化(よく検索するため)したいのですが PHPMyadminでKEY (`id`,`pass`,`title`)をするとエラーがでます。 また、以下のsql文をこのテーブルを効率よく検索するにはどのようなテーブル構成がいいでしょうか? SELECT * FROM `seq` FROM `user_tbl` WHERE `id`=ID; SELECT * FROM `seq` FROM `user_tbl` WHERE `title`=TITLE; SELECT * FROM `seq` FROM `user_tbl` WHERE `id`=ID and `pass`=PASS;
MySQLってFROM..FROM...なんていうイカれた文法通るのか? そして無理にPRIMARY KEYにする理由がわからんが。 普通にCREATE INDEXすればいいじゃん。 EXPLAINなりで計測してそんなに差が出るとも思えんし。
796 :
794 :2007/03/04(日) 00:22:18 ID:???
>>795 さん
レスありがとうございます。
794のsql文はよく使用する3つをかいてます
1文ではないです。
データが100万程度、入るテーブルですので効率を最大限上げたいなあと思って
>SELECT * FROM `seq` FROM `user_tbl` WHERE `id`=ID; FROM `seq` FROM `user_tbl`ってFROMが2回連続して出てくるけどいいの? それともselect * from user_tbl where ID='id'; の間違い?
798 :
794 :2007/03/04(日) 03:16:46 ID:???
>>797 さん
…どこに目をつけてるんだもれ…(´・ω・`)
そのとおりです
799 :
NAME IS NULL :2007/03/05(月) 00:02:53 ID:BZyfvGj7
計算式AS たとえば SELECT 単価*在庫数 AS 在庫価格, 在庫.単価etc... で名前を変更し、その中からいくら以上の価格だけ抽出したい場合 WHERE 在庫価格>=10000; とかだと思うのですが、 パラメータの入力 在庫金額 と出てしまいます。どう書き換えればしっかり抽出出来ますでしょうか?
800 :
572 :2007/03/05(月) 00:16:25 ID:???
WHEREじゃなくて、 HAVING 在庫価格>=10000 でいいんじゃね?
801 :
NAME IS NULL :2007/03/05(月) 00:54:45 ID:BZyfvGj7
>>800 ありがとうございます。無事抽出出来ました。
もう1つ質問なのですが、
単価 売上数
300 3
400 5
500 6
としてすべての売上総額の計算式はどういったものになるでしょうか?
SELECT 単価 * 売上数 FROM ....
って藻前が
>>799 でやってることと変わらんと思うんだが。
sum(単価*売上数) ってことじゃね。
スマソ、SELECT SUM(単価 * 売上数) FROM...だと思う。
805 :
NAME IS NULL :2007/03/05(月) 01:03:23 ID:BZyfvGj7
>>802 説明不足でした、すいません
801に書いた式であれば
300x3=900
400x5=2000
500x6=3000
の合計で5900と表示されるSelect文が解らないのです・・。
デッドロックの回避って具体的にどうやればいいんでしょうか。 update文にorder byでプライマリキー順に更新とかルール付ければ、おきないものなのでしょうか? (その前にできるか知りませんが・・・)
>>806 単発の行ロックならデッドロックは発生しないでしょ。
通常、複数のロックを一定でない順序で取得しようとするからデッドロックが発生する。
808 :
806 :2007/03/05(月) 21:46:39 ID:???
>>807 すみません。説明が足りなかったです。
1コミット中に1レコードだと問題ないのですが、
常に複数行を更新される恐れのあるテーブルの場合です。
大げさに言えば、全レコードを1コミットで更新するSQLが、複数処理から呼ばれる場合、
デッドロックが発生する可能性が大だと思います。
その場合どうすればいいのかと悩んでます。
810 :
NAME IS NULL :2007/03/06(火) 09:30:16 ID:7AABqwK/
仕様レベルで処理順序がきちんとしているならば、デットロックは発生しにくいし。 そもそも、DBMSによってロック管理が違うから、一概に難友言えないし。
811 :
NAME IS NULL :2007/03/06(火) 14:09:15 ID:fZ+u7Psg
>>811 使ってるDBがMySQLでは無いと言うオチはなしだぞ
813 :
NAME IS NULL :2007/03/06(火) 15:55:19 ID:fZ+u7Psg
>811 ごめん、素で書き忘れた Mysql 5.0です;;
>>811 何をどう試してどううまくいかないのかを書いてないものに答える気力は出ないわけです。
INSERT table_a SELECT * FROM table_b 副問い合わせ出来ないと言われてるMySQL4.0を使っていて、 上記のSQLは有効みたいなのですが、これって副問い合わせって言わないんでしょうか?
>>815 いわない。逆にselectの箇所にテーブル名をじかに持ってこれないだろ?
817 :
NAME IS NULL :2007/03/07(水) 16:38:56 ID:PkZhI7eE
指定した順番でorderかけるにはどうすればいいですか order by value = G, A, T, K みたいなことがしたいです
>>817 caseで1,2... に読み替えてorder by
*を項目名にすると動かなくなりますね・・・ありがとうございます ・・・くそっMySQL4.0氏ねばいいのに
820 :
819 :2007/03/07(水) 17:33:15 ID:???
何か勘違いしてないか
すみません。どうしても分からなかったため質問させてください。 cd kingaku ---------------------- 1 1000 2 2000 3 1500 4 2200 5 1200 6 1000 上記のようなテーブルから cdが奇数(1,3,5)の場合と偶数(2,4,6)の場合の 金額の合計をUNIONを使って出力結果を結合するのではなく 一つのSQL文で出力するSQL文を教えていただけないでしょうか。 期待する出力結果 グループの名称 金額合計 ------------------------------- 奇数番号の合計 3700 偶数番号の合計 5200 お手数をお掛けしますが もしよろしければ教えていただけると助かります。 よろしくお願いします。
823 :
NAME IS NULL :2007/03/08(木) 12:45:08 ID:cnXUTSfl
DBMSによる部分もあるが、元の値×余りを出す演算結果を01に変換 を偶数、奇数でやったSUMでいいんじゃねーの? SELECT SUM(金額×DECODE(奇数?,1,0)) 奇数の和、 SUM(金額×DECODE(偶数?,1,0)) 偶数の和 なんちゃってSQLだが感じをとってもらえれば。
SELECT sum(kingaku) FROM テーブル GROUP BY cd % 2; とかじゃだめかね
SELECT CASE WHEN cd % 2 = 1 THEN '奇数番号の合計' ELSE '偶数番号の合計' END AS グループの名称, sum(kingaku) AS 金額合計 FROM テーブル GROUP BY グループの名称; これでそのまま出た。
826 :
822 :2007/03/08(木) 17:50:55 ID:???
827 :
NAME IS NULL :2007/03/10(土) 09:44:44 ID:RH4stIbl
id value ------- 1 100 1 200 1 150 4 220 5 150 5 400 7 100 7 300 7 500 7 150 こういうテーブルがあったとき、それぞれのidについてvalueの大きい順に上位2件ずつ取得するSQL文を教えてください。 期待する結果: id value ------- 1 200 1 150 4 220 5 400 5 150 7 500 7 300 RDBMSはMySQLの4.1か5.0です。
>>827 「最大値」と「最大値を除いた残りの最大値」をUNION。
又は、
各idごとの順位番号をつけてWHERE句で順位<=2。
ってのしか思い浮かばず、
いくらなんでも無駄すぎっぽいので、素直にLimitクエリを使って、
SELECT * FROM t AS T1 WHERE value IN (SELECT value FROM t WHERE T1.id=id ORDER BY value DESC Limit 2);
実用的速度を得られるかどうかは不明だが。
829 :
NAME IS NULL :2007/03/10(土) 11:19:39 ID:RH4stIbl
>>828 ありがとう。
ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
だそうです。うーむ(MySQL 5.0.32)
> 各idごとの順位番号をつけてWHERE句で順位<=2。
こっちの方、教えてくれませんか。
>>829 ありゃ、サブクエリ内でLimit使えないのか。
SELECT * FROM
(SELECT (SELECT count(*) FROM t WHERE id=T1.id AND value>T1.value)AS num,* FROM t AS T1)AS T2
WHERE num < 2;
MySQLで動くかな? もうちょっと略せそうな気もするが...
831 :
NAME IS NULL :2007/03/10(土) 12:55:26 ID:RH4stIbl
>>830 だめみたい...
mysql> SELECT * FROM (SELECT (SELECT count(*) FROM t WHERE id = T1.id AND value > T1.value) AS num, * FROM t AS T1) AS T2 WHERE num < 2;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM t AS T1) AS T2 WHERE num < 2' at line 1
>>831 ダメだったか、役立たずでスマソ。
SELECT リストにサブクエリが使えないならダメなんだろうけど、
ひょっとして*を T1.* とか id,valueとかに置き換えてもダメなんかな?
あと、SELECTリストに相関サブクエリを置くんじゃなくて、
JOINしてGROUP BYしてカウントをとる方法もありだと思うが、
つか、そっちの方が場合に因っては速いかもしれないが、
今の俺にはSQLが思いうかばねぇ。
だいたい俺って相関サブクエリ厨なんだよな('A`)
このスレにはエキゾチック結合をうまく使う人もいるから
そんな人の出現を待った方がいいな。
833 :
NAME IS NULL :2007/03/10(土) 13:17:45 ID:RH4stIbl
>>832 お、いけた。
... AS num, *がまずかったみたい。
... AS num, idと明示してやったら通りました。thx!
834 :
833 :2007/03/10(土) 13:18:35 ID:RH4stIbl
>>833 訂正
... AS num, id, valueにしたらOKだった。
おっ、うまくいったのか、ヨカタ。 俺は密かにリベンジしてたw。 SELECT t2.id,t2.value,count(t2.value) FROM t AS T1 JOIN t AS T2 ON T1.id=T2.id AND T1.value>=T2.value GROUP BY t2.id,t2.value HAVING count(t2.value)<=2 ; なんかすげ〜グダグダ...
すみません。質問です。 ユーザーテーブル(users)にユニークなuser_id 商品テーブル(products)にユニークなproduct_id そして投票テーブル(votes)は vote_id,user_id,product_id となっている。 やりたいのは、 商品の一覧取得時に投票数も一緒に取得。 SELECT ? as vote_num from products, votes where products.product_id = votes.vote_id こんな感じなのですが、vote_numに投票数を入れるにはどうすれば良いでしょうか? 宜しくお願いいたします。 使用DBはmysql 3.23
837 :
836 :2007/03/10(土) 21:13:11 ID:???
追記します その後、いろいろ試して SELECT *, count(vote_id) FROM products, votes WHERE products.product_id = votes.product_id GROUP BY products.product_id でそれっぽいのは出来ましたが、 投票が一つもないproductが WHERE products.product_id = votes.product_id ではじかれてしまいます。 これを、投票がひとつもない商品に対して、 count(vote_id) = 0 となるようなSQL文を探しています。 宜しくお願いいたします。
>>837 そいつをもうひとつの商品テーブルと外部結合するか、
投票が一つもない商品の検索結果とunionとればおk
839 :
836 :2007/03/10(土) 22:27:48 ID:???
>>838 ありがとうございます
>そいつをもうひとつの商品テーブルと外部結合するか
これはよく意味がわかりません。
「もうひとつの商品テーブルと」とはどういうことでしょうか?
>投票が一つもない商品の検索結果とunionとればおk
これもごめんなさい。
投票が一つもない商品の検索結果を出す式もわからないんです。
試しに下記のようにしてみましたが、見当はずれの結果でした。
SELECT *, count(vote_id)
FROM products, votes
WHERE products.product_id != votes.product_id
GROUP BY products.product_id
すみません、宜しくお願いします。
840 :
836 :2007/03/11(日) 00:57:40 ID:???
度々、すみません。 解決しました。 >838 ありがとうございます。 外部結合でいろいろ検索して下記の文が完成しました select products.*, count(vote_id) as cnt from products left join votes on products.product_id = votes.product_id group by products.product_id
dropやdeleteではなくテーブルを削除?するのがあるらしいのですが名称を忘れました トランスケットだったかトライケットだったような 全然違うような・・・
truncate トランケイト
>>842 こんな的を射ないレスで回答がもらえるとは・・・
本当にありがとうございます。
844 :
NAME IS NULL :2007/03/13(火) 07:07:51 ID:LlT/FMMQ
ちょっとつまずいたので教えて下さい。データベースはmysql4.0.27を使ってます。 2つのテーブル「member_table」「team_table」があるとします。 フィールドは全てNOT NULLです。 member_table --------------------------------------- team_id | member_id | member_name | --------------------------------------- 1 | 1 | 一郎 | --------------------------------------- 2 | 2 | 二郎 | --------------------------------------- 3 | 3 | 三郎 | --------------------------------------- 4 | 4 | 四郎 | --------------------------------------- team_table ------------------------ team_id | team_name | ------------------------ 1 | レッズ | ------------------------ 2 | ブルズ | ----------------------- 3 | パープルズ | ----------------------- これを外部結合させます。 SELECT * FROM member_table LEFT JOIN team_table USING (team_id) とすると、当然team_idの4はデータに無い為、四郎の外部結合されたteam_idとteam_nameはNULLになります。 ここで私がやりたい事は、 結合されたテーブルからteam_idとteam_nameがNULLのメンバー、 つまりチームに所属設定されていないメンバー(この例では四郎)を抽出する事です。 SELECT * FROM member_table LEFT JOIN team_table USING (team_id) WHERE team_table.team_id=NULL とか SELECT * FROM member_table LEFT JOIN team_table USING (team_id) WHERE team_table.team_name=NULL とやってみたのですが、抽出されませんでした。 とのようにしたら良いのでしょうか? ご存じの方いらっしゃいましたら、宜しくお願い致します。
>>844 WHERE team_table.team_id IS NULLでど?
846 :
844 :2007/03/13(火) 08:10:14 ID:???
>>845 出来ました!!ありがとうございます!
そうか、NULLの場合は「=」ではなく「IS」を使うんですね。
初歩的なことで申し訳ありません。
朝早くからありがとうございました。
あなたにとって今日一日が素晴らしい一日でありますように・・・。
そーゆ上っ面だけの覚え方してると別の場所でハマることになる 「三値論理」でぐぐれ
create table tbl1( col1 INT NOT NULL AUTO_INCREMENT DEFAULT 0, col2 DECIMAL(13,0) NOT NULL DEFAULT 0, PRIMARY KEY (col1) ) TYPE=MyISAM; create table tbl2( col1 INT NOT NULL AUTO_INCREMENT DEFAULT 0, col2 DECIMAL(13,0) NOT NULL DEFAULT 0, PRIMARY KEY (col1) ) TYPE=MyISAM; 上記のtbl2.col2を丸々tbl1.col2へ移して、tbl1.col1は1から連番を振りたいのですが どうすればいいんでしょうか・・・ MySQL4.0.2で副問い合わせが使えません
create table tbl1( col1 INTEGER NOT NULL AUTO_INCREMENT, col2 DECIMAL(13,0) NOT NULL DEFAULT 0, PRIMARY KEY (col1) ) TYPE=MyISAM; create table tbl2( col1 INTEGER NOT NULL AUTO_INCREMENT, col2 DECIMAL(13,0) NOT NULL DEFAULT 0, PRIMARY KEY (col1) ) TYPE=MyISAM; INSERT INTO tbl2 VALUES(10,7777777); INSERT INTO tbl2 VALUES(16,9999999); INSERT INTO tbl2 VALUES(32,1111111); INSERT INTO tbl2 VALUES(null,8888888); INSERT INTO tbl1(col2) SELECT col2 FROM tbl2; SELECT * FROM tbl1; SELECT * FROM tbl2;
850 :
NAME IS NULL :2007/03/14(水) 16:23:43 ID:eQEhHzf6
drop table tbl1; drop table tbl2;
851 :
NAME IS NULL :2007/03/14(水) 21:48:34 ID:WWlj4a+E
テーブルA date,id,name テーブルB date,id,value テーブルC date,id,value テーブルA、テーブルB、テーブルCと三つあるテーブルを、 Aのdate列以前で最新の日付のレコードをBとCからそれぞれ取ってきて、 AにマージするSQLを書いたのですが、 サブクエリが遅すぎます。なんとか速くする方法はないでしょうか? <書いたSQL> select a.*, b.value, c.value from a, b, c where a.id = b.id and a.id = c.id and b.date = (select max(date) from b where id = a.id and date <= a.date) and c.date = (select max(date) from c where id = a.id and date <= a.date) A、B、Cはそれぞれ50万レコード位あり、上記だと10分くらいかかります。 当然全部のテーブルにIndexを張っています。 マジで困っているので、よろしくお願いします。 DB2 9.1
852 :
NAME IS NULL :2007/03/14(水) 21:53:12 ID:WWlj4a+E
立て続けですみません。 select a/b from c で、 b が 0またはnullなら a/b をnullにする方法で簡単な書き方はありませんか? 現在下記のように書いているのですが、割り算がたくさんあるとぐちゃぐちゃになってしまいます。 select case b when 0 then null else a/b end from c よろしくお願いします。 DB2 9.1
>>851 index張ってるって、まさか、(date,id)じゃないだろうな。
854 :
NAME IS NULL :2007/03/14(水) 23:22:04 ID:22UGj69h
共有ロックとマルチバージョニングでIsolationがSerializableの場合に まったく同一の内容aを以下でInsertした場合、 どの時点で主キー制約になりますか? Tran A Insert a Tran B insert a Tran A Commit Tran B Commit 両方ともTran A Commitが成功して、 Tran B Commitで失敗でいいんでしょうか?
855 :
NAME IS NULL :2007/03/15(木) 00:16:58 ID:E/8sp7ah
>>853 それはPrimaryKeyです。
あと、date、id列単独でIndex張ってます。
>>854 Tran A
Insert a
Tran B
insert a (ここでA-aが未確定のため待機)
Tran A Commit (ここでB-aがキー重複でエラー)
857 :
NAME IS NULL :2007/03/15(木) 00:28:42 ID:ZdngYRrc
>>856 Tran A はCommitに失敗するんですか?
Tran A 成功
TranB 失敗
もしくは
Tran B 成功
Tran A 失敗
みたいなどちらかは成功させる方法はないんでしょうか
>>857 失敗はしない。Aのコミットが成功するタイミングで、待機してたBのInsert aが失敗する。
>>855 idあたりのdateが少なめならあんまり変わらないかもしれんが、索引はid単独よりid, dateがベター。
この問い合わせに限ればdate単独のキーは意味がない。
もしテーブルの構成を変えられるのなら
テーブルAにBとCの最新のレコードのキーを保持するようにして置くのが一番。
SQL初心者でよくわからん。 初歩的ですまんす。 ↓ってどうやるんでしょう。 ID | NAME | ------------- あ | アイウエオ | あ | カキクケコ | あ | サシスセソ | い | アイウエオ | い | ナニヌネノ | う | アイウエオ | う | サシスセソ | ここで、NAME列に「アイウエオ」「サシスセソ」の両方を持っている行を「IDの括り」で取り出したい。 求める結果 ID | NAME | ------------- あ | アイウエオ | あ | カキクケコ | あ | サシスセソ | う | アイウエオ | う | サシスセソ |
>>860 SELECT * FROM Table WHERE id IN (SELECT id FROM Table WHERE name='アイウエオ' OR name='サシステソ' GROUP BY id HAVING count(id)=2);
※但し、UNIQUE(id,name) である場合に限る。
>>860 exceptが使えるなら
select * from テーブル a where ID in (
select ID from テーブル where NAME = "アイウエオ"
except
select ID from テーブル where NAME = "サシスセソ"
)
864 :
NAME IS NULL :2007/03/15(木) 23:43:37 ID:8J8WaYZq
MySQL,Postgresqlどちらでもよいのですが, 実テーブルのカラムの順番って変更できないのでしょうか? id, data1, data2, comment というテーブルにdata3を追加したくなったときに id, data1, data2, comment, data3 となってしまうと管理しにくいのですが,これの回避方法みたいなのは あるのでしょうか?ビューを使うとかでしょうか?
>>864 なんでカラムの順番を変更する必要があるのか解らんが。
select id,data1,data2,data3,commentとSQL書けば済む話だし。
気に入らないんだったらテーブル作り直すしかないと思うが。
>>862 いまさらだけど、EXCEPTじゃなくてINTERSECTだよな。積集合だから
867 :
じゅん :2007/03/17(土) 02:28:11 ID:???
ネットを開きお気に入りを開くとフォルダがあるのですが、隠しファイルにしてしまい消えてしまいました。どうしたら復活してくれますか?
春だなぁ
869 :
NAME IS NULL :2007/03/18(日) 12:21:03 ID:GFbo8JDw
select 隠しファイル from お気に入り where こないだ隠しファイルにしたヤツ
871 :
NAME IS NULL :2007/03/18(日) 18:40:31 ID:ZkFahWCW
phpPgAdminを入れてみようと思い、各種インストール、設定を行いました。 が、ブラウザからアクセスしてみると >データベースをサポートするように PHP のコンパイル・インストールがされていません。 >configure の --with-pgsql オプションを用いて PHP を再コンパイルする必要があります。 というエラーメッセージが出ています。 おそらく…そのまんまなのだと思いますが、 「configure の --with-pgsql オプションを用いて PHP を再コンパイルする」というのは、 具体的にはどこで何をどうすればいいのでしょうか。
>>871 SQL関係ないがな。
「PHP PostgreSQL コンパイル」とかでググって見れwww
コンパイルで検索しても、きっと
>>871 の問題解決にはならないだろうな。
Windows版でphp.iniの設定だけだろう。まぁスレ違いどころか板違い。
874 :
NAME IS NULL :2007/03/18(日) 21:35:14 ID:ZkFahWCW
やはりスレ違いでしたか。すんません。
>>872 エラーメッセージでは「PHPをコンパイルせよ」となってるんですが
Postgreに問題があるんですか。
あと、再コンパイルってのは要するにもう一度 yum installとかするんでしょうか。
>>873 だいぶググってはいるんですが…。ちなみにどこの板に行けばいいでしょか?
875 :
871 :2007/03/18(日) 21:38:19 ID:???
リロードしてみたら動いてました! …色々やろうとはしましたが、アパッチ再起動くらいしか身に覚えが ないのですが…!
876 :
NAME IS NULL :2007/03/18(日) 21:39:24 ID:m1qacMfw
MYSQLで掲示板の書き込みレスを更新参照したいんですが、 2ちゃんみたいなタイプの掲示板だとすると 1スレにつき1つのテーブルにしたほういいんでしょうか? それとも他の形式にしたほうがいいんでしょうか?
877 :
NAME IS NULL :2007/03/18(日) 22:41:48 ID:36ARxA6B
下のような販売テーブルと単価テーブルがあった場合に、 購入日と価格適用日を比べて、ほしい結果を得るには どうやるんでしょうか? 販売テーブルに単価テーブルを外部結合させて 購入日が適用日を下回る行を削除まではできたのですが、その後がさっぱりです。 DBはSQLServer2005です。 購入日と価格適用日の型はintです。 よろしくお願いします。 販売テーブル 商品コード | 購入日 ----------+----------- 101 | 20051229 101 | 20051230 101 | 20051231 201 | 20051231 単価テーブル 商品コード | 価格適用日 | 単価 ----------+------------+-------- 101 | 0 | 100 101 | 20051230 | 200 欲しい結果 商品コード | 購入日 | 単価 ----------+----------+------- 101 | 20051229 | 100 101 | 20051230 | 200 101 | 20051231 | 200 201 | 20051231 | NULL
>>876 1行目の意味がイマイチわからないが、2行目以下だけの問いとして応えると、
まぁ規模次第なんだが、それでも1スレ1テーブルはないと思う。
大雑把に書くと、スレテーブル,レステーブルの2テーブルだけ、
板はどこかに一覧がいるが、DBのテーブルとしてまでは要らんかなぁ。
ただ、各スレのレス数取得
SELECT thread,count(response) WHERE board= 'xxx' FROM table GROUP BY thread;
見たいなSQLがしょっちゅう走らせると問題になりそうなので、
書き込み(INSERT)時にトリガを仕掛けるとかが必要になってくるでしょうね。
細かいところはスレ違いか? 正規化スレの方がよさそ。
>>877 SELECT T1.*,
(SELECT 単価 FROM 単価テーブル WHERE 価格適用日=(SELECT max(価格適用日) FROM 単価テーブル WHERE 商品コード=T1.商品コード AND 価格適用日<=T1.購入日))
FROM 販売テーブル AS T1;
MSSQLで動くかどうかは知らん。
>>877 可能なら、価格適用日はFROM TOで持っておけば楽になるぞ。
単価テーブル
商品コード | 価格適用日FROM | 価格適用日TO | 単価
>>877 select a.商品コード,a.購入日,a.単価
from (
select h.商品コード,購入日,単価,価格適用日
from 販売テーブル h,単価テーブル t
where h.商品コード=t.商品コード
) a,(
select h.商品コード,購入日,max(価格適用日) 価格適用日
from 販売テーブル h,単価テーブル t
where h.商品コード=t.商品コード and 価格適用日<=購入日
group by h.商品コード,購入日
) b
where a.商品コード=b.商品コード and a.価格適用日=b.価格適用日
881 :
NAME IS NULL :2007/03/19(月) 12:54:33 ID:A0j4KWTn
>>871 yumが使えるんなら,
yum install php-pgsql
これでおkじゃないか?
まあすれ違いなのでこれ以上はアドバイスできんが,
コンパイルしなおす必要はない。windows版ならphp.iniの
pgsqlの関係のコメントをはずすだけだしfedoraなら上記で。
何とか
884 :
NAME IS NULL :2007/03/22(木) 02:46:36 ID:pjljHPoK
Windows XP SP2でDB2 V9のExpress-Cバージョンを入れようとすると、 CDをインサートした瞬間に問題が発生したため、db2lp.exe を終了します。 ご不便をおかけして申し訳ありません。 AppName: db2lp.exe AppVer: 9.1.0.356 ModName: ntdll.dll ModVer: 5.1.2600.2180 Offset: 00001010 というメッセージが表示されて、落ちてしまう。2台のコンピューターで試したけど、 同じ現象が起こる。2台ともに共通しているのはXP SP2,カスペルスキー、 オフィス2003がはいているくらい。後は秀丸とかフリーのソフトが入っている。 なのに過去に一度もインストールしたことがないのに、このようなメッセージが でるかわかりません。このようなメッセージが出て解決された人はいますか?
>>885 ありがとうございます、DB2のスレで聞いてみます。
887 :
NAME IS NULL :2007/03/22(木) 23:16:12 ID:RBDAGc0R
hogehogeというテーブルにnameフィールドがあり、 「テスト」というデータが数件入っているのですが、 name テスト テスト テスト SELECT * FROM hogehoge で取得し、見てみると、 「テスト」がひとつしか格納されていません 全て取得するにはどうすれば良いのでしょうか?
888 :
NAME IS NULL :2007/03/22(木) 23:37:14 ID:RBDAGc0R
すみません、PHPの問題で解決しました
889 :
NAME IS NULL :2007/03/23(金) 00:38:57 ID:RS+1p0xB
教えて下さい。
>>12 の変形です。
店ごとに、値段の安い上位2アイテムを
抽出する方法を教えて下さい。
TOP2だと店無視で2アイテムしかでません。
SHOP | ITEM | PRICE |
---------------------------
A | 1 | 10
A | 2 | 30
A | 3 | 40
A | 4 | 600
B | 5 | 400
B | 6 | 200
B | 7 | 5
B | 8 | 15
C | 9 | 10
C | 10 | 900
C | 11 | 800
C | 12 | 1000
(取得したい結果↓)
SHOP | ITEM | PRICE |
---------------------------
A | 1 | 10
A | 2 | 30
B | 7 | 5
B | 8 | 15
C | 9 | 10
C | 11 | 800
店ごとの上位100ランキング表作成しろとか
いわれて手がでないです・・・
>>889 rankが使える処理系なら
select shop, item, price from
(select *, rank() over (partition by shop order by price) as rank from テーブル) a
where rank <= 2 order by shop, rank
892 :
NAME IS NULL :2007/03/23(金) 13:56:47 ID:F44imCFj
Firebird1.5で下記のtableA,tableBを結合して出力サンプルのような結果を得たいのですが 通常のSQLだけで処理できますでしょうか。 要するにB_DATEの一番小さい行と、tableAを左外部結合するような感じなのですが、うまくいきません。 tableA A_ID A_NAME 0 SS200 1 SK300 2 KM620 3 TS120 tableB A_ID B_DATE B_NAME 1 07/02/12 ROLER-1 1 07/03/11 MOTOR-2 1 07/01/10 ROLER-2 3 06/12/28 SPACER-1 3 07/01/21 ROLER-2 出力サンプル A_ID A_NAME B_DATE B_NAME 0 SS200 1 SK300 07/01/10 ROLER-2 2 KM620 3 TS120 06/12/28 SPACER-1
>>889 SELECT A.SHOP,A.ITEM,A.PRICE
FROM TBL A
WHERE EXISTS
(
SELECT 1
FROM TBL B
WHERE B.SHOP = A.SHOP
AND B.PRICE <= A.PRICE
HAVING COUNT(B.SHOP) <= 2
)
ORDER BY A.SHOP,A.ITEM
894 :
NAME IS NULL :2007/03/23(金) 23:33:15 ID:8VoitTUi
しょうもない質問ですみません。 Webアプリに興味があり、Apache,MySQL,PHPを軸に学習しようと思うのですが、 ノートブック(WinXPpro、メモリ1G)を学習、開発環境専用に使用するのは妥当でしょうか? 開発環境の主流はLinuxOSなんでしょうか? もしWinで不都合な点があれば教えていただきたいです。
>>894 スレ違いつーか、板違いなんだが。
まぁ、何を持って妥当性を問うのかワカランが、別にWindowsでも問題ないよ。
実運用はLinux系OSが多いので、そちらの知識もあった方がいいとは思うけど。
Webアプリに限らず、ノートで開発している人は多と思うし、俺もそうだった(SXGA+だが)。
メモリ1GありゃVMwareを動かす手もある。Xは起動せずにSSH経由などで操作すりゃ
テスト環境としては十分な速度だし。
>>892 Firebird1.5でjoin〜onが使えるか実は知らないが標準SQLで書くなら
select A_ID,A_NAME,B_DATE,B_NAME
from tableA a left outer join (
select c.A_ID,c.B_DATE,c.B_NAME
from tableB c join (
select A_ID,min(B_DATE) B_DATE
from tableB
group by A_ID
) d
on c.A_ID=d.A_ID and c.B_DATE=d.B_DATE
) b
on a.A_ID=b.A_ID
order by a.A_ID;
898 :
894 :2007/03/24(土) 00:50:58 ID:???
>>895 ご誘導ありがとうございます。今後参考にさせていただきますね。
>>896 板違いすみません。もっと調べるべきでした。。
Winノートでも大丈夫なんですね。
Winに慣れてしまってるんでしばらくWinでやってみようかと思います。
板違いにも関わらず親切な対応ありがとうございました。
>>892 >>897 に先越されちゃってるけどやってみた。
SELECT a.A_ID, a.A_NAME, b.B_DATE, b.B_NAME
FROM tableA AS a
LEFT OUTER JOIN (
SELECT A_ID, B_DATE, B_NAME
FROM tableB AS c
WHERE B_DATE = (
SELECT MIN( B_DATE )
FROM tableB
WHERE c.A_ID = A_ID
GROUP BY A_ID )
) AS b ON a.A_ID = b.A_ID
900 :
892 :2007/03/24(土) 11:50:26 ID:???
>>897 >>899 ありがとうございます。残念ながらFB1.5ではテーブル名の部分に
サブクエリを使えません。2.0なら大丈夫なようです。
こんなTABLEがあります。 TABLEレイアウト 名前 varchar2(100) 日付 number(8) 時間帯 number(2) <-- 0から23までの時間帯が入っている。 売上数 number データとしては 名前 日付 時間帯 売上数 -------- -------- ---------- ------------ 山田 20070310 0 100 山田 20070310 1 100 山田 20070310 3 100 ・・・ 高橋 20070310 0 200 高橋 20070310 2 300 ・・・ という風に入っているのですが、レコードが存在しない時間帯があります。 このレコードが存在しない時間帯を売上数0としてダミー的に表示させる SQLは書けないでしょうか。 名前 日付 時間帯 売上数 -------- --------- ---------- ------------ 山田 20070310 0 100 山田 20070310 1 100 山田 20070310 2 0 <-- ダミー 山田 20070310 3 100 ・・・ 高橋 20070310 0 200 高橋 20070310 1 0 <-- ダミー 高橋 20070310 2 300 ・・・
>>901 日付 number(8)
時間帯 number(2)
からなるテーブルが別に必要。それにあらかじめ日付時間帯を入力しておく。
演算子についての質問ですが、 「!=」と「<>」の違いは明確にありますか? どの点が違うというのがありましたら、教えて下さい。
>>903 意味は同じだが、ANSI SQL的には <> が正しい。
!= はCやその系統の言語で使われているので、一部の処理系のSQLでも使えたりする。
905 :
901 :2007/03/24(土) 13:19:39 ID:???
>> 902 そのテーブルを用意して、どのようなSQLを書けばいいでしょうか。 名前があるので単純な外部結合ではうまくいかないような。。。
>>904 >意味は同じだが、ANSI SQL的には <> が正しい。
おお、そういうことなんですか。
単発のくだらない質問にお答えありがとうございます。
>>901 Oracleだったら…
select c.名前,c.日付,c.時間帯,nvl(d.売上数,0) 売上数
from (
select a.名前 名前,a.日付 日付,b.時間帯
from (
select distinct 名前,日付
from TABLE
) a,(
select rownum-1 時間帯
from all_objects
where rownum<=24
) b
) c,TABLE d
where c.名前=d.名前(+) and c.日付=d.日付(+) and c.時間帯=d.時間帯(+)
order by c.名前,c.日付,c.時間帯;
908 :
889 :2007/03/25(日) 01:02:42 ID:???
selectで表を取得するとき、 列とその値しか取得することができませんが、 そのとき、表のタイトルを付けたいのですが、 そういうことはできますか? 例えば、次のような機能はありますか? (ここらへんに表題を付けることができればいいのですが。。) カラム名 -------- 1000
>>909 ですが、
任意の表題でもいいし、テーブル名でもいいので、
表のタイトルとして表示させたいのです。
911 :
901 :2007/03/25(日) 16:33:33 ID:???
>> 907 ありがとうございます。明日試してみます!
912 :
NAME IS NULL :2007/03/25(日) 16:56:35 ID:+mvq7EfM
PHP+MySQLで制作しています。 下記[1]のような数字のデータがありますが、 重複する数字をカウントして、 distinctで[2]のような形にするselect文を教えてください。 [1] num ------------------ | 1 | ・・・ | 2 | ・・・ | 3 | ・・・ | 3 | ・・・ | 4 | ・・・ | 5 | ・・・ | 5 | ・・・ | 5 | ・・・ | 6 | ・・・ | 7 | ・・・ | 7 | ・・・ ------------------ [2] num cnt ----------- | 1 | 1 | | 2 | 1 | | 3 | 2 | | 4 | 1 | | 5 | 3 | | 6 | 1 | | 7 | 2 | ---------- select count(distinct num) as cnt こんな感じで行き詰ってしまいました。
>>912 MySQL は知らんけど、普通に Group By でいけるでしょ
select num, count(num)
from table
group by num
914 :
NAME IS NULL :2007/03/26(月) 19:01:28 ID:AMmRJ556
SQL文でSELECTを使ってデ−タを表示しています。 nvarchar型のデータ(管理コード)をORDER BYで値順で表示しているのですが 1000 11000 200 25000 左から数値を見ているため上記の様な表示になります。 200 1000 11000 25000 上記の様に右から値順で表示してほしいのですがどうすればよいでしょうか?
>>914 管理コードを整数に替えるか、管理コード登録時に
00200
01000
11000
25000
のように桁数をあわせばいいんじゃね?
それか整数にキャストするか。
916 :
912 :2007/03/26(月) 22:00:07 ID:Narz+pYj
>>913 ご返事遅くなりましたが、出来ました。
ありがとうございます。
917 :
NAME IS NULL :2007/03/27(火) 11:52:50 ID:Tn/pQeKS
教えてください。 DAY1の最新日付のQTYを1件だけ取得したいのですが、 もし、DAY1の最新日付がNULLだった場合は、 そのQTYを取得したい。 CODE QTY DAY1 0001 1 2007/03/06 0002 2 2007/03/05 0003 3 2007/03/04 0004 4 2007/03/03 0005 5 2007/03/02 0006 6 2007/03/01 0007 7 NULL 欲しい結果: 1 CODE QTY DAY1 0007 7 NULL 欲しい結果: 7 失敗例: SELECT QTY FROM TABLE WHERE DAY1 IS NULL OR DAY1=(SELECT MAX(DAY1) FROM TABLE); 出力結果: 1 7
SELECT QTY FROM TABLE WHERE DAY1=(SELECT MAX(DAY1) FROM TABLE) OR (DAY1 IS NULL AND NOT EXISTS (SELECT MAX(DAY1) FROM TABLE))
あ。集計関数で NOT EXISTS は無理か・・・ SELECT QTY FROM TABLE WHERE DAY1=(SELECT MAX(DAY1) FROM TABLE) OR (DAY1 IS NULL AND (SELECT MAX(DAY1) FROM TABLE) IS NULL)
>>920 ありがとうございます!
それで正常動作しました。
同一集計関数を2回呼ぶとは考え付きませんでした。
nullを'1900/01/01'とかに置き換えてorder by して top 1 取った方がパフォーマンス良さそう
>>917 Oracleなら…
SELECT QTY FROM TABLE WHERE DAY1=(
SELECT MAX(NVL(DAY1,TO_DATE('9999/12/31','YYYYMMDD')) FROM TABLE
)
>>923 DAY1 が NULL のとき、それで出る?
>>924 おっとっと、左辺もNVLするの忘れてた。スマソ。
SELECT QTY FROM TABLE WHERE NVL(DAY1,TO_DATE('9999/12/31','YYYYMMDD')=(
SELECT MAX(NVL(DAY1,TO_DATE('9999/12/31','YYYYMMDD')) FROM TABLE
)
926 :
NAME IS NULL :2007/03/28(水) 10:55:16 ID:zXzG4Wvl
質問です 以下のようなテーブルAAAがあります ID(int) | No(int) | Name(string) データとしては 1,1なまえ 1,2,は 1,3AAA 1,4,です 2,1,あいうえお このようなデータの時 出力される内容は ID | Name 1,なまえはAAAです 2,あいうえお このように出力したいのです。 そこで SELECT ID,Name FROM AAA GROUP BY ID までは思いついたのですが、Nameが文字列の為数値のときに使うSumが使えません。 文字列を結合する事は出来るのでしょうか? ちなみにDBはPostGres7.4を使用しています。
連結関数作るとか
>>927 むぅ・・・・
やっぱ一撃必殺で取得は無理ですか
929 :
917 :2007/03/28(水) 16:23:28 ID:???
>>925 Oracle8なのでそのコードで試して見ましたが、
NULLがヒットしません。
> MAX(NVL(DAY1,TO_DATE('9999/12/31','YYYYMMDD')))
この部分が気になるのですが、
MAX関数内にNULLの判定を入れても
もともとNULLは集計対象外では?
931 :
917 :2007/03/28(水) 17:17:15 ID:???
ああ、すいません しっかり返ってきました
つかそれだとnullが最大とみなされちゃうじゃん。
>>917 の
CODE QTY DAY1
0001 1 2007/03/06
0002 2 2007/03/05
0003 3 2007/03/04
0004 4 2007/03/03
0005 5 2007/03/02
0006 6 2007/03/01
0007 7 NULL
の例だと7が返ってくると思うけど
>>917 に対する疑問
最初の例で最新がDAY1が2007/03/06となる理由は?
NULLを一番優先順位が低いものとするということなのか?
またDAY1はNULLも含めて一意なのか?
一意でない場合はどのような条件で1行に絞るのか?
など良くわからない点があるな…
>926 PostGreは知らんが、 Noの最大値がわかるなら、MAXとCASEを使って取れるじゃね。 ↓Oracleでの例 SELECT ID, MAX(CASE WHEN No = 1 THEN Name ELSE NULL END) || MAX(CASE WHEN No = 2 THEN Name ELSE NULL END) || MAX(CASE WHEN No = 3 THEN Name ELSE NULL END) || MAX(CASE WHEN No = 4 THEN Name ELSE NULL END) AS Name FROM AAA GROUP BY ID ORDER BY ID
935 :
NAME IS NULL :2007/03/29(木) 07:48:25 ID:9BGmCr7g
SQLとDBがなぜ今これほど持て囃されているか。。 世界諸国家の策謀が懸かっているのをご存知か? 我々がネットに流した全ての情報。。名前、全てのネットに流した書き込み。。が 限られた人たちの手に握られようとしている。 いま、意図的に流行らされ、そのジャンルの中に天才的な人材が生まれ始めたとき、 初めてSQLに意味が出てくるのだ。。。ある種の人たちに限れば。 これから、コンピュータの更なる発展によって 全ての情報の99%以上がネットワークに流される時代が来る時、 全ての人の生きてから死ぬまでの情報が管理されたDBによって、 たった数百人の現人神たちを楽しませるために生まれたのだ。
SQL Server2005を利用しております。 DBが何らかの理由により、select文等を実行出来ないもしくは実行に十数秒時間が 掛かったらアラートとして指定のメールアドレスに通知を行いたいと思います。 何かいい方法とかツールはありますでしょうか?
938 :
NAME IS NULL :2007/03/30(金) 14:31:24 ID:OlbCK0te
オラクルってテーブル名の修飾にAS句を使えないの?
940 :
NAME IS NULL :2007/03/30(金) 15:09:23 ID:OlbCK0te
>>939 SELECT A.商品ID, B.数量
FROM 商品マスタ AS A
INNER JOIN 売上明細 AS B
ON A.商品ID = B.商品ID
;
こう書くとエラーで、ASを抜くと通ります。
初心者なのでつまらない勘違いをしていそうですが、分からないです。
誰か教えてください。
941 :
939 :2007/03/30(金) 16:51:16 ID:???
>>940 すまん、Oracle8iで流してみたら
AS句は使えないみたいだ。
というか、INNER JOINも使えなかったが。
>>941 お手数かけてすみません。
ありがとうございました。
INNER JOINは10g(express)だと使えるようです。
グダグダでワロタ
9iもテーブル名にASは使えない (使えるのはカラム名)
946 :
NAME IS NULL :2007/03/30(金) 22:18:08 ID:AwhCfeDt
MySQLで、最後から5件のデータを取得とかどうやるとできますか?
948 :
NAME IS NULL :2007/03/30(金) 23:00:08 ID:AwhCfeDt
>>947 なるほど。ありがとうございます。
しかしそのやり方だとデータを表示するときも降順になってしまうので
できれば昇順で最新の5件を取得したいです。
よろしくお願いいたします。
他のデータ削除するか新しいテーブルにinsertするかすれば?
俺は同じ様な事で教えてもらったものを使ってる。 株価テーブル(銘柄コード・出来高年月日がキー)で 直近100日分のデータを昇順で出すものだけど(MySQL 4.1) select * from ( select * from kabuka where mcode=xxxx order by wk_date desc limit 100 ) as x order by wk_date asc
>>950 の
直近100日分 + 最も古いデータ1件を抽出するクエリが知りたい。
ありがトン!
954 :
NAME IS NULL :2007/03/31(土) 15:55:33 ID:3cRYEFr6
MySQLの質問です SELECT する際、特定のフィールド以外を取得するにはどうすればいいのでしょうか? フィールド名 user_id, name, dob, join_date で、join_date以外をセレクトしたいのです… SELECT * FROM user_table SELECT * (WITHOUT join_date) FROM user_table (←腰が抜けるほど、自分勝手に書きました…) みたいなことって出来ないのでしょうか?
できない。 あきらめろ。
956 :
NAME IS NULL :2007/03/31(土) 18:31:09 ID:3cRYEFr6
>955 やっぱりそうか。。。ありがとうございました。勉強になりました
join_date以外を全部書けばええやん SELECT user_id, name, dob FROM user_table
INSERT INTO old SELECT * FROM new これだとテーブル名newのデータをoldに入れることができるのですが テーブル名newのフィールド名code以外を入れるにはどうしたらいいでしょうか?
>>958 RDBMSに因ってはカラムの型と順序があってればカラム名は無視するものがある。
oldテーブルのカラム順にあわせてSELECTすれば済む。
INSERT INTO old SELECT column1,column2 FROM new;
カラム名も同じでないとダメなら、
INSERT INTO old SELECT column1 AS oldname1,column2 AS oldname2 FROM new;
全て丁寧に書き上げれば、
INSERT INTO old(oldname1,oldname2) SELECT column1 AS oldname1,column2 AS oldname2 FROM new;
960 :
958 :2007/04/01(日) 04:47:34 ID:???
961 :
NAME IS NULL :2007/04/03(火) 12:31:42 ID:SKiNbGpd
番号や日時などのカウントしてるカラムがない状態で 単純に入力されたレコード順を desc したいのですが、 何か方法はありますか?
>>961 テーブル設計が間違ってるから
とりあえず順序を保証する列を追加汁。
sql server 2000で、大量のメモリを積んでも order by がオンメモリで実行されないのは仕方ないのでしょうか。 oracleはsort sizeを指定できたのですが同様のオプションはないのでしょうか。
sql*plusでcreate tableでデータ型をdateで定義したとき、 日付と時刻を例えば2007/01/01 14:22:50のように具体的に入力したい場合は どうすればいいのですか?
ACCESS2007のSQLで質問です コード 年月 数値 A 2006/01 19 B 2006/01 18 C 2006/01 17 A 2006/02 21 B 2006/02 22 C 2006/02 23 A 2006/03 39 B 2006/03 38 C 2006/03 37 (1)月毎に数値の上位2つを抜き出す A 2006/01 19 B 2006/01 18 B 2006/02 22 C 2006/02 23 A 2006/03 39 B 2006/03 38 (2) (1)の結果とコードは同一、年月は1月前で結合して 最終的にこんなのがほしいです A 2006/02 21 B 2006/02 22 B 2006/03 38 C 2006/03 37 SELECT TOP と副問い合わせを使えばできそうな気はするのですが 私には荷が重いようで (1)だけでもどなたか教えてください
969 :
NAME IS NULL :2007/04/10(火) 15:25:07 ID:sD7FH5rm
質問ですが、特定のフィールドの中のデータに右側にスペースがあるためそれを削除して更新したいのですが update テーブル1 set field1 = select rtrim([field1]) from テーブル1; みたいに幾つか試してもダメです。本見たりググッたりしているのですが、わからないのです。 どうしたら削除して更新できるようなSQL文が組めるのでしょうか?
>>969 update テーブル1 set field1 = rtrim([field1])
971 :
NAME IS NULL :2007/04/10(火) 15:44:39 ID:sD7FH5rm
あっこっちがあったのか 別スレとマルチになっちゃいますがむこう一日放置されたんで… すんません mysql5の質問です userテーブル id(int) name(varchar) sendテーブル from_id(id) to_id(int) があるとき from_idとto_idのそれぞれのnameを取得したいのですが うまくいきません select from_id, to_id, (from_idの)name, (to_idの)name from user, send where send.from_id=user.id and send.to_id=user.id イメージ的には↑こんな感じなんですが…… たとえば select from_id, to_id, t1.name, t2.name from user, send where send.from_id=user.id as t1 and send.to_id=user.id as t2 みたいな方法ってあるんでしょうか? お願いします
select f.name, t.name from send join user f on send.from_id = f.id join user t on send.to_id = t.id 移動はかまわないが誘導はしておいてくれ。
>973 ありがとうございます!助かります そのヒントでがんばってみます >移動はかまわないが誘導はしておいてくれ。 ここのurl書いときました
>>967 968氏のヒントを読んで作ってみた。ACCESS2003で確認
SELECT TT.[コード], TT.[年月], TT.[数値]
FROM table3 AS TT,
(
SELECT T3.[コード],DateAdd("m",1,T3.[年月]) AS [年月]
FROM table3 AS T3
WHERE [数値] IN (
SELECT TOP 2 [数値]
FROM table3
WHERE T3.[年月]=[年月]
ORDER BY [数値] DESC
)
) AS TS
WHERE TT.[年月]=TS.[年月] AND TT.[コード]=TS.[コード]
ORDER BY TT.[年月], TT.[コード], TT.[数値] DESC
;
MYSQLでデータベースを勉強始めたんですがテーブルの作成で いきなり詰まりました。 CREATE TABLE DIARY( DIARY_ID AUTO_INCREMENT RIMARY KEY, UPDATE_DATE DATE, TITLE VARCHAR(64), ARTICLE TEXT ); という感じですが、エラー1064シンタックスエラーとでました。 どこがまちがってますか?
977 :
976 :2007/04/11(水) 23:06:23 ID:OcHXQf/Q
× DIARY_ID AUTO_INCREMENT RIMARY KEY, ○ DIARY_ID AUTO_INCREMENT PRIMARY KEY, データベースにはちゃんと打ち込んでました。
MYSQL『DIARY_IDの型ワカンネ。死ぬ。』
979 :
NAME IS NULL :2007/04/12(木) 13:43:31 ID:EDoxXkrN
>>976 >>978 さんを翻訳すると
DIARY_ID INT AUTO_INCREMENT RIMARY KEY,
980 :
NAME IS NULL :2007/04/12(木) 15:05:56 ID:Sbd1R0wY
こんにちは。よろしくお願いいたします。 例えば以下のように、二つの同じ構造を持つテーブルがあったとして、 一方の行を優先的に採用して、これに無いキーの行が他方にあった場合に、 他方の行を採用して、結果セットを返すことを、joinのような操作でできないものか と思っています。具体的には、 create table t1 ( key int, name text ); create table t2 ( key int, name text ); insert into table1 values(1,'t1_1'); insert into table1 values(3,'t1_3'); insert into table2 values(2,'t2_1'); insert into table2 values(3,'t2_3'); としたテーブルから 1, "t1_1" 2, "t2_1" 3, "t1_3" のような結果セットを得たいと思うのですが、join周辺で考えるのは、おかど違いでしょうか。。
↑insertの部分、 insert into t1 values(1,'t1_1'); insert into t1 values(3,'t1_3'); insert into t2 values(2,'t2_1'); insert into t2 values(3,'t2_3'); でした。。度々すみません。
982 :
980 :2007/04/12(木) 15:20:08 ID:???
983 :
NAME IS NULL :2007/04/12(木) 17:58:38 ID:+M1Tpzg5
今実行できる環境がないので教えていただきたいのですが、 tableA ColA ColB ColC ---- ---- ---- 1 2 4 2 1 5 3 2 6 上記のテーブルの場合に、 ColB、ColCの合計と、select * した結果を取得したいんですが、 ColA ColB ColC ---- ---- ---- null 5 15 1 2 4 2 1 5 3 2 6 この場合のSQLは select ColA, sum(ColB) as ColB, sum(ColC) as ColC from tableA grouping sets((ConA),()) でいいんですか?
984 :
sage :2007/04/13(金) 03:44:20 ID:PJKJA3tC
select ColA, sum(ColB) as ColB, sum(ColC) as ColC from tableA group by grouping sets((ColA),()); または select ColA, sum(ColB) as ColB, sum(ColC) as ColC from tableA group by rollup(ColA);
985 :
NAME IS NULL :2007/04/13(金) 16:34:05 ID:RNYTl6WI
ACCESS2000を使ってます。 在庫テーブルに商品名カラムと定価カラムと納入日カラムがあります。 まず納入日で昇順をかけて古い納入日から定価を足していって 合計が50000円を超える直前までのレコードを引っ張ってくるSQL文って どう書けばいいかわかりません。 お願いします。
986 :
983 :2007/04/13(金) 17:36:57 ID:???
>>984 ありがとうございます。
助かりました。
>>985 5000円を超えるまで足すとか、そんな制御って標準のSQL一発だけで出来るんか?
AccessだったらVBAを使う方向で考えた方がいいんじゃない
>>985 こんなのはダメ?
select * from 在庫 as 在庫0
where (select sum(定価) from 在庫 as 在庫1 where 在庫1.納入日<=在庫0.納入日) <= 50000
order by 納入日;
989 :
NAME IS NULL :2007/04/14(土) 19:12:19 ID:vEBJlPWj
すいません質問です。 Oracle Plusを使っています。 表 購入日 顧客名 支払金 1101 山田 1000 1104 田中 2000 1107 山田 500 1120 鈴木 1000 1027 鈴木 500 1010 山田 1000 1005 山田 1000 というようなデータがあったとして 顧客名 10月 11月 山田 2000 1500 田中 0 2000 鈴木 500 1000 という風に月毎の合計金額を出したいのですがどうしたら良いでしょうか?
990 :
989 :2007/04/14(土) 19:17:12 ID:vEBJlPWj
購入日 顧客名 支払金 1101 山田 1000 1104 田中 2000 1107 山田 500 1120 鈴木 1000 1027 鈴木 500 1010 山田 1000 1005 山田 1000 顧客名 10gatu 11gatu 山田 2000 1500 田中 0 2000 鈴木 500 1000 ずれてしまいました・・・ 訂正します。 月毎の支払金の合計金額を出したいのです。
もうそろそろ次スレお願いします m(__)m
992 :
989 :2007/04/14(土) 19:26:48 ID:vEBJlPWj
それと書き忘れましたが 表には 1224 山田 2000 0930 田中 1000 のデータもあり、WHERE句でそれを限定したと考えてください。 ちなみに SELECT 顧客名, NVL(SUM(支払金),0) 10gatu, NVL(SUM(支払金),0) 11gatu FROM T_HARAI WHERE 購入日 LIKE '10%' OR 購入日 LIKE '11%' GROUP BY 顧客名; では二ヶ月の支払金の合計金額が出るだけです。 なんとか1回のSELECTで出したいのです。支払金を11gatuと10gatuの列に振り分ける良い関数か何かがないでしょうか? 長々と失礼しましたがよろしくお願いします。
993 :
989 :2007/04/14(土) 19:28:22 ID:vEBJlPWj
ごめんなさいもう一つ訂正でFROM句には'表'が入ります。
別々に集計したSQLを結合すれば良いのでは? それぞれの列名を別名にして、顧客名で結合する。
>>989 こんな感じでどうでしょうか?
SELECT 顧客名,SUM(M10) "10月",SUM(M11) "11月"
FROM (
SELECT 顧客名
,DECODE(SUBSTR(購入日,1,2),10,SUM(支払金),0) M10
,DECODE(SUBSTR(購入日,1,2),11,SUM(支払金),0) M11
FROM T_HARAI
GROUP BY 顧客名,SUBSTR(購入日,1,2)
)
GROUP BY 顧客名
>>922 ここ数年postgresqlしか触っとらんのでSQL方言になっとるかもしれんが、
SELECT
顧客名
,SUM(CASE WHEN 購入日 LIKE '10%' THEN 支払金 ELSE NULL END) AS 10gatu,
,SUM(CASE WHEN 購入日 LIKE '11%' THEN 支払金 ELSE NULL END) AS 11gatu,
・・・
こんなんでは駄目か?
997 :
NAME IS NULL :2007/04/14(土) 20:56:05 ID:NMo+/zfb
998 :
989 :2007/04/14(土) 21:00:11 ID:vEBJlPWj
>>994 >>995 ありがとうございます。
ですが結合は使わない方法を探しているのです。
>>996 申し訳ありません。私の場合ですとそれでは駄目だと思います。
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。