1 名前:NAME IS NULL mailto:sage [2009/03/05(木) 20:45:54 ID:???] このスレは 「こういうことをやりたいんだけどSQLでどう書くの?」 「こういうSQLを書いたんだけどうまく動きません><」 などの質問を受け付けるスレです。 SQLという言語はISOによって標準化されていますが この標準を100%実装したDBMSは存在せず、 また、DBMSによっては標準でない独自の構文が 追加されていることもあります。 質問するときはDBMS名を必ず付記してください。 【質問テンプレ】 ・DBMS名とバージョン ・テーブルデータ ・欲しい結果 ・説明 前スレ: SQL質疑応答スレ 7問目 pc11.2ch.net/test/read.cgi/db/1223525474/
2 名前:NAME IS NULL mailto:sage [2009/03/05(木) 20:46:43 ID:???] SQL言語リファレンス一覧 Oracle Database otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05750-02/toc.htm Microsoft SQL Server msdn.microsoft.com/ja-jp/library/bb510741.aspx IBM DB2 Database publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp (目次から参照情報→SQL) PostgreSQL www.postgresql.jp/document/pg833doc/html/sql.html MySQL dev.mysql.com/doc/refman/5.1/ja/sql-syntax.html 参考リンク sql.main.jp/cont/sql/map.html www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html oraclesqlpuzzle.hp.infoseek.co.jp/ www.techscore.com/tech/sql/
3 名前:NAME IS NULL mailto:sage [2009/03/05(木) 20:50:44 ID:???] 過去スレ SQL質疑応答スレ 6問目 pc11.2ch.net/test/read.cgi/db/1210940477/ SQL質疑応答スレ 5問目 pc11.2ch.net/test/read.cgi/db/1193486961/ 【帰ってきた】SQL質疑応答スレ 4問目 pc11.2ch.net/test/read.cgi/db/1176553195/ 【帰ってきた】SQL質疑応答スレ 3問目 pc11.2ch.net/test/read.cgi/db/1160458216/ 【帰ってきた】SQL質疑応答スレ 2問目 pc8.2ch.net/test/read.cgi/db/1141622643/ 【帰ってきた】SQL質疑応答スレ pc8.2ch.net/test/read.cgi/db/1124178925/ SQL質疑応答スレ Part 2 pc8.2ch.net/test/read.cgi/db/1103113155/ SQL質疑応答スレ pc8.2ch.net/test/read.cgi/db/1056973582/
4 名前:NAME IS NULL mailto:sage [2009/03/05(木) 20:52:25 ID:???] よくある質問1 (問) ID | DATE | DATA --+----------+----- 1 | 2007-11-11 | aaa 2 | 2007-11-11 | bbb 1 | 2007-11-10 | ccc 3 | 2007-11-12 | ddd 3 | 2007-11-11 | eee 4 | 2007-11-10 | fff 1 | 2007-11-12 | ggg このようなテーブルから、下記のように 1 | 2007-11-12 | ggg 3 | 2007-11-12 | ddd 2 | 2007-11-11 | bbb 4 | 2007-11-10 | fff 各idに対して最新の1件だけ抽出するSQLの書き方を教えてください。 (答) select A.ID, A.DATE, A.DATA from TableName A inner join (select ID, max(DATE) as MAX_DATE from TableName group by ID ) B on A.ID = B.ID and A.DATE = B.MAX_DATE ;
5 名前:NAME IS NULL mailto:sage [2009/03/05(木) 20:53:22 ID:???] よくある質問2 (問) key data ---------------- 1 a 1 a 1 b 1 b 1 a 2 b 2 a 2 a というテーブルから key a b -------------------- 1 3 2 2 2 1 というExcelのピボットの様なデータを取得したいのですが、どういうSQLになりますか? a,bというのは固定なので、仮にcというデータがあっても無視して構いません。 (答) SELECT key, SUM(CASE data WHEN 'a' THEN 1 END) AS a, SUM(CASE data WHEN 'b' THEN 1 END) AS b FROM table GROUP BY key ORDER BY key ;
6 名前:NAME IS NULL mailto:sage [2009/03/05(木) 21:11:51 ID:???] >>1 乙&>>2 のリンク修正 SQL言語リファレンス一覧 Oracle Database otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05750-03/toc.htm Microsoft SQL Server msdn.microsoft.com/ja-jp/library/bb510741.aspx IBM DB2 Database publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp (目次から参照情報→SQL) PostgreSQL www.postgresql.jp/document/current/html/sql.html MySQL dev.mysql.com/doc/refman/5.1/ja/sql-syntax.html 参考リンク sql.main.jp/cont/sql/map.html www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html oraclesqlpuzzle.hp.infoseek.co.jp/ www.techscore.com/tech/sql/
7 名前:NAME IS NULL [2009/03/07(土) 00:30:17 ID:lFENR4eI] ちょっとSQLとは離れてしまうのですが、テーブルのなかにテーブルを作れる DBMS ってあるのでしょうか? id | table | data --+----------+----- 1 | sub_tb1 | aaa 2 | sub_tb2 | bbb こんなかたちで、普通のデータとテーブルを混合して扱えるといいのですが、
8 名前:NAME IS NULL mailto:sage [2009/03/07(土) 00:48:02 ID:???] >>7 少なくともOracleではできるけど激しくお勧めしない 今すぐデータ構造を見直したほうがいい
9 名前:NAME IS NULL mailto:sage [2009/03/07(土) 00:51:03 ID:???] >>7 何故それをやらなければならないのか、それが問題だ。
10 名前:NAME IS NULL [2009/03/07(土) 02:33:50 ID:lFENR4eI] >>8 >>9 一つのプロジェクト情報を1レコードで管理しようと考えていまして、こんな感じのデータ入れようと思っています。 主キーはプロジェクトコードになります。 A工程作業 10人の氏名や単価などなど5カラムくらい。 B工程20人... C工程30人... となると、1レコードあたり300カラム以上になってしまい、また委託先がバラバラなので外注マスタみたいなものを 作るのが困難なため、こんな方法にしようかと、、、なにかいい方法はないでしょうか
11 名前:NAME IS NULL mailto:sage [2009/03/07(土) 03:40:34 ID:???] >>10 一つ確認なのですが、300カラム以上と言うのは、 (10人 x 5カラムぐらい) + (20人 + 5カラムぐらい) + (30人 + 5カラムぐらい) という計算で良いのでしょうか?
12 名前:NAME IS NULL mailto:sage [2009/03/07(土) 07:19:26 ID:???] >>10 RDBMS を勉強し直せ
13 名前:NAME IS NULL [2009/03/07(土) 10:40:24 ID:lFENR4eI] >>11 はいそうなんです。こんな形で考えてみましたのですが、ありなのでしょうか? |A名前1|A単価1|A期間1|A社名1|A備考1|・・・|A名前10|A単価10|A期間10|A社名10|A備考10|B名前1|・・・|B備考20|C名前1|・・・|C備考30| >>12 なにか根本的に間違っているのでしょうか、、
14 名前:NAME IS NULL mailto:sage [2009/03/07(土) 11:15:19 ID:???] >>13 根本的に間違ってるからまずリレーショナルデータモデルを勉強したほうがいい
15 名前:NAME IS NULL [2009/03/07(土) 11:40:31 ID:lFENR4eI] >>14 なんか根本的に間違ってる気がしてきた、、項目が多い部分は、外部のテーブルにしろってことですかね。 □主テーブル |プロジェクトコード|プロジェクト名|予算|工期|・・・・ □外部のテーブル |プロジェクトコード|工程種別|No|名前|期間|備考| こんな形にしてプロジェクトコードで結合。この場合、正規化する必要の無いテーブルを分割しているのですが、それはありですか?
16 名前:NAME IS NULL mailto:sage [2009/03/07(土) 12:21:23 ID:???] 主キーとか正規化とか知ってる割には... 釣りとしか思えん。 釣りじゃないと言うなら、>>12 , >>14 が言ってるように本屋に 行ってデータベース関連の本買ってきて勉強した方がいい。
17 名前:NAME IS NULL mailto:sage [2009/03/07(土) 12:52:13 ID:???] 釣りじゃないですよ。もう少しちゃんと勉強しないとまずそうですね。 スレ汚しみたいになってしまってすみませんでした。本買ってきます。
18 名前:NAME IS NULL mailto:sage [2009/03/07(土) 13:00:27 ID:???] なんて偉そうなw
19 名前:NAME IS NULL mailto:sage [2009/03/07(土) 14:15:18 ID:???] 純粋にデータベース理論に基づく議論として、>>13 のスキーマがダメで >>15 のようなスキーマの方がよい理由って何でしょうか。
20 名前:NAME IS NULL mailto:sage [2009/03/07(土) 14:24:28 ID:???] ここは SQL なスレであって、テーブル設計のスレではないことに そろそろ気づこうな。
21 名前:NAME IS NULL [2009/03/07(土) 23:08:49 ID:lFENR4eI] 本から調べてみましたが、正規化するする必要がないテーブルを分割するのは設計上ありえない、もしくは仕方の無い場合のみ しかしカラム数が膨大になる場合でも分割するのは、EDI規約では分割しては "ダメ" とのこと、、、 まあ結局 Oracle あたりで調べてみるしかなさそうですね どうでも良いけど、「リレーションをつかえば..」「そういう設計はない」「もう少し調べてろ」とか うちのアホ上司と 答えが同じで面白かったです。で、困ると「俺に(ここ)で聞くな」的なw 知らなければ知らないでいいですよ。無理しないでね。
22 名前:NAME IS NULL mailto:sage [2009/03/07(土) 23:13:25 ID:???] 何をもって「正規化する必要がない」なのか、俺には全然理解できん。 普通に正規化する必要ありそうに見えるけどな。
23 名前:NAME IS NULL mailto:sage [2009/03/07(土) 23:16:39 ID:???] >>21 正規化について考えたのであれば>>10 のデータに関して 関数従属性(FD)を見当したはずですが、どのようなFDを 列挙したか書いてもらえますか?
24 名前:NAME IS NULL mailto:sage [2009/03/07(土) 23:22:06 ID:???] ACCESSだけど、>>13 と同じ構造でテーブル設計されてるDBを見たことがある。 もうなんていうか、え…っ?何を見たんだろう…?って感じ。 でもさすがに300カラムはなかった。255カラムだったw >>19 人の入れ代わりが繰り返されたら、そのテーブル構造だとどうなるかをまず考えてみよう。 そうして、正規化について基礎から勉強しなおそう。
25 名前:NAME IS NULL mailto:sage [2009/03/07(土) 23:24:54 ID:???] スレ違いなのに、逆ギレを装いつつ煽ることで答えを引き出そうとするテクニックですね。 いい加減、スレ違いなお馬鹿さんにつきあうのはやめにしましょう。
26 名前:NAME IS NULL mailto:sage [2009/03/07(土) 23:29:09 ID:???] >>24 いや、なので純粋に「関係データベースモデル的に」ですよ。ネタです。 とりあえず部分従属も推移的従属も多値従属もないですよ?
27 名前:NAME IS NULL [2009/03/07(土) 23:37:48 ID:lFENR4eI] >>23 なんかスレ違いを続けてすみません。 プロジェクトA の 作業A の スタッフ1 は プロジェクトコードAにのみ従属するので断念しました。スキル不足かもしれません。 また、正規化の基礎が分かっている方なら、それが出来ないくらい分かりそうなものだと思いますが、、 データベース関連の本買ってきて勉強した方がいい。ですよw
28 名前:NAME IS NULL mailto:sage [2009/03/07(土) 23:43:51 ID:???] カタカナ言葉で逃げないで、ちゃんと読めって言われた本やマニュアル読みなよ。 自己満足で変な物作るなよ。
29 名前:NAME IS NULL mailto:sage [2009/03/07(土) 23:45:37 ID:???] >>27 失礼しました。関数従属性も見当しないで「正規化すると・・・」なんて 文句言う人も少なくないので一応ちゃんと見当したか確認したかった のです。見当したという事で、了解しました。 もう一つ確認なのですが、各プロジェクトのスタッフの数は10人・20人・ 30人で固定でしょうか。 欠員や人数割れは発生しませんか?あるいはこれらの人数は単に 上限を示すものでしょうか。
30 名前:NAME IS NULL mailto:sage [2009/03/08(日) 00:01:01 ID:???] データーベースってさ、 「作る前に」 いっしょうけんめい、考えないといけないよね。
31 名前:NAME IS NULL mailto:sage [2009/03/08(日) 00:03:27 ID:???] >>24 > ACCESSだけど、>>13 と同じ構造でテーブル設計されてるDBを見たことがある。 > でもさすがに300カラムはなかった。255カラムだったw Excel の概念から脱却できなかったんだろうな。 まあ、Excel 2003 まででよかったよ、Excel 2007 使いだと、カラム数 1,000 とか平気で作りそうだし。(w
32 名前:NAME IS NULL mailto:sage [2009/03/08(日) 00:06:45 ID:???] >>26 ヒント:第一正規形
33 名前:NAME IS NULL [2009/03/08(日) 00:16:05 ID:OlHguXyr] >>32 >>13 のリレーションは第一正規形のようですが。
34 名前:7 [2009/03/08(日) 00:19:08 ID:vyix2FVv] >>29 こちらそ失礼をすみません。スタッフの数は極端な話 0人(全てお任せで社名のみ)〜100人近くになる可能性もあります。 直接プロジェクト管理する場合は、全てのスタッフ情報を登録する必要があり、外注先が子会社、別会社、個人とバラバラなので マスタを作るとなるとショットで頼んだ個人まで登録しなくてはならないので、>>13 みたいな形を考えました。 ただ想定している上限100名×5 = 500カラムはちょっと無理そうなので、テーブルのなかにテーブルがつくれるのがいいのかな?と考えました。
35 名前:NAME IS NULL [2009/03/08(日) 00:29:25 ID:OlHguXyr] >>34 了解しました。実は以下の回答はあらかじめ書いてあったものです。 無駄にならなくて良かったw まず私の意見としては「正規化すれ」云々のコメントは全く見当違いです。 例としてあげられた>>13 のスキーマは第五正規形まで見事に満たしています。 これ以上正規化しようがありません。更新時異常も起こりようがありません。 失敗はリレーションの正規化以前の、データ設計にあります。 例としてプロジェクトの「作業Aのスタッフ1の名前」を挙げます。 >>13 のスキーマではこれは次の関数従属性で表現されています。 プロジェクトID -> 作業Aのスタッフ1の名前 これに対して、ベターな表現は次のようなものです。 プロジェクトID, 作業A, スタッフ1 -> 名前 何故これがベターかは左辺の作業名とスタッフ番号を具体値から属性名 に置きかえると判ります。 プロジェクトID, 作業名, スタッフ番号 -> 名前 幸いこれは多値ではない関数従属です。ですので綺麗に第一正規形の リレーションで表現出来ます。試しに元の表現でもやってみます。 プロジェクトID -> 作業名, スタッフ番号, 名前 これは多値関数です。ですのでナイーブに実装しようとすると思わず入れ子 リレーションを発想してしまうかも知れません。>>7 のような質問が出てきた 理由を無理矢理理屈立てて推測すると、多分こんなところです。 いずれにしても>>15 のスキーマは>>13 のスキーマの正規化を崩している のではなく、元より異なるデータ構造を実装したものなのです。 なので安心して>>15 のアプローチでデータベースを作ると良いと思います。
36 名前:NAME IS NULL mailto:sage [2009/03/08(日) 00:29:41 ID:???] >>31 Oracleならありそうで怖いw Accessは幸いなことに…いや全然幸いでも何でもないけど、1テーブル255カラムが最大。 >>26 >>13 のテーブル構造で、それぞれのプロジェクトにかかるコストを算出することを考えてみて。 工程ごとの小計もそれに加えたりなんかすれば…、死ねるw DB構築する意味ないじゃん。
37 名前:NAME IS NULL mailto:sage [2009/03/08(日) 00:40:45 ID:???] なんだ〜、さっぱり理解できない… 最後の1文だけ同意するw
38 名前:NAME IS NULL mailto:sage [2009/03/08(日) 01:02:50 ID:???] 正規化できない暴威は結局,答えが欲しいんでしょ? 素直になれば良いのに。 「教えてください」って言えない子は,自分勝手に設計して 後で理解できれば本人のためにも良いと思う。 スレチってことも自覚してるようだし。 Access弄ってる気の利いた素人でもそんな設計しないよw
39 名前:7 [2009/03/08(日) 01:24:03 ID:vyix2FVv] >>35 >失敗はリレーションの正規化以前の、データ設計にあります。 >元より異なるデータ構造 このあたりを考えていなかったため、おはずかしい考えをさらしてしまいました、、、 別テーブルを、異なるデータ構造を扱うためのものとしてとらえてみます。 ベテランの方だと思うのですが、失礼すみませんでした。
40 名前:NAME IS NULL mailto:sage [2009/03/08(日) 01:34:46 ID:???] >>37 要約すると、次のような感じ。 (1) >>13 のスキーマは正規形 (2) >>15 のスキーマは>>13 のとは異なるデータ構造を実装したもの (3) なので>>15 のスキーマは正規化崩しではない。安心してOK。 (4) 正規化正規化言っている人は、ちゃんと理解して言っていますか? (4)が屁理屈っぽく書いた理由です。 ただ正規化正規化言っているのも、ちょっと無責任だなと思ったので。 余興ついでにもちっと数学的に屁理屈をつけると>>13 のスキーマに 含まれる関数従属は>>15 のスキーマで表現されている関数従属 プロジェクトID, 作業名, スタッフ番号 -> 名前 の左辺にある作業名・スタッフ番号という属性に対してカリー化という 操作を適用し、出来た関数にこの2属性の具体値を適用する事で、 この一つの関数従属を複数の関数従属へと分割したものです。 数学的も何ら問題ない操作ですし、データモデリングの際には逆カリー 化と共に広く行われている操作です。 問題はこの操作によって出てくる関数従属の数や種類は適用された 2属性(作業名・スタッフ番号)の具体値(またはドメイン)に依存します。 例えばスタッフ番号の数が変わると、異なる数の関数従属が出ます。 他方でデータベーススキーマの一つの目的はデータ中の関数従属を 十分に表現する事ですから、関数従属の数や種類が変わるとそれに 応じてスキーマも変更しなければなりません。 スキーマ=時間不変な構造、が、スタッフ番号の数などでコロコロ 変化されては困ります。屁理屈を言えば>>29 の質問の意図はこの点 を確認するものでした。 ところが実際はスタッフの数はどうも曖昧っぽかったので、理屈的にも ベターなのはこのカリー化を適用していない>>15 のスキーマです。
41 名前:NAME IS NULL mailto:sage [2009/03/08(日) 02:10:38 ID:???] >>40 詳しい説明をどうもです。 でもカリー化とやらをググってたら脳ミソ逃避し始めた…w
42 名前:NAME IS NULL mailto:sage [2009/03/08(日) 02:33:51 ID:???] >>41 ごめんなさい。ググるほどの概念でも、難しい操作でもありません。 手順を書くと次のような操作です。 (元の関数従属) プロジェクトID, 作業名, スタッフ番号 -> 名前 (カリー化) 作業名, スタッフ番号 -> (プロジェクトID -> 名前) これだけです。右辺も関数になっているのがミソです。 (左辺に具体値を適用) 作業A, スタッフ1 -> (プロジェクトID -> 名前) 作業A, スタッフ2 -> (プロジェクトID -> 名前) ... 作業B, スタッフ1 -> (プロジェクトID -> 名前) 作業B, スタッフ2 -> (プロジェクトID -> 名前) ... あとはそれぞれの左辺の具体値を新たな属性名として利用して、 右辺の関数従属を 「プロジェクトID -> 作業Aスタッフ1の名前」 のようにスキーマ内で実装すれば>>13 のスキーマが出来ます。 ただこれらは「屁理屈」ですからね。理解としては楽しいですが あまり世間的に役に立つとは思いません。
43 名前:NAME IS NULL mailto:sage [2009/03/08(日) 10:08:10 ID:???] 俺の意見としては >>13 は「正規化できてない」だな。 単純に「作業名(?)」が重複してるから。 そんなん、「作業」が増えたときにすぐ死ねる。 「スタッフ」もとくに固定ではない、ってことだし。 マスタ化しづらいなら、マスタから値を引っ張るケース、その行に単一スタッフを 書き込むケース、なんて形に分けると思う。
44 名前:NAME IS NULL mailto:sage [2009/03/08(日) 10:38:07 ID:???] 俺もそう思う。 難しい言葉はともかく、第一正規形は 「テーブル内テーブル」を排除したものでしょ?
45 名前:NAME IS NULL mailto:sage [2009/03/08(日) 14:46:17 ID:???] >>42 待った。 >>13 を見ただけではそのような関数従属が存在するとは判断できないと いう意味で、>>13 が非正規形であると言い切れないというのは良い。 ただ、>>42 のような関数従属の存在を前提とした場合、コッドの関係モデルが 一階述語論理に基づくものである以上、そのようなカリー化された関係を スキーマに表現することはできない。 カリー化の操作そのものには問題はないのだが、「左辺の具体値を新たな 属性名として利用して」という部分で、元の関数従属を表現できなくなっている ことに注意。
46 名前:NAME IS NULL mailto:sage [2009/03/08(日) 16:40:11 ID:???] >>45 その通りです。一連の操作で展開された関係従属の集合と元の関数従属は 同じものとして扱う事は出来ません。 なので>>13 と>>15 のスキーマは「異なるデータ構造」、つまり異なる属性集合 と異なる関係従属性の集合を表現したものなります。 元々の質問が>>15 は>>13 の正規化崩しでは無いか、というものであったので、 そうではないです、なぜなら元より異なるデータ構造を表現しているのだから、 というのが一連の趣旨です。 >>43-44 データ設計(モデリング)とスキーマの正規化ははっきり区別すべきです。 データベースで表現したい対象から属性とその間の関係を抽出するデータ 設計とスキーマの正規化はどの本でも異なる章に書かれているはずです。 元のデータ中に存在する関係従属性を出来るだけ保ったままリレーションを 無損失に分解していくのが正規化の一連のステップですが、>>13 から>>15 のように肝心の関係従属性の集合をざっくり別のものに入れ替えるようでは 流石に正規化の範囲を超えています。 これはデータ設計の問題として議論すべき事柄です。 実際>>13 のスキーマはちゃんと正規形なのです。なぜなら>>27 にあるように 「作業Aスタッフ1の名前はプロジェクトコードにのみ関数従属する」他の属性 についても以下同文、というようにデータを設計したらです。 そのようなデータを表現する限りに置いて、このスキーマは正規形です。 ですのでツッコミの入れどころは正規化ではなく、データ設計のそのものと なります。
47 名前:NAME IS NULL mailto:sage [2009/03/08(日) 16:43:09 ID:???] ありゃ、関数従属が全部関係従属になっている・・・Typoです orz
48 名前:スレタイも読めないぼんくらに言っても無駄か... mailto:sage [2009/03/08(日) 18:05:06 ID:???] 君らが賢いのわかったから、どっかよそでやってくれないかな。
49 名前:NAME IS NULL mailto:sage [2009/03/08(日) 18:30:35 ID:???] やっぱりXMLデーターベースだよねー あとから変更できるしー
50 名前:NAME IS NULL mailto:sage [2009/03/08(日) 19:10:34 ID:???] >>46 こっちにレスしました。 DB設計を語るスレ 2 pc11.2ch.net/test/read.cgi/db/1223458453/321 >>48 こういう話題振ると、叩き上げの上司がそういう反応したりしますねぇ。
51 名前:NAME IS NULL mailto:sage [2009/03/08(日) 19:12:48 ID:???] いい加減、煽るのやめろよハゲ
52 名前:NAME IS NULL mailto:sage [2009/03/08(日) 19:46:02 ID:???] 注意されて逆切れするタイプなんだろ。 スルー推奨。
53 名前:NAME IS NULL mailto:sage [2009/03/08(日) 20:11:07 ID:???] >>49 XQueryとXPathが全社共通になったらね。
54 名前:NAME IS NULL mailto:sage [2009/03/08(日) 20:12:56 ID:???] >>53 そんなの待ってられないから、 とりあえず、現時点でシェアトップのものを 使いたいんだけど?
55 名前:NAME IS NULL mailto:sage [2009/03/08(日) 20:27:50 ID:???] よし ならば DB2 v9.1 pureXMLだ 夏前にはv9.5が出るよん
56 名前:NAME IS NULL mailto:sage [2009/03/08(日) 21:54:31 ID:???] >>53 それを言うなら問題はXQuery Update Facilityだと思うけど・・・ XQueryやXPathは世に言うXMLDBなら大概は使えると思う。
57 名前:NAME IS NULL mailto:sage [2009/03/09(月) 16:25:54 ID:???] PHP+MySQLで、ある設定をひとつのユーザにつき10個までに制限したい この場合の設定テーブルは ID、ユーザーID、設定1、設定2、設定3・・・設定10 なのか ID=ユーザーID*10+0、ユーザーID、設定 ID=ユーザーID*10+1、ユーザーID、設定 ID=ユーザーID*10+2、ユーザーID、設定 なのか・・・ どういう構造がいいんでしょうか?
58 名前:NAME IS NULL mailto:sage [2009/03/09(月) 16:45:11 ID:???] 典型的には後者だけど、次のような点が検討項目になるかな ・「設定」って何? (a) 設定={設定値A, 設定値C, 設定値J, ...}みたいな形で 最大10個まで設定値の好きな組み合わせを選べるものなのか、 (b) 設定1: 設定値F, 設定2: 設定値A, ...設定10: 設定値Kみたいに 設定1から10までの項目があって、それぞれに設定値をセット するようなものなのか ・(a)だとして、設定値を選択した順番に意味はあるのか。 ・(b)だとして、設定値のダブりはありか(設定2: 設定値F, 設定5: 設定値F) ・「設定」をテーブルで表現したとして、どういう検索をしたいのか
59 名前:NAME IS NULL mailto:sage [2009/03/09(月) 17:54:11 ID:???] 設定値はユーザーが任意に入力できる正規表現の文字列なので、 多種多様な値が入ることになります。 検索はしないかもです。データベースでやる必要はないんでしょうか? とりあえず後者のやり方でやってみます
60 名前:NAME IS NULL mailto:sage [2009/03/09(月) 18:11:32 ID:???] ユーザーIDで検索するだけってことだよね。 ところでユーザーIDも保持してるならIDを10倍して足す意味が無いような。
61 名前:NAME IS NULL mailto:sage [2009/03/09(月) 18:24:50 ID:???] >>59 後者だとして、「ID=ユーザーID*10+0」は多分使い勝手が 悪いので別の方法をとった方が良いよ。 単にユーザが正規表現を10個登録したいだけなら属性は {ユーザID, 正規表現}だけで、この2属性の組にPK制約 かけておけば十分。 もし正規表現1は○○、正規表現2はXX、みたいにある 正規表現が何番目の正規表現であるかが重要なのであれば、 {ユーザID, 正規表現No, 正規表現}といった3属性にして {ユーザID, 正規表現No}にPK制約をかける。正規表現Noは 1から10までの、ユーザごとの正規表現の通し番号です。 「ID=ユーザーID*10+0」という表現はユーザIDと正規表現No の二つを表現しているので、すぐ隣に「ユーザID」属性もある ことを考えると意味的にオーバーラップしています。 こういう属性は後日色々とトラブルの元であることが経験的に 知られています。 例えば今日から正規表現数を20個まで増量!などした時など。
62 名前:NAME IS NULL mailto:sage [2009/03/09(月) 20:28:49 ID:???] なるほど。 {ユーザID, 正規表現}でPK制約しようと思いましたが、 フレームワークがCakePHPなんで IDは制約として必要で複合キーもサポートされていないみたいです。 しょうがないのでやっぱり、ID=ユーザID*10+0にしてみようと思います ありがとうございました。
63 名前:NAME IS NULL mailto:sage [2009/03/09(月) 21:05:21 ID:???] なんでわざわざ SQL のスレで聞くのか・・・
64 名前:NAME IS NULL mailto:sage [2009/03/09(月) 21:51:22 ID:???] タイトルに「質問」「質疑」って書いてあるスレ他にあまり無いし。 DB設計の方は「語る」スレらしいのでこっちに流れてくるのも 仕方がないのではないかと。
65 名前:NAME IS NULL mailto:sage [2009/03/09(月) 22:13:58 ID:???] SQLServer2000を使用しています。 テーブルAに項目1がありそのMAX値に+1をした結果を テーブルAにインサートするストアドプロシージャを作りました。 複数プロセスから同時実行する際に排他ロックをかけたいのですが、 デッドロックのような状態になってしまいました。(3プロセス同時) ロックの考え方が間違っているのでしょうか? @param1 output AS Begin Transaction SELECT @param1 = MAX(項目1)+1 FROM テーブルA WITH (TABLOCK,XLOCK) INSERT INTO テーブルA(項目1)VALUES(@param1) Commit Transaction
66 名前:NAME IS NULL mailto:sage [2009/03/09(月) 22:23:38 ID:???] ロックについてはわからんけど。 auto_increment 列を使うのが一般的じゃない?
67 名前:NAME IS NULL mailto:sage [2009/03/09(月) 22:57:06 ID:???] >>62 やめたほうがいいって回答されてるのにあえてやるってのは、回答者への 嫌がらせなんだろうかw PKをIDにしても、べつにUNIQUE NOT NULLな制約は付けられるでしょ?
68 名前:NAME IS NULL mailto:sage [2009/03/09(月) 23:06:51 ID:???] >>62 複合キーを使えないというのであれば、普通にサロゲートキーに しておいた方が良いと思う。 「ユーザID*10+x」なんてキーにするなんて、仕様に自ら爆弾を 仕込むようなものですぜ。
69 名前:NAME IS NULL mailto:sage [2009/03/09(月) 23:08:18 ID:???] SQLiteって、CHECK制約が使えないってひどくないですか。 データーの入る範囲を、1−100にしたい、とか思っても、 できないってことじゃないですか。
70 名前:NAME IS NULL mailto:sage [2009/03/09(月) 23:24:44 ID:???] >>69 MySQLの間違いじゃなくて?
71 名前:NAME IS NULL mailto:sage [2009/03/09(月) 23:30:57 ID:???] >>70 SQLiteのはなしだよ
72 名前:NAME IS NULL mailto:sage [2009/03/09(月) 23:31:52 ID:???] アプリ側で制約すればいいじゃん。
73 名前:NAME IS NULL mailto:sage [2009/03/09(月) 23:42:23 ID:???] >>66 ありがとう ただ、他のテーブルも同じように排他ロックをかけようとしていたので 先ほどの条件でうまく排他制御できないことが気になってました。 もう少し自分で試してみます。
74 名前:NAME IS NULL mailto:sage [2009/03/09(月) 23:42:55 ID:???] >>71 う、う〜ん? www.dbonline.jp/sqlite/table/index7.html うっふん
75 名前:NAME IS NULL mailto:sage [2009/03/09(月) 23:50:15 ID:???] >>74 読んでる教科書が2005年発行のやつだったので 古かったようです。
76 名前:NAME IS NULL mailto:sage [2009/03/10(火) 10:13:25 ID:???] 実際にやってみて困った話じゃないのかよ
77 名前:NAME IS NULL mailto:sage [2009/03/10(火) 21:31:56 ID:???] だって教科書読んでたら、 対応してない、って書いてあるんだもん
78 名前:NAME IS NULL mailto:sage [2009/03/10(火) 22:54:44 ID:???] でも他人様の成果物に対して「ひどい」なんて文句をここに 書き込む前にちょっとはクグろうや。 「sqlite check」で一瞬で見つかったよ。
79 名前:NAME IS NULL mailto:sage [2009/03/10(火) 23:17:37 ID:???] トリガーっていうの、 よくわかりません
80 名前:NAME IS NULL mailto:sage [2009/03/10(火) 23:21:03 ID:???] >>79 Insert とか Update とか Delete とかが発生したときに呼び出されるプロシージャ。 TableA のデータが削除されたタイミングで、TableB の関連データを削除する、 とかってときに使えるよ。
81 名前:NAME IS NULL mailto:sage [2009/03/11(水) 00:10:13 ID:???] ようはストアード・プロシージャの一種なのね。 違いがわからんかった。
82 名前:NAME IS NULL mailto:sage [2009/03/11(水) 00:21:19 ID:???] ユリウス暦ってのがよくわかりません
83 名前:NAME IS NULL mailto:sage [2009/03/11(水) 00:21:51 ID:???] スキーマとプラグマの違いがよくわかりません
84 名前:NAME IS NULL mailto:sage [2009/03/11(水) 00:22:03 ID:???] >>82 それは SQL に関係なさそうです。
85 名前:NAME IS NULL mailto:sage [2009/03/11(水) 00:23:58 ID:???] ランダムに1−5を生成して、 それをボタンが押されるごとに、 どんどん足していく、というプログラムなのですが、 SQL側でランダムに数字を生成して足す、という 構造に今、しているのですが、 「○を足しました」 とかってPHP側で表示したいのですが、今、 いくつの数字をランダムに生成して、いくつ足したのか、 って、PHP側で知る方法はあるのでしょうか? それとも、前後の差分を取るしかない?
86 名前:NAME IS NULL mailto:sage [2009/03/11(水) 00:25:57 ID:???] >>84 だってユリウス暦を取得する、って関数があるんです。 昨日発見しました。
87 名前:NAME IS NULL mailto:sage [2009/03/11(水) 00:28:24 ID:???] >>85 SQL でどんな処理をしてるのか書こうな。 >>84 ユリウス歴が何かは Google とかで調べような。 SQL には直接関係ないから。
88 名前:NAME IS NULL mailto:sage [2009/03/11(水) 00:35:53 ID:???] >>79 もちっと厳密に言うと、active databaseという考え方が元になっていて、 ・○○が起きたときに (Event: イベント) ・△△だったら (Contition: 条件) ・XXしちゃう (Action: アクション) のECAの三つ組みをデータベーススキーマとして登録する仕組み。 外部キー制約などで表現しきれないリレーションやその間の制約 を表現したり、データ更新のログをとったりするのに使えたりします。 >>82 どっちかというとこの質問はWikipediaの領分かな。 欧米における日本の旧暦みたいなものです。 今でも正教会とか、お祭りを今のグレゴリウス暦ではなく昔の ユリウス暦で祝うところがまだあるんです。 しかしこれを実装するのであればDATE値から大安とか丑年とか 計算してくれる関数がないと不平等だよな。
89 名前:NAME IS NULL mailto:sage [2009/03/11(水) 00:39:57 ID:???] >>85 > ランダムに1−5を生成して、 > それをボタンが押されるごとに、 > どんどん足していく、 なんか、最近似たようなモンを見たような気がするが、なんかの課題なのか?
90 名前:NAME IS NULL mailto:sage [2009/03/11(水) 01:10:43 ID:???] SQLite3で、 あとからAUTOINCREMENT 指定するのは 不可能?
91 名前:NAME IS NULL mailto:sage [2009/03/11(水) 01:29:47 ID:???] >>89 どれ?
92 名前:NAME IS NULL mailto:sage [2009/03/11(水) 01:50:35 ID:???] 前スレでの話しだな。> ランダム で、その前スレから疑問に思ってたけど、乱数生成をSQL側でしようとするのが疑問だった。 最終的にはUPATE Table SET val = val + random().... 的な使われ方だけで 済むのならSQLで済ませてもいいけど、いろいろ制約(乱数の範囲やvalの最大値)があるみたいだし、 素直にPHPで生成させておけば、そんなに悩むものでも無かろう。
93 名前:NAME IS NULL mailto:sage [2009/03/11(水) 01:53:49 ID:???] >>92 それで生成させたランダム値を PHP側で知りたいんですけど、無理ですか?
94 名前:NAME IS NULL mailto:sage [2009/03/11(水) 01:55:05 ID:???] ようはコンビニでおでんを買って、 「たれは、ごまだれにしますか?からしにしますか?それとも何もつけないようにしますか?」 って聞かれて 「ランダムでいいです」 って答えて、 「でも、ランダムに決定して、その結果は教えてね」 みたいな。
95 名前:NAME IS NULL mailto:sage [2009/03/11(水) 01:57:29 ID:???] >>93 できるだろ。テーブルに1件だけデータを入れておいて、Update のあと Select するとか。
96 名前:NAME IS NULL mailto:sage [2009/03/11(水) 09:12:08 ID:???] テンポラリーテーブルか。 うまいね。
97 名前:NAME IS NULL mailto:sage [2009/03/11(水) 19:24:23 ID:???] SQLite3の最新版で、 alterで、テーブルを作成したあとに、 autoincrementを付加することは可能なの?
98 名前:NAME IS NULL mailto:sage [2009/03/11(水) 20:48:51 ID:???] sqlzoo.net/ いいページ見つけた。 ボタンを押すとSQL文を生成してくれるっていう。
99 名前:NAME IS NULL mailto:sage [2009/03/11(水) 21:03:16 ID:???] 見せる… 行ロックを無限に発生させてしまうSELECT文が…
100 名前:NAME IS NULL mailto:sage [2009/03/11(水) 23:37:10 ID:???] >>4 に関連して「最新のものの次点のレコード」を抽出したい場合は どうすればいいでしょうか。 DBはOracle10gです。 <出力イメージ> 1 | 2007-11-10 | ccc 3 | 2007-11-11 | eee
101 名前:NAME IS NULL mailto:sage [2009/03/12(木) 00:16:43 ID:???] >>100 1 | 2007-11-11 | aaa の間違いじゃね。 Oracle使いじゃないけど、WITH句を使うとこんな感じかな。 WITH RemoveMax AS (SELECT * FROM Table WHERE (id,date_) NOT IN (SELECT id,max(date_) FROM Table GROUP BY id)) SELECT * FROM RemoveMax JOIN (SELECT id,max(date_) AS date_ FROM RemoveMax GROUP BY id) AS T1 USING (id,date_); WITH句なしで、 SELECT * FROM (SELECT * FROM Table WHERE (id,date_) NOT IN (SELECT id,max(date_) FROM Table GROUP BY id))AS T1 JOIN (SELECT id,max(date_)AS date_ FROM (SELECT * FROM Table WHERE (id,date_) NOT IN (SELECT id,max(date_) FROM Table GROUP BY id))AS T2 GROUP BY id)AS T3 USING(id,date_); フィールド名にdateは使えないのでdate_としています。
102 名前:NAME IS NULL mailto:sage [2009/03/16(月) 20:39:51 ID:???] create table categorizings( product_id integer not null references products(id), category_id integer not null references categories(id), sub_category_id integer references sub_categories(id), created_at datetime not null default current_datetime, updated_at datetime not null default current_datetime ) というテーブルがあるのですが、重複しているレコードがあるので、それを抽出しようとしています。 はじめは select product_id, category_id, sub_category_id from categorizings group by product_id, category_id, sub_category_id having count(*) > 1 としていたのですが、重複しているデータのcreated_atとupdated_atも抽出するようにと言われて、困ってます。 今は select c1.* from categorizings c1 where concat(c1.product_id, '-', c1.category_id, '-', c1.sub_category_id) in (select concat(c2.product_id, '-', c2.category_id, '-', c2.sub_category_id) from product_categorizings c2 group by c2.product_id, c2.category_id, c2.sub_category_id having count(*) > 1) ; としているのですが、パフォーマンスが遅いし、これで正しいのかもよくわかりません。 なんかいい方法を紹介してください。よろしくお願いします。 MySQL 5.45
103 名前:NAME IS NULL mailto:sage [2009/03/16(月) 20:55:12 ID:???] 未チェック。概念だけ select A.* from categorizings A, (select product_id, category_id, sub_category_id, count(*) as RNUM from categorizings group by product_id, category_id, sub_category_id ) B where A.product_id = B.product_id and A.category_id = B.category_id and A.sub_category_id = B.sub_category_id and B.RNUM > 1
104 名前:NAME IS NULL mailto:sage [2009/03/16(月) 23:19:26 ID:???] >>102 パフォーマンスを気にするのなら、 product_id, category_id, sub_category_idのカラムを 複合primary keyに持つcategorizings_duplicatedなりの 別テーブルを作って前者のSQLをinsert intoして それとjoinするのが最速かと。
105 名前:NAME IS NULL [2009/03/17(火) 08:55:52 ID:HhqqMBkm] vistaに11gの30日番をインストールしました。 sqlplusがコマンドプロンプトと変わりません。 よく見慣れた十字架のお墓みたいなアイコンのsqlplusだけをインストール できないでしょうか?
106 名前:NAME IS NULL mailto:sage [2009/03/17(火) 09:29:05 ID:???] GUI版のSQL*Plusは11gから廃止されました。
107 名前:NAME IS NULL [2009/03/17(火) 12:52:28 ID:HhqqMBkm] >>102 ありがとうございます。
108 名前:NAME IS NULL mailto:sage [2009/03/17(火) 20:57:32 ID:???] 以下のようなデータがあるとします。 id no data 1 1 aaa 1 2 bbb 1 4 ccc 1 5 ddd このデータをidとnoで昇順でソートした後 noの番号を降りなおしたい。 つまり、以下のように更新したい 1 1 aaa 1 2 bbb 1 3 ccc 1 4 ddd このようなsqlはどのように記述すればよいでしょうか。?
109 名前:NAME IS NULL mailto:sage [2009/03/17(火) 21:33:45 ID:???] >>108 idとnoの組合せで一意になる、かつDBMSがOracleと仮定して update TableName a set no = (select b.RN from (select id, no, row_number() over (order by id, no) as RN from TableName) b where a.id = b.id and a.no = b.no) ;
110 名前:NAME IS NULL mailto:sage [2009/03/17(火) 22:03:11 ID:???] >>108 ついでにたぶん汎用解 update TableName a set no = (select count(*) + 1 from TableName b where a.id > b.id or (a.id = b.id and a.no > b.no)) ;
111 名前:>>108 mailto:sage [2009/03/18(水) 01:43:48 ID:???] >>109 >>110 ありがとうございます。 ちなみにmysqlです。
112 名前:>>111 mailto:sage [2009/03/18(水) 16:24:28 ID:???] mysqlの場合は、以下のようにする。 update hoge as a inner join (select *,(select count(*) + 1 from hoge where no<x.no) as rownum from hoge as x) as b on a.id=b.id and a.no=b.no set a.no=b.rownum where a.id=1
113 名前:NAME IS NULL mailto:sage [2009/03/18(水) 20:43:22 ID:???] mysqlだとそんな奇怪なSQLになるのか・・・ とはいえ、>>110 も標準SQLではないな。(UPDATE句に相関名は書けない) 相関名をやめて update TableName set no = (select count(*) + 1 from TableName b where TableName.id > b.id or (TableName.id = b.id and TableName.no > b.no)) ; にすれば標準だと思うけど。
114 名前:NAME IS NULL mailto:sage [2009/03/18(水) 23:45:02 ID:???] Oracle10gにて SQL中の文字列(WHEREの後ろとかLIKEの後ろ)にそのままでは使えない文字の全量、対応方法ってわかりますか?
115 名前:NAME IS NULL mailto:sage [2009/03/18(水) 23:49:07 ID:???] >>114 質問の意味が分からん
116 名前:NAME IS NULL mailto:sage [2009/03/18(水) 23:50:26 ID:???] 予約語の一覧が欲しいのかな。 各RDBMSのマニュアル読んで、ユニークな列名を考えて下さい。
117 名前:NAME IS NULL mailto:sage [2009/03/18(水) 23:59:52 ID:???] >>114 質問の意図が、予約語と解釈する人もいれば、エスケープが必要な文字と 解釈する人もいそうな曖昧な質問の仕方だなw
118 名前:NAME IS NULL mailto:sage [2009/03/19(木) 00:55:19 ID:???] 114です すみません… '%_(シングルコーテ、パーセント、アンダーバー)のようなエスケープが必要な文字を知りたかったのです。
119 名前:NAME IS NULL mailto:sage [2009/03/19(木) 14:20:58 ID:???] >>118 なかなか回答つかないもんだな。 まぁ、本来はOracleスレで聞いた方がよかったんだろうが。 知りたい内容に対応する公式リファレンスは以下かな。 テキスト・リテラル ttp://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19201-02/sql_elements.html#41297 LIKE条件 ttp://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19201-02/conditions.html#7948 デフォルトだとリテラル文字列は'、LIKE条件はさらに%_も エスケープが必要となるが、それを変更する方法も提供されているということか。 バインド変数を使えば、これらのしがらみからも幾分は開放される。
120 名前:NAME IS NULL mailto:sage [2009/03/19(木) 15:36:30 ID:???] >>108 このテーブルってid た
121 名前:NAME IS NULL mailto:sage [2009/03/19(木) 15:49:28 ID:???] >>108 このテーブルってidとnoがprimary keyだと思うんだけど、更新するカラムをprimary keyのするのはよくないと思うんだけど、どうなんだろう。 もし、俺がテーブル設計するなら、以下のようなカラムを用意して、idとnoをprimary keyにして、no2を更新カラムにする。 id no no2 data こうしないと、以下のデータがあったとして、 id no data 1 1 aaa 1 2 bbb 1 3 ccc 二行目以下のnoを、まとめて+1するようなsqlをじた、キー重複エラーが発生する。
122 名前:NAME IS NULL [2009/03/24(火) 15:04:34 ID:yR1qlEgs] ある条件でORDERBYした時の、あるレコードの前後のレコードを取得することって可能ですか? 全レコードを一旦取得して、ホスト言語で前後を抽出するか ORDER BYが一個のカラムなら、対象レコードのそのカラムより大きいものをCOUNTして、 OFFSETでとってくることも可能かな でも、ORDER BY対象がユニークなカラムじゃないとだめか・・ なんかどれも効率悪そうなんですけど、もっといい方法ありますか? MySQLです。
123 名前:NAME IS NULL mailto:sage [2009/03/24(火) 15:36:53 ID:???] あるレコードの前後つーのは、 あるレコードの前→あるレコードより小さい中での最大 あるレコードの後→あるレコードより大きい中での最小
124 名前:NAME IS NULL mailto:sage [2009/03/24(火) 15:54:42 ID:???] ORDERBY対象がユニークなカラムじゃない のに特定レコードの前後を取りたいとかアレなの? 氏ぬの?
125 名前:NAME IS NULL mailto:sage [2009/03/24(火) 17:54:44 ID:???] >>122 具体例を挙げないと、何をしたいのかわからん人がほとんどだと思う(俺も含め)。 ソートした結果の10位前後のレコードを取り出したいというのなら 「じゃあ select * from table order by key limit 9, 3; でいいじゃん」 と誰もが答えるだろう。
126 名前:NAME IS NULL [2009/03/24(火) 18:32:38 ID:yR1qlEgs] >>123 ああ、そうか、そう考えれば簡単ですね。ありがとうございます。 >>124 ありがとうございます。 例えば更新日時で時系列に次へ次へみたいにリンクを出したい時、 そういう場合どうすればいいのでしょう? 更新日時って同じタイムスタンプになる確率があるって聞いたんですけど 更新日時カラム自体をユニークにして万が一同じタイムスタンプになったら、再保存するようにするのでしょうか? これが例えば変更されない登録日時なら主キーを使ってしまうって言う手もありますけど。 まあ、そもそも、更新されたら並び順が変わるし、このインターフェイス自体が問題あるきもしますけど。
127 名前:122 [2009/03/24(火) 18:42:55 ID:yR1qlEgs] >>125 具体的には126にちょっと書きましたが 記事の表示ページに更新日時順で次へ、前へというリンクを出したいんです。 で、そのページはダイレクトに主キーで記事を指定してくることもあるのでLIMIT 1 OFSSET〜っていうわけには行かない感じなんです
128 名前:125 mailto:sage [2009/03/24(火) 19:06:53 ID:???] >>127 ページング処理をしたかったのね。 俺も業務上そのテの開発はよくやるけど、やっぱり limit x, y だよ。 記事を指定して、その記事が含まれるページ(例えば81〜90件目を表示)とかに 飛ぶようなリクエストが発生するシステムであれば、 (順位, 更新日時, 記事ID) を持つソート済みテーブルをあらかじめ作成しておく。 レコード数が多いなら記事IDにindex付与。 更新日時が可変で順位が変わる可能性があるのなら、その頻度に応じてソート済みテーブルを再構築する。
129 名前:NAME IS NULL mailto:sage [2009/03/24(火) 20:06:31 ID:???] じゃ123でいいじゃん
130 名前:NAME IS NULL mailto:sage [2009/03/26(木) 08:01:10 ID:???] テーブルX(a,b)と テーブルY(b,c)で 列bを結合キーにした場合、 テーブルXに無いレコードをテーブルYから削除するには どのようなSQL文を書けば良いでしょうか
131 名前:NAME IS NULL mailto:sage [2009/03/26(木) 08:05:03 ID:???] where not in select b from A でいいんじゃないの?
132 名前:NAME IS NULL mailto:sage [2009/03/26(木) 08:05:42 ID:???] ごめんAじゃなくてXだった
133 名前:130 mailto:sage [2009/03/26(木) 08:13:50 ID:???] >>131 ありがとうございます 結合は不慣れでして… ちゃんと勉強しないといかんな (´・ω・`)
134 名前:NAME IS NULL mailto:sage [2009/03/26(木) 08:26:15 ID:???] >>133 結合は慣れです。 経験を積めば楽に結合出来るようにもなります。 慣れるまではプロの手ほどきを受けるのも良いかもしれませんね。
135 名前:NAME IS NULL mailto:sage [2009/03/26(木) 08:29:49 ID:???] 131で書いたのは結合じゃなくてサブクエリだけどね
136 名前:NAME IS NULL [2009/03/27(金) 02:32:29 ID:p8FYVGy/] 質問です。 以下のような、木構造のデータがあるとします。 東京→大田区→蒲田→羽田1丁目 東京→大田区→蒲田→羽田2丁目 東京→千代田区→秋葉原 大阪→住之江区→緑町 これを、テーブルに以下のような形式で入れるとします。 name prev_name 東京 東京 大田区 東京 蒲田 大田区 羽田1丁目 蒲田 羽田2丁目 蒲田 千代田区 東京 秋葉原 千代田区 大阪 大阪 住之江区 大阪 大阪市 大阪 緑町 住之江区 name=prev_nameなレコードが親トップとなります。(上記のデータですと、東京と大阪が親トップにあたります) この状態から、name=大田区のレコードを削除されたと考えてください。 ここから、name=(蒲田、羽田一丁目、羽田二丁目)のデータを取得するにはどのようなSQLをかけばよいでしょうか? ※ 住所をこのような形式で管理するのはおかしい!と感じる方もいらっしゃると思いますが、 これは問題をわかりやすくするため、このようにしています。 実際に住所を上記のような管理をしようとしているわけではないので、あらかじめご了承ください。
137 名前:NAME IS NULL mailto:sage [2009/03/27(金) 03:02:29 ID:???] >>136 恐らく、あなたが欲しいであろう回答をもらうための 前提条件が十分に説明されていない。 name in ('蒲田', '羽田一丁目', '羽田二丁目') で満たされてしまうからだ。
138 名前:NAME IS NULL [2009/03/27(金) 03:09:42 ID:p8FYVGy/] >>137 説明が足りず、すいません。 親がなくなってしまったname=蒲田のレコードと、その配下のレコード全部(つまり、羽田一丁目、羽田二丁目)を抽出したいという意味です。
139 名前:NAME IS NULL mailto:sage [2009/03/27(金) 03:33:47 ID:???] >>138 その説明でも曖昧さはまだ残るのだが…。 「親が存在しない、つまり不完全な構造になってしまった全てのレコード およびその子ノードたち(一世代まで下)を列挙したい」 と勝手に解釈するなら select name from table_name where prev_name not in (select name from table_name) union all select name from table_name where prev_name in (select name from table_name where prev_name not in (select name from table_name))
140 名前:>>139 [2009/03/27(金) 03:57:31 ID:p8FYVGy/] >>139 解釈ありがとうございます。。。 >一世代まで下 ここは、一番最後の世代まで下、という解釈でお願いします。 ちなみに、MySQL使っております(後だしすいません。。)
141 名前:NAME IS NULL mailto:sage [2009/03/27(金) 04:04:34 ID:???] >>140 これ、難しいけど問題としては面白いな。 解けそうで、解けないというか、一番最後の世代というところが難しいわ。
142 名前:139 mailto:sage [2009/03/27(金) 04:34:57 ID:???] >>140 そういうことなら、スマンが俺なら一つのSQLで済ますのはサジを投げる。 ストアドかホストアプリ側で列挙が完了するまでループ。 想定するシーンによっては、ホストアプリ側でn分木を再構築して 探索にはSQLに頼らない処理も考える。 いずれの方法も、循環参照の危険があるならそれも考慮しないと無限ループにハマるがな。
143 名前:139 mailto:sage [2009/03/27(金) 04:47:26 ID:???] >>140 ふと思ったが、もしかしてディレクトリツリーの再帰削除みたいなことをしたいのか? それならトリガで子ノード(一世代だけでよい)のDELETE書くだけで済むけど。
144 名前:NAME IS NULL mailto:sage [2009/03/27(金) 21:43:25 ID:???] >>143 MySQLってトリガのネストとか再帰とか可能なのか? 可能だとしても、階層に限界はあるだろうから、あまりにもネストが深いと失敗するかもな
145 名前:NAME IS NULL mailto:sage [2009/03/27(金) 23:11:51 ID:???] MYSQLはOLAP使えないの?
146 名前:NAME IS NULL mailto:sage [2009/03/28(土) 06:47:54 ID:???] どの程度の事をやりたいか判らないけどMYSQLのSELECT文には WITH ROLLUP修飾子なるものが階層別の集計はやってくれる。 これ以上を求めるならMondrian辺りを突っ込んでMDXでクエリを 書いた方が幸せになれると思う。
147 名前:NAME IS NULL mailto:sage [2009/03/28(土) 07:07:21 ID:???] whereでヒットしたレコードの指定件目を SQL文だけで取得したいのですが、 どうすれば良いですか><
148 名前:NAME IS NULL mailto:sage [2009/03/28(土) 08:02:24 ID:???] >>147 LIMIT 〜 OFFSET 〜が使えるDBMSならそれで ROW_NUMBER()が使えるDBMSならそれで
149 名前:NAME IS NULL mailto:sage [2009/03/28(土) 08:46:18 ID:???] countでいいじゃん
150 名前:NAME IS NULL mailto:sage [2009/03/28(土) 09:19:08 ID:???] 指定件目だぞ なんでcountだよ
151 名前:147 mailto:sage [2009/03/28(土) 10:20:03 ID:???] >>148 ありがとうございます sqliteですが、使えるか確認してみます><
152 名前:NAME IS NULL mailto:sage [2009/03/28(土) 18:41:16 ID:???] >>147 orderを指定しないselectの、行が返される順番は保障されない ということは覚えておいた方が良いかもしれない
153 名前:NAME IS NULL mailto:sage [2009/03/28(土) 23:07:57 ID:???] >136 パッと見たかんじ、最大何階層になるかだけ解れば可能なように見える(実際SQL叩いてないけどw)。 最大階層数が不明なら階層数調べるためにループさせる必要があると思うのでストアドっぽい気がする。
154 名前:NAME IS NULL mailto:sage [2009/03/28(土) 23:13:21 ID:???] >147 「ORDER BY」、「ROWNUM」
155 名前:147 mailto:sage [2009/03/29(日) 05:03:08 ID:???] LIMITとORDERで出来ましたヾ(^▽^)ノ 教えて下さった方々、どうもありがとうございました
156 名前:NAME IS NULL mailto:sage [2009/03/29(日) 19:51:33 ID:???] 礼にはおよばんよ。 またいつでも聞きにきなさい。
157 名前:NAME IS NULL mailto:sage [2009/03/31(火) 11:55:58 ID:???] データベースダイアグラム(リレーションシップ)っていままで使用せずに来ましたが、 これって使うのが一般的ですか? 例えば、伝票ヘッダテーブル・伝票明細テーブルがあったとして、データベースダイアグラムしておくと、 ヘッダテーブルのレコードを削除すると、そのレコードに対応する明細テーブルからも自動的に削除される って認識でいるのですが、なんか使いにくい気がしていつもコードからヘッダテーブル・明細テーブルを削除 しにいってます。 どうなんでしょうか。
158 名前:NAME IS NULL mailto:sage [2009/03/31(火) 13:21:31 ID:???] データベースダイアグラムってMS SQL?
159 名前:NAME IS NULL mailto:sage [2009/03/31(火) 13:39:17 ID:???] そうです。MS SQLです。 ACCESSでもリレーションシップは使っていませんでした。。
160 名前:NAME IS NULL mailto:sage [2009/03/31(火) 15:12:25 ID:???] 必要なきゃ使わなくていい。 ここは、SQL のスレであって、SQL Server のスレではないことに 気をつけような。
161 名前:NAME IS NULL mailto:sage [2009/03/31(火) 15:48:17 ID:???] 要は外部キーみたいなものだろうから、普通使うだろ。
162 名前:NAME IS NULL mailto:sage [2009/03/31(火) 18:06:28 ID:???] みんな、サンクス。 すれ違みたいなので、そっちへ行くわ。。
163 名前:NAME IS NULL mailto:sage [2009/03/31(火) 22:56:36 ID:???] 開発中はリレーション張って開発するけど 本番はインサート性能落ちるからリレーション張らないな Webだけの常識かもしれないけど
164 名前:NAME IS NULL mailto:sage [2009/03/31(火) 23:11:28 ID:???] そうなんだ!? 情報サンクス〜^^
165 名前:NAME IS NULL mailto:sage [2009/04/01(水) 05:33:13 ID:???] >>163 本番で外すような制約を開発時につけてるのか? 俺は開発時はリレーションに制約付けない。データの作成とか変更とかやりにくくなるから 逆に、本番は制約付ける。 制約のそもそもの目的は不正データの排除だから、本番についてないなら意味だろう どうしても性能の問題で制約外すことはあるかもしれないが、 Webだけの常識ってのは違うとおもうぞ
166 名前:NAME IS NULL mailto:sage [2009/04/01(水) 08:03:45 ID:???] Webシステムは伝統的にMySQLを使う事が多くて、 それにはMyISAMってのがあってだな、 設計時には勿論、外部キーを考慮してデータ設計するんだけども、 実際には云々以下略
167 名前:NAME IS NULL mailto:sage [2009/04/01(水) 10:04:18 ID:???] >>166 > Webシステムは伝統的にMySQLを使う事が多くて、 プゲラw お前さんのところの伝統を語られてもな・・・
168 名前:NAME IS NULL mailto:sage [2009/04/01(水) 11:20:19 ID:???] まぁ実際問題Webサイトの大多数はMySQLだろうけどね
169 名前:NAME IS NULL mailto:sage [2009/04/01(水) 11:33:32 ID:???] まぁ、スレ違いだな
170 名前:NAME IS NULL mailto:sage [2009/04/01(水) 19:02:50 ID:???] クイズを出すPHPサンプルを弄っているのですが 問題を、AUTO_INCREMENTでIDを増やしつつ追加して 後で一部の問題を削除すると、空のIDでエラーになります。 つめて整理する方法&AUTO_INCREMENTを最後尾から 再スタートする方法はあるのでしょうか?
171 名前:NAME IS NULL mailto:sage [2009/04/01(水) 19:08:19 ID:???] エスパーだが1〜最大IDまでのランダムなIDで出題してるの? もしそうならORDER BY RAND()とか
172 名前:NAME IS NULL mailto:sage [2009/04/01(水) 19:41:38 ID:???] そうです。 $id = rand(1, $count[0]); としているのでハズレを引いていると思います。 ORDER BY RAND()調べてみます。 サンクス
173 名前:NAME IS NULL mailto:sage [2009/04/02(木) 06:44:19 ID:???] >>170 >質問するときはDBMS名を必ず付記してください。 空き番号をつめるのはupdate書けばできるだろうけど、 自動採番が設定されてるカラムをupdateできるかどうかはDBによるんじゃね 自動採番号の設定値変える方法もDBによるんじゃね
174 名前:NAME IS NULL mailto:sage [2009/04/02(木) 08:51:36 ID:???] DBMS?
175 名前:NAME IS NULL mailto:sage [2009/04/02(木) 09:07:21 ID:???] でーたーべーすまねーじめんとしすてむ ようは、つかってるDBの種類かけと いろいろあるだろ、ORACLEとかMySQLとかACCESSとか桐とかファイルメーカーとか
176 名前:NAME IS NULL mailto:sage [2009/04/02(木) 09:14:32 ID:???] だからそれDBじゃなくてDBMS
177 名前:NAME IS NULL mailto:sage [2009/04/02(木) 09:32:08 ID:???] この場合のDBはDBMSの意味で使ってる DBMSという用語が理解できるなら文脈でわかると思うが DBMSとDBの区別がついてない人にとっては、DB=DBMSだからな DBとDBMSという用語を明確に使い分ける必要はあんまりないんじゃない
178 名前:NAME IS NULL mailto:sage [2009/04/02(木) 12:18:43 ID:???] あるんじゃないのかな。 アドバイス出来るほど理解出来ている人であればこの辺りは 誤解を招かないように意識して使い分けて書くべきだと思う。 文脈からも読めるかも知れないけど、ちゃんと言葉で明確に 区別するのに超した事はないよね。 スキーマとインスタンス、リレーションとテーブルとかと同様に 「似ているようで全然異なる、区別してもらわないと困る」類の 言葉だと思うよ>DBとDBMS
179 名前:NAME IS NULL mailto:sage [2009/04/02(木) 16:03:47 ID:???] 明確に使い分ける方がいいって意見はまあ納得できるんだが 会話は相手に伝わらないことには意味がないからな >>173 は確かにDBMSと書くべきだった >>175 は、>>174 がDBMSとは何かわからない人の発言かと思い、 あえてDBMSではなくDBと書いてある DBという言葉は割と一般的に使われるが、DBMSという言葉は一般的ではないと思うんだ そして一般にDBという場合、その多くがDBMSのことだったりすんだよな 俺は今のDBという言葉はDBMSを含んだ広い概念の言葉になってると思ってる
180 名前:NAME IS NULL mailto:sage [2009/04/02(木) 16:12:44 ID:???] 一般にDBという場合はドラゴンボールだろ この板出来たときから居るけど、最初の1年くらいは ドラゴンボールのスレが沢山あったんだぜ
181 名前:NAME IS NULL mailto:sage [2009/04/02(木) 19:49:22 ID:???] 実際の会話じゃないんだから DBMSって言われて知らなかったら調べるだろ 相手をばかにしてるだけ
182 名前:NAME IS NULL mailto:sage [2009/04/02(木) 19:59:22 ID:???] スルーで良いだろ わざわざ相手にする必要なし
183 名前:NAME IS NULL mailto:sage [2009/04/02(木) 20:25:20 ID:???] 2003年に立ったドラゴンボールスレがまだ残ってるわけだが
184 名前:NAME IS NULL mailto:sage [2009/04/02(木) 20:42:00 ID:???] >一般にDBという場合はドラゴンボールだろ 一般の友人のブログで「DBが〜…」とか書いてあって、「え!?なんでRDBMS知ってんだ!!」と驚いて本文を読んだらウボォー('A`)
185 名前:NAME IS NULL mailto:sage [2009/04/02(木) 22:39:10 ID:???] >>179 お前がDBMSをDBと書くことによって相手に伝わってないじゃん 174で突っ込みもらってすら173のおかしさに気づけない時点で理解できてないことが見え見え
186 名前:NAME IS NULL mailto:sage [2009/04/03(金) 12:07:39 ID:???] そうだな。DBMSがわかるやつが、あの文で通じないとはたしかに理解できてなかった あと、おもったより、>今のDBという言葉はDBMSを含んだ広い概念の言葉になってると思ってる が支持されてないようなので、今後は考えを改めることにするわ いいかげんスレ違いなのでこの話題は俺はここまでにする
187 名前:NAME IS NULL [2009/04/04(土) 23:48:34 ID:Zi6VTYVX] よろしくお願いします。 ある行の内容全て(主キーを除く)を、他の行へコピーしたいのですが、 どう書けばいいですか? 例) ID | DATE | DATA --+----------+----- 1 | 2009-04-05 | aaa 2 | 2000-01-01 | bbb ↑ ID=1のDATEとDATAの内容を、 ID=2のDATEとDATAへコピーしたい 理想の結果) ID | DATE | DATA --+----------+----- 1 | 2009-04-05 | aaa 2 | 2009-04-05 | aaa ←ID=1と同じ内容になる (SQL文のイメージ) UPDATE テーブル名 SET 【ID2の"ID"以外の全ての内容】 = 【ID1の"ID"以外の全ての内容】
188 名前:NAME IS NULL mailto:sage [2009/04/04(土) 23:52:43 ID:???] サブクエリ
189 名前:NAME IS NULL mailto:sage [2009/04/05(日) 00:26:18 ID:???] Oracleとかだと update テーブル名 set (DATE, DATA) = (select DATE, DATA from テーブル名 where ID = 1) where ID = 2 って書けたりするけど標準SQLだと update テーブル名 set DATE = (select DATE from テーブル名 where ID = 1), DATA = (select DATA from テーブル名 where ID = 1) where ID = 2 みたく書くしかないかな
190 名前:187 mailto:sage [2009/04/05(日) 00:34:23 ID:???] >>189 ありがとうございます。とても助かりました。 標準SQLですので、後者を使わせていただきます。
191 名前:NAME IS NULL mailto:sage [2009/04/05(日) 00:44:22 ID:???] その解だとID毎に全部書かなきゃならんのだが・・
192 名前:NAME IS NULL mailto:sage [2009/04/05(日) 01:59:55 ID:???] >>187 コピーする件数にもよるだろうけど、多くなければdeleteしてinsert delete from テーブル名 where ID = 2 ↓ insert into テーブル名 (ID, DATE, DATA) select 2, DATE, DATA from テーブル名 where ID = 1
193 名前:NAME IS NULL mailto:sage [2009/04/05(日) 03:26:50 ID:???] >187 MS SQLなら update work set [date] = w1.[date], data = w1.data from work,work w1 where work.id=2 and w1.id=1; MYSQLは UPDATE WORK, WORK W1 SET WORK.`DATE`=W1.`DATE`,WORK.DATA=W1.DATA WHERE WORK.ID=2 AND W1.ID=1; POSTGRESQLでは update work set "date" = w1."date", data = w1.data from work w1 where work.id=2 and w1.id=1;
194 名前:NAME IS NULL mailto:sage [2009/04/05(日) 10:18:33 ID:???] おまいら家のPCにDB環境いくつある?
195 名前:NAME IS NULL mailto:sage [2009/04/05(日) 11:04:04 ID:???] Oracle Express EditionとDB2 Express-C
196 名前:NAME IS NULL mailto:sage [2009/04/05(日) 11:16:04 ID:???] 何故そこにMS SQLの無料エディションが無い。
197 名前:NAME IS NULL mailto:sage [2009/04/05(日) 11:26:19 ID:???] ・会社で使ってないから ・Linuxに乗らないから
198 名前:NAME IS NULL mailto:sage [2009/04/05(日) 11:30:37 ID:???] ∧__∧ ( ・ω・) Windows以外はいやDOS ハ∨/^ヽ ノ::[三ノ :.、 i)、_;|*く; ノ |!: ::.".T~ ハ、___| """~""""""~"""~"""~"
199 名前:NAME IS NULL mailto:sage [2009/04/05(日) 14:50:39 ID:???] >194 おれっくらいの達人になると脳内DBだぜ、 脳内DBは10行3列までしか格納できないのがちょっと不便。
200 名前:NAME IS NULL mailto:sage [2009/04/05(日) 15:19:07 ID:???] 九九も入らないなw
201 名前:NAME IS NULL mailto:sage [2009/04/05(日) 16:03:03 ID:???] 九九のDB作るには複合インデックスも必要だしね。 ににんがし〜
202 名前:NAME IS NULL mailto:sage [2009/04/05(日) 16:38:35 ID:???] >>197 スレチだがDB2は日本では普及してるの? SQLServerの元になったRDBだよね?
203 名前:NAME IS NULL mailto:sage [2009/04/05(日) 16:40:19 ID:???] SQLServerの元はSybaseですがな。
204 名前:NAME IS NULL mailto:sage [2009/04/05(日) 16:50:18 ID:???] DB2はIBM関係の仕事してたらまず間違いなく使うことがある 逆にIBMと関係ない仕事してたらまず間違いなく使わない HiRDBと日立、Symfowareと富士通みたいなもんだ
205 名前:NAME IS NULL mailto:sage [2009/04/05(日) 16:59:57 ID:???] そんなもんと一緒にすんなって怒られそうだな
206 名前:NAME IS NULL mailto:sage [2009/04/05(日) 17:59:00 ID:???] >HiRDB 日立系の人から「使ってる?」と聞かれたことがあるけど、「知りません」って答えたら「そうでしょうね」と納得していたのが忘れられない。
207 名前:NAME IS NULL mailto:sage [2009/04/05(日) 19:11:36 ID:???] うちは、日立の子会社だけど基幹は Oracle だし、 俺自身も使ったことないし。
208 名前:NAME IS NULL mailto:sage [2009/04/05(日) 20:10:37 ID:???] 富士通も日立も普通にオラクルだよw 有名で実績あるからオラクルのほうが入れやすいんだと思う 少々高くても金はあるところにはあるし。
209 名前:NAME IS NULL mailto:sage [2009/04/05(日) 23:54:48 ID:???] しかしIBMはそういう場合でもDB2を入れてくる会社なんだぜ
210 名前:なまえ mailto:sage [2009/04/06(月) 00:20:55 ID:???] SQLの基礎はIBMの研究所で確立されたと聞いたことがあるぞ そうなると、DB2はもっとも由緒あるRDBMSといえるんじゃないかな ま、由緒があるから機能や性能が優れてるとは限らんがw
211 名前:NAME IS NULL mailto:sage [2009/04/06(月) 01:42:25 ID:???] >210 由緒はある、だが、パクって磨いて売りまくったのはオラクル。
212 名前:NAME IS NULL mailto:sage [2009/04/06(月) 22:39:19 ID:???] よろしくお願いします。 初めてaccess触ってるもんでさっぱりです・・・ レコードを、起算日から終了日までの日数分出力したいのですが、どうすればよろしいでしょうか? 例) ID data 起算日 終了日 -------------------------- 001 A 20080101 20080110 ←10日分出力したい 001 B 20080201 20080220
213 名前:NAME IS NULL mailto:sage [2009/04/06(月) 22:42:13 ID:???] (´・ω・`)…
214 名前:NAME IS NULL mailto:sage [2009/04/06(月) 23:03:48 ID:???] >212 そのテーブルの日付範囲を条件にして他のテーブルから日付範囲分のレコードを取ってきたいってことか? select 起算日−終了日 from テーブル where 起算日−終了日 = 起算日−終了日 でOK。 解説は↓↓↓↓↓がする
215 名前:NAME IS NULL mailto:sage [2009/04/06(月) 23:35:28 ID:???] 他のテーブル指定してねーじゃん
216 名前:NAME IS NULL mailto:sage [2009/04/06(月) 23:42:53 ID:???] >>214 抽出元は、このテーブルです 1行目の起算日から終了日までだと、日数が10日あるので10行表示するようなイメージです
217 名前:NAME IS NULL mailto:sage [2009/04/06(月) 23:45:34 ID:???] limitでいいじゃん
218 名前:NAME IS NULL mailto:sage [2009/04/06(月) 23:57:18 ID:???] >>216 20080101 20080102 . . 20080110 ってことか? 標準的なSQLでは無理。
219 名前:NAME IS NULL mailto:sage [2009/04/06(月) 23:59:52 ID:???] まず、日本語で説明できるようになろうな。
220 名前:NAME IS NULL mailto:sage [2009/04/07(火) 00:03:51 ID:???] >>218 やっぱ、ダメか・・・ ありがとうございました。他の方法を考えてみます
221 名前:NAME IS NULL mailto:sage [2009/04/07(火) 00:21:15 ID:???] 上司に説明してもらった方が解決しそう。
222 名前:NAME IS NULL mailto:sage [2009/04/07(火) 11:42:38 ID:???] 変数に代入して+1してけばいいんじゃないの?
223 名前:NAME IS NULL mailto:sage [2009/04/07(火) 12:42:53 ID:???] BETWEENとかそういう話じゃなくてか
224 名前:NAME IS NULL mailto:sage [2009/04/07(火) 12:47:57 ID:???] RDBMSによってはできるな。 accessはわからんが
225 名前:NAME IS NULL mailto:sage [2009/04/08(水) 05:06:40 ID:???] テーブルをカラム A (ユニーク) でソートした時、A の値が 'HOGE' の行の 出現インデックスを取得するような SQL は書けますか? 先頭からループでブン回して出現位置を見つけるしかないんでしょうか? Apache の Derby です。
226 名前:NAME IS NULL mailto:sage [2009/04/08(水) 05:39:49 ID:???] >>225 'HOGE' が何行目にあるか? ってことかな? ApacheのDerbyは使ったことないが、 SELECT count(*) FROM Table WHERE A <= 'HOGE'; でいけるんじゃね?
227 名前:NAME IS NULL mailto:sage [2009/04/08(水) 08:11:16 ID:???] DBの統計情報を利用したいというように読める。
228 名前:社内SE mailto:sage [2009/04/08(水) 23:05:12 ID:???] >225 SQL書くんのめんどいからヒント ソート 行番号 'HOGE'指定 最小 を1個ずつクリアしていけOK。 俺っくらいのレベルになると脳内DBでサクッとできるんぜ。 脳内DBのテーブルは3列10行制限 DBでインデックスとゆう用語は勘違いされるからむ
229 名前:NAME IS NULL mailto:sage [2009/04/08(水) 23:30:53 ID:???] ランクが知りたいんじゃないの?
230 名前:NAME IS NULL mailto:sage [2009/04/09(木) 11:33:54 ID:???] ・oracle11g ・あろテーブルで、複数のカラムで一つのIDを持っているんですが、 そのIDの重複の有無を調べるSQLを教えてください。 型は全てnumberです。
231 名前:230 mailto:sage [2009/04/09(木) 12:13:58 ID:???] 勘違いしててすぐ解決しました。
232 名前:NAME IS NULL mailto:sage [2009/04/12(日) 23:57:56 ID:???] 文字化けが直らない。 疲れ果てて質問も出来ない。 いじょう
233 名前:NAME IS NULL mailto:sage [2009/04/13(月) 00:06:52 ID:???] どのみちこのスレで文字化けの質問なんかしてもスレ違いだ いじょう
234 名前:NAME IS NULL mailto:sage [2009/04/13(月) 00:36:36 ID:???] DB2は迷ったらUTF8、他のDBもおすすめの日本語文字コードがあります。
235 名前:NAME IS NULL [2009/04/13(月) 22:53:53 ID:z55NoKLw] 達人の俺になんか問題を振ってくれ age
236 名前:NAME IS NULL mailto:sage [2009/04/13(月) 23:02:01 ID:???] 逆に今時どのDBでもUTF8だろ Accessとかならともかく
237 名前:NAME IS NULL mailto:sage [2009/04/13(月) 23:27:03 ID:???] Accessは手軽にアプリケーションが作れるので気に入った。
238 名前:NAME IS NULL mailto:sage [2009/04/13(月) 23:45:35 ID:???] JIS 第一なら概ねあいうえお順だから JIS 順ソートが仕様になってる所は UTF-8 使えないんじゃないの。 今時の DB は UTF-8 でも JIS 順ソート指定とかできるんか知らんが。
239 名前:NAME IS NULL mailto:sage [2009/04/13(月) 23:47:36 ID:???] UTF-8でSQLに渡してPHPから呼んで表に入れたら化けた。 SQLに渡したリストを表示するPHPは化けない。 化けてない方はブラウザもUTF-8で表示してる。 化けてる方はブラウザはEUC-JPで表示しててUTF-8に変更すると SQL関係ない文字が化ける。 表作成のコードは一緒なのに。 もう嫌。
240 名前:NAME IS NULL mailto:sage [2009/04/13(月) 23:52:44 ID:???] なんだよ SQL って・・・
241 名前:NAME IS NULL mailto:sage [2009/04/13(月) 23:57:04 ID:???] IBMの研究所の偉い人が考えた言語
242 名前:NAME IS NULL mailto:sage [2009/04/14(火) 00:41:47 ID:???] 仮にMySQLならset names スクリプトの文字コード やっちゃえよ
243 名前:239 mailto:sage [2009/04/14(火) 14:12:12 ID:???] PHPファイル自体をUTF8で保存したら文字化け直った。
244 名前:NAME IS NULL mailto:sage [2009/04/14(火) 14:46:54 ID:???] 要するに文字コード変換一切せずに突っ込んでたって事じゃないか
245 名前:NAME IS NULL mailto:sage [2009/04/14(火) 16:03:35 ID:???] ∧∧ ヽ(・ω・)/ ズコー \(\ ノ 、ハ,、  ̄  ̄"
246 名前:NAME IS NULL mailto:sage [2009/04/14(火) 20:21:29 ID:???] 何にせよスレ違い。二度と来んなよー
247 名前:NAME IS NULL mailto:sage [2009/04/14(火) 21:11:16 ID:???] where aaa<>'5' と書くとaaa列がnullのレコードが取ってこれないのはどう理解しればいいですか? 納得いきません。 nullは'5'ではありませんので取ってくれよ、と思っています。
248 名前:NAME IS NULL mailto:sage [2009/04/14(火) 21:16:21 ID:???] >>247 DBにおけるNULLの扱いを勉強しましょう。
249 名前:NAME IS NULL mailto:sage [2009/04/14(火) 21:19:34 ID:???] >>247 null はどう評価しても null。つまり、true ではないから。
250 名前:NAME IS NULL mailto:sage [2009/04/14(火) 21:24:18 ID:???] >249 あんがと。 もうひとつ質問 ''(シングルクォート2連続)はnullと同じですか? aaa is null と aaa ='' は同じですか?
251 名前:NAME IS NULL mailto:sage [2009/04/14(火) 21:28:02 ID:???] >>250 別
252 名前:NAME IS NULL mailto:sage [2009/04/14(火) 21:33:09 ID:???] >>250 同じ扱いのDBMSもあったような気がする・・・Oracleだったかな?
253 名前:NAME IS NULL mailto:sage [2009/04/14(火) 21:34:12 ID:???] INSERT INTO ('') INSERT INTO (NULL) 両者は同じになるのですが、どう理解しればいいでしょうか?
254 名前:NAME IS NULL mailto:sage [2009/04/14(火) 21:37:32 ID:???] >>250 DB による
255 名前:NAME IS NULL mailto:sage [2009/04/14(火) 22:35:24 ID:???] >>250 各RDBMSで挙動が異なる。 SQLの解説書によく出てくるよ。
256 名前:NAME IS NULL mailto:sage [2009/04/14(火) 23:24:22 ID:???] >>253 syntax error
257 名前:NAME IS NULL mailto:sage [2009/04/14(火) 23:26:04 ID:???] >256 なるほど。 どおりで同じわけだ。
258 名前:NAME IS NULL mailto:sage [2009/04/14(火) 23:37:17 ID:???] >>253 とりあえず、ここ読んでらっしゃ〜い ttp://www.geocities.jp/mickindex/database/db_3vl.html
259 名前:NAME IS NULL mailto:sage [2009/04/14(火) 23:47:13 ID:???] よくある質問1の日付が未来まである場合のテーブルで、 今日未満の最新レコードを抽出する事は可能ですか?
260 名前:NAME IS NULL mailto:sage [2009/04/14(火) 23:50:22 ID:???] >>259 はい
261 名前:NAME IS NULL mailto:sage [2009/04/15(水) 00:05:41 ID:???] DATE型の大小関係で、「今日」という日付を使って 今日 <= MIN(DATE_column) すべての日付の最小値をとり、今日を含む今日よりも新しい日付を抽出する。
262 名前:NAME IS NULL mailto:sage [2009/04/15(水) 00:55:28 ID:???] between句について質問です。(初心者です) code between '123456' and '123459' で範囲指定した検索を行うと 検索結果に code 1234 も含まれます。 なぜでしょうか? また、数値型に変換して cast句を使用したのですが、code に全角数字が 含まれる為、SQLエラーとなりうまくいきません。 何かよい方法は無いでしょうか?
263 名前:NAME IS NULL mailto:sage [2009/04/15(水) 00:59:43 ID:???] 全角半角混在とは、、、 しょうがないから半角に統一するストアドファンクション作ろう
264 名前:NAME IS NULL mailto:sage [2009/04/15(水) 01:08:06 ID:???] >>263 様 ありがとうございます。 ストアドファンクションって何ですか?ってレベルなんですけど 調べてみます。 ちなみに、code には 「-」 も含まれます。。。。
265 名前:NAME IS NULL mailto:sage [2009/04/15(水) 01:22:27 ID:???] >>262 >>1 まあ code 1234 が '123456'より大きく'123459'より小さいと判断されてるのだろう 文字列の比較ルールは処理系や文字コードによるのでこれ以上はなんともいえない
266 名前:NAME IS NULL mailto:sage [2009/04/15(水) 01:35:00 ID:???] 全角が入るって・・・エンドユーザの入力をそのままSQLに渡してるのか? SQLインジェクションとか、別のとこで心配になってきたぞ。 ストアドで解決するよりも、ホストアプリ側でバリデーションすべきだと思う。
267 名前:266 mailto:sage [2009/04/15(水) 01:42:32 ID:???] ・・・と書いてから気づいたが、既存のレコードが全角なのね、勘違いしてた。 まあ、既に入っちまったもんは仕方ないか。 >>262 の使ってるDBが何か知らんが、「照合順序」がキーワードになるんじゃないかな。
268 名前:NAME IS NULL mailto:sage [2009/04/15(水) 02:22:41 ID:???] 使っているDBはSQLSERBER2005です。照合順序をJapanese_binに設定しても同様にエラーがでます。。。
269 名前:NAME IS NULL mailto:sage [2009/04/15(水) 02:47:18 ID:???] >>268 全角半角を区別したくないんなら、Japanese_CI じゃないのか?
270 名前:NAME IS NULL mailto:sage [2009/04/15(水) 07:43:08 ID:???] 質問です。 ISO規格のSQL(SQL-92)のみが使える機能を搭載したRDBMSはあるのでしょうか? SASを使用しているのですがどうよらSQL-92が使える事は分かったのですが、各社の拡張機能をつい使ってしまう癖を直したくて質問しました。 よろしくお願いします。
271 名前:NAME IS NULL mailto:sage [2009/04/15(水) 13:50:48 ID:???] 本来のもの以外は全く使えないって正月番組の英語禁止ゴルフかよ
272 名前:NAME IS NULL mailto:sage [2009/04/15(水) 15:12:05 ID:???] SQL Serverで '1234' between '123456' and '123459' が真になるような 照合順序なんて無いと思うので、何かがおかしい DBCC CHECKTABLEとかって2005でも実行できるのかな?
273 名前:NAME IS NULL mailto:sage [2009/04/15(水) 19:14:41 ID:???] >>270 Oracleだとalter session set flagger=fullとかやるとチェックできる。 他のDBMSでも似たような機能はあるんじゃない?(知らんけど)
274 名前:NAME IS NULL mailto:sage [2009/04/15(水) 20:26:48 ID:???] >>270 SQL92の良いリファレンスを買って手元に置く方が良いよ。 プロ野球養成ギプスじゃあるまいし、癖を直すにしても頭で 理解して直さないと意味がないでしょう。
275 名前:NAME IS NULL mailto:sage [2009/04/15(水) 20:36:27 ID:???] でもちょっとチューニングしようと思ったら SQL92 じゃどうしようもならんよね。
276 名前:NAME IS NULL mailto:sage [2009/04/15(水) 20:45:50 ID:???] BNFで充分だろ ttp://savage.net.au/SQL/sql-92.bnf.html まあ、BNFじゃ構文しか分からんが
277 名前:270 mailto:sage [2009/04/15(水) 23:33:11 ID:???] ご意見ありがとうございます。 参考にします。
278 名前:NAME IS NULL mailto:sage [2009/04/16(木) 08:24:06 ID:???] 質問です。 COLUMN Aの値がa1のところをa2に変えたいと思っています。 ただし制約があってCOLUMN AとCOLUMN Bでユニークなインデクスを作っているので COLUMN Bの値がかぶらないようにチェックしないといけません。 COLUMN Bがかぶらない行だけを変える方法、あるいはCOLUMN Bがかぶる行を削除する方法を 教えてください。
279 名前:NAME IS NULL mailto:sage [2009/04/16(木) 13:45:19 ID:???] testテーブル aid|bid|value|ip|created このようなテーブルから、 ipが同じ、かつ同じcreatedが同じ日付のものを重複として取り除き、 valueの平均を出したいのですが・・・ サブクエリを使えば、 SELECT bid, avg( value ) FROM ( SELECT * FROM test GROUP BY bid, ip, date( created ) ) AS tmp GROUP BY bid のようにできるのですが、 サブクエリを使わずに実現する方法はありますでしょうか? よろしくお願いします。
280 名前:NAME IS NULL mailto:sage [2009/04/16(木) 14:10:38 ID:???] そのサブクエリ自体が間違っているような・・・ ipと日付が同じでvalueが異なる行があった場合は どうするのだろうか。
281 名前:NAME IS NULL mailto:sage [2009/04/16(木) 14:19:44 ID:???] >>279 select ip, date(created), avg(value) from test group by ip, date(created) これで事足りるんじゃないの?
282 名前:279 mailto:sage [2009/04/16(木) 14:21:22 ID:???] >>280 説明が足りずすみません・・・ 同じipで同じ日付ならば、時間が早いほうのvalueを使うほうにしたかったのですが・・・ SELECT bid, avg( value ) FROM ( SELECT * FROM test GROUP BY bid, ip, date( created ) ORDER BY created ASC ) AS tmp GROUP BY bid こんなかんじでしょうかね・・・ いろいろ間違ってるかもしれません;
283 名前:279 mailto:sage [2009/04/16(木) 14:24:53 ID:???] >>281 またまた説明が足りませんでした・・・ 同じipで同じ日付を重複として取り除いたものから、 valueの平均をbidごとに集計したかったのです・・・
284 名前:NAME IS NULL mailto:sage [2009/04/16(木) 14:51:18 ID:???] とりあえずそのサブクエリは文法エラーで評価出来ないと 言うことは意識しているかな。GROUP BYを使った場合は 無頓着に*は使えないよ。 あと「時間が早いほう」とは書いているけど、全く同時刻に 複数のvalueがある場合はどうなるのだろう。 最後に、やっぱりサブクエリ使わないと難しいと思う。 使えない理由がDBMSの仕様であるなら、DBMSの名前と バージョンを書くべし。
285 名前:NAME IS NULL mailto:sage [2009/04/16(木) 20:02:54 ID:???] サブクエリ使えないなら一時テーブル使えば?
286 名前:NAME IS NULL mailto:sage [2009/04/16(木) 21:02:09 ID:???] 達人の俺(まいど脳内DBの俺)が教えてやろう >278 そーゆうとき、まずUPDATEするまえにDECODE関数を使って'a1'を'a2'に変えた表を作る その表と元の無編集の表をキーで付き合わせればいいんだよ。 ポイントはdecode、not exists、from句に元の無編集の表と編集した表だ。 最終的にはDML一発でやりたい事ができるぞ。少なくとも俺の脳内では。
287 名前:NAME IS NULL mailto:sage [2009/04/16(木) 21:07:33 ID:???] >279 達人の俺がパッと見た感じではごく普通の難易度に見えるが 俺の脳内DBは3列10行までしか格納できないのでパス。
288 名前:NAME IS NULL mailto:sage [2009/04/16(木) 21:11:01 ID:???] aid|bid|value|ip|created ↓ bid|ip|created なら教えてあげてもいい。
289 名前:NAME IS NULL mailto:sage [2009/04/16(木) 21:22:17 ID:???] 達人の脳内 DB はヒープどれくらい割り当ててるんですか?
290 名前:NAME IS NULL mailto:sage [2009/04/16(木) 21:35:05 ID:???] 俺っくらいの達人になると ひーぷ()笑 だ。決してヒープという用語を知らないわけではないぞ。
291 名前:NAME IS NULL mailto:sage [2009/04/17(金) 01:43:03 ID:???] 良く解りませんがヒップへのアクセス権はguest可です
292 名前:278 mailto:sage [2009/04/17(金) 02:44:23 ID:???] 達人様ありがとうございました。 decodeが使えなかったのでcaseを使って実現しました。 結局様々な事情で実装は別の方法を取ったのですが 勉強になりました。
293 名前:NAME IS NULL mailto:sage [2009/04/17(金) 03:29:36 ID:???] 公開したらヒップに SQL Injection 喰らいました。
294 名前:NAME IS NULL mailto:sage [2009/04/17(金) 03:43:47 ID:???] アクセス権はつけてるけどINSERT権限はつけてないから無問題
295 名前:DBの達人 mailto:sage [2009/04/17(金) 05:56:38 ID:???] おはよう!
296 名前:NAME IS NULL [2009/04/17(金) 08:26:10 ID:uJNeHSTZ] DBからデータを取り出すときに、 今週のものだけを取り出すにはどのようにすればよいのでしょうか? 7日以内ではなく、「今週」のものなのですが。 プログラムなどで、今週の始めと終わりの日付などを計算する必要があるのでしょうか? SQLで可能ならば教えてください。 また、カラムに更新日時が記録されているとき、 たとえば3日以上j更新されていないものを取り出すにはどのようにすればよいのでしょうか? 初歩的なことかもしれませんが、どうかお願いします。
297 名前:NAME IS NULL mailto:sage [2009/04/17(金) 10:01:39 ID:???] >>296 今週の日曜日から土曜日で、 WHERE date_column BETWEEN CAST(NOW()-CAST(EXTRACT(DOW FROM NOW())||' day' AS INTERVAL) AS DATE) AND CAST(NOW()-CAST(EXTRACT(DOW FROM NOW())-6 || ' day' AS INTERVAL) AS DATE)
298 名前:297 mailto:sage [2009/04/17(金) 10:07:54 ID:???] 見逃してた。下の質問だけど、更新日時が今日より3日以内って意味かな? WHERE date_column BETWEEN CAST(NOW()-INTERVAL'3 days' AS DATE) AND CAST(NOW() AS DATE);
299 名前:297 mailto:sage [2009/04/17(金) 10:28:50 ID:???] 逆か>>298 WHERE date_column NOT BETWEEN CAST(NOW()-INTERVAL'3 days' AS DATE) AND CAST(NOW() AS DATE);
300 名前:296 mailto:sage [2009/04/17(金) 15:48:09 ID:???] >>297-299 ありがとうございます! 試してみます。
301 名前:NAME IS NULL mailto:sage [2009/04/17(金) 19:44:40 ID:???] 普通date_truncとか類似の関数で週単位の切り捨てもできるだろ
302 名前:達人 mailto:sage [2009/04/17(金) 23:06:00 ID:???] 俺が出るまでもないな。
303 名前:NAME IS NULL mailto:sage [2009/04/18(土) 02:23:43 ID:???] いまだに達人と聞くと、シューティングを思い出してしまう
304 名前:NAME IS NULL [2009/04/18(土) 03:15:53 ID:AF1CyfHl] 社員(名前 char(32),社員番号 int primary key) 個人情報(社員番号 int primary key,年齢 int,支店番号 int) という2つのテーブルがあるとき、制約条件として foreign key 社員番号 references 社員 というのを個人情報テーブルに追加した方がいいですか、それとも foreign key 社員番号 references 個人情報 というのを社員テーブルに追加した方がいいですか?
305 名前:NAME IS NULL mailto:sage [2009/04/18(土) 05:34:25 ID:???] 社員番号がkeyなので社員テーブルを参照するのがいい。 つまり前者の制約でいいと思う。 でも、支店番号は社員テーブルにあったほうが良くないか?
306 名前:NAME IS NULL mailto:sage [2009/04/18(土) 05:47:55 ID:???] 一つのファクトは同じテーブルに収めろよ
307 名前:NAME IS NULL mailto:sage [2009/04/18(土) 06:17:36 ID:???] >>304 そのテーブルの関係が1-0か0-1かによって決まる。 どっちかわかっていないなら付けられない。
308 名前:NAME IS NULL mailto:sage [2009/04/18(土) 20:02:40 ID:???] 1つのテーブルに纏めるべきだとは思うけど、 参照制限をかけたいがためにわざと別テーブルにしてる・・・とかか?
309 名前:NAME IS NULL mailto:sage [2009/04/18(土) 22:14:51 ID:???] オッス達人だ。 >304 ある社員の @名前はあるが、、年齢と支店番号がない。 A年齢と支店番号はあるが、名前がない。 どっちがイイのよ?
310 名前:NAME IS NULL mailto:sage [2009/04/18(土) 22:35:53 ID:???] なんか変なのが居ついちゃったな
311 名前:NAME IS NULL mailto:sage [2009/04/19(日) 02:00:42 ID:???] つか、それSQLの話じゃないし、設計の話はスレ違いだ
312 名前:NAME IS NULL [2009/04/19(日) 05:12:30 ID:gQJBptjI] テーブルのカラム名でDATE(もちろん意味は日付です)というのを使いたいんですが、DATEというデータ型とかぶってしまいます。 プロの皆さん方は、日付という意味のカラム名はどうされてますか?
313 名前:NAME IS NULL mailto:sage [2009/04/19(日) 05:38:03 ID:???] 前になんか付ける。更新日ならUPD_DATEとか。 つかそれもこのスレじゃないな。
314 名前:NAME IS NULL [2009/04/19(日) 05:53:22 ID:gQJBptjI] ついでに後1個だけ。 カラム名は、大文字も小文字も区別されないと思っておいたほうがいいですよね?
315 名前:NAME IS NULL mailto:sage [2009/04/19(日) 19:59:55 ID:???] dbmsによる
316 名前:NAME IS NULL mailto:sage [2009/04/20(月) 00:55:55 ID:???] >>314 大文字か小文字だけを使うように設計するべき。
317 名前:NAME IS NULL mailto:sage [2009/04/20(月) 01:41:21 ID:???] Oracleなら全部大文字、MySQLやPostgreSQLは小文字って感じの規約が多いかな。 一応理由があって、Oracleは内部の情報としてカラム名やテーブル名を 大文字で管理してるから、大文字で最初から書いた方が効率が良くて、 逆にMySQLとかPostgreSQLは小文字で管理してるから逆になる。 ただどっちにしろSELECTとかINSERTみたいなコマンド部分は 大文字で書くのが一般的。 ただ、厳密な意味で大文字小文字を区別するってDBMSはあんまり無いと思う。
318 名前:NAME IS NULL mailto:sage [2009/04/20(月) 03:55:46 ID:???] 今日(日付的には昨日)あった基本情報の問題についてですが 問3の設問4(SQL)が「ア」じゃダメな理由がわかりません SQLの問題なのでここで聞いてみました 問題冊子:www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2009h21_1/2009h21h_fe_pm_qs.pdf 解答:www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2009h21_1/2009h21h_fe_pm_ans.pdf
319 名前:NAME IS NULL mailto:sage [2009/04/20(月) 04:46:24 ID:???] アだとジャガイモが在庫切れで非表示にしたい料理の他に ジャガイモを元々使わない料理も出てこなくなる
320 名前:NAME IS NULL mailto:sage [2009/04/20(月) 05:55:14 ID:???] 技術系の質問スレって「そんなDB使う奴がバカ」「そんなテーブル設計する奴がバカ」 みたいな、何の解決にもならない根本否定するだけのスレをよく見掛けるけど、ここは それがあまりない。おまいら「DB屋は今そこにあるDBを何とかしなきゃいけない」って よく分かってるプロだなーといつも感心する。
321 名前:NAME IS NULL mailto:sage [2009/04/20(月) 06:08:56 ID:???] ひんと: スルー力
322 名前:318 mailto:sage [2009/04/20(月) 10:47:49 ID:???] 問題文3行目の「使用する食材全てについて在庫が〜」というのを見逃してました。 しっかり問題文を読まねば・・・・・・ 解説ありがとうございました。
323 名前:NAME IS NULL mailto:sage [2009/04/20(月) 10:53:59 ID:???] >>317 ""でくくると大文字小文字を区別するけど、くくらないとすべて小文字扱いになるよ、PostgreSQLは 他のは知らないけど、似たようなもんじゃないのかなあ。
324 名前:NAME IS NULL mailto:sage [2009/04/20(月) 12:46:39 ID:???] >>321 何度見ても「するーか」と読んでしまう私のSELECT文
325 名前:NAME IS NULL mailto:sage [2009/04/20(月) 13:43:10 ID:???] ユンカース
326 名前:NAME IS NULL mailto:sage [2009/04/20(月) 18:26:07 ID:???] スツーカ
327 名前:NAME IS NULL mailto:sage [2009/04/20(月) 18:31:38 ID:???] 暴力二男
328 名前:NAME IS NULL mailto:sage [2009/04/20(月) 20:44:32 ID:???] 達人だ。 >312 「HIZUKE」または「HIDUKE」でOK。 ダサくても大規模プロジェクトでこんな名称使ってるとこたまにある 「〜_DATE」でOK。 よくあるのが 「INS_DT」「INP_DT」 「DEL_DT」 「UPD_DT」 運用日付なら「UNYO_HIZUKE」でオッケー牧場。
329 名前:NAME IS NULL mailto:sage [2009/04/20(月) 21:58:19 ID:???] 意味の無い返答はやめていただきたい。
330 名前:NAME IS NULL [2009/04/21(火) 02:38:25 ID:6SQGommS] MySQLを使っているのですが、 ifnullとcaseの違いについてわからないことがあります。 以下のようなSQLファイルを作成しました。 ------------------------------------- ~$ cat hoge.sql use test; drop table if exists hoge; create table hoge (id int, no int, data text, primary key(id, no)); insert into hoge values(1, 1, 'aaa'); insert into hoge values(1, 2, 'aaa'); insert into hoge values(1, 3, 'aaa'); insert into hoge values(2, 1, 'bbb'); insert into hoge values(2, 2, 'bbb'); select ifnull(max(no)+1, 0) as no from hoge where id=3; select (case when no is NUll then 0 else max(no)+1 end) as no from hoge where id=3; ------------------------------------- これを実行してみたところ、以下のようになりました。 ------------------------------------- ~$ cat hoge.sql | mysql -u root --table +----+ | no | +----+ | 0 | +----+ +------+ | no | +------+ | NULL | +------+ ------------------------------------- なぜ、ifnullの場合は0なのに、caseの場合はNULLなのでしょうか? よろしくご教示お願い致します。
331 名前:NAME IS NULL mailto:sage [2009/04/21(火) 02:46:51 ID:???] >>330 dev.mysql.com/doc/refman/5.1/ja/case-statement.html
332 名前:NAME IS NULL mailto:sage [2009/04/21(火) 02:51:13 ID:???] いや単に前者がnull+1でnullになってるからだろ
333 名前:>>330 [2009/04/21(火) 03:39:55 ID:6SQGommS] >>331 >.332 本当にありがとうございました。
334 名前:sql mailto:sage [2009/04/21(火) 05:28:21 ID:???] select distinct col1, col2, col3 from tablename; とやると全行表示されるがこの件数だけを取得したい場合は一体どうかけばいいですか?
335 名前:NAME IS NULL mailto:sage [2009/04/21(火) 05:39:28 ID:???] 標準ではないが DB によっては limit 20 とか fetch first 20 rows only とか 追加で書けたりする。DB の SQL リファレンス参照。
336 名前:NAME IS NULL mailto:sage [2009/04/21(火) 06:12:41 ID:???] select count(*) from tablename group by col1, col2, col3; じゃないの?
337 名前:336 mailto:sage [2009/04/21(火) 06:20:06 ID:???] 寝ぼけてるな俺・・・ select count(*) from (select distinct col1, col2, col3 from tablename);
338 名前:NAME IS NULL mailto:sage [2009/04/21(火) 06:33:26 ID:???] あ欲しいのは件数か。「この件数」→「特定の件数」と勝手に脳内補完してしまった、失礼。
339 名前:sql mailto:sage [2009/04/21(火) 06:43:13 ID:???] >>337 oracleでは動くのですが、MySQLでは動作しません。なんか違うんでしょうか? ERROR 1248 (42000): Every derived table must have its own alias
340 名前:NAME IS NULL mailto:sage [2009/04/21(火) 07:08:01 ID:???] >>339 エラーメッセージの通りじゃないの?(知らんけど。) select count(*) from (select distinct col1, col2, col3 from tablename) a;
341 名前:sql mailto:sage [2009/04/21(火) 07:32:37 ID:???] >>340 出来たー!!有り難うございました
342 名前:NAME IS NULL mailto:sage [2009/04/21(火) 12:35:25 ID:???] MySQLには「SELECTしたものを、n件まで表示する」というのがあって便利だった。
343 名前:NAME IS NULL mailto:sage [2009/04/21(火) 12:52:45 ID:???] 何でもう過去形なんだよw
344 名前:NAME IS NULL mailto:sage [2009/04/21(火) 14:07:14 ID:???] それ SELECT TOP n とはどう違うの?
345 名前:NAME IS NULL mailto:sage [2009/04/21(火) 14:10:13 ID:???] limit x となら完全に同じ。 さらに、limit x, y で開始行まで指定することもできて便利・・・だった
346 名前:NAME IS NULL mailto:sage [2009/04/21(火) 19:08:36 ID:???] >>343 商用でMySQLという案件が無かったから。 自宅で試す程度で、あまり自信が無くてね。
347 名前:NAME IS NULL mailto:sage [2009/04/21(火) 20:36:56 ID:???] >>343 そりゃ、ORACLEさんに買われて、お先真っ暗ですから
348 名前:NAME IS NULL mailto:sage [2009/04/21(火) 20:39:16 ID:???] >>346 > 商用でMySQLという案件が無かったから。 OracleのSun買収でこのあたりどうなるかね? 共にSQLを拡張して互換性を取るような動きになると、ありがたいんだけども。
349 名前:NAME IS NULL mailto:sage [2009/04/21(火) 21:23:55 ID:???] IBM「ちょwwwwwwwwおまwwwwwwwSQL作ったの俺たちのとこの博士だしw」
350 名前:NAME IS NULL mailto:sage [2009/04/21(火) 21:26:34 ID:???] >>342 逆にそれできないDBMSって何?
351 名前:NAME IS NULL mailto:sage [2009/04/21(火) 21:28:21 ID:???] >>350 Derby
352 名前:達人 mailto:sage [2009/04/21(火) 21:47:59 ID:???] グルーピングは体で覚えるんだ ロールアップまで使いこなせるようになるとGood お偉いさん達は集計、小計、合計、率、比率、が気になってしょうがない生き物だから
353 名前:NAME IS NULL mailto:sage [2009/04/22(水) 07:05:44 ID:???] >>352 特に前年比がね〜 めんどうなんだよ! 頭の体操になるけどね
354 名前:NAME IS NULL mailto:sage [2009/04/22(水) 07:28:21 ID:???] orderみたいに、 そのままカラム名に指定するとエラーになってしまうカラム名を知りたいのですが、 どこかまとめてあるところご存じないでしょうか? ここで質問していいんでしょうかね;
355 名前:NAME IS NULL mailto:sage [2009/04/22(水) 07:31:56 ID:???] マニュアルどぞー
356 名前:NAME IS NULL mailto:sage [2009/04/22(水) 07:36:49 ID:???] >>354 なんとなくわからないけ? select *,order,where,select,group ,top,3 from from where where = order order by by みたいな事できたらキモイでしょ
357 名前:354 mailto:sage [2009/04/22(水) 07:39:40 ID:???] >>355 すみません・・・ マニュアルのどこらへんに書いてあるんでしょうか? >>356 orderとかselectはまだわかるのですが、 keyとかでもエラーになったので・・・ ちなみにMySQLです。
358 名前:NAME IS NULL mailto:sage [2009/04/22(水) 08:21:23 ID:???] >>354 「SQL 予約語」でググる。
359 名前:NAME IS NULL mailto:sage [2009/04/22(水) 11:52:01 ID:???] >>357 どこに書いてあるかも聞かないと分からないとは・・・・(驚愕)
360 名前:NAME IS NULL mailto:sage [2009/04/22(水) 12:36:03 ID:???] 自分が聞きたいことが何なのかが分からないことはよくある。
361 名前:NAME IS NULL mailto:sage [2009/04/22(水) 12:44:10 ID:???] 予約語、という言葉を知らないと探しにくいかもなあ
362 名前:NAME IS NULL mailto:sage [2009/04/22(水) 17:33:23 ID:???] そんなことより僕と踊りませんか
363 名前:NAME IS NULL mailto:sage [2009/04/22(水) 19:53:06 ID:???] 予約語でも”で括ると使えちゃったりするかも
364 名前:NAME IS NULL mailto:sage [2009/04/22(水) 20:54:11 ID:???] ``じゃなくてか
365 名前:NAME IS NULL mailto:sage [2009/04/22(水) 21:20:42 ID:???] (''ω'')ふひひ さーせん
366 名前:NAME IS NULL mailto:sage [2009/04/22(水) 22:45:19 ID:???] いいから舐めろ
367 名前:NAME IS NULL mailto:sage [2009/04/23(木) 07:11:30 ID:???] どのていど消費されるかわからない主キー(オートインクリメント)のデータ型を とりあえず全部BIGINTにしておくというのは、 なにかデメリットはありますか? ほかにもLONGTEXTなども、多めに取っておくと何か不都合があるのでしょうか?
368 名前:NAME IS NULL mailto:sage [2009/04/23(木) 08:24:59 ID:???] >>367 MySQLだよね? BIGINTのデメリットは消費データ量が4bytesから8bytesになること LONGTEXTはMEDUIMTEXTにくらべてカラムヘッダが2bytesから4bytesになる まあ2bytesとか4bytesをケチケチしなくていいと思う
369 名前:NAME IS NULL mailto:sage [2009/04/23(木) 12:06:21 ID:???] こういうのってできる? ○ テーブル1 1 aaa ○ テーブル2 aaa bbb aaa ccc ○ テーブル3 bbb xxx bbb yyy bbb zzz ccc kkk ○ 結果 1 aaa bbb xxx - --- --- yyy - --- --- zzz - --- ccc kkk
370 名前:NAME IS NULL mailto:sage [2009/04/23(木) 12:21:51 ID:???] >>369 joinの左外部結合(右外部結合) 該当する行にはデータが、該当しない行にはNULLが入る。 「---」というデータが作りたいなら、置換してください。
371 名前:369 mailto:sage [2009/04/23(木) 12:50:14 ID:???] >370 --- はNULLの意味です。 LEFT OUTER JOINだと、 1 aaa bbb xxx 1 aaa bbb yyy 1 aaa bbb zzz 1 aaa ccc kkk になりませんか? 重複している行をNULLなどにできないのでしょうか?
372 名前:NAME IS NULL mailto:sage [2009/04/23(木) 12:57:13 ID:???] - --- --- yyyだけ見ると1 a bbb yyyなのか1 a ccc yyyなのか わからないからねぇ。 >>369 の結果テーブルは順序を持っている事になるから、結構 難しいと思う。
373 名前:NAME IS NULL mailto:sage [2009/04/23(木) 15:32:34 ID:???] うーんお手上げです。 1回限りのデータなら、Excel使って手でデータ作った方が早いと思います。
374 名前:NAME IS NULL mailto:sage [2009/04/23(木) 16:16:38 ID:???] >>369 問題を単純化するために、 1 aaa 1 bbb 2 ccc 2 ddd 2 eee のテーブルを 1 aaa - bbb 2 ccc - ddd - eee と表示する方法から考えてみたら? SQLでできないこともないだろうけど、俺ならホストアプリ側で制御かな。 ホストアプリのメモリで扱いきれないデータ量なら、表示用の別テーブルを作成する。
375 名前:NAME IS NULL mailto:sage [2009/04/23(木) 20:32:18 ID:???] >369 達人の出番だなw
376 名前:NAME IS NULL mailto:sage [2009/04/23(木) 21:15:37 ID:???] >>369 row_number()が使えるなら 1じゃなかったらnull、的な感じでいけると思う
377 名前:NAME IS NULL mailto:sage [2009/04/23(木) 21:20:22 ID:???] row_numberでできるけどSQLでやることじゃないよなw
378 名前:NAME IS NULL mailto:sage [2009/04/23(木) 21:22:03 ID:???] 確かにw やりたきゃ取得した側でやれって話だな
379 名前:達人 mailto:sage [2009/04/23(木) 21:46:19 ID:???] まいど、達人だ。 俺の出番か、まかせとけ @.外部結合で表示(>>371 の表ね)、ソートし、各行に一意なID(オートナンバーとかROWNUMでいい)をふる。 結果は以下(列名を左から順に"ア","イ","ウ","エ","オ"とすし、このレコードセットを"ViewA"と名づけよう) ア イ ウ エ オ 1 aaa bbb xxx 1 1 aaa bbb yyy 2 1 aaa bbb zzz 3 1 aaa ccc kkk 4 A.ひとつ前の行と比較して表示するか判定する。具体的には以下。 SELECT DECODE(ZZZ.ア,(SELECT ViewA.ア FROM ViewA WHERE ViewA.オ-1=ZZZ.オ),NULL,ZZZ.ア) AS ア ,DECODE(ZZZ.イ,(SELECT ViewA.イ FROM ViewA WHERE ViewA.オ-1=ZZZ.オ),NULL,ZZZ.イ) AS イ ,DECODE(ZZZ.ウ,(SELECT ViewA.ウ FROM ViewA WHERE ViewA.オ-1=ZZZ.オ),NULL,ZZZ.ウ) AS ウ ,DECODE(ZZZ.エ,(SELECT ViewA.エ FROM ViewA WHERE ViewA.オ-1=ZZZ.オ),NULL,ZZZ.エ) AS エ FROM ViewA ZZZ ORDER BY 1,2,3,4 脳内ではできたが、実際にSQLは叩いてないからミス構文エラーかもしれん 少なくともヒントにはなっただろw
380 名前:NAME IS NULL mailto:sage [2009/04/23(木) 21:55:27 ID:???] 天才現る select '1', 'aaa', 'bbb', 'xxx' union all select null,null,null,'yyy' union all select null,null,null,'zzz' union all select null,null,'ccc ','kkk ' ;
381 名前:達人 mailto:sage [2009/04/23(木) 22:01:35 ID:???] へのつっぱりは、いらんですよ!! >380 おしい FROM DUAL
382 名前:NAME IS NULL mailto:sage [2009/04/23(木) 22:20:29 ID:???] Oracle厨房の心のよりどころDUALw
383 名前:NAME IS NULL mailto:sage [2009/04/23(木) 22:22:56 ID:???] 買収されたから、MySQLもDUALが強要されるように改悪されるかもしれんな。
384 名前:NAME IS NULL mailto:sage [2009/04/23(木) 22:27:24 ID:???] SCOTT, TIGER が入る日も近いな。
385 名前:NAME IS NULL mailto:sage [2009/04/23(木) 22:36:56 ID:???] まぁ、別にいいんじゃない?困る人は少ないと思うし
386 名前:NAME IS NULL mailto:sage [2009/04/23(木) 22:51:26 ID:???] こうか。 (テーブル1を(a, b)、テーブル2を(b, c)、テーブル3を(c, d)とする) select case when RN1 = 1 then a else null end, case when RN2 = 1 then b else null end, case when RN3 = 1 then c else null end, case when RN4 = 1 then d else null end from (select a, b, c, d, row_number() over (partition by a order by a,b) as RN1, row_number() over (partition by a,b order by a,b,c) as RN2, row_number() over (partition by a,b,c order by a,b,c,d) as RN3, row_number() over (partition by a,b,c,d order by a,b,c,d) as RN4 from テーブル1 inner join テーブル2 using (b) inner join テーブル3 using (c) ) ;
387 名前:達人 mailto:sage [2009/04/23(木) 23:08:45 ID:???] >386 Good。センスいい。
388 名前:NAME IS NULL mailto:sage [2009/04/23(木) 23:17:54 ID:???] しかし、本当にSQLに向いてない仕様だなw
389 名前:NAME IS NULL mailto:sage [2009/04/23(木) 23:48:28 ID:???] 達人の ”ひとつ前の行のレコードと比較する” ってテクはSQLでやれる事の可能性が広がったわ ってかホントにできんの?
390 名前:NAME IS NULL mailto:sage [2009/04/24(金) 00:17:55 ID:???] >>389 サブクエリに任意に連番を振ることが可能なら、可能だとは思う 思うが、今回の質問のようなものは俺ならやらない グループインジケーションはクライアントアプリの仕事だ ちゃんとしたレポートツールとかなら、そのぐらいの機能は大抵あるしな しかし、SQLの規則では、order by はサブクエリには書けなかったと思った なんで中間テーブルなりビューなりを用意しないとダメじゃないかな まあ、このへんはDBMSによって変わってくるだろうな partitionは使ったことない(というか使えるDBMS使ってないw)からよくわからん
391 名前:NAME IS NULL mailto:sage [2009/04/24(金) 00:28:05 ID:???] >>389 やりたい事がそれであればlag関数でスッキリ実現可能。 ただ>>369 をSQLで実現しようとすべきでは無いってのは自分も同意
392 名前:NAME IS NULL mailto:sage [2009/04/24(金) 00:40:01 ID:???] まぁ、SQLでやらなきゃならない事情があったんだろ いろんな事情があるからな。 アプリ改造したいがソースを紛失したとかw んで、SQLだけは外出ししてあったから直せるはずだろ、とか テーブルの中にSQLを格納してあってSQLでSQL文を取り出すシステムとかもあるんだぜ (データディクショナリとかそーゆーのじゃないくて)
393 名前:NAME IS NULL mailto:sage [2009/04/24(金) 01:25:56 ID:???] mysqlを触ろうとしてるんですが、 DELETE FROM xxx WHERE aaa= bbb AND ccc = (SELECT MIN(ccc) FROM xxx WHERE aaa= bbb) ↑を実行したらエラーになりました。 ググったら「mysqlは副問い合わせが出来ない」って出てきたんですが こういう場合、mysqlではどのようにやるのが常套手段なんでしょうか…
394 名前:NAME IS NULL mailto:sage [2009/04/24(金) 01:55:52 ID:???] 副問い合わせの結果をwhileやforeaceで回せばいいのでは
395 名前:NAME IS NULL mailto:sage [2009/04/24(金) 02:02:51 ID:???] >>394 どもです…ほんとに簡易sqlって感じなんですねぇorz
396 名前:NAME IS NULL mailto:sage [2009/04/24(金) 04:04:15 ID:???] >>395 version5.xでサブクエリ周りに機能追加なかったけ?
397 名前:NAME IS NULL mailto:sage [2009/04/24(金) 13:04:25 ID:???] MySQL(InnoDB)をperl-DBIで使ってます。 複数テーブルにわたる更新の場合はオートコミットを切ってトランザクション下で処理するんですが、 これはテーブルロックがかかってる状態ですよね? ほかのユーザーは該当テーブルについてリードはできるが更新はできない状態なんですよね? しかし、トランザクション中でもテーブルに書き込みできてるんですが、これはテーブルロックじゃなくて、行ロックを勝手にしてくれてるって事で良いんでしょうか?
398 名前:NAME IS NULL mailto:sage [2009/04/24(金) 16:35:56 ID:???] InnoDBは行ロックだよ
399 名前:NAME IS NULL mailto:sage [2009/04/25(土) 06:30:53 ID:???] >>395 >>396 サブクエリのDELETEはversion4.1からサポートしてますよ。
400 名前:NAME IS NULL [2009/04/28(火) 02:18:37 ID:aHnBfSXl] 株価データをDBに入れて保持してるんですが、今は1つの大きなテーブルに入れてます。 (trade_date DATE, stock_name int, market_type int, open double, close double) これ1個のテーブルで3000万件くらいになってます。しかも最近データの増える速度がどんどん 速くなってきた。 なにをやるにも時間がかかるので、テーブルをわけてしまおうかと思っているのですが、 銘柄単位でテーブルを分けるとテーブルが5000個とかになるし、 日にちでテーブルを分けると10000個近くになります。 両方をやると、データの冗長性があまりにもひどい気がします。 銘柄ごとでも日にちごとでも検索しまくるのですが、こういう場合どういう 形のテーブルにしておくのがよいでしょうか?
401 名前:NAME IS NULL mailto:sage [2009/04/28(火) 03:03:27 ID:???] >>400 カラムの意味と関連するテーブルのスキーマも見ないとわからん あとテーブル設計に関してはスレチじゃないか?
402 名前:401 mailto:sage [2009/04/28(火) 03:05:34 ID:???] こっちで聞いたほうがいいと思う pc11.2ch.net/test/read.cgi/db/1223458453
403 名前:NAME IS NULL [2009/04/28(火) 03:12:20 ID:aHnBfSXl] すいません、そっちで聞いてみます。
404 名前:NAME IS NULL [2009/05/09(土) 12:43:28 ID:JoxlLn6y] DELETE * FROM WHERE NAME LIKE "%ii%"; みたいなことをやりたいのですが、DELETEにはLIKEは使えないようなので、 ほかにやり方がないかと思っています。 どうかやり方がないか教えてください。
405 名前:NAME IS NULL mailto:sage [2009/05/09(土) 12:49:33 ID:???] 使えるだろ・・・。どこの DB だよ?
406 名前:NAME IS NULL mailto:sage [2009/05/09(土) 15:20:12 ID:???] >DELETE * FROM WHERE NAME LIKE "%ii%"; そもそもSQL文が間違ってないか? DELETE文は「DELETE FROM (テーブル名) WHERE (評価式)」だぞ
407 名前:NAME IS NULL mailto:sage [2009/05/09(土) 17:24:17 ID:???] DELETE * って DELETE id,nameとかできたら便利だなw
408 名前:NAME IS NULL mailto:sage [2009/05/09(土) 19:10:13 ID:???] *もいらなく無いっけ?
409 名前:NAME IS NULL mailto:sage [2009/05/10(日) 16:37:38 ID:???] DELETEする前に、まずSELECT文としてきちんと評価されているかを確認するのが鉄則。 DELETEしたくない行を消したことが何度あったことか_| ̄|○
410 名前:NAME IS NULL mailto:sage [2009/05/10(日) 16:39:31 ID:???] まあSELECTで表示させてから、SELECT * をDELETEに差し替えるわな
411 名前:NAME IS NULL mailto:sage [2009/05/10(日) 17:25:38 ID:???] updateにwhere付け忘れた あああああああああああああ
412 名前:NAME IS NULL mailto:sage [2009/05/10(日) 17:28:19 ID:???] (*´Д`)⊃ROLLBACK
413 名前:NAME IS NULL mailto:sage [2009/05/10(日) 18:04:04 ID:???] AUTO_COMMIT がえし!
414 名前:NAME IS NULL mailto:sage [2009/05/11(月) 09:55:08 ID:???] AccessではDELETE文に*つける。
415 名前:NAME IS NULL mailto:sage [2009/05/11(月) 10:20:32 ID:???] SQL SERVERの共通テーブル式でノードを辿る再帰クエリーを作成しているのですが、 ルートがループしているところがあります。 ループしている部分のデータの重複を避けたいのですが方法はありますでしょうか? UNIONやEXCEPTを使用しようと思ったのですがダメでした。
416 名前:NAME IS NULL mailto:sage [2009/05/11(月) 13:22:01 ID:???] Accessは削除クエリ作ると裏で勝手にDELETE *のSQL文が作られるけど SQLを手打ちするなら*なしでも普通に通るよ。
417 名前:NAME IS NULL mailto:sage [2009/05/11(月) 20:10:07 ID:???] 漠然とした質問で申し訳ないんですが、効率のよいSQLの書き方について勉強するためのよい本や資料はどのようなものがありますか。 たとえば、 select users.* from users, groups where users.group_id = groups.id and group.name = 'Admin'; と select users.* from users inner join groups on users.group_id = groups.id where group.name = 'Admin' と select users.* from users where users.group_id in (select id from groups where name = 'Admin') のどれがいちばん効率がいいのかということを、自分で実験して調べるのもいいですけど、先人の知恵を使って勉強したいです。 なにかお勧めの本などを紹介してください。
418 名前:NAME IS NULL mailto:sage [2009/05/11(月) 20:18:59 ID:???] あなたの言う効率とは?
419 名前:NAME IS NULL mailto:sage [2009/05/11(月) 20:43:39 ID:???] 単純に実在するテーブルで時間計測してみるとかでいいんじゃない? RDBMSごとの得意・不得意よりも、稼働しているDBの構成に大きく依存する。 しかも正解が他で通用するとも限らない。
420 名前:NAME IS NULL mailto:sage [2009/05/11(月) 21:01:36 ID:???] 普遍的に通用するセオリーみたいなのってほとんどないからねぇ どこでも通用するものだけに搾ったら本一冊も書けないんじゃない?
421 名前:NAME IS NULL mailto:sage [2009/05/11(月) 21:49:46 ID:???] >>417 他の人も言ってように、DBMSやその構成に依存するから、コレってものは知らないなぁ。 昔はどこかのサイトに「こう書け」って事例があったよ。 でも、今となってはほとんど通用しないのじゃないかな。 例えば>>417 の3つめのクエリは遅いクエリの代表みたいなものだったけど、 今じゃどれも一緒。IN述語の処理そのものが速くなったというよりも、 1つ目もしくは2つ目に書き換えて実行している。と考えた方がいい。 一番参考になると思うのは、実行プランを出力させてみること。 実際の処理時間だけを比較してみるのではなくて、 クエリがどのような手順で実行されるのかをも確認する。 そのうちに、どう書けば効率のいいクエリになるのかわかるようになる。 結合(JOIN)するときはテーブルの行数が、少ない行数同士、片方が多い、両方多い等によっても 結合方法などの実行プランが変わるから、実データでいろいろやった方がいい。
422 名前:NAME IS NULL mailto:sage [2009/05/11(月) 23:14:39 ID:???] DB2では人間が書いたSQL文が、RDBMSで自動的にどう解釈されているかが分かるログがあるよ。 単なるJOINであっても、内部的に挙動が異なる事があるとか、意外と考えさせられた。 今の自分は、自動化できる部分は全部自動化でいいと思ってる。
423 名前:NAME IS NULL mailto:sage [2009/05/11(月) 23:36:15 ID:???] ってか統計とってチューニングしながら実装しろよ
424 名前:NAME IS NULL mailto:sage [2009/05/11(月) 23:40:28 ID:???] よろしく、メガドック
425 名前:417 mailto:sage [2009/05/12(火) 00:24:43 ID:???] みなさん、いろいろありがとうございます。 結局、これといった資料はないというのが実情なんですね。 >>421 >例えば>>417 の3つめのクエリは遅いクエリの代表みたいなものだったけど、 >今じゃどれも一緒。IN述語の処理そのものが速くなったというよりも、 >1つ目もしくは2つ目に書き換えて実行している。と考えた方がいい。 ほしかったのはまさにこういうことが載っている本です。 explain でいろいろ調べたりするする前に、こういった先人の知識をあらかじめ知っておいた方がいいだろうと思ったのですが。 残念です。
426 名前:NAME IS NULL mailto:sage [2009/05/12(火) 00:26:52 ID:???] そのへん知りたかったら Oracleコンサル雇うしかないかもね 飯の種だからね
427 名前:NAME IS NULL mailto:sage [2009/05/12(火) 01:25:05 ID:???] >>417 かなり昔の本なら、プログラマのためのSQL って本があったんだが いかんせん古い 最近でその系統なら、アート・オブ・SQL とかどうだ というか、スレ違いだな、そういうスレなかったか?w
428 名前:NAME IS NULL mailto:sage [2009/05/12(火) 03:44:41 ID:???] >>417 最適化のノウハウの背後にある理屈を理解したいのであれば、英語 ず大丈夫ならRaghu Ramakrishnanの教科書がおすすめ。 オプティマイザも含めてデータベースに関わる理論を広く薄く網羅 した本なので、一冊持っておくとデータベースのある部分について 理屈を理解したくなった時にとっかかりとして大変便利なはずです。
429 名前:NAME IS NULL [2009/05/13(水) 07:18:50 ID:R4pv+GIi] 最近SQLの勉強を始めた者です。 VIEWって何のためにあるのかわかりません。結局いくつかのテーブルから自分の見たいカラムを 取ってきてJOINしているだけ(だからSELECTで同じことができるんじゃないか)という感じがするのですが、 VIEWの存在意義って何ですか?どういうケースで使うべきでしょうか?
430 名前:NAME IS NULL mailto:sage [2009/05/13(水) 09:52:33 ID:???] 俺的には、ワンクッションおけるってのが大きい。 Table A と B から View_C を作ってるとして、 アプリの方で、Select * From View_C としてるとする。 後で変更の必要があり、Table D と E から View_C を作ることに なっても、アプリの変更はいらないから。
431 名前:NAME IS NULL mailto:sage [2009/05/13(水) 20:54:09 ID:???] VIEWしか見れないユーザーであっても、テーブルの特定の行をいくらでも見れる。 (UPDATEやINSERTは不可) これが大きな利点であると思います。
432 名前:NAME IS NULL mailto:sage [2009/05/13(水) 21:12:28 ID:???] 前スレより転載(VIEWの利点・欠点) 734 名前:NAME IS NULL [sage] 投稿日:2009/02/05(木) 21:55:47 ID:??? >>731 こんなもんかな? 利点: ・クエリが(一見)単純になる ・あらかじめパフォーマンスチューニングしたVIEWを定義することで あとから書くクエリではパフォーマンスを考慮しなくて良くなる(場合がある) ・行や列ごとにセキュリティかけたい場合に使えたりする 欠点: ・あとからロジックを追うのが面倒(な場合がある) ・あとからパフォーマンスチューニングするのが面倒(な場合がある)
433 名前:NAME IS NULL [2009/05/13(水) 21:22:02 ID:raTYNme4] 質問させてください。 複合インデックスを作成する際のキーの順番って関係ありますか? またその場合はカーディナリティの高い順にするべきでしょうか? よろしくお願いします
434 名前:NAME IS NULL mailto:sage [2009/05/13(水) 21:40:28 ID:???] >>432 利点の上2つは労力全然減ってないように思うけど VIEWのSQL考えるかソースに書くとき考えるかの違いだけであって
435 名前:NAME IS NULL mailto:sage [2009/05/13(水) 22:00:33 ID:???] >>433 カーディナリが高い順が一般的だが、 それがパフォーマンスに影響するかどうかはDBMSによるかな。 なかにはOrcaleのCompress索引のように第1キーのカーディナリが 極端に低い場合専用の索引があったりします。
436 名前:433 [2009/05/13(水) 22:50:51 ID:raTYNme4] >>435 ありがとうございます。 もう1つよろしいですか? order byで使用する項目も基本的にはカーディナリティ順で良いのでしょうか? datetime型を想定しています。 すいません。書き忘れてました。 DBMS:MySQL5 です。
437 名前:NAME IS NULL [2009/05/13(水) 23:28:06 ID:R4pv+GIi] SELECT * FROM A,B WHERE 条件; と SELECT * FROM A INNER JOIN B ON 条件; って同じですか?
438 名前:NAME IS NULL mailto:sage [2009/05/13(水) 23:29:57 ID:???] 違います。
439 名前:NAME IS NULL [2009/05/13(水) 23:39:24 ID:R4pv+GIi] ありがとうございます。 どっちのクエリも、AとBの積を求めて、そこから条件を満たすレコードだけを 残すから同じ結果になりませんか?
440 名前:NAME IS NULL mailto:sage [2009/05/14(木) 20:25:28 ID:???] >>438 where条件で外部結合した場合、評価や結合順序で結果が変わるってのは聞いたことがあるんだが 内部結合でも同様のことが起こりえる? 結果の問題じゃなくて内部の動作の問題だっていうなら、 オプティマイザ次第な所があると思うんだ
441 名前:NAME IS NULL mailto:sage [2009/05/14(木) 21:13:41 ID:???] >>437 の最初のSQLの「条件」と後のSQLの「条件」が同じなら そもそも前者は結合してない
442 名前:NAME IS NULL mailto:sage [2009/05/14(木) 21:38:19 ID:???] 「条件」は同じって前提でしょ?(A.ID=B.IDとかで。) 前者は結合してないってどういう意味???
443 名前:441 mailto:sage [2009/05/14(木) 21:45:27 ID:???] ああ間違えた。忘れてくれ。
444 名前:NAME IS NULL mailto:sage [2009/05/14(木) 22:20:28 ID:???] 結論: >>437 は、「条件」が内部結合条件であるとき、 ・結果は同じ ・実行速度は違うかもしれんし同じかもしれん(オプティマイザ次第)
445 名前:440 mailto:sage [2009/05/14(木) 22:22:07 ID:???] >>441 ,443 条件式の内容が書かれてないから、必ずしも結合に関する条件を 書いてあるというわけじゃないかもしれないがな >441は直積は結合じゃないって言いたかったんじゃないかと思ったが 前者は直積とったテーブルをフィルタしてる 後者は条件に従った結合をする段階でフィルタする そういう意味で結合してない、じゃないのかな ただ、実際はオプティマイズ入るから直積とったようなワークなんぞつくらんだろうし、 内部結合においては同じ条件式なら同じ結果になる気がするんだが...ならない例があるかな?
446 名前:NAME IS NULL mailto:sage [2009/05/14(木) 22:38:43 ID:???] 初心者が読んだらいいようなサイトと本を教えてください。
447 名前:NAME IS NULL mailto:sage [2009/05/14(木) 22:40:51 ID:???] ここかな washitake.com/jp/
448 名前:NAME IS NULL mailto:sage [2009/05/14(木) 23:19:03 ID:???] >>438 の反応は、 結果は同じでも、そもそもそこに書いてあるSQL文は「違います」 というネタ的回答だと流してたわ。
449 名前:NAME IS NULL mailto:sage [2009/05/15(金) 02:51:17 ID:???] SQL文が違うんだからDBMSによっては 実行プランが異なる可能性もあるし、 実行プランが同一でもその作成過程が異なる、とかの 厳密な意味での「違います」だととったな、俺は。 あと、質問の内容からすると初心者っぽいから、 「結果が同じだからって、短絡的に同じだと思うなよ」と諌めたかったんでは。
450 名前:NAME IS NULL [2009/05/15(金) 09:56:31 ID:8Je7scRL] sqlStr = "select * from t_member where member_id = ○○"; ↓OR telephone1 = ○○"; これが出来るSQLを教えて欲しいです。
451 名前:NAME IS NULL [2009/05/15(金) 11:00:39 ID:8Je7scRL] 単純に select * from t_member where member_id=○○ or telephone=○○; でいいのかな??
452 名前:NAME IS NULL mailto:sage [2009/05/15(金) 12:34:47 ID:???] アプリ側の実装の問題では?
453 名前:NAME IS NULL mailto:sage [2009/05/15(金) 13:45:43 ID:???] アプリが何かで答えは変わるな
454 名前:NAME IS NULL [2009/05/15(金) 14:05:47 ID:8Je7scRL] javaでアプリを作っています。 DBはMYSQL5.0でnetbeansを使用してます。
455 名前:NAME IS NULL mailto:sage [2009/05/16(土) 13:46:01 ID:???] sstkn.blog87.fc2.com/
456 名前:NAME IS NULL mailto:sage [2009/05/18(月) 16:27:42 ID:???] ((レンタルテーブル)) レンタルID PRIMARY KEY, インベントリID FOREIGN KEY ((インベントリテーブル)) インベントリID PRIMARY KEY, 映画ID FOREIGN KEY ((映画テーブル)) 映画ID PRIMARY KEY 上記のようにレンタルテーブルはインベントリテーブルを、インベントリテーブルは映画テーブルをリファレンスしている場合に、 最も人気のある(レンタル数の多い)映画名を抜き出したいです。どのようなサブクエリを書けばいいでしょうか?
457 名前:456 mailto:sage [2009/05/18(月) 18:31:02 ID:???] すみません 上記の問題については出来ました。取り消します
458 名前:NAME IS NULL mailto:sage [2009/05/20(水) 11:27:51 ID:???] TSUTAYAの中の人だったら嫌だなw
459 名前:NAME IS NULL mailto:sage [2009/05/20(水) 12:39:11 ID:???] 実際ML見てるとこれ業務そのものじゃないかなぁって質問あるし あながち無いとは言えん
460 名前:NAME IS NULL [2009/05/21(木) 01:19:22 ID:216X3HC3] 左外結合 右外結合 ってそれぞれ何と読むんですか? 左外部結合、右外部結合のことみたいですが、買った教科書には上記のように記述されていました もう1つ、左、右外結合はどのようなところで使うのでしょうか? 概要はわかったのですが、あまり使われないような気がします・・・ よろしくお願いします
461 名前:NAME IS NULL mailto:sage [2009/05/21(木) 01:22:27 ID:???] sage忘れました すみません
462 名前:NAME IS NULL mailto:sage [2009/05/21(木) 01:29:06 ID:???] ダメだゆるさん
463 名前:NAME IS NULL mailto:sage [2009/05/21(木) 01:37:14 ID:???] 使いどころがわかりやすいよう、業務に即した例を挙げると、 勇者テーブル ・勇者ID ・勇者名 勇者が覚えた魔法テーブル ・勇者ID ・魔法名 というテーブルがあったとする。 「勇者名」と「それぞれの勇者が覚えている魔法の数」を知りたい場合、 内部結合だと勇者が魔法使いならいいが、勇者が戦士だった場合魔法を1つも覚えていない。 すると一覧には、戦士は名前自体出てこないことになる。 外部結合であれば、戦士であっても名前だけは出てくる。
464 名前:NAME IS NULL mailto:sage [2009/05/21(木) 01:38:21 ID:???] ありがちな業務だな。
465 名前:NAME IS NULL mailto:sage [2009/05/21(木) 01:42:06 ID:???] どんなシステムでもその2テーブルは外せないよな
466 名前:NAME IS NULL mailto:sage [2009/05/21(木) 02:18:54 ID:???] >>460 ひだりがいぶけつごう、みぎがいぶけつごう
467 名前:NAME IS NULL mailto:sage [2009/05/21(木) 19:16:46 ID:???] >>460 そんなしょうもない教科書は捨てて他のを買った方がいい
468 名前:NAME IS NULL mailto:sage [2009/05/21(木) 21:24:04 ID:???] ちょっと今1週間習ってて不安があるので質問です oracleでSQLを勉強してるんですが いまいち覚えられてない・・・ どれをやるにも見なきゃ出来ない。 今のレベルはこういう場合は確かこれとこれを使うんだよな・・・くらい。 シルバーの本を借りたんだがやったことではあるんだが応用?見たいな感じで さっぱりすぎてへこんだ
469 名前:NAME IS NULL mailto:sage [2009/05/21(木) 23:12:24 ID:???] いろいろ遊んでればそのうちに覚える
470 名前:NAME IS NULL mailto:sage [2009/05/21(木) 23:22:25 ID:???] 仕事でやってれば自然と覚えるよ。
471 名前:NAME IS NULL [2009/05/22(金) 02:03:38 ID:MrqDSeOc] PostgreSQL でプライマリキーで検索かけてるのに、インデックススキャンになりません。 現在 100万行チョイ入ってるテーブルで、こんなインデックスになってます。 Indexes: "txxx_pkey" primary key, btree (xxx_id) explain してみると以下の通りインデックスが使用されないようです。 # explain select * from txxx where xxx_id=100000; QUERY PLAN -------------------------------------------------------------- Seq Scan on teditlog (cost=0.00..49310.86 rows=1 width=193) Filter: (xxx_id = 100000) (2 rows) 実際に select すると秒単位で時間がかかります。 インデックスを使用させるにはどうしたらよいでしょうか?
472 名前:471 mailto:sage [2009/05/22(金) 02:11:25 ID:???] >>471 の explain 結果のテーブル名が生のまま出ていましたね。 teditlog は見なかったことにして、txxx と読み替えてください。 追加情報ですが、xxx_id は BIGINT で、おおむね連番のシーケンス番号が付いています(たまに歯抜けになります)。 で xxx_id は、他テーブルから外部参照されています。 といった感じですが、インデックスが使用されない原因になっていそうでしょうか。
473 名前:471 mailto:sage [2009/05/22(金) 02:52:55 ID:???] すみません、自己解決です。 該当カラムが BIGINT なので、検索したい値も BIGINT にしなくてはいけないようです。 つまり、 # explain select * from teditlog where elid=cast(100000 as bigint); QUERY PLAN -------------------------------------------------------------------------------- Index Scan using txxx_pkey on txxx (cost=0.00..3.04 rows=2 width=192) Index Cond: (xxx_id = 100000::bigint) (2 rows) ということらしいです。 単に 100000 と書いただけじゃ BIGINT とは扱ってもらえないんですね・・・ バージョンを確認したら PostgreSQL 7.4.7 なんですけど、新しいのだと改良されてたりするんでしょうか。 ところでこれにちなんだ追加質問ですが、列挙した値をまとめてキャストする方法ってあるでしょうか。 たとえば select * from txxx where xxx_id in (10000, 20000, 30000) なんてやる場合、(10000, 20000, 30000) の全部の値を BIGINT にキャストしたいです。 (CAST(10000 AS BIGINT), CAST(20000 AS BIGINT), CAST(30000 AS BIGINT)) みたいにしないといけないでしょうか。
474 名前:NAME IS NULL mailto:sage [2009/05/22(金) 04:08:54 ID:???] >>471 8系だと型が完全一致しなくてもインデックス使うみたいだよ
475 名前:NAME IS NULL [2009/05/22(金) 13:48:07 ID:BGl6oKa6] >>468 シルバーでSQLだと9i? 状況が許せば10gの方がいいと思うけど。 自分的には「現場で使うSQL」(だっけ?)がお勧め 最初うちは、考える+本を見るの繰り返しになるのは しょうがないんじゃないかな 基礎体力つけないと、なかなか応用力はつかん気がする
476 名前:NAME IS NULL mailto:sage [2009/05/22(金) 21:47:45 ID:???] ・MySQL 5.1.33です userID | groupID 1 | 1 2 | 1 3 | 1 4 | 2 5 | 3 5 | 3 列の一部が userID | groupID となっています groupIDに所属しているuserIDが1つのレコードを抜き出したいです。 上の表だと 4|2 のデータだけ抜き出せるでしょうか? GROUP BYをうまく使うのかな?と思って試したのですが、思い通りの結果が出ませんでした。
477 名前:NAME IS NULL mailto:sage [2009/05/22(金) 22:06:20 ID:???] group by groupID having count(userID) = 1
478 名前:NAME IS NULL mailto:sage [2009/05/22(金) 22:17:18 ID:???] ばっちりです! userIDとgroupIDの両方をGROUP BYしていたので COUNTでうまく数えられなかったようです。助かりました−
479 名前:NAME IS NULL mailto:sage [2009/05/23(土) 06:14:06 ID:???] MySQL 5.1.34を使ってます key data1 data2 data3 ----------------------- 1 a b c 2 a a c 3 c c a 4 b c b こういうテーブルから data1、data2、data3のいずれかにaが入っているものを取り出したいです。
480 名前:NAME IS NULL mailto:sage [2009/05/23(土) 07:31:25 ID:???] where data1 = 'a' or data2 = 'a' or data3 = 'a'
481 名前:NAME IS NULL mailto:sage [2009/05/23(土) 08:38:40 ID:???] >>479 SELECT * FROM TableName WHERE 'a' IN (data1,data2,data3);
482 名前:NAME IS NULL mailto:sage [2009/05/23(土) 11:10:48 ID:???] 例を出すなら、希望の検索結果(この場合keyの一覧)も書かないと伝わりにくいかもよ
483 名前:NAME IS NULL mailto:sage [2009/05/24(日) 01:15:19 ID:???] 質問です classA |__Name |__AAA |__BBB classB |__BBB |__Name |__CCC select * from classA naturaljoin classb; を実行すると Name BBB AAA CCC で中身が出力されると思うのですが、解釈としては両方にある列名が先に出てきて、 そのとき先に出てくるのはnatural join の前に指定した表通りの順 一致してない列名はnatural join の前に指定した表、次に後に指定した表 で出力される ということでよろしいのでしょうか? お願いします
484 名前:NAME IS NULL mailto:sage [2009/05/24(日) 01:19:35 ID:???] 順番気にするなら*使わないからわからん
485 名前:NAME IS NULL mailto:sage [2009/05/24(日) 01:47:43 ID:???] 実装依存入ってくるんじゃないのかなぁ。 ともあれコマンドラインから手打ちする場合はともかく、 プログラムにクエリ埋め込むときは絶対に*使わないから >>484 と以下同文。
486 名前:NAME IS NULL mailto:sage [2009/05/24(日) 02:00:34 ID:???] >>483 SQLでは、テーブル定義の列の順番は基本的に意味を持たないってのが原則 必要な場合は列リストを書いて指定する 俺の持ってる本ではその順番で出力されるようなことは書いてあるが、 それが定義された動作なのか実装に依存するのかは不明 >>484 が言うように、順番を指定したいなら*ではなく列リストを書くべき
487 名前:NAME IS NULL mailto:sage [2009/05/24(日) 02:01:20 ID:???] >>483 に対する答えとしては同意だけど、 >>485 > プログラムにクエリ埋め込むときは絶対に*使わないから なんで「絶対」? たいていの言語にはカラム名を配列などの添字で 扱えるから、場合によっちゃ * は十分ありだと思うけど。
488 名前:NAME IS NULL mailto:sage [2009/05/24(日) 02:07:30 ID:???] そうですかー わかりました まぁたぶんということで思ったとおりの解釈にします ところで、自分はMySQL5.0.67を使ってるのですが、 ・完全外部結合(A full outer join B) ・和集合(A union join B) ・共通集合(A intersect B) ・差集合(A except B) で構文エラーが出ます サポートしてないということでいいのですかねー? もし、MySQLの仕様がわかるようなページがあればURLお願いします バージョンアップを考えたいと思います
489 名前:NAME IS NULL mailto:sage [2009/05/24(日) 02:22:07 ID:???] >>487 スキーマ変わるとカラム数が変わってくるしDISTINCTとか 使っていると行数も変わってくるので。 そういう部分を曖昧にする積極的な理由もないので、基本*は 使っていません。 >>488 基本ここから追いかけて。 dev.mysql.com/doc/refman/5.1/ja/select.html あと目的がシステム開発じゃなくてSQLの勉強なのであれば MySQLよりPostgreSQLの方が良いよ。 こっちの方がSQL標準により対応しているので。
490 名前:NAME IS NULL mailto:sage [2009/05/24(日) 02:34:45 ID:???] >>489 勉強用に使ってます ポスグレですか 使ったことがないのでイマイチとっかかりにくいです^^; わざわざURLありがとうございます 見てみます
491 名前:NAME IS NULL mailto:sage [2009/05/24(日) 04:13:00 ID:???] >>487 俺も場合によってはありだと思うが とあるプロジェクトでselect * 禁止ってルールがあったことがあるな スキーマの変更がSQLに影響を及ぼすのを避ける 項目数の増減によるパフォーマンス変化を避ける が主な理由だった気がする まあ、プログラマ的立場からいえば、プログラム作らす前にDB設計終えとけとw
492 名前:NAME IS NULL [2009/05/24(日) 09:26:16 ID:p08hoVjs] >>490 本とセットなら、SQL鯖かOracle+現場で使うSQLがいいと思う PostgresベースのSQL勉強用の本、あまりいいのがない気がする #MySQLも同じ・・・・ #単なるお勉強しました じゃなくてその後の業務でも使えそうな本ね
493 名前:NAME IS NULL mailto:sage [2009/05/24(日) 16:48:38 ID:???] 最初にSQL鯖やOracleなんて覚えたら環境依存激しすぎて ああOracleだったらできるのにこれだからフリーのRDBMSはと愚痴る人間になっちゃうぞ
494 名前:NAME IS NULL mailto:sage [2009/05/24(日) 16:56:26 ID:???] そんなん何で始めても一緒。本人の資質次第だよ。 Postgresとかで始めても、やっぱり「Oracleは環境依存が激しすぎて」なんて 愚痴るようになる人だっているわけだし。
495 名前:NAME IS NULL mailto:sage [2009/05/24(日) 17:14:34 ID:???] う〜ん、もめていますが、>>489 で書いたのは >あと目的がシステム開発じゃなくてSQLの勉強なのであれば と限定した上で、 >MySQLよりPostgreSQLの方が良いよ。 >こっちの方がSQL標準により対応しているので。 と書いたのですが。最大公約数としての標準SQLを学ぶので あればMySQLよりPostgresがベターと言うだけの話であって、 システム開発にまつわる個別の実装の方言の問題はとりあえず 保留、で良いのではないでしょうか。 (参考書の書き方の問題もありますが。実践なんちゃら系の本は 標準と方言をちゃんと区別してないことが多いですし)
496 名前:NAME IS NULL mailto:sage [2009/05/24(日) 17:26:53 ID:???] 現場で使うSQLがそもそも標準SQLじゃなくてOracle/SQLServer依存なんだから駄目だろ
497 名前:NAME IS NULL mailto:sage [2009/05/24(日) 17:32:34 ID:???] いや、だから現場で使うとは誰も言っていないじゃないですか。
498 名前:NAME IS NULL mailto:sage [2009/05/24(日) 17:34:21 ID:???] どうでもいいスレ違いはやめにして、次の質問どうぞー
499 名前:NAME IS NULL [2009/05/24(日) 18:29:24 ID:p08hoVjs] 8.4からCTEも使えるし、そう違うとは思えないんだが>管理系は別 細かい部分の差異の読み替えは、慣れだしね どんな時にどうすればいいのか、の考え方の方が重要でしょ?
500 名前:NAME IS NULL mailto:sage [2009/05/24(日) 18:51:00 ID:???] >>497 "現場で使うSQL"っていう書籍名
501 名前:NAME IS NULL mailto:sage [2009/05/24(日) 22:05:42 ID:???] こういう場面で一度も話題に上らないDB2( ´・ω・)カワイソス
502 名前:NAME IS NULL mailto:sage [2009/05/24(日) 23:45:23 ID:???] Sybaseより見ないからなぁDB2
503 名前:NAME IS NULL mailto:sage [2009/05/24(日) 23:47:34 ID:???] 次期バージョンでは、PL/SQL が使えるらしいぞ
504 名前:NAME IS NULL mailto:sage [2009/05/25(月) 00:05:18 ID:???] うん。IBM社内的にもv9.xからv10.xになればいいじゃん、という声があったほど大きく変わった。 なのに「v9.7」
505 名前:NAME IS NULL mailto:sage [2009/05/25(月) 01:18:03 ID:???] PL/SQL使うならOracleでいいじゃんみたいな
506 名前:NAME IS NULL [2009/05/25(月) 07:43:45 ID:+IuRrIp9] Oracleからの移行狙いなんだろうね 商用のpostgresにも、そういうのなかったっけ? >>504 DLして試してみたいかも>後一ヶ月くらいか Express9.5 CentOS に入れて放置だわw
507 名前:NAME IS NULL mailto:sage [2009/05/25(月) 07:48:40 ID:???] ミドルウエアやERPがDB2に対応してくれないとそんなに移行しないだろ PL/SQLさえ動けばいいわけじゃないんだし
508 名前:NAME IS NULL mailto:sage [2009/05/25(月) 12:50:32 ID:???] また皆さん痛いところをつく(ノД`)
509 名前:NAME IS NULL [2009/05/25(月) 13:09:28 ID:+IuRrIp9] その通りなのだが、試してみたくね? SQL鯖メインだから、かんけーねーといえばそれまでなんだが 現行ではまず使うことないんだけど>DB2
510 名前:NAME IS NULL mailto:sage [2009/05/25(月) 19:42:08 ID:???] distinctで、かぶり無しで抽出したレコードを空白やカンマ区切りで結合するのは、 どのようにコードをかけばいいでしょうか? SELECT disctinct(種類) FROM 商品リスト レコードは 1 バナナ 果物 2 キャベツ 野菜 3 リンゴ 果物 4 イチゴ 果物 5 ニンジン 野菜 上では 果物 野菜 と2レコードで出るのですが、 果物 野菜 と1レコードで出したいです。
511 名前:NAME IS NULL mailto:sage [2009/05/25(月) 20:01:00 ID:???] SQLでは列の数が可変な問合せはできない ストアド使えばできなくもないけど アプリでやったほうがいいかと
512 名前:510 mailto:sage [2009/05/25(月) 20:06:02 ID:???] >>511 すいません、 もしややこしいこと書いていればすいません。 上では 果物 野菜 と2レコード 1フィールドで出るのですが、 「果物 野菜」 と1レコード 1フィールドで出したいのです。 1レコード2フィールドではないのですが、 前者ならできますでしょうか?
513 名前:NAME IS NULL mailto:sage [2009/05/25(月) 21:12:46 ID:???] ごちゃごちゃ言っても回答は同じ
514 名前:510 mailto:sage [2009/05/25(月) 21:21:43 ID:???] >>513 ・・・orz
515 名前:NAME IS NULL mailto:sage [2009/05/26(火) 11:42:13 ID:???] 煽りじゃなくて、少し入門書を読んだ方が良いね。 今のままじゃ、違和感ばかりたまって、いくらやっても向上しないよ。
516 名前:NAME IS NULL mailto:sage [2009/05/26(火) 20:37:27 ID:???] >>510 MySQLならGROUP_CONCAT あとは知らん。
517 名前:NAME IS NULL mailto:sage [2009/05/30(土) 15:41:24 ID:???] 昔Oracleでなんかの上位10個を検索して横に並べるってSQL見たことあるなぁ どんなんしてたっけなぁ やっぱプロシージャだったかな
518 名前:NAME IS NULL mailto:sage [2009/05/31(日) 10:03:59 ID:???] 数固定ならSQLだけで何とかならんこともない
519 名前:NAME IS NULL mailto:sage [2009/05/31(日) 14:49:09 ID:???] LIMIT 1 OFFSET 0 LIMIT 1 OFFSET 1 … いやなんでもない
520 名前:NAME IS NULL [2009/06/01(月) 00:06:43 ID:3TUTRBRK] 初心者です。どうか教えてください。 visual studio 2005をADOを通してデータベースmdbを接続し FPspreadへ表示できるようにしたいのですが全くわかりません。個人としては dim cnn as adodb.connection dim rs as adodb.recordset 'データベース接続したとする ここからアクセスデータを取得したいのですが SQL = "SELECT FROM * ;" rs.open(SQL, cnn) ????? ここからの文を作れずつまずいています。 SQL文からデータベースをスプレッドシートに表示するにはどういった構文に すべきでしょうか?
521 名前:NAME IS NULL mailto:sage [2009/06/01(月) 00:13:36 ID:???] スレ違い VB スレでも行け
522 名前:NAME IS NULL [2009/06/01(月) 00:15:27 ID:3TUTRBRK] わかりました。すみませんでした。
523 名前:NAME IS NULL mailto:sage [2009/06/01(月) 03:06:14 ID:???] SELECT FROM * ふいたwww
524 名前:NAME IS NULL mailto:sage [2009/06/01(月) 17:45:49 ID:???] ろ
525 名前:NAME IS NULL mailto:sage [2009/06/01(月) 19:00:30 ID:???] 辞めちゃった人間の作ったJETデータベースエンジンのMDBを引き継がされて テーブル名が*とかフィールド名がFROMとかSQLがSELECT [FROM] FROM [*]とかいう ウンコDBを書き換える仕事はもうイヤだお・・・
526 名前:NAME IS NULL mailto:sage [2009/06/02(火) 06:28:03 ID:???] FROM SELECT *
527 名前:NAME IS NULL mailto:sage [2009/06/02(火) 21:07:07 ID:???] 博士が泣いておられます
528 名前:NAME IS NULL mailto:sage [2009/06/02(火) 21:26:29 ID:???] select [where],[group by],count(where) from [from] where [order] is null group by [group by] order by [null] こういうのは?
529 名前:NAME IS NULL mailto:sage [2009/06/02(火) 23:15:09 ID:???] なんのナゾナゾだよw
530 名前:NAME IS NULL mailto:sage [2009/06/03(水) 22:21:44 ID:???] 質問します。 【DBMS名】Oracle 10g 【バージョン】申し訳ありません。不明です。 【テーブルデータ】 ID | DATE | DATA --+----------+----- 1 | 2009-05-11 | aaa 2 | 2009-06-01 | bbb 3 | 2009-06-10 | ccc 4 | 2009-06-12 | ddd 5 | 2009-07-19 | eee 【説明と欲しい結果】 このようなテーブルから、下記のように 2 | 2009-06-01 | bbb 3 | 2009-06-10 | ccc 4 | 2009-06-12 | ddd [DATE]が今月分のレコードのみを抽出するSQLの書き方を教えて下さい。 (システム日付は今日、2009/06/03とします) よろしくお願いします。
531 名前:NAME IS NULL mailto:sage [2009/06/03(水) 22:29:29 ID:???] 日付を yyyymm で取ってきて、200906 と同じかどうか。 あるいは、年が 2009、月が 6 のレコード。 日付操作関数を調べてね。
532 名前:NAME IS NULL mailto:sage [2009/06/03(水) 22:58:06 ID:???] 普通に DATE > '2009-06-00' 又は DATA >= '2009-06-01' でいいんじゃ?
533 名前:NAME IS NULL mailto:sage [2009/06/03(水) 23:02:21 ID:???] ヒント:trunc関数で月単位の切り捨てもできる
534 名前:530 mailto:sage [2009/06/03(水) 23:56:43 ID:???] >>531 >>532 >>533 ご回答ありがとうございます。 Oracleが手元にないので、実際に試せないのですが、 システム日付を「yyyymm」で取得して、 その後、[DATE]が先ほど取得したyyyymmで始まるかどうか、 を抽出条件に入れることで対応したいと思います。 これで永眠できます。
535 名前:NAME IS NULL mailto:sage [2009/06/04(木) 18:40:31 ID:???] 最近はじめたものなのですが 質問です。 SELECT*INTO 1○○ FROM 2○○ 1を2に挿入するってことなのですか? それとも2を1に挿入なのでしょうか? いまいちわからないので教えてください。初歩的で申し訳ないです
536 名前:NAME IS NULL mailto:sage [2009/06/04(木) 20:04:55 ID:???] SELECT じゃなくて INSERT じゃねえの? それともDBMS固有SQL?
537 名前:NAME IS NULL mailto:sage [2009/06/04(木) 21:09:22 ID:???] >>536 んー固有かどうかはわかないです。 他人の作ったACCESSのVBAコードだったんで・・・
538 名前:NAME IS NULL mailto:sage [2009/06/04(木) 21:17:57 ID:???] やってみればいいじゃん。
539 名前:NAME IS NULL mailto:sage [2009/06/04(木) 21:29:39 ID:???] SQL ServerとJetな。 INTO句で指定したテーブル名のテーブルがCREATEされるよ。 FROMがレコード抽出元テーブルの指定。
540 名前:NAME IS NULL mailto:sage [2009/06/04(木) 21:32:54 ID:???] え マジでこんな書き方許されるの?
541 名前:NAME IS NULL mailto:sage [2009/06/04(木) 21:39:28 ID:???] マイクロソフトだもん。
542 名前:NAME IS NULL mailto:sage [2009/06/04(木) 21:41:00 ID:???] SELECT INTO は PostgreSQLにもあるよ。
543 名前:NAME IS NULL mailto:sage [2009/06/04(木) 21:48:53 ID:???] 用途は全く違うがSELECT INTO はoracleにもある
544 名前:NAME IS NULL mailto:sage [2009/06/04(木) 21:54:09 ID:???] Oracleのはいくらなんでも別物だろう。
545 名前:NAME IS NULL mailto:sage [2009/06/04(木) 21:57:34 ID:???] PostgreSQLはSELECT INTOよりもCREATE TABLE ASが推奨されてなかったっけ?
546 名前:NAME IS NULL mailto:sage [2009/06/04(木) 21:58:41 ID:???] Oracleで意味的に同じものは CREATE TABLE AS SELECT
547 名前:NAME IS NULL mailto:sage [2009/06/04(木) 22:04:22 ID:???] >>545 これか? ttp://www.postgresql.jp/document/pg732doc/reference/sql-selectinto.html
548 名前:NAME IS NULL mailto:sage [2009/06/04(木) 22:23:13 ID:???] >>545 マニュアルにはそう書いてあるけど、>>539 と使い方は一緒だね。
549 名前:NAME IS NULL mailto:sage [2009/06/05(金) 00:45:46 ID:???] どなたか教えてください。 テーブルに ステータス、登録日、ID、… といった情報をもつレコードがあるとき IDでグルーピングして、複数のレコードが合ったときに @ステータス 90>30>20 の優先順位で高いほうのレコードを抽出。 A同じステータスの場合は、登録日が昔のものを抽出 ということを一つのSQL文でやりたいのですが、やり方が全くわかりません 助けてください…
550 名前:NAME IS NULL mailto:sage [2009/06/05(金) 01:18:06 ID:???] order by field(ステータス, 90, 30, 20), 登録日 とかでいいんでなくて?
551 名前:NAME IS NULL mailto:sage [2009/06/05(金) 07:50:28 ID:???] おお、ステータスはこうやるのですか ただ、これって、1レコードになるのでしょうか ちょいと試してみます。出来なかったらまた伺います。。。 イッテキマス
552 名前:NAME IS NULL [2009/06/05(金) 17:25:22 ID:5dMjVb/r] SELECT name from X where name LIKE '%キーワード%' → 文字列「キーワード」を含むname「キーワード1」「重要キーワード」など が選べます。 逆に、文字列「キーワード」に含まれるnameを選ぶようなSQL文はありますか? 「素敵なSQL文」 →文字列「キーワード」に含まれるname「キー」「ワード」「ワー」などを選ぶ。 となるような「素敵なSQL文」です。よろしくお願いします。
553 名前:NAME IS NULL mailto:sage [2009/06/05(金) 17:37:02 ID:???] >>552 逆にすればいいんじゃね。 SELECT name FROM X WHERE 'キーワード' LIKE '%'||name||'%';
554 名前:552 [2009/06/05(金) 18:13:38 ID:5dMjVb/r] ああああああああああああああああああ。 >>553 こんなことできたんですね。ありがとうございます。 (MySQLでは「||」はムリなのでしょうか。 '%'||name||'%'のかわりにconcat('%', name, '%')でイケました。)
555 名前:NAME IS NULL mailto:sage [2009/06/05(金) 21:04:27 ID:???] テーブル名をワイルドカード指定することは可能でしょうか? 例えば、A0,A1というテーブル名のテーブルがあった場合、 SELECT * FROM A*; のように、テーブル名をワイルドカード指定して、A0,A1の内容を参照したいのですが。
556 名前:NAME IS NULL mailto:sage [2009/06/05(金) 21:21:22 ID:???] >>555 無理。
557 名前:NAME IS NULL mailto:sage [2009/06/05(金) 21:23:01 ID:???] 出来たとしてどんな結果を期待してるんだろうな。 UNIONか?
558 名前:sage [2009/06/05(金) 21:28:43 ID:PrWmL95S] PRO*COBOL での プリコンパイラにて 「WHEN」の中に「式の記号」は書けない という旨のエラーがでます CASE WHEN col_1 = 1 THEN '○' WHEN col_1 = 2 THEN '×' ELSE NULL END WHEN の中に 「=」 が プリコンパイラでエラーとなります col_1 IN('1') としても、条件を逆にして col_1 <> '1' としても 「IN」、「<>」 が プリコンパイラでエラーとなります 実現したい条件は、 CASEが ネストで3階層あります CASE when col_1 = ' ' THEN CASE when col_2 = ' ' THEN CASE when col_3 <> ' ' THEN col_3 を比較条件のカラムにする END ELSE col_2 を比較条件のカラムにする END ELSE col_1 を比較条件のカラムにする END col_x =:INP_ID CASE WHEN を使わないで、上記の条件をどのように記述したらよいのでしょうか
559 名前:NAME IS NULL mailto:sage [2009/06/05(金) 21:29:42 ID:???] DB設計がとてつもなく汚い悪寒w
560 名前:NAME IS NULL mailto:sage [2009/06/05(金) 21:33:35 ID:???] スレ違いだな。COBOL スレでも行け。
561 名前:NAME IS NULL mailto:sage [2009/06/05(金) 21:34:49 ID:???] >>558 Pro*COBOLってことはOracleなんだろうから書けそうなもんだけど、 どうしても書けないなら where col_1 = なにか or (col_1 = ' ' and col_2 = なにか) or (col_1 = ' ' and col_2 = ' ' and col_3 = なにか) とかするしかないんじゃね?
562 名前:NAME IS NULL mailto:sage [2009/06/05(金) 21:34:54 ID:???] PRO*COBOLは知らんけど CASE col_1 WHEN 1 THEN みたいに書けんの?
563 名前:NAME IS NULL mailto:sage [2009/06/05(金) 23:41:07 ID:???] >>558 まずはそのSQLがSQL*Plusとかで通るかどうか試すべき
564 名前:sage [2009/06/06(土) 14:08:20 ID:4vB1BD0o] >>559 DBリンクを使って、他業者のDBのテーブルを判断なので 確かにDB設計が汚いです @@; >>561 ありがとうございます。その記述にして、やってみます >>563 SQL*PLUSでは、実行でき、ちゃんと望みどおりの検索結果が返ってきます
565 名前:NAME IS NULL [2009/06/07(日) 03:52:32 ID:BvTw+nDU] HEXの形式で入っている文字列を普通の文字に変換したいのですが 例) '31323334' →’1234’ どう書けばいいのでしょうか?DBはオラクル10gです
566 名前:NAME IS NULL [2009/06/07(日) 09:48:22 ID:H5yYzBMm] >>564 decode は?
567 名前:NAME IS NULL mailto:sage [2009/06/07(日) 11:48:09 ID:???] おしえてください。 ある整数の列があるとして、 昇順あるいは降順にソートしたものが 以下のようなデータだったとしてます。 1, 2, 3 , 10, 15, 60, 125, 524, 680 この結果の中において隣接する値と一番乖離している行番号を取得したいです。 どうすればいいでしょうか?
568 名前:NAME IS NULL mailto:sage [2009/06/07(日) 12:25:18 ID:???] >>567 「昇順時で次の値までが一番離れている」と受け取った。 LIMITクエリで手抜きだが。 SELECT num,(SELECT min(num) FROM Table AS T2 WHERE T1.num<T2.num) FROM Table AS T1 ORDER BY 2 DESC NULLS LAST LIMIT 1; NULLS LASTが使えないなら、2カラム目のサブクエリをCOALESCEで囲うか。
569 名前:NAME IS NULL mailto:sage [2009/06/07(日) 12:59:29 ID:???] >>567 select * from (select T1.ColumnName, min(T2.ColumnName), min(T2.ColumnName) - T1.ColumnName, row_number() over (order by min(T2.ColumnName) - T1.ColumnName desc) as RN from TableName T1 inner join TableName T2 on T1.ColumnName < T2.ColumnName group by T1.ColumnName) where RN = 1 ; 差が同じところが2箇所以上あっても1つしか選択されないので注意
570 名前:NAME IS NULL mailto:sage [2009/06/07(日) 13:41:40 ID:???] date_sub()でのintervalの指定に 変数や別テーブルからselectした結果を使いたいのですが、 mysql> select @x:='interval ''6'' month'; +----------------------------+ | @x:='interval ''6'' month' | +----------------------------+ | interval '6' month | +----------------------------+ 1 row in set (0.00 sec) mysql> select date_sub('2009-4-30', @x); ERROR 1064 (42000): You have an error in your SQL syntax 以上ではエラーになります。 クオート?かなにか必要なのでしょうか。 サーバはMySQL5.0を使っています。 お願いします。
571 名前:NAME IS NULL [2009/06/07(日) 14:07:44 ID:s0waBkcv] 揚げ
572 名前:NAME IS NULL [2009/06/07(日) 14:27:47 ID:FbuXSqjn] 567です。 >>568 >>569 お返事ありがとうございます。 MySQL5を使っているのですが、 例示していただいたコードではsyntax errorが出て あれこれと考えていました。 autoincrement列を追加し、その値を取得することで対処しようと 思います。 SELECT id,(SELECT min(num) FROM test_table AS T2 WHERE T1.num<T2.num)-num as diff FROM test_table AS T1 order by diff desc; ありがとうございました。
573 名前:NAME IS NULL mailto:sage [2009/06/07(日) 15:55:45 ID:???] >>565 昔やったときは文字単位でばらしてCHR()でがんばったなぁ。 なんでこんな基本的な機能がないんだろうって文句言いながら。 今ならあるのかな?
574 名前:NAME IS NULL mailto:sage [2009/06/07(日) 16:12:31 ID:???] >>567 はじめからDBいえよカス
575 名前:NAME IS NULL mailto:sage [2009/06/07(日) 18:30:30 ID:???] MySQL4.1.2(各文字コードはUTF-8)を使用し、形態素解析済みのカラムに対するFullText検索を試しているのですが、 SQLの書き方が悪いのか、結果が思うようにいきません。 検索ワードがひとつだとまずまずなのですが、ANDやOR・NOTといった複数語となると特に・・・ 例として「赤ちゃん」「権力者」をAND検索する場合ですが、どう書けばいいのでしょうか。 試しているSQL文は以下のような感じです。※「権力者」は分かち書きされて「権力 者」となっています。 (例1※おそらく間違い) SELECT * FROM some_table MATCH(some_column) AGAINST('+"赤ちゃん" +"権力 者" in boolean mode'); =>LIKE検索では結果は2件だが、131件ヒットする。 +や-記号が効いていないようで、上記「権力 者」の前の+を-に変えても結果は変わらない。 以下も同じで、LIKE検索に比べ数10件の誤差が出る(ワードにスペースが含まれない場合の例のつもり) SELECT * FROM some_table MATCH(some_column) AGAINST('+赤ちゃん +権力 in boolean mode'); (例2※LIKE検索っぽい書き方をしてみた) SELECT * FROM some_table MATCH(some_column) AGAINST('赤ちゃん') AND AGAINST('権力 者'); =>5件ヒットする。=>「赤ちゃん」しか含まない結果が3件ある&ググッてもこういう書き方をしてる例が見つからない すみませんがお願いします。
576 名前:NAME IS NULL mailto:sage [2009/06/07(日) 18:43:23 ID:???] MATCHってWHERE句なくても動くんだ?
577 名前:575 [2009/06/07(日) 18:53:06 ID:dWbdg2sE] >>576 申し訳ない、WHERE抜かしてました。正しくは (例1) SELECT * FROM some_table WHERE MATCH(some_column) AGAINST('+"赤ちゃん" +"権力 者" in boolean mode'); (例2) SELECT * FROM some_table WHERE MATCH(some_column) AGAINST('赤ちゃん') AND AGAINST('権力 者');
578 名前:NAME IS NULL mailto:sage [2009/06/07(日) 19:07:37 ID:???] >>575 FULL TEXTインデックスの説明 ttp://dev.mysql.com/doc/refman/4.1/ja/fulltext-search.html ttp://www.tatamilab.jp/rnd/archives/000389.html
579 名前:NAME IS NULL mailto:sage [2009/06/07(日) 19:09:18 ID:???] 'の位置を確認してみれ
580 名前:575 [2009/06/07(日) 19:25:16 ID:dWbdg2sE] >>578-579 おしえていただいたページは両方とも参考にしていました。 しかし・・・'の位置orz 以下の文で正しい結果(LIKE検索と同じ2件取得)となりました。 SELECT * FROM some_table WHERE MATCH(some_column) AGAINST('+"赤ちゃん" +"権力 者"' in boolean mode'); ありがとうございました!
581 名前:580 [2009/06/07(日) 19:27:03 ID:dWbdg2sE] くひっ。また間違えた・・・正しくは SELECT * FROM some_table WHERE MATCH(some_column) AGAINST('+"赤ちゃん" +"権力 者"' in boolean mode); です。
582 名前:NAME IS NULL mailto:sage [2009/06/07(日) 22:05:51 ID:???] まず落ち着こうよ。 読みやすい文章を書くのも大事なことです。
583 名前:NAME IS NULL [2009/06/10(水) 22:45:16 ID:zpAa6Yna] sqlserver 2000 を使っています。 varchar型の文字列に含まれる改行コードの数を出したいのですが、 何かいい方法はありませんか? 教えてください。
584 名前:NAME IS NULL mailto:sage [2009/06/10(水) 22:53:11 ID:???] 動く環境無いんで想像だけど replace(文字列,'\r\n','') と 文字列 のlengthの差で出るかな。
585 名前:NAME IS NULL mailto:sage [2009/06/10(水) 23:09:04 ID:???] 改行コード、数えて何したいかによるんじゃないのかな? 例えば、行数に応じて出力先の高さを可変にしたいとか この場合、無理してSQLでやらずに、ホストのプログラムでやった方が楽だと思うよ 改行コードで分割して配列に詰め込むような関数を使う(自作する)とかね
586 名前:NAME IS NULL [2009/06/10(水) 23:31:44 ID:zpAa6Yna] >>584 select replace(len(文字列,char(10),'')) - len(文字列) from テーブル で 取得できました! 今日1日中考えていたのでちょっと感動です。 ぐっすり眠れます。 ありがとうございます。 >>585 まさにそうなんです。行数で高さを調節したかったんです。 明日改行数を取得する関数を作ってみようと思います。 SQLでなんとか出せないかと視野が狭くなっていました。 もっと柔軟に考えなきゃいけませんね。 ありがとうございました。
587 名前:585 [2009/06/10(水) 23:35:59 ID:zpAa6Yna] くひっ。僕も間違えた・・・正しくは select len(文字列) - replace(len(文字列,char(10),'')) from テーブル です。
588 名前:NAME IS NULL mailto:sage [2009/06/11(木) 01:47:19 ID:???] >>587 落ち着けw それでもおかしいだろ。
589 名前:NAME IS NULL [2009/06/11(木) 22:39:02 ID:/TZVY2cm] SQL Serverを使用しています。 例えばselect * from INFORMATION_SCHEMA.COLUMNS のような内容をを特定の行だけ縦に表示するにはどう書いたらいいでしょうか? colmun data -------------------- table_name test colmun_name 番号 みたいな感じです
590 名前:NAME IS NULL mailto:sage [2009/06/12(金) 19:48:45 ID:???] 同じ行を何個もUNIONして… AP側でどうにかしろ
591 名前:NAME IS NULL mailto:sage [2009/06/13(土) 07:40:51 ID:???] だいたいSQLに「表示」なんて概念は・・・・
592 名前:NAME IS NULL mailto:sage [2009/06/13(土) 14:52:14 ID:???] >>589 select * from INFORMATION_SCHEMAしてアプリ側で調整
593 名前:NAME IS NULL mailto:sage [2009/06/15(月) 18:15:08 ID:???] おはずかしいのですが REPLACE 文に付いて教えください。 ID DATA -------- 1 258.9 2 350.6 3 426.9 -------- ID 2 の行を置き換えようと INSERT OR REPLACE INTO MYDB VALUES(2,330.8); これだと2の行が置換でなく追加されてしまうので悩んでいます。 今は DELETE 文発行して、INSERT しています。
594 名前:NAME IS NULL mailto:sage [2009/06/15(月) 18:21:40 ID:???] where ID = 2 が要るだろ普通
595 名前:NAME IS NULL mailto:sage [2009/06/15(月) 18:34:52 ID:???] >>594 早速ありがとうございます。 VALUES() の後では文法エラーになってしまって(悩中) WHERE 文の記述ヶ所教えていただけませんか?
596 名前:NAME IS NULL mailto:sage [2009/06/15(月) 18:56:42 ID:???] INSERT OR REPLACE も UPSERT(だったかな)もよくは知らないのだけど、 IDがプライマリーキーじゃないと拙いような気がする。 SQLは >>593 のままでも通りそうだけど。
597 名前:NAME IS NULL mailto:sage [2009/06/15(月) 18:59:05 ID:???] INSERT OR REPLACEなんていう気持ち悪い構文はSQLiteか? UPDATE文を使え
598 名前:NAME IS NULL mailto:sage [2009/06/15(月) 19:03:22 ID:???] >>596 あああ、PRIMARY KEY ・・ ありがとうございます。ID INTEGER PRIMARY KEY で置換しました。
599 名前:589 mailto:sage [2009/06/16(火) 16:30:36 ID:???] 遅くなったけどありがとう。 自前で処理することにします。
600 名前:NAME IS NULL [2009/06/17(水) 02:06:29 ID:tRvf1FDN] すみません、SQL初心者です。 下記のようにSQLを組んだのですが、「--エラー箇所」の場所で 「1つ以上の表が外部結合されています?」のようなエラーが発生してしまいます。 どのように修正したら良いか教えて下さい。 【やりたいこと】 CASE WHENで取得した、「A.コード1」または「A.コード2」に対応する「T.製品コード」が ない場合でも、レコードを弾かず、T.製品名を空としてレコードを取得したい。 (+)を外すとエラーは発生しないのですが、対応するコードがないデータが 弾かれてしまいます。 【環境】 オラクル8i + ASP --------------------------------------------------------------------------- SELECT A.KEY1, A.KEY2, T.製品名 FROM Aテーブル AS A, Bテーブル AS B, Cテーブル AS C, Dテーブル AS D, 取引テーブル AS T WHERE A.KEY1=B.KEY1 AND A.KEY1=C.KEY1 AND A.KEY1=D.KEY1 AND A.KEY2=B.KEY2 AND A.KEY2=C.KEY2 AND A.KEY2=D.KEY2 AND A.KEY3=T.KEY3 --エラー箇所 AND T.製品コード(+)= CASE WHEN (C.条件コード判定='1' OR C.条件コード判定='2') AND D.フラグ='1' THEN A.コード1 ELSE A.コード2 END ORDER BY A.KEY1, A.KEY2, A.製品名
601 名前:NAME IS NULL mailto:sage [2009/06/17(水) 07:43:42 ID:???] AND A.KEY3=(+)T.KEY3 がいるんじゃなかろか
602 名前:NAME IS NULL mailto:sage [2009/06/17(水) 13:08:02 ID:???] AND CASE WHEN T.製品コード(+)= CASE WHEN (C.条件コード判定='1' OR C.条件コード判定='2') AND D.フラグ='1' THEN A.コード1 ELSE A.コード2 END THEN 1 ELSE 0 END = 1
603 名前:600 mailto:sage [2009/06/17(水) 20:43:10 ID:???] >>601 、602 返信が遅くなって申し訳ない。 今環境がなく試せないのですが 後日試してみます。ありがとうございます。助かります。
604 名前:NAME IS NULL mailto:sage [2009/06/20(土) 04:58:00 ID:???] クエリについて質問があります。 レス内容が長くなってしまいすみませんが、説明に分かり辛い部分がありましたら補足しますのでどうかよろしくお願いします。 【質問テンプレ】 ・DBMS名とバージョン: SQLite 3 ・テーブルデータ:長いため下記に記載 ・欲しい結果:Mozilla Firefox 3.0.11のブックマークファイル(*.sqlite/SQLite 3)から特定の履歴(閲覧)を削除したいです。 ・説明:長いため下記に記載 ●テーブルデータ ================================================================================================================== ■moz_historyvisits | id | from visit | place id | visit date | visit type | session | ------------------------------------------------------------------------------------------------------------------ ■moz_places | id | url | title | rev host | visit count | hidden | typed | favicon id | frecency | ================================================================================================================== ●欲しい結果と説明 [moz_places]テーブルの[id]フィールドが、[moz_historyvisits]テーブルの[place id]フィールドと一致する場合に、 [moz_places]テーブルのレコードを削除したいです。 また、その際の追加条件として、[moz_places]テーブルの[url]フィールドに[www.test/] という文字列を含む場合は、 必ず削除、[www.example.com/*] または、[*.sqlite.localhost/*] という文字列を"含まない"場合も必ず削除、 それ以外の場合は削除しないという条件を付け加えたいです。 さらに、それと同時に上の条件で、[moz_places]テーブルからレコードを削除したら、[moz_historyvisits]テーブルの該当 レコード(idとplace idを比較して一致した[moz_historyvisits]テーブルのレコード)も削除したいです。 (>>80 さんが言っているような事をしたいです。) ●自分で調べて書けた一部 DELETE FROM moz_places WHERE id IN (SELECT place_id FROM moz_historyvisits) AND (url LIKE 'www.test/% ' OR (url NOT LIKE 'www.example.com/% ' AND url NOT LIKE '%.sqlite.localhost/% ')) ※[moz_historyvisits]テーブルのレコードを同時に削除するという方法が分からないです。 ・上のクエリは、長いので改行して投稿しました。 ・一応実行できたのですが、添削していただければ幸いです。 ●補足 1.データベースファイル名は、[places.sqlite]です。 2.[moz_historyvisits]テーブルの[place id]には、重複データが有ります。 3.Windows XP Professional SP3 (32bit版)で、PupSQLite・TkSQLiteというソフトで操作しています。 4.SQL(SQLite)については昨日あたりから調べ始めました。 (プログラミング言語については、JavaScriptとVBSだけは、なんとか調べて基本的な事だけは若干理解できる程度です。) 以上、どうかよろしくお願いします。
605 名前:604 mailto:sage [2009/06/20(土) 05:03:44 ID:???] 連続で失礼します。 Firefox3のデータベースの事について載っているサイトです。 ●places.sqlite テーブル情報等 builder.japan.zdnet.com/sp/firefox-3-for-developer-2008/story/0,3800087566,20380782,00.htm ■moz_historyvisits フィールド情報等 builder.japan.zdnet.com/sp/firefox-3-for-developer-2008/story/0,3800087566,20382307,00.htm ■moz_places フィールド情報等 builder.japan.zdnet.com/sp/firefox-3-for-developer-2008/story/0,3800087566,20380856,00.htm 他にも質問に不備等があれば補足しますので、どうかよろしくお願いします。
606 名前:NAME IS NULL mailto:sage [2009/06/20(土) 08:52:26 ID:???] >>604 標準SQLでは複数テーブルからのDELETEはできない。 どうしてもやりたければ参照整合性制約やトリガーを使うけど まあDELETE文2回でいいんじゃね?
607 名前:604 mailto:sage [2009/06/21(日) 01:52:54 ID:???] >>606 レスありがとうございます。 できれば、そのトリガー(もしくは参照整合性制約)というものを使って同時に削除したいです。 よろしければ、>>604 のクエリにトリガーという方法を加えたクエリを書いていただけますでしょうか? 下記のページを参考に調べているのですが、基本的な事しか理解できず複雑な式は分からず・・・。 net-newbie.com/sqlite/lang.html#createtrigger お時間のある時で構いませんので、お手数ですが再度レスをいただけると助かります。 どうかよろしくお願いします。
608 名前:NAME IS NULL mailto:sage [2009/06/21(日) 02:15:17 ID:???] sqliteを使ったことがないけどこれでいけるかな CREATE TRIGGER delete_history AFTER DELETE ON moz_places BEGEN DELETE moz_historyvisits WHERE id = OLD.id END
609 名前:NAME IS NULL mailto:sage [2009/06/21(日) 02:21:48 ID:???] 被るところだったw >>608 のDELETE文はFROMがいるんじゃね DELETE FROM moz_...
610 名前:604 mailto:sage [2009/06/21(日) 03:10:18 ID:???] >>608 ,>>609 レスありがとうございます。 ちょっとそこまでくると、サッパリで分からないのですが、 >>604 に書いた下記のクエリの下に追加すればいいのでしょうか? >●自分で調べて書けた一部 >DELETE FROM moz_places WHERE id IN (SELECT place_id FROM moz_historyvisits) > AND (url LIKE 'www.test/% ' > OR (url NOT LIKE 'www.example.com/% ' AND url NOT LIKE '%.sqlite.localhost/% ')) CREATE TRIGGER delete_history AFTER DELETE ON moz_places BEGEN DELETE moz_historyvisits WHERE id = OLD.id END バックアップ取ってから試してみたいと思いますが、よろしければ再度レスをいただければ幸いです。 何度もすみませんが、よろしくお願いします。
611 名前:604 [2009/06/21(日) 04:15:16 ID:Bz0yhBlW] 604です。 色々弄っていたところ、下記のクエリ文で動作しました。 多分。(汗 ●クエリ CREATE TRIGGER delete_history AFTER DELETE ON moz_places BEGIN DELETE FROM moz_historyvisits WHERE id = OLD.id; END; DELETE FROM moz_places WHERE id IN (SELECT place_id FROM moz_historyvisits) AND (url LIKE 'www.test/% ' OR (url NOT LIKE 'www.example.com/% ' AND url NOT LIKE '%.sqlite.localhost/% ')) 間違い等ありましたら、指摘していただけますでしょうか。 何度もレスをしてスレを伸ばしてしまってすみませんが、よろしくお願いします。
612 名前:NAME IS NULL mailto:sage [2009/06/21(日) 05:01:37 ID:???] DELETE FROM moz_places WHERE id IN (SELECT place_id FROM moz_historyvisits) AND (url LIKE 'www.test/% ' OR (url NOT LIKE 'www.example.com/% ' AND url NOT LIKE '%.sqlite.localhost/% ')) が実行されると、自動的に CREATE TRIGGER delete_history AFTER DELETE ON moz_places BEGIN DELETE FROM moz_historyvisits WHERE id = OLD.id; END; が走る。 これがトリガね。
613 名前:NAME IS NULL mailto:sage [2009/06/22(月) 07:19:19 ID:???] 333.ooo.amigasa.jp/
614 名前:604 mailto:sage [2009/06/23(火) 00:49:07 ID:???] 返事が遅れてすみません。 >>612 レスありがとうございます。 なんとなく分かったような気がします。(・ω・;) ただ、間抜けな事をしていて消すテーブルが逆でした。(爆 ただ今、修正中なのです。 回答・アドバイス等いただいた方々に大変感謝しています。 この度は色々とどうもありがとうございました。
615 名前:NAME IS NULL mailto:sage [2009/06/23(火) 16:46:57 ID:???] テーブルが作成されているかを確認する標準的な方法はあるでしょうか。 mysqlならCREATE DATABASE IF NOT EXISTSでいけるのですが。
616 名前:NAME IS NULL [2009/06/23(火) 22:02:19 ID:Lck5HQZ4] テーブル一覧のプロパティのファイルグループ名を クエリで取得することって出来ますか?
617 名前:NAME IS NULL mailto:sage [2009/06/23(火) 22:05:06 ID:???] スレ違い。
618 名前:NAME IS NULL [2009/06/24(水) 11:02:20 ID:cpDMBc2F] 以下のように、AとBのカラムがあるHOGEと言うテーブルがあったとして、 AとBのカラムを見てユニークなものだけをカウントするにはどういうSQL書けばいいでしょうか? DBMSはMySQL5.0.67です。 A|B (TABLE HOGE) -+- 1|2 3|5 7|3 この場合、1,2,3,5,7,9 9|5 よって、その合計の「6」が答え
619 名前:NAME IS NULL mailto:sage [2009/06/24(水) 17:00:53 ID:???] 指定のMySQLで出来るかどうかは知らん select count(distinct *) from (select A from HOGE union all select B from HOGE) as X
620 名前:NAME IS NULL mailto:sage [2009/06/25(木) 12:44:02 ID:???] SQLって統一規格じゃないんですか? 独自SQLのようなものがあるんですか?
621 名前:NAME IS NULL mailto:sage [2009/06/25(木) 12:48:35 ID:???] ある程度の機能と用件を満たせば準拠。 プログラミング言語と比べるとSQLは独自色が強い。
622 名前:NAME IS NULL mailto:sage [2009/06/25(木) 22:29:16 ID:???] 統一規格はあるけど、方言に頼るところも多い。 文字列変換や時刻関数等はほとんど方言だな。 oracleの外部結合の方言はひどいw
623 名前:NAME IS NULL mailto:sage [2009/06/25(木) 23:23:34 ID:???] オラクルの外部結合って、SQL92が出てくる前からあったんじゃなかったけ。 各ベンダーの独自拡張があって、その後の標準化だから、 互換性のために方言として残るのは仕方ないだろう。
624 名前:NAME IS NULL mailto:sage [2009/06/25(木) 23:24:48 ID:???] DB2 に truncate 相当の機能が無いのには驚いた。 良い悪いって話じゃないけど。
625 名前:NAME IS NULL mailto:sage [2009/06/27(土) 23:05:42 ID:???] 下のようなテーブルでIDが1のDATEの新しい順に10個取得したいのですが、もっと早くできる書き方はないでしょうか IDにはインデックスが無く、DATEはインデックスがあります。 mysql 5.0.51aです ID | DATE --+---------- 1 | 2009-01-11 2 | 2006-01-01 1 | 2006-11-10 3 | 2008-07-12 SELECT * FROM table WHERE id = 1 ORDER BY DATE DESC limit 10
626 名前:NAME IS NULL mailto:sage [2009/06/28(日) 02:18:02 ID:???] >>625 id = 1で検索してるから、idにインデックス付けてみたら? で、実行計画取ってみて、インデックスの有無で変化があるか確認してみて
627 名前:NAME IS NULL mailto:sage [2009/06/28(日) 04:28:48 ID:???] IDの意味解って付けてんのかよ
628 名前:NAME IS NULL [2009/06/28(日) 13:31:46 ID:tWKLIY9h] もちろん、IDはプライマリキーです。 とかね。
629 名前:NAME IS NULL mailto:sage [2009/06/28(日) 14:38:30 ID:???] あるあるw
630 名前:625 mailto:sage [2009/06/28(日) 18:03:08 ID:???] 問題をわかりやすくするため単純にしたつもりだったのですが 横着してテンプレのものを流用したため、逆に誤解を招く書き方になったようですいません。 ほかで聞くことにします。失礼しました
631 名前:NAME IS NULL mailto:sage [2009/06/28(日) 18:38:29 ID:???] Y!知枝袋にでも逝っておいで
632 名前:NAME IS NULL mailto:sage [2009/06/28(日) 22:12:36 ID:???] つか、そこまで単純にしてしまって、 速度に差が出るほどバリエーションのある書き方できると思ってたのか?
633 名前:NAME IS NULL mailto:sage [2009/06/28(日) 22:45:55 ID:???] 相変わらず厳しいやつらだ
634 名前:NAME IS NULL mailto:sage [2009/06/29(月) 00:57:01 ID:???] SQL Serverでストアドつくろうとしてるけど、 アプリからストアドに渡す引数がいっぱいあるんだけど普通? これってアプリでやるべきじゃねぇのか。 アプリにするかストアドにするかの基準を教えてくれ。
635 名前:NAME IS NULL mailto:sage [2009/06/29(月) 00:59:57 ID:???] ここはSQL文を語るスレ
636 名前:NAME IS NULL mailto:sage [2009/06/29(月) 01:04:31 ID:???] 引数がいくつでもスピード重視ならストアドにするんじゃない? まあ、スレチ。
637 名前:NAME IS NULL mailto:sage [2009/06/29(月) 11:21:17 ID:???] Postgresql v8.3で 商品(商品番号(int),商品名(char)) 分類(分類番号(int),分類名(char)) 取り扱い(商品番号(int),分類番号(int),取り扱い時期(int)) という3つの表を 商品情報(商品番号,分類番号,商品名,分類名,取り扱い時期)という 一つの表集合として結合(4個目の表として存在させる)したいのですが、方法が良く分かりません。 新しく表を定義するのであればcreate tableかなと思ったのですが、表を結合表示させるときは selectを使っていましたし、create tableとselectをどうやってつなぎ合わせるのか見当もつきません。 ヒントだけでも構いませんのでご教示願います。
638 名前:NAME IS NULL mailto:sage [2009/06/29(月) 12:20:27 ID:???] create table 商品番号 (〜〜〜) insert into 商品番号 select 商品番号, 分類番号, 〜〜〜 from 〜〜 natural join 〜〜 natural join 〜〜 的な感じでいいんんじゃないの?postgres知らんけど
639 名前:NAME IS NULL mailto:sage [2009/06/29(月) 12:37:24 ID:???] MySQLです、↓のようなSQL文がありまして SELECT DISTINCT aaa.*, bbb.name FROM {table_a} aaa LEFT JOIN {table_b} bbb ON aaa.uid = bbb.uid INNER JOIN {table_c} ccc ON aaa.snid = ccc.snid これにaaa.mailが第四のテーブル({table_d} ddd)のddd.mailと一致しないものを抽出という条件を追加したいのですが どういう風にすればいいでしょうか?
640 名前:NAME IS NULL mailto:sage [2009/06/29(月) 13:56:06 ID:???] 度々すみません・・・。 >>637 について、 create table 商品情報( 商品番号 int, 分類番号 int, 商品名 char(20), 分類名 char(50), 取り扱い時期 int ) insert into 商品情報 select 商品番号,分類番号,商品名,分類名,取り扱い時期 from 商品 natural join 分類 natural join 取り扱い natural join; とやってみたのですが、どうもエラーになってしまいます。 insert付近でのエラーとなっているのですが、 insertとcreateを分けてしまうと、createまでは通っても、 insertで既に存在する表の作成云々というエラーになってしまいますし、 表の趣旨も全く意味をなさないものになってしまいます。 どこをどのように修正すればよいのでしょうか? 宜しくお願い致します。
641 名前:NAME IS NULL mailto:sage [2009/06/29(月) 17:00:39 ID:???] VIEW作るんじゃいかんの?
642 名前:NAME IS NULL mailto:sage [2009/06/29(月) 20:37:15 ID:???] >>640 最後の natural join が余計。 つか、キーワードが分かったら自分でマニュアル読んでみれ。
643 名前:NAME IS NULL mailto:sage [2009/06/29(月) 21:25:23 ID:???] >>640 恒常的に見るのであれば、 craete view 商品情報(・・・・) select 〜
644 名前:NAME IS NULL mailto:sage [2009/06/30(火) 16:11:55 ID:???] 実体作りたいって言ってんだろカス
645 名前:NAME IS NULL mailto:sage [2009/06/30(火) 16:39:18 ID:???] 結合したいっていう話しか出てないだろ 人の話はちゃんと読め
646 名前:NAME IS NULL mailto:sage [2009/07/01(水) 03:12:25 ID:???] >一つの表集合として結合(4個目の表として存在させる)したいのですが >一つの表集合として結合(4個目の表として存在させる)したいのですが >一つの表集合として結合(4個目の表として存在させる)したいのですが >一つの表集合として結合(4個目の表として存在させる)したいのですが >一つの表集合として結合(4個目の表として存在させる)したいのですが >一つの表集合として結合(4個目の表として存在させる)したいのですが
647 名前:NAME IS NULL mailto:sage [2009/07/01(水) 06:52:40 ID:???] >>646 うん。だからviewでいいよね。
648 名前:NAME IS NULL mailto:sage [2009/07/01(水) 10:48:26 ID:???] 元質問者はVIEWの存在を知っているのかどうかが知りたいところではある
649 名前:NAME IS NULL mailto:sage [2009/07/01(水) 10:57:35 ID:???] ある時点のスナップショットをとりたい=>ワークテーブル 複数テーブルの結合結果を表として扱いたい=>VIEW どちらをやりたいのかによるな
650 名前:NAME IS NULL mailto:sage [2009/07/01(水) 11:16:04 ID:???] >>647 よくない。SQL初心者?
651 名前:NAME IS NULL mailto:sage [2009/07/01(水) 12:08:55 ID:???] >>650 横からすみませんが、「ちゃんと読め」とか「よくない」とか文句だけ言うよりは、 自分で回答を示せば良くないですか?
652 名前:NAME IS NULL mailto:sage [2009/07/01(水) 12:35:29 ID:???] >>639 動作未確認だけど、WHERE句で条件付けるのはダメ? WHERE NOT EXISTS( SELECT * FROM {table_d} ddd WHERE ddd.mail = aaa.mail )
653 名前:639 mailto:sage [2009/07/01(水) 14:03:32 ID:???] >>652 行けました、NOT EXISTSという使い方があったんですね 前任者の書いたSQLに処理を追加する作業だったんですが安請け合いして後悔し始めたところです dくすでした
654 名前:NAME IS NULL mailto:sage [2009/07/01(水) 18:05:32 ID:???] 細かい話だけどNOT EXISTS ならSELECT 1 とかすべき
655 名前:NAME IS NULL mailto:sage [2009/07/01(水) 18:12:21 ID:???] 細かい話だけど最近のRDBMSならSELECT *で十分最適化されるよ
656 名前:NAME IS NULL mailto:sage [2009/07/01(水) 21:55:46 ID:???] むしろ*のほうがいい
657 名前:NAME IS NULL mailto:sage [2009/07/02(木) 16:10:37 ID:???] で、どっちが正解?
658 名前:NAME IS NULL mailto:sage [2009/07/02(木) 17:13:52 ID:???] >>657 昔は定数の方が速かった。今は * の方が速い時もある。
659 名前:NAME IS NULL mailto:sage [2009/07/03(金) 11:43:01 ID:???] なるほど
660 名前:NAME IS NULL mailto:sage [2009/07/03(金) 18:05:06 ID:???] 教えてくだせー >>4 で、例えば最新の3件を抽出するにはどうしたらいいですか?
661 名前:NAME IS NULL mailto:sage [2009/07/03(金) 18:10:02 ID:???] top n とかrow_number()とかrownumとか。 DBMSの種類によって書き方が違う。
662 名前:660 mailto:sage [2009/07/03(金) 22:18:56 ID:???] >>661 ありがとう ちょっとやってみます
663 名前:NAME IS NULL mailto:sage [2009/07/06(月) 21:30:55 ID:???] MSDEのData更新に困っております AccessプロジェクトよりCSVファイルをインポートして DataBase作成しているのですが、インポート先のCSVファイルは 常に更新されています AccessプロジェクトのData更新の為、インポートを行うと 重複したDataになります・・・・ 重複しないクエリもしくはVBEはないでしょうか?
664 名前:NAME IS NULL mailto:sage [2009/07/06(月) 22:18:16 ID:???] まず「インポート」の意味から勉強してこようぜ 話はそれからだ。
665 名前:NAME IS NULL mailto:sage [2009/07/07(火) 06:37:53 ID:???] importの前にdeleteすればOKだね はい 次
666 名前:NAME IS NULL mailto:sage [2009/07/07(火) 09:46:04 ID:???] >>663 MSDEどこいった?
667 名前:NAME IS NULL mailto:sage [2009/07/07(火) 17:00:45 ID:???] −データベース桐からの挑戦− 「販売管理とか会計システムとかのSQLの例書いてみろよ」 だそうです。 ttp://pc11.2ch.net/test/read.cgi/db/1057318214/699
668 名前:663 mailto:sage [2009/07/07(火) 20:04:57 ID:???] 申し訳御座いませんマルチしておりました 反省しております >>665 さん AccessプロジェクトのDataをdeleteしましたができませんでした 別のやり方があるのでしょうか・・・ MDBの様にリンクできればよいのですが
669 名前:NAME IS NULL mailto:sage [2009/07/08(水) 09:44:54 ID:???] >>668 あっちのスレでもいっぱい返事もらってるのに 並行で進めるのはやめれ
670 名前:NAME IS NULL mailto:sage [2009/07/08(水) 17:28:50 ID:???] >>669 質問の内容はどうでもいいことばかり。 だれかれに構って欲しいのさ。 あちこちに書くのは、2chに張り付いてるからだろ。 とにかくかまって欲しいんだよ。
671 名前:NAME IS NULL [2009/07/09(木) 14:22:20 ID:I1RDXwu9] postgresSQLを使っているのですが、以下の問題がわかりません。 以下の順序で列を表示するビュー定義を考え実行する 支払金額、明細
672 名前:NAME IS NULL mailto:sage [2009/07/09(木) 14:57:50 ID:???] >>671 宿題は自分で解く。 順序の指定は ORDER BY
673 名前:NAME IS NULL mailto:sage [2009/07/09(木) 15:14:05 ID:???] SQL Server 2005 互換性レベル8.0(2000)です。 別テーブルに問い合わせて、条件に該当するレコードが存在するかどうかを、列に表示したいのです。Boolで。 SELECT CM.CustomerID, CM.CustomerName, FlagUriage = ( CONVERT( bit, ( SELECT COUNT(*) FROM UriageData UD WHERE UD.Nendo = 2008 and UD.CustomerID = CM.CustomerID ) ) ) FROM Customer CM ORDER BY CustomerID 現在は、このように件数をCountしたのをbitにConvertしてますが、これでいいんですかね。 EXISTS を使えば、booleanを返すのだから、 FlagUriage = ( EXISTS ( SELECT * FROM UriageData UD WHERE UD.Nendo = 2008 and UD.CustomerID = CM.CustomerID ) ) のようにすればよさそうだけどエラーになる。 キーワード 'EXISTS' 付近に不適切な構文があります。 一番りこうな書き方は何ですか。
674 名前:NAME IS NULL [2009/07/09(木) 15:58:07 ID:H2IBJWq1] >>673 どういう文脈で使いたいのかいまいち分からないけど TSQL内で使うならIF SQL分だけで使うならcoalesceでよくない?
675 名前:NAME IS NULL mailto:sage [2009/07/09(木) 15:59:19 ID:???] 利口ってか、早いのは実行計画とってみないとわからん 外部結合してNULLかどうか判定するとかが一般的じゃないかな あとはUNION使って SELECT ..., 1 as FlagUriage WHERE ... UNION SELECT ..., 0 as FlagUriage WHERE not ... とか
676 名前:NAME IS NULL mailto:sage [2009/07/09(木) 17:43:54 ID:???] >>673 SQL鯖はよく知らないが > FlagUriage = ( CONVERT( bit, ( SELECT COUNT(*) FROM UriageData UD WHERE UD.Nendo = 2008 and UD.CustomerID = CM.CustomerID ) ) ) > FlagUriage = ( EXISTS ( SELECT * FROM UriageData UD WHERE UD.Nendo = 2008 and UD.CustomerID = CM.CustomerID ) ) なにこれ? よっとして (CONVERT .....) AS FlagUriage と同じことなのかな? COUNT(*)するよりEXISTSの方が良さそうなので、 CASE WHEN EXISTS ( SELECT * FROM UriageData UD WHERE UD.Nendo = 2008 and UD.CustomerID = CM.CustomerID ) THEN 'あり' ELSE 'なし' END で動かないかな?
677 名前:NAME IS NULL mailto:sage [2009/07/15(水) 14:14:11 ID:???] MySQL 5.0.45で質問です。 webのアクセスログをDBに格納しており 以下の様なTABLEになります。 FILE | DATETIME -----+--------------------- aa.txt | 2007-11-01 00:05:10 aa.txt | 2007-11-01 06:02:00 bb.txt | 2007-11-01 02:30:30 aa.txt | 2007-11-02 10:15:15 aa.txt | 2007-11-02 15:30:00 cc.txt | 2007-11-03 10:05:50 これを以下の様に、ファイルの日毎のアクセス数(COUNT)を 取得したいと思っていますが、どのようにSQLを書けば良いでしょうか? FILE | DATE | COUNT -----+-------+------- aa.txt | 11-01 | 2 aa.txt | 11-02 | 2 aa.txt | 11-03 | 0 bb.txt | 11-01 | 1 bb.txt | 11-02 | 0 bb.txt | 11-03 | 0 cc.txt | 11-01 | 0 cc.txt | 11-02 | 0 cc.txt | 11-03 | 1 理想は以下のようになれば良いですが、上記のようになってくれれば あとはプログラムで対応したいと思ってます。 FILE | 11-01 | 11-02 | 11-03 -----+------+-----+------ aa.txt | 2 | 2 | 0 bb.txt | 1 | 0 | 0 cc.txt | 0 | 0 | 1
678 名前:NAME IS NULL mailto:sage [2009/07/15(水) 14:26:41 ID:???] mysql> select date_format(hiredate, '%m-%d'), count(*) from emp group by date_format(hiredate, '%m-%d'); +--------------------------------+----------+ | date_format(hiredate, '%m-%d') | count(*) | +--------------------------------+----------+ | 01-23 | 1 | | 02-20 | 1 | | 02-22 | 1 | | 04-02 | 1 | | 04-19 | 1 | | 05-01 | 1 | | 05-23 | 1 | | 06-09 | 1 | | 09-08 | 1 | | 09-28 | 1 | | 11-17 | 1 | | 12-03 | 2 | | 12-17 | 1 | +--------------------------------+----------+ 13 rows in set (0.00 sec)
679 名前:NAME IS NULL mailto:sage [2009/07/15(水) 14:46:18 ID:???] このSQLはあまり性能がよくないので気をつけてね
680 名前:NAME IS NULL mailto:sage [2009/07/15(水) 15:02:23 ID:???] レスありがとうございます ただファイル毎の統計が欲しかったので以下のようにしてみました あとはプログラム側で加工していこうと思います。 select A.FILE,acdate,COUNT from (select FILE, acdate from (select DISTINCT FILE from LOGTABLE) as A1 CROSS JOIN (select DISTINCT date_format(actime,'%m%d') as acdate from LOGTABLE) as A2 ) as A LEFT JOIN (select FILE, date_format(actime,'%m%d') as acdate2, count(*) as COUNT from LOGTABLE group by concat(month(actime), '-', day(actime), FILE) ) as B ON A.FILE = B.FILE and A.acdate = B.acdate2 order by FILE, acdate
681 名前:NAME IS NULL mailto:sage [2009/07/16(木) 22:01:04 ID:???] Oracle xeで、以下の機能を実現したいんですが... どうにも長くなってしまいそうで...短く実現する方法はないでしょうか? あるテーブル『TT』に KEY ----- 3 5 6 10 11 って感じで入ってる値を1回のSQLで横に並べたいんです。 key1 | key2 | key3 | key4 | key5 ----+------+-----+-----+----- 3 | 5 | 6 | 10 | 11 で、散々悩んだ挙句... SELECT T1.KEY KEY1, T2.KEY KEY2, T3.KEY KEY3, T4.KEY KEY4, T5.KEY KEY5 FROM (SELECT KEY FROM (SELECT KEY, ROWNUM RN FROM TT) WHERE RN = 1) T1, (SELECT KEY FROM (SELECT KEY, ROWNUM RN FROM TT) WHERE RN = 2) T2, (SELECT KEY FROM (SELECT KEY, ROWNUM RN FROM TT) WHERE RN = 3) T3, (SELECT KEY FROM (SELECT KEY, ROWNUM RN FROM TT) WHERE RN = 4) T4, (SELECT KEY FROM (SELECT KEY, ROWNUM RN FROM TT) WHERE RN = 5) T5 こんなSQLを書いたんですが... 正直もっと簡単にならないものでしょうか?
682 名前:NAME IS NULL mailto:sage [2009/07/16(木) 22:19:25 ID:???] >>681 >>511
683 名前:NAME IS NULL mailto:sage [2009/07/16(木) 22:36:42 ID:???] このスレはまとめサイトがあったほうがいいかもわからんね
684 名前:NAME IS NULL mailto:sage [2009/07/17(金) 01:14:50 ID:???] >681 レスthx そおですか... 一応maxが20の可変長なんで、自分の書いたSQLを20まで書けば実現できるんですが... ストアドかアプリサイドで、ですね。 アプリサイドは通信料増えるのを嫌って最後の手段で考えてました。 ちょっと検討してみます。(´・ω・`)
685 名前:NAME IS NULL mailto:sage [2009/07/17(金) 01:15:36 ID:???] >682だった。(´Д`;)
686 名前:NAME IS NULL mailto:sage [2009/07/17(金) 03:42:40 ID:???] 縦横変換の基本形に従うと次のようになる。 SELECT MAX(CASE WHEN RN = 1 THEN KEY END) AS KEY1, MAX(CASE WHEN RN = 2 THEN KEY END) AS KEY2, MAX(CASE WHEN RN = 3 THEN KEY END) AS KEY3, MAX(CASE WHEN RN = 4 THEN KEY END) AS KEY4, MAX(CASE WHEN RN = 5 THEN KEY END) AS KEY5 FROM ( SELECT KEY, ROWNUM AS RN FROM TT ) 簡単になるかどうかはともかく全表検索は1回で済む。 質問したいんだけど、XEを業務で使っているの?
687 名前:681 mailto:sage [2009/07/17(金) 17:07:04 ID:???] >686 thx。自分で考えた方法よかよっぽど良いですね。 結局、あれから検討した結果。。。他にも要因があってアプリサイドでやることになりました。 xeは業務で使ってますよ。 本ちゃん環境は10gらしいですが...
688 名前:NAME IS NULL mailto:sage [2009/07/17(金) 18:56:24 ID:???] >687 なるほど開発で使っているのか。 ちょうど俺も試しに使ってみようとしていたところなんだ。 ありがと。
689 名前:NAME IS NULL [2009/07/19(日) 16:28:56 ID:Ee/IhaoQ] 下記のようなデータがあり、最新の3日分のデータを取得しようとしています。 このような場合、MySQLでのSQL文はどうなるでしょうか? ◎データベース id | date | memo ---+------------+------ 1 | 2009-12-22 | test1 2 | 2009-12-23 | test2 3 | 2009-12-24 | test3 4 | 2009-12-24 | test4 5 | 2009-12-25 | test5 ◎取得しようとしてるデータ(最新の3日分のデータ) array( '2009-12-25' => array( array('id'=>5,'date'=>'2009-12-25','memo'=>'test5'), ), '2009-12-24' => array( array('id'=>3,'date'=>'2009-12-24','memo'=>'test3'), array('id'=>4,'date'=>'2009-12-24','memo'=>'test4'), ), '2009-12-23' => array( array('id'=>2,'date'=>'2009-12-23','memo'=>'test2'), ), );
690 名前:NAME IS NULL mailto:sage [2009/07/19(日) 20:51:49 ID:???] select * from test t1, (select distinct date_format(date, '%Y-%m-%d') df from test order by df desc limit 3) t2 where date_format(t1.date, '%Y-%m-%d') = t2.df order by t1.date desc;
691 名前:NAME IS NULL mailto:sage [2009/07/19(日) 20:53:54 ID:???] >>689 SELECT * FROM table WHERE `date` >= DATE_SUB(CURDATE() , INTERVAL 3 DAY) で、どうでしょう?
692 名前:NAME IS NULL mailto:sage [2009/07/19(日) 21:06:22 ID:???] データの無い日をどう数えるかによるね
693 名前:689 mailto:sage [2009/07/19(日) 22:37:34 ID:???] >>690-692 すみません、MySQLではなくSQLite(Ver.2)でした。 SQL文を実行してみましたがno such functionやsyntax errorでした。
694 名前:NAME IS NULL mailto:sage [2009/07/19(日) 23:02:40 ID:???] SELECT * FROM Table AS T1 WHERE 3 > (SELECT count(DISTINCT date) FROM Table WHERE date > T1.date); SQLiteで動くかどうかしらね。
695 名前:NAME IS NULL mailto:sage [2009/07/20(月) 00:49:08 ID:???] Oracle 10g で質問です。 WITH句で書いたクエリをインライン展開するかどうかを ヒントなどで制御する方法はないでしょうか? 「実行に時間はかからないが、SQLが長い/複雑になる」という場合に、 SQLはWITH句に1回だけ書きたいのですが、 実行結果をTEMP TABLE TRANSFORMATIONするとかえって遅くなるので、 参照箇所のそれぞれで(インラインで書いた場合と同じように) 実行して欲しいのです。 簡単に言うと、WITH句で、 @同じクエリを複数回書かなくて良い A同じクエリを複数回実行しない と出来るうちの、@だけ使いたいということです。 方法をご存知の方がいらっしゃいましたら、教えて下さい。 よろしくお願いします。
696 名前:NAME IS NULL mailto:sage [2009/07/20(月) 17:42:45 ID:???] Oracleをなめまくる
697 名前:NAME IS NULL mailto:sage [2009/07/21(火) 01:21:08 ID:???] >>695 どうも最終的にどんな結果が欲しいのか良くわからん。 簡単でいいからやりたいことをSQLで例示してくれないか。
698 名前:NAME IS NULL mailto:sage [2009/07/21(火) 01:59:06 ID:???] こういうことかな? たとえが適正かどうかは別にして WITH WithT AS (SELECT * FROM Table WHERE col1 = true) SELECT * FROM WithT WHERE col2 = 1 UNION ALL SELECT * FROM WithT WHERE col2 = 2; この場合、WITH句のクエリが1度実行されて、一時的に置いておいて その中から col2 を2回検索される。 のだけれども、col2にはインデックスが張られているので、 SELECT * FROM Table WHERE col1=true AND col2 = x; が2度実行される方が速い。 だから、そのように動かす方法は無いかや? で、俺はその答えを知らない。Oracle使いでもないしな。 何かスイッチで制御できるものなのか、それとも各ベンダーの プランナやオプチマイザでの性能UPを期待するしかないのか?
699 名前:NAME IS NULL mailto:sage [2009/07/21(火) 07:36:44 ID:???] 本来はそこもオプテイマイザが適切に判断するはずなんだが、それが 実際には意図した実行計画になっていなかったから明示的にHINTで 指定したいのだと読んだが? 答は俺も知らん。
700 名前:NAME IS NULL mailto:sage [2009/07/21(火) 22:22:00 ID:???] ますますわからん
701 名前:695 mailto:sage [2009/07/23(木) 02:11:26 ID:???] 695です。言葉足らずですみません。 言いたかったことはほぼ>>698 さん、>>699 さんに書いてもらった内容でした。 ただインデックスがある場合に限らずで、 「一時的に置いておいて」の処理自体でそこそこ時間がかかってしまうようで、 2回実行した方が速いことが結構あります。 ですが実際はそうは動いてくれず、 ヒントなどで制御できないのかな?と思った次第でした。 それらしいヒントは調べても見当たらなかったので、 ヒント以外でも何か方法があればと思ったのですが、、、
702 名前:698 mailto:sage [2009/07/25(土) 14:43:40 ID:???] >>701 >>699 も言ってるが、プランナかオプティマイザが適切に判断するべきところなんだけど、 Oracleの仕様上WITH句のサブクエリだけ先に実行されてしまうようになっているのなら どうしようもないが、判断上でサブクエリが実行されているのなら、コスト計算の問題かな? 一時テーブルへの待避コストを多く見積もるようにどこかにパラメータはない? てか、Oracleスレで聞いた方がいいかも。
703 名前:NAME IS NULL mailto:sage [2009/07/25(土) 23:51:12 ID:???] SQLiteで以下のようなテーブルがあります。 hashが主キーです。 hash|name|size LIKEでの検索時にdistinctでnameとsizeが重複するものを除外したいのですが、 hashも取得しなければなりません。 よってSELECT hash, name, sizeとしたいのですが、 distinctでhashは除外したいのです(そうしないと重複はあり得ないため)。 なにか良い方法はありますか?
704 名前:NAME IS NULL mailto:sage [2009/07/26(日) 01:05:23 ID:???] >>703 日本語でおk ハッシュ値がユニークなのに、ほか二つの値が同じレコードをまとめたいなんて、一体どっちのハッシュ値をもってくればいいんだ?
705 名前:703 mailto:sage [2009/07/26(日) 01:13:40 ID:???] >>704 あ、そういえばそうですね。 重複したname,sizeをリストから除去したいです。 ハッシュは最初に現れる値でも最後に現れる値でもどちらでも良いですが、重複をのぞく方法は他にあるのでしょうか?
706 名前:NAME IS NULL mailto:sage [2009/07/26(日) 01:53:42 ID:???] >>705 今端末さわれる場所にいないからなんとも言えんが、 select hash, name, size from table_name where name != (select name from table_name group by name, size having count(*) >1) and size != (select size from table_name group by name, size having count(*) >1); で、いいのか? 汚いな...
707 名前:NAME IS NULL mailto:sage [2009/07/26(日) 02:49:31 ID:???] >>705 select distinct on (name, size) hash, name, size from table_name; おやすみ。
708 名前:NAME IS NULL mailto:sage [2009/07/26(日) 03:29:26 ID:???] >>707 それポスグレだろ。 select hash,name,size from table_name group by name,size でいける。他だと動かないみたいだけど。
709 名前:NAME IS NULL mailto:sage [2009/07/26(日) 03:52:42 ID:???] それ動くのかよw むちゃくちゃだな
710 名前:NAME IS NULL mailto:sage [2009/07/28(火) 17:45:01 ID:???] SQLserver2005の処理で一つ教えてください。 2つの同じ項目のビューがあり、それを一つのビューにマージしようと思っています。 ただある項目が重複した場合は重複データを破棄したいのですが UNIONだとキー以外の項目が違っていたら別データ扱いですし、 UNION ALLでは問答無用で入ってしまいます。 重複キーを指定してマージすることはできるのでしょうか?
711 名前:NAME IS NULL mailto:sage [2009/07/28(火) 19:08:16 ID:???] >>710 なんかデジャヴだな キーが同じでキー以外の項目が違う場合はどのデータを残すん?
712 名前:NAME IS NULL mailto:sage [2009/07/28(火) 19:15:12 ID:???] select id, value from union_parts_1 union all select id, value from union_parts_2 where not exists (select * from union_parts_1 where union_parts_2.id = id) とか?
713 名前:NAME IS NULL mailto:sage [2009/07/28(火) 20:00:48 ID:???] >>711 破棄だから、重複したデータは結果から削除じゃないのか? >>710 select id,value from table1 where id not in (select id from table2) union all select id,value from table2 where id not in (select id from table1) で行けると思う。ためしてないけど
714 名前:NAME IS NULL mailto:sage [2009/07/28(火) 22:41:46 ID:???] >>713 両方破棄すんの?
715 名前:NAME IS NULL mailto:sage [2009/07/28(火) 23:22:27 ID:???] 重複コードを破棄しちゃいかんだろ。 1つ残すととらえるのが自然だと思う。
716 名前:NAME IS NULL mailto:sage [2009/07/28(火) 23:29:32 ID:???] そう読むのが自然な気はするけどどっちを残せばいいのかわからん。 キー以外のカラムも同じならどっちでもいいんだろうけどそうでは無いんだよね?
717 名前:NAME IS NULL mailto:sage [2009/07/28(火) 23:55:26 ID:???] 結局>>711 に戻るわけだな
718 名前:NAME IS NULL mailto:sage [2009/07/29(水) 00:30:06 ID:???] そうね。>>713 は先走ったかも
719 名前:NAME IS NULL mailto:sage [2009/07/29(水) 05:52:21 ID:???] >>714 ,715 どちらかのテーブルのデータ残すなら>>712 で行けるんじゃないか 両方消すなら>>713 それ以外なら>>710 の説明不足 やりたいことをちゃんと説明できないのは 自分自身も何をどうしたいのかはっきり分かってないって事だろうな
720 名前:NAME IS NULL mailto:sage [2009/07/29(水) 14:37:57 ID:???] こういうの、どうすればうまくいきますか? テーブル 日付 | 数量 --------------- 2009-6-10|1000 2009-6-11|2000 2009-6-13|3000 2009-7-10|1100 2009-7-13|1200 2009-7-15|1300 取得したい表(同日を比較したい) 当月 数量 前月 数量 ------------------------------- 2009-7-10|1100|2009-6-10|1000 2009-7-11|1100|2009-6-11|2000 2009-7-11は無いため2009-7-10のデータをセット。 2009-7-13|1200|2009-6-13|3000 2009-7-15|1300|2009-6-15|3000 2009-6-15は無いため2009-6-13のデータをセット。
721 名前:NAME IS NULL mailto:sage [2009/07/29(水) 16:24:08 ID:???] >>720 先月との比較を曜日で合わせてる? 日付対応のルールが明確でないと色々厳しいと思うけど。
722 名前:NAME IS NULL mailto:sage [2009/07/29(水) 16:32:28 ID:???] >>720 PostgreSQL用、つっても汎用的に書いたつもりだが、 INTERVAL型指定とかEXTRACT(=date_part)なんかはお使いのDBに合わせてな。 SELECT CASE WHEN T1.日付 IS NULL THEN T2.日付-INTERVAL'1 MONTH' ELSE T1.日付 END AS 当月, CASE WHEN T1.数量 IS NULL THEN (SELECT 数量 FROM Table WHERE 日付 = (SELECT max(日付) FROM Table WHERE 日付 < T2.日付+INTERVAL'1 MONTH')) ELSE T1.数量 END AS 数量, CASE WHEN T2.日付 IS NULL THEN T1.日付+INTERVAL'1 MONTH' ELSE T2.日付 END AS 前月, CASE WHEN T2.数量 IS NULL THEN (SELECT 数量 FROM Table WHERE 日付 = (SELECT max(日付) FROM Table WHERE 日付 < T1.日付-INTERVAL'1 MONTH')) ELSE T2.数量 END AS 数量 FROM (SELECT * FROM Table WHERE EXTRACT(MONTH FROM 日付) = EXTRACT(MONTH FROM NOW())) AS T1 FULL JOIN (SELECT * FROM Table WHERE EXTRACT(MONTH FROM 日付) = EXTRACT(MONTH FROM NOW()-INTERVAL'1 MONTH')) AS T2 ON EXTRACT(DAY FROM T1.日付) = EXTRACT(DAY FROM T2.日付); 実用的な速度が得られるかどうかしらんよ。
723 名前:NAME IS NULL mailto:sage [2009/07/29(水) 16:37:49 ID:???] 07/01とか06/01のデータが無い場合が厄介だな
724 名前:722 mailto:sage [2009/07/29(水) 16:48:22 ID:???] 訂正 SELECT CASE WHEN T1.日付 IS NULL THEN T2.日付+INTERVAL'1 MONTH' ELSE T1.日付 END AS 当月, CASE WHEN T1.数量 IS NULL THEN (SELECT 数量 FROM Table WHERE 日付 = (SELECT max(日付) FROM Table WHERE 日付 < T2.日付+INTERVAL'1 MONTH')) ELSE T1.数量 END AS 数量, CASE WHEN T2.日付 IS NULL THEN T1.日付-INTERVAL'1 MONTH' ELSE T2.日付 END AS 前月, CASE WHEN T2.数量 IS NULL THEN (SELECT 数量 FROM Table WHERE 日付 = (SELECT max(日付) FROM Table WHERE 日付 < T1.日付-INTERVAL'1 MONTH')) ELSE T2.数量 END AS 数量 FROM (SELECT * FROM Table WHERE EXTRACT(MONTH FROM 日付) = EXTRACT(MONTH FROM NOW())) AS T1 FULL JOIN (SELECT * FROM Table WHERE EXTRACT(MONTH FROM 日付) = EXTRACT(MONTH FROM NOW()-INTERVAL'1 MONTH')) AS T2 ON EXTRACT(DAY FROM T1.日付) = EXTRACT(DAY FROM T2.日付); 当月、前月の日付を表示する部分で、対応する日付がない場合の表示を±逆にしていた。 >>723 それはこのSQLだと前月最終データからとってくるだけなんだけど、 7月31日の前月データは6月30日('2009-07-31' - '1 month' の値次第)になる。
725 名前:NAME IS NULL [2009/07/29(水) 19:27:46 ID:JrJvF1CD] 一つのSQL文内に、同じSELECT文が何度も出てくる場合、 あらかじめSELECTした結果に別名をつけておいて、 それを使い回すことってできますか?
726 名前:NAME IS NULL mailto:sage [2009/07/29(水) 20:05:07 ID:???] >>725 WITH句をサポートするDBMSならそれで なければVIEWで
727 名前:NAME IS NULL mailto:sage [2009/07/29(水) 20:18:59 ID:???] 一時テーブルかなー
728 名前:725 mailto:sage [2009/07/29(水) 22:29:26 ID:???] ありがとうございます。 一文中では無理な感じでしょうか。 SELECTしか使えない環境なので、一文でなんとかしたかったのです。 PostgreSQLなのですが、DBMSはよく分かりません。
729 名前:NAME IS NULL mailto:sage [2009/07/29(水) 22:32:00 ID:???] SELECTしか使えない環境・・・? Accessか何かか?
730 名前:NAME IS NULL mailto:sage [2009/07/29(水) 22:53:12 ID:???] そこでSQLインジェクションですよ
731 名前:NAME IS NULL mailto:sage [2009/07/30(木) 00:03:16 ID:???] 内容によってはなんかできるかもしれないけど、それだけだとちょっと難しいよね
732 名前:NAME IS NULL mailto:sage [2009/07/30(木) 01:38:14 ID:???] >>728 PostgreSQLは最新の8.4からWITH句をサポート
733 名前:NAME IS NULL mailto:sage [2009/07/30(木) 02:25:50 ID:???] 初めて質問するので書き方が間違っていたらごめんなさい。 ・MySQL 4.1 maintable mid | field1 | field2 --------------- 5 | 2 | 4 6 | 1 | 5 ・ ・ ・ subtable sid | tema ---------- 1 | その1 2 | その2 3 | その3 4 | その4 field1=sid,field2=sidとして結合なり置換して mid | tema1 | tema2 ------------------- 5 | その2 | その4 6 | その1 | その5 ・ ・ ・ としてselectすることはできるのでしょうか。どうかよろしくお願いします。
734 名前:NAME IS NULL mailto:sage [2009/07/30(木) 03:10:34 ID:???] >>733 SELECT T1.mid,T2.tema,T3.tema FROM maintable AS T1 LEFT JOIN subtable AS T2 ON T1.field1=T2.sid LEFT JOIN subtable AS T3 ON T1.field2=T3.sid;
735 名前:nanasi [2009/07/30(木) 06:17:30 ID:suQVAKTQ] kakaku.com/bb/ranking_ADSL3_120040290027000000000012/?sort=3&page=000&button=0&sc=7&count=15 都会系、受信局2km範囲。 光など不要。\ 7ヵ月後2万円キャッシュバックって偉くない? ちなみにおいらは@nifty 何処かの糞みたいに高いプロバイダーが不要やねん。 この世の中に。 書類利用規約審査義務違反。あの画像さあ? もっと改め直して?なっ? 書類不正利用規約義務違反 こっちそっちの手引きで免許証の裏に住所書いて、警察署でおしかり受けたがな。 なんで俺がそんなん喰らわなあかんねん?ヘボプロバイダーO○N。
736 名前:NAME IS NULL [2009/07/30(木) 11:05:29 ID:72K2TDMo] ほんと基本的な質問ですみませんが、テーブル定義書において、タイプ記述方法を調べたいのです。 CHAR,NUMERIC,DECIMALなどを書く方法もありますが、それ以外の方法(特に今回知りたいのは0,S,A,Oと書く方法)について、 教えていただけないでしょうか。 サイトの紹介でも結構です、よろしくお願いいたします。
737 名前:NAME IS NULL mailto:sage [2009/07/30(木) 12:01:17 ID:???] 回答またはアドバイスをお願いいたします。 長文ですみません。 MySQLを使用しています。 [テーブルの項目] ・ID(主キー):数値(AUTO_INCREMENT) ・KEYWORD:文字列 ・USER_ID:数値 ・ENABLE_FLG:有効/無効設定フラグ (TRUE/FALSE) [前提] ・ユーザはキーワードをデータベースにいくつでも登録できる。 ・ユーザはそれぞれのキーワードに対して、有効/無効を設定できる。 ・同じキーワードを別のユーザが登録することができる。 ・1人のユーザが同じキーワードを2つ以上登録することはできない。 [取得したい情報] ・指定した複数のキーワードを全て登録しているユーザ(USER_ID)を知りたい。(AND検索) (キーワードが有効になっていることが条件) ・条件を満たしている全てのUSER_IDを取得する。 検索するキーワードが'AA'と'BB'の場合は ↓のようになりますよね? SELECT USER_ID FROM KEYWORD_TBL WHERE KEYWORD == 'AA' AND ENABLE_FLG == 'TRUE' AND USER_ID IN (SELECT USER_ID FROM KEYWORD_TBL WHERE KEYWORD == 'BB' AND ENABLE== 'TRUE'); キーワードが3つ以上だった場合(AA,BB,CC)は、 WHERE句と副問い合わせを伸ばすしかないでしょうか? 'AA','BB','CC'を登録してあるUSERを選ぶ、 という処理のスマートな書き方を教えてください。
738 名前:NAME IS NULL mailto:sage [2009/07/30(木) 12:11:48 ID:???] select user_id from keyword_tbl where keyword in ('AA', 'BB', 'CC') group by user_id having count(*) = 3 とか? 実際に確認してないけれども。
739 名前:NAME IS NULL mailto:sage [2009/07/30(木) 16:28:37 ID:???] >>738 なるほど!その手がありましたか。 参考になりました。ありがとうございます。
740 名前:NAME IS NULL mailto:sage [2009/07/30(木) 18:21:49 ID:???] MySQLで、ある数値がカンマ区切りで数値の入っているフィールド nums(text型)に含まれるかを判断するWHERE文を書きたいのですが、 どう書いたら良いでしょうか。 ANDで絞り込み条件として使いたいのですが、思いつきません。 イメージとしてはこんな感じです(128がnumsに含まれるレコード抽出)。 SELECT * FROM test WHERE 128 IN(nums); どうか知恵をお貸しください。
741 名前:NAME IS NULL mailto:sage [2009/07/30(木) 18:46:34 ID:???] >>740 SELECT * FROM test WHERE nums REGEXP concat('(^|,','128','(,|$)'); かな? 自信なし。
742 名前:NAME IS NULL mailto:sage [2009/07/30(木) 18:48:26 ID:???] 書き込んでから気づいた。直書きならわざわざconcatで連結する必要ないな。 nums REGEXP '(^|,)128(,|$)';
743 名前:NAME IS NULL [2009/07/30(木) 20:57:26 ID:EY3peTrf] postgreSQLで、 日付の差分を値の補正に使いたいのですが、 日付の差分を値に掛けると XXXX day みたいな日数表示になってしまいます。 この日数型を整数にするにはどうすればいいでしょうか。
744 名前:NAME IS NULL mailto:sage [2009/07/30(木) 21:21:46 ID:???] >>743 EXTRACT(DAY FROM INTERVAL型)
745 名前:743 mailto:sage [2009/07/30(木) 21:22:24 ID:???] 調べたらextractというのがありました。 (extract(year FROM age(日付1,日付2)) * 365) + (extract(month FROM age(日付1,日付2)) * 31) + (extract(year FROM age(日付1,日付2))) これに月の日数と閏年の判定をいれれば、ゴリ押しでとれなくもないですが。。。
746 名前:743 mailto:sage [2009/07/30(木) 21:31:47 ID:???] >>744 extract(day FROM (日付1-日付2)) で日数とれました。 ありがとう。
747 名前:740 mailto:sage [2009/07/30(木) 21:36:55 ID:???] >>741-742 早速のレス有難うございます。 レスが遅くなり申し訳ありません。 ただいま確認したところ、期待通りに動きました。 大変助かりました。有難うございました。