2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :NAME IS NULL:2006/10/10(火) 14:30:16 ID:U8kssbc7
参考リンク
http://www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html
http://oraclesqlpuzzle.hp.infoseek.co.jp/
http://www.techscore.com/tech/sql/

前スレ:【帰ってきた】SQL質疑応答スレ 2問目
http://pc8.2ch.net/test/read.cgi/db/1141622643/l100

2 :NAME IS NULL:2006/10/10(火) 16:03:41 ID:???
過去ログ

前スレ:【帰ってきた】SQL質疑応答スレ
http://pc8.2ch.net/test/read.cgi/db/1124178925/
SQL質疑応答スレ Part 2
http://pc8.2ch.net/test/read.cgi/db/1103113155/
SQL質疑応答スレ
http://pc8.2ch.net/test/read.cgi/db/1056973582/

3 :NAME IS NULL:2006/10/10(火) 18:08:03 ID:SmWQiBwg
ある変数のデータの中でn番目に大きなもの(小さいもの)を選択したいのですが、
どうしたらよいですか。エクセルだとlarge(n,変数名)という関数があるのですが。

4 :3:2006/10/10(火) 18:12:11 ID:SmWQiBwg
忘れていましたが
OS:WindowsXP
使用ソフトはAccessで、かなり古い97です。

5 :NAME IS NULL:2006/10/11(水) 06:30:22 ID:???
>>1

SELECT
    '乙'
FROM
    ALL_OBJECTS
/


6 :NAME IS NULL:2006/10/11(水) 10:29:15 ID:lKBGPFvL
  cd    date    value1  value2
---------------------------------
  1  2006/09/01   1     1
  1  2006/09/02   2     1
  2  2006/09/02   3     1

↑のようなデータから、全てのcdのdateが最新の行を抽出するには
どうすればいいのでしょうか。
上の例だと、下の二行を抽出したいのですが。

  1  2006/09/02   2     1
  2  2006/09/02   3     1


7 :NAME IS NULL:2006/10/11(水) 11:16:49 ID:???
FAQ

8 :NAME IS NULL:2006/10/11(水) 11:20:06 ID:???
>>6
FAQと過去ログ嫁
厨房

9 :NAME IS NULL:2006/10/11(水) 21:40:36 ID:Qe2UBQfX
FROM句はトランザクションテーブルを一番右に、それに付帯する各マスタを左に並べると早いってのは本当?
駆動軸がどうとか

10 :NAME IS NULL:2006/10/11(水) 23:09:23 ID:???
>>9
試してみればいいのでは?
DB2とかだと小さいテーブルはメモリ参照って具合に最適化するけど、
OracleやPostgreがそうだとは限らんし。

11 :NAME IS NULL:2006/10/11(水) 23:27:01 ID:???
>>9
ネタが古いw
てか古いオラクルでも順番だけで駆動テーブルが決まる訳じゃないし。
そんなくだらない知識よりまず実行計画の読み方から勉強した方がいいよ。

12 :NAME IS NULL:2006/10/15(日) 12:50:43 ID:???
質問です。
各店舗の商品で最も価格が高いもののリストを抽出したいのですが
うまいやり方が思いつきません。

テーブル構造とサンプルは以下のような感じです。
店舗ごとに並んでいる商品が違ったりもします。SHOPとITEMの組み合わせは一意です。
同じ価格の場合はITEM番号の大きいほうが優先されます。


SHOP | ITEM | PRICE |
---------------------------
   A |    1 |    10
   A |    2 |    30
   A |    3 |    30
   B |    4 |   600
   B |    5 |   400
   B |    6 |   200
   C |    2 |     5
   C |    4 |    15
   C |    5 |    10
   D |    8 |   900
   D |   10 |   800
   D |   12 |  1000


(取得したい結果↓)

SHOP | ITEM | PRICE |
---------------------------
   A |    3 |    30
   B |    4 |   600
   C |    4 |    15
   D |   12 |  1000



最初は強引に SELECT SHOP, MAX(PROCE) 〜 で取得した結果と元テーブルを結合して
店舗ごとに最も価格の高い商品リストが作れたのですが、価格が重複している場合は
レコードも重複してしまうので困りました。さらにMAX()で元テーブルと結合するのは
かなり重そうだし、そもそもこのやり方自体間違っている気がするので…



13 :NAME IS NULL:2006/10/15(日) 13:54:56 ID:???
>>12
オラクル(たしか9i以降)ならGROUP BYで、
MIN() KEEP (DENSE_RANK FIRST/LAST〜)が使えるんだが、他のはワカラン。

14 :NAME IS NULL:2006/10/15(日) 15:56:19 ID:???
>>12
つ NOT EXISTS

15 :NAME IS NULL:2006/10/15(日) 19:12:29 ID:???
一方ロシアはNOT EXISTSを使った。

16 :NAME IS NULL:2006/10/15(日) 23:02:40 ID:e8jqgW9b
>>12
論理としては、「重複して困った」というその集合を、
さらにSHOPで集計してITEMのMAX取ればいいだけなんだけど、
ビューとか使ってたら当然重くなるね。

一気に2重3重の副問合せ書いて効率良く絞るとか、
ストアドで途中で一時テーブル使いながら単純化し、最後に結果を返すとか、
どうやると高速にできるか勉強した方がいいと思う。

17 :NAME IS NULL:2006/10/15(日) 23:24:22 ID:???
>>12
サブクエリ使えば簡単だろ

select * from (select * from T1 order by PRICE desc) TMP_T1 group by SHOP;

18 :NAME IS NULL:2006/10/15(日) 23:55:03 ID:???
忘れてたITEMもソートしないとな

select * from (select * from T1 order by ITEM desc, PRICE desc) TMP_T1 group by SHOP;

19 :NAME IS NULL:2006/10/16(月) 01:16:54 ID:zQ3wf1ji
>>18
それ何のDB?もしできたとしても超亜種だと思う。

普通こうだよ。
SELECT
T1.SHOP, MAX(T1.ITEM), MAX(T1.PRICE)
FROM T1
INNER JOIN (
SELECT
SHOP, MAX(PRICE) AS PRICE1
FROM T1
WHERE 〜
GROUP BY SHOP
) T1_P
ON T1_P.SHOP = T1.SHOP
AND T1_P.PRICE1 = T1.PRICE
WHERE 〜
GROUP BY T1.SHOP

20 :NAME IS NULL:2006/10/16(月) 05:32:58 ID:EmB35BHi
select 1 from 〜

この列選択リストの「1」って何ですか?

21 :NAME IS NULL:2006/10/16(月) 05:49:01 ID:???
>>19
MySQLだけどどこか特殊な構文ある?
値の出し方がトリッキーなのは認めるけどね

22 :NAME IS NULL:2006/10/16(月) 06:14:16 ID:???
>>20
何の話だか分からんがリテラルだろ


23 :NAME IS NULL:2006/10/16(月) 06:17:49 ID:???
>>20
定数。数値。算数における基本単位。1+1の1。

24 :NAME IS NULL:2006/10/16(月) 06:23:59 ID:???
>>21
19じゃないけどMySqlと聞いて納得。でもMySqlと断りをいれるべきだろ。他のやつでは動きすらしないよ。

25 :NAME IS NULL:2006/10/16(月) 06:29:05 ID:???
>>24
へーそうなんだ
もしかして最後のgroup byのところが問題かな
group by TMP_T1.SHOP ならどう?

26 :NAME IS NULL:2006/10/16(月) 07:13:53 ID:???
>>25
いや、select * のとこ。もちろん列名書いても無理。

これでITEMやPRICEの逆ソートされた最初の値返してくれるのはMySQLだけ。


27 :NAME IS NULL:2006/10/16(月) 07:18:19 ID:???
つまり他のDBだとfrom 句にサブクエリ使えないってことか?
そりゃ不便だな

28 :NAME IS NULL:2006/10/16(月) 09:52:59 ID:???
違うよ
group by 使ったときは、選択リストにはgroup byに指定した項目か集計関数しか使えない。

29 :NAME IS NULL:2006/10/16(月) 10:29:20 ID:zQ3wf1ji
ほー。MySQLってすげーな。
Limit も、他のDBからすれば夢みたいな機能だけど。
将来は標準規格の方に入るかな。
でも集合の定義としてちょっと変だから、集計関数として追加されるかな。
SELECT TOP *
ならぬ、
SELECT TOP(*)
とか。

30 :NAME IS NULL:2006/10/16(月) 12:35:33 ID:???
つーか、こんなアホなのが許されるのがおかしい。
りくつにあってないだろ

31 :NAME IS NULL:2006/10/16(月) 18:47:22 ID:???
まー、group by の時にselectに*が許されてもいいじゃん。とは初心者の頃激しくオモタな。

32 :NAME IS NULL:2006/10/16(月) 22:30:37 ID:???
>>16
...いや、おまいも自己流じゃなくてちゃんと勉強した方がいいと思う

33 :NAME IS NULL:2006/10/17(火) 00:29:23 ID:KyI1Tz1l
>>32
さあ…ケースバイケースだから、あれでいいかどうかは実際の場面でないと分らない。
他社が数分かかるものを数秒にすることはよくあるよ。

34 :超初心者です:2006/10/17(火) 13:08:36 ID:???
VC++6.0でお勉強しているものです。
まったくの初心者です。
SQLサーバーをVCから呼び出すコードがわからなくてとても困っています、調査能力のない自分が悪いのですが、行き詰っています。
どなたか接続の仕方を教えてもらえるとこの一週間が進みます。
ODBCでの接続で、探しています。


35 :NAME IS NULL:2006/10/17(火) 13:55:13 ID:???
複数テーブルの指定列から最大値を求めるにはどうしたらいい?

例えば、hoge1のid列とhoge2のid列から最大値を求めるとか

36 :NAME IS NULL:2006/10/17(火) 14:17:20 ID:???
>>353
両方求めて比較すればいい

37 :NAME IS NULL:2006/10/17(火) 14:49:50 ID:???
>>34
ADO.NETの質問・雑談スレ
http://pc8.2ch.net/test/read.cgi/db/1104630889/

【新型】SQLServer2005【またか】
http://pc8.2ch.net/test/read.cgi/db/1134746899/
あたりかな?

38 :NAME IS NULL:2006/10/17(火) 15:40:22 ID:s0a+dHjv
>>35
greatな関数を使え

39 :NAME IS NULL:2006/10/17(火) 17:07:39 ID:???
>>35
SELECT MAX(ID) FROM (
 SELECT ID FROM HOGE1
 UNION
 SELECT ID FROM HOGE2
 ) T

40 :NAME IS NULL:2006/10/17(火) 17:10:08 ID:???
ていうか、求めたいのが「ID」って名前なのが気になる。一意保証の危うい設計やめれ。

41 :NAME IS NULL:2006/10/17(火) 19:42:58 ID:???
質問


SQL Server 2000 + Access 2002(XP)VBAの環境下でシーケンシャルデータを
最も効率的にInsertするにはどうしたらよいですか?

当然bulk insert などの一括挿入も検討されるがUTF共有自体が許可されない環境です。

みなさんの考えをお聞かせください。(.NETを使うと簡単すぎだし、解決にならんので
office2002+VBAの環境下でお願いします(アセンブリも))。


42 :NAME IS NULL:2006/10/17(火) 21:22:44 ID:???
>40
hogeとかfooみたいなもんじゃないの?

43 :NAME IS NULL:2006/10/18(水) 00:49:01 ID:???
>>41
通信の遅い環境で、INSERT文を100行分ずつ束ねて送信したことはあるけど。
その時はVPNじゃなくてASPに対して送信だったので、HTTP POSTの限界考慮して区切った。
限界がないなら全行分まとめて送信してみれば?

44 :big:2006/10/18(水) 08:19:32 ID:9//4oqjS
DBAビギナーです。
Oracle Data Pumpの使用についてご教示
ください。 スレ違いかもですが。。

【Oracle バージョン】:10.2.0.1.0
【OS】:Windows Server 2003 Enterprise Edition Version 5.2.3790 SP1
【実行スクリプト】:
impdp usernm/pw tables=emp directory=dp dumpfile=dp_test.dmp logfile=dp_test.log

なのですが、どうしても下記のエラーが出てしまいます:
-----------------------------------------------------
ORA-31626: ジョブが存在しません
ORA-31637: ジョブjobnm(ユーザーusernm)を作成できません
ORA-06512: "xxxxxx", 行nn
ORA-06512: "xxxxxx", 行nnnn
ORA-39080: Data Pumpジョブのキュー"xxxx"および"xxxxx"の作成に失敗しました
ORA-06512: "xxxxx", 行nn
ORA-06512: "xxxxx", 行nnnn
ORA-00832: Streamsプールは作成されませんでした。自動的に作成することはできません
-----------------------------------------------------

何か間違い、見落としている点等あるのでしょうか?
どなたかお解かりになる方、よろしくお願いいたします。

45 :NAME IS NULL:2006/10/18(水) 08:24:18 ID:???
>>44
>スレ違いかもですが。。
 
わかってるなら・・・

46 :NAME IS NULL:2006/10/18(水) 09:20:26 ID:???
見たこともないSQLだ・・・

47 :NAME IS NULL:2006/10/18(水) 13:30:19 ID:???
>>38-39
サンクス

PostgreSQL8.1.4だけど、
GREATEST ( MAX(HOGE1.ID), MAX(HOGE2.ID) ) FROM HOGE1, HOGE2

とすると、どちらかのテーブルに行が無い場合、結果が出ないね…

48 :NAME IS NULL:2006/10/18(水) 13:45:07 ID:CntbNDNh
>>47
そこで完全外部結合だお

49 :NAME IS NULL:2006/10/18(水) 19:23:52 ID:???
>>48
それ駄目。ぜーッ怠惰目。UNIONでできるものはUNIONで。速度が全然ちがーう。

50 :NAME IS NULL:2006/10/19(木) 09:33:37 ID:???
一概に言えんと思うが。
DBMSによっても違うし、インデックスの適用によっても違うし。


51 :NAME IS NULL:2006/10/19(木) 11:36:50 ID:rYPEA4U9
>>49
は?
完全外部結合に命をかけたファーアーバードを知らんのか?

52 :NAME IS NULL:2006/10/19(木) 12:03:39 ID:???
Oracle データベースで

CREATE DATABASE AAA;
CREATE DATABASE BBB;
CREATE DATABASE CCC;

として

AAAの中でCREATE TABLE ・・・
とかAAA内での管理者権限ってあるの?なんて権限?
BBB,CCCはアクセスできません。




53 :NAME IS NULL:2006/10/19(木) 15:19:18 ID:SHleJobA
>>52
まず、日本語で何をしたいのか説明しろ。
それにすれ違い。ORACLE限定ならばORACLEスレへ。

54 :NAME IS NULL:2006/10/20(金) 11:29:59 ID:Rf9Ei9dc
質問です。MYSQLを使用しています。

フィールドAとフィールドBのどちらかに条件値が存在する行を
フィールドCでorder by したいのですが、インデックスの作成で困っています。

select * from table where A = 'hoge' or B = 'hoge' order by C

↑だと、orを使うのでインデックスが使用できませんよね?
データ数が非常に多いので何とかインデックスを使用したいのですが
良い方法はないでしょうか?なお、AとBには同一値は入りません。

55 :NAME IS NULL:2006/10/20(金) 17:00:33 ID:???
>>54
orを使ってもインデックスは使用されるんだけど、MySQLはダメなんか?
サブクエリが使えるバージョンかどうか知らんが、
SELECT * FROM
(SELECT * FROM table WHERE A='hoge'
UNION ALL
SELECT * FROM table WHERE B='hoge')
ORDER BY C;
だとどお?

56 :NAME IS NULL:2006/10/20(金) 22:24:40 ID:Rf9Ei9dc
>>55
explainやってみてるんですが、orだと駄目っぽいんですよね。
さらにバージョンが4.0.26なんでサブクエリも使えませんでした。

57 :NAME IS NULL:2006/10/20(金) 23:33:19 ID:???
SELECT * FROM table WHERE A='hoge'
UNION ALL
SELECT * FROM table WHERE B='hoge'
ORDER BY C;

これでどお?ネストする必要無いはずだが。

58 :NAME IS NULL:2006/10/21(土) 00:32:58 ID:???
SQL Server と MY SQL の違いってなんですか?

59 :NAME IS NULL:2006/10/21(土) 04:14:20 ID:???
>>58
MYSQL/MSSQL、Yと佐賀違う。

60 :NAME IS NULL:2006/10/21(土) 09:06:31 ID:???
今日はいやに佐賀の話題が多いな
何かあったのか?

61 :NAME IS NULL:2006/10/21(土) 10:53:54 ID:???
ニュー速+行け。すぐ分かる。

62 :NAME IS NULL:2006/10/21(土) 11:14:20 ID:???
佐賀ってどんな意味ですか?
SQL Server と MY SQL は使い方はかわらないのですか?

63 :NAME IS NULL:2006/10/21(土) 14:06:20 ID:zFcqxEeh
>>57
動きました。explainしてみたところ設定したindexも
使用されているようです。ありがとうございました。

64 :NAME IS NULL:2006/10/21(土) 15:52:56 ID:vg/WQ1gp
ここで聞くのが適切かどうかわからないのですが…(違ってたら誘導していただけるとありがたいです)

PL/SQLに関する質問です。
PL/SQLで複雑なプログラムを作ったときに、どこかでエクセプションが発生してしまった際に
それがどこで発生したか簡単に調べる方法はあるでしょうか?(つまり1行ずつトレース文を
はさむような事をせず)

65 :NAME IS NULL:2006/10/21(土) 19:36:01 ID:0YEftnXD
>62
SQLの使い方は違う。
どうちがうかをかたるのはこのスレの範疇ではないから
別のスレにおききなされ。

66 :NAME IS NULL:2006/10/21(土) 19:38:10 ID:0YEftnXD
しまったまとめて送信すりゃよかったあるよ

>64
EXCEPTIONのCATCHの仕方でドコで発生したかがわかるようになるよ。
詳しくは、Oracleのスレでお聞きなされ。
PL/SQLはSQLも使うけど、君の聞いているコトはOracle固有のお話だから。

67 :NAME IS NULL:2006/10/21(土) 22:47:43 ID:???
>>65
ありがとうございました。

68 :NAME IS NULL:2006/10/22(日) 15:26:56 ID:m4udQEN9
Windows XPで Microsoft SQL Serverを使っています。
テーブルAにフィールドがいくつかあり、
そのうちのフィールドB(NULL許容)UNIQUEとしようとしています。

そうすると、フィールドBがNULLのデータが1つしか入れられなくなりました。
やりたいことは、フィールドBは、「NULLまたはユニークな値」なのです。
値が入っていればユニークでなければいけないが、NULLなレコードは複数あってもよい、
というのがやりたいのです。
テーブルの属性の設定などでは無理なのでしょうか?

69 :NAME IS NULL:2006/10/22(日) 16:42:01 ID:???
>68
テーブルの制限でユニーク値を求めるストアドプロシージャを使えばいいんじゃないの?
あと、ここはSQL Serverのスレじゃないから。
続きをしたければSQL Serverのスレでヨロ。

なんか交通整理ばっかりしているなぁ、おいら。

70 :NAME IS NULL:2006/10/22(日) 17:59:50 ID:???
漏れの中の常識ではKEYとなるフィールドはNULL禁止って
イメージがあるのだが、最近はそうでないのか?

テーブル設計の人がNULLの意味を理解していないじゃないかと思うけど。

71 :68:2006/10/22(日) 18:21:33 ID:???
失礼しました。SQL Serverのスレがあったんですね。
移動します。
ちなみにフィールドBはユニークですが、キーのフィールドは別にあります。

72 :NAME IS NULL:2006/10/22(日) 18:28:41 ID:???
んなら外部制約でも使えばって気がするが・・・。
SQLServerで使えるか知らんが。
使えないから質問しているのか…。ガンガレ

73 :NAME IS NULL:2006/10/22(日) 20:09:06 ID:???
あれ、UNIQUE制約ってNULLは複数あっても化。
>>68の期待する制約だと思うんだが、SQL Serverってそうじゃないんか。


74 :NAME IS NULL:2006/10/22(日) 20:25:28 ID:???
DB2だとNULL可のフィールドはUNIQUE制約できんぞ。

75 :NAME IS NULL:2006/10/22(日) 20:27:40 ID:???
だよねぇ。たしかにNULLは入るけど一つだけ、ってのが欲しいと思ったことも
あるけど、普通の仕様はNULL複数可だと思うが。

ところでSQLServerがそんな動作するってことは、is nullにもindexが効くって事か。
それはそれで便利かもしれん。

76 :NAME IS NULL:2006/10/22(日) 20:35:31 ID:???
>>75
便利かも知れんがNULLがINDEX含まれるって事は
NULL判定する分、検索がトロくなる印象があるんだが。

つか、DB2だとNULL禁止つけたほうが動作が高速化
するといわれているので、漏れはKEYにはNULL禁止な設計するし、
普段からマメにNULL禁止にしているなぁ。

77 :NAME IS NULL:2006/10/22(日) 20:40:58 ID:???
それってNULLは値だっていってるようなもんだな

78 :73:2006/10/22(日) 21:18:49 ID:???
>>73な様なことを書いておきながら、SQL ServerでもUNIQUE制約でNULLは複数可って
仕様になっていると思ってて、きっと>>68の勘違いじゃって考えてんだが、
このスレにはSQL Server使いがいないんかw

>>76
KEYに使われるようなカラムは当然のこと、それ以外でもなるべくNOT NULL制約は
かけておいた方がいいよな。NULLを許可すると便利なときもあるけど、
集約関数ではCOALESCEを挟まなきゃなんなくなるし。

79 :NAME IS NULL:2006/10/22(日) 22:56:02 ID:???
>78
おいらは>69でSQL Server使いだけど、
そもそもUNIQUE制約つけるのに、
NOT NULLじゃないなんてありえねーなんて思ってるし。
NULLオッケーってするなら、UNIQUE制約はTABLEにつけるんじゃなくて、
実装するのが運用ラクじゃねーの?って考えですわ。

80 :NAME IS NULL:2006/10/23(月) 13:11:01 ID:xbTShaHm
>>66 わかりました。ありがとうございます。

81 :NAME IS NULL:2006/10/24(火) 05:09:44 ID:???
mysql標準付属の関数としてis_nullなどははあるようですが、is_numericやis_stringのような関数はありませんか?

82 :NAME IS NULL:2006/10/24(火) 10:57:03 ID:NVuTF5PR
>>81
あるよ

83 :NAME IS NULL:2006/10/24(火) 11:56:17 ID:???
>>79
一般的なDBでは索引が設定されているフィールドにNULLが使われた場合索引にNULLは含まれない。
このため where data1 = 100 なら索引が使われるケースでも、
where data1 is null の場合はデータ部のフルスキャンになるのでパフォーマンスの問題が発生する。
一方、SQLServerの場合は索引にNULLを含むので、where data1 is null でも索引が使われる。
その代償としてユニークな索引の場合NULLもユニークである必要が出てくる。

SQLserverがこういう仕様なのは古いバージョンのSQLServerがNULLをブランク1つとして扱っていたからで、
それとの互換のためにこうなっているものと思われる。
それでもそろそろオプションで切り替えがきくようにしてもらいたいものだ。

84 :NAME IS NULL:2006/10/24(火) 14:02:54 ID:153RAHGk
SQLのDBを市販のバックアップソフトを使ってテープやDISKにバックアップする事って
出来ますか?
初心者でスマソ 
教えてください

85 :NAME IS NULL:2006/10/24(火) 14:09:03 ID:???
>>84
できる。それ以上のことはスレ違いだから、お前の使ってるDBの専門スレへいってくれ。

86 :73:2006/10/24(火) 15:50:14 ID:???
>>83
> その代償としてユニークな索引の場合NULLもユニークである必要が出てくる。

あいやーそうだったのか。そりゃ失礼した。 >>68

>>79
貴方の考え方は概ね同意だが、各自の考え方とUNIQUE制約の仕様は切り分けてね。

87 :NAME IS NULL:2006/10/26(木) 12:48:51 ID:???
配列のi番目の要素を削除したい場合って
hoge[1:i-1] || hoge[i+1:n]

みたいなやり方しか無い?

88 :NAME IS NULL:2006/10/27(金) 15:58:04 ID:???
VIEWについてよく分からないんだが、
PostgreSQLのドキュメントにはVIEWが参照される度に問い合わせが実行されるとある
つまり、ある問い合わせにおいて、よく参照する問い合わせ結果はTABLEに格納した方がいいってこと?

89 :NAME IS NULL:2006/10/27(金) 17:35:24 ID:7Yc/x2jD
>>82
関数名は?

90 :NAME IS NULL:2006/10/27(金) 17:35:27 ID:7xxX9trU
  cd    date    value1  value2
---------------------------------
  1  2006/09/01   1     1
  1  2006/09/02   2     1
  2  2006/09/02   3     1

↑のようなデータから、全てのcdのdateが最新の行を抽出するには
どうすればいいのでしょうか。
上の例だと、下の二行を抽出したいのですが。

  1  2006/09/02   2     1
  2  2006/09/02   3     1

91 :NAME IS NULL:2006/10/27(金) 18:24:46 ID:j+JTiTDC
オラクルの8iで結合にjoinのANSI標準って使えないの?
なんか、8iにもバージョンがあるけど、もう9にならないとダメ?

92 :NAME IS NULL:2006/10/27(金) 20:00:00 ID:???
>>90
「何 度 目 だ ナ ウ シ カ」

>>91
9iから。マニュアル嫁。

93 :NAME IS NULL:2006/10/28(土) 12:19:59 ID:???
gas117bunt740

質問です。
SQLサーバを使ってるんですが、
1レコード500前後のフィールドがあるテーブルがあるとします。
ここから1000レコード、全フィールドを取り出す場合に
最速な方法ってどんなのがありますか?

select * from でやってるのですが、*指定は時間がかかると聞いたので
1つ1つ指定しようと思ってもSQL文が長くなってしまいます。
ストアド使ったり、とか何でもいいのでどなたか良い方法を教えてもらえませんか?

94 :93:2006/10/28(土) 12:21:01 ID:???
一番上の文字列は無視してください
ゴメンナサイ

95 :NAME IS NULL:2006/10/28(土) 12:35:14 ID:???
*でいいじゃん

96 :NAME IS NULL:2006/10/28(土) 13:14:17 ID:???
時間かかるったって人間に判別できるレベルじゃないだろ。
実行前の解析時の問題だし。

97 :93:2006/10/28(土) 14:03:47 ID:???
>>95>>96
即レスありがとです。
テストプログラム作って試してみたら、客から要求されるスペックぎりぎりなので
他の方法があれば試してみようと思ったのであります(本当は10万レコード取得する必要有り)。


ちなみに、いささかスレ違いになるかもしれませんが
ハードウェアのスペックを、
XP、ペン4 3GHz、メモリ512、から
XP 64bit、デュアルコア(conroe?)、メモリ2GB
とかに変えたら結構変わりますか?相性とかの問題で一概には言えないのは分かりますが。
SQLサーバへのアクセスはスレッド化してやってて、CPU使用率が100%になっています。

以上、長文失礼しますた

98 :NAME IS NULL:2006/10/28(土) 15:13:20 ID:???
>>97
出力先はファイルなんだよね?
SQLはチューニングの余地無し?

だとしたらボトルネックはハードディスクだろうからそっちを早くしたら?

99 :NAME IS NULL:2006/10/29(日) 10:20:16 ID:???
>>97

・テーブルが丸々収まるだけのメモリを積め
・joinするな
・sortするな

あと、例えば20万件のテーブルから1000件取り出す場合と10万件取り出す
場合では最適な方法が変わる。
それから、CPU100%になってるのはクライアント側じゃないよな?

100 :NAME IS NULL:2006/10/29(日) 14:21:00 ID:???
>>97
SQLServer2000で64ビット化は8Gバイト越えたあたりから効果が出た。
それほど細かい単位でテストしたわけではないが、6Gバイト以下なら
32ビットで/3GB オプション+AWEの方がパフォーマンスがよかった。

101 :93:2006/10/29(日) 16:20:58 ID:???
レス遅れました。
みなさんありがとうです。
>>出力先はファイルなんだよね?
500フィールド*10万レコード取得しますが、ファイル出力は1回です。
なので、ハードディスクの影響は小さいと思います。

>>SQLはチューニングの余地無し?
>>joinするな、sortするな
あと今回使うのはみなさんが思っているよりもひたすら簡単なSQLなので
JOINもSORTもありません。
ですのでSQLのチューニング(インデックス、クラスタ化など)とか、
構文の変更は効果が薄いと思っていました。

>>CPU100%になってるのはクライアント側じゃないよな?
うーん、ネットワーク経由のアクセスではなく、1台のPCにSQLサーバとアプリケーションを
積んで動かします。
テストプログラムでは、SQLサーバが30%、アプリケーションが70%って感じでCPUを使ってました。


>>テーブルが丸々収まるだけのメモリを積め
>>32ビットで/3GBオプション+AWEの方がパフォーマンスがよかった
やはり、メモリを増設するのがスピードアップに欠かせないみたいですね。


みなさん、ご丁寧にありがとうございました。とりあえずハードの性能を上げてから、
客に「色々試したが原理的に難しい」とかなんとか言っておきます。
お世話になりました。ノシ



102 :NAME IS NULL:2006/10/29(日) 17:03:25 ID:???
*が時間がかかるって本当だろうか?
カラムを列挙する方がそのパースとチェックに時間がかかりそうだ。
*ならテーブルのスキーマやサブクエリの指定から持ってくればそれで終わり。

103 :NAME IS NULL:2006/10/30(月) 00:59:06 ID:qwh4pYn3
create or replace view v as
select
a, b
from
(
select a,b from table_a -- (1)
union all
select a,b from table_b -- (2)
)
;
のような構造のVIEWで、問い合わせ時は select * from v where a = :1; と
することがわかっている場合、(1)と(2)は全部問い合わせされてしまう
のでしょうか?
それだと無駄なのであらかじめ (1)と(2) も where a = :1 で抽出されている
と良いのですがそのような方法はありますでしょうか?



104 :NAME IS NULL:2006/10/30(月) 01:56:53 ID:???
>>103
>それだと無駄なのであらかじめ (1)と(2) も where a = :1 で抽出されている 

通常はそう。気になるならプランを確認しなされ。

105 :NAME IS NULL:2006/10/30(月) 08:55:31 ID:???
テーブル hoge1
| id : int4 | level : int4 |

テーブル hoge2
| idpath : int4[] | … |

hoge2.idpath[ hoge1.level ] = hoge1.id

の条件のものをテーブル hoge2 から SELECT または、DELETE するにはどんな方法がある?

106 :NAME IS NULL:2006/10/30(月) 09:52:55 ID:mzvVOSKf
OracleでWITH句ってあるっぽいんだけど
誰か意味と文法教えてくださいorz

107 :NAME IS NULL:2006/10/31(火) 00:17:33 ID:???
>>105
それは配列か?
そういう疑問が出るって事は、お前が使うべきものじゃないってことだ。

108 :NAME IS NULL:2006/10/31(火) 05:57:27 ID:???
>>106
インラインビュー定義。

書き方は確か
WITH
IVIEW AS(
  SELECT ~ FROM ~
)
SELECT ~ FROM IVIEW

こんな感じだったかな。複数定義も可。少しはマニュアル嫁。



109 :NAME IS NULL:2006/10/31(火) 12:52:48 ID:???
>>107
配列

SELECT * FROM hoge2 h2 INNER JOIN hoge1 h1 ON h2.idpath[ h1.level ] = h1.id;
他に効率のいい方法はある?

110 :NAME IS NULL:2006/11/01(水) 01:26:57 ID:wuXOdbma
質問です。
NULL以外のものだけ、まとめることは可能でしょうか?

例:

data  value
1    1
2    2
3    null
4    null
5    2
6    1

↓↓↓

data  value
1    1
2    2
3    null
4    null

※まとめた際のdataはminだろうがmaxだろうが、値が残れば何でも構いません。


111 :NAME IS NULL:2006/11/01(水) 02:12:04 ID:???
UNIQUE制約でのNULL扱い(複数許可)を考えれば、>>110でGROUP BY valueとしたとき
NULL値でまとめられてしまうってのは、チョットつじつまが合わない...かな。

>>110
SELECT min(data),value FROM Table WHERE value IS NOT NULL GROUP BY value
UNION
SELECT data,value FROM Table WHERE value IS NULL;


112 :NAME IS NULL:2006/11/01(水) 04:01:59 ID:1j/d4EoT
助けて下さい!!
MySQL5.0の環境設定がどうしてもできません…

113 :NAME IS NULL:2006/11/01(水) 08:24:04 ID:???
>>112
http://pc8.2ch.net/test/read.cgi/db/1081818145/
ここで聞いたほうがいいんじゃないですかね?

114 :NAME IS NULL:2006/11/01(水) 11:53:40 ID:wuXOdbma
>>111
ありがとん

115 :NAME IS NULL:2006/11/01(水) 12:04:20 ID:???
Oracleのストアドプロシージャとファンクションについてなんですが、
ストアドプロシージャはINSERT、UPDATE、DELETEなどを断続的に実行するもので、
ファンクションは複雑なSELECT文の結果を戻り値として取得するのものであるという認識でいいんでしょうか。
あと、ファンクションの内部ではINSERT、UPDATE、DELETEは使用できないのでしょうか。
よろしければ助言をお願いします orz

116 :NAME IS NULL:2006/11/01(水) 12:12:34 ID:???
>>115
ここは、DB版の案内所なのか?
つ Oracle 総合 Session6

ストアド関連は標準が無いに等しいので一般的な話で言えばその通りで、
更新は出来ないことにしている実装が多い。selectでこっそり更新してたらややこしいだろう。

117 :NAME IS NULL:2006/11/01(水) 12:50:26 ID:???
>>115
プロシージャとファンクションの違いは戻り値を返すか返さないかの違いのみ。
どちらでもSELECTだろうとINSERTだろうとCREATEだろうとなんでも可能。

118 :NAME IS NULL:2006/11/01(水) 13:02:05 ID:???
>>116
すいません、SQLに関しての質問なのでこちらがいいと思っていました。
DBMSによって実装の違いがあるのですね。
OracleのFUNCTIONの実装について調べてみます。

>>117
最初はそう思っていたのですが、以下のようなファンクションを定義したら、
実行時に「ORA-14551: 問合せの中でDML操作を実行することはできません。」と出ました。

CREATE FUNCTION fnc_test(test IN VARCHAR2) RETURN NUMBER AS
BEGIN
  FOR i IN 0..1000 LOOP
    INSERT INTO test(id,name)VALUES(i,'N' || i);
  END LOOP;
  COMMIT;
END;

なお、まったく同じ内容でストアドプロシージャを定義したら、正しく実行されました。

119 :NAME IS NULL:2006/11/01(水) 13:12:34 ID:???
>>118
それは実行の仕方に問題があるんでないの?
SELECT文の中で呼んでるとか?

120 :NAME IS NULL:2006/11/01(水) 14:21:12 ID:???
>>90
FAQと過去ログ嫁
厨房

121 :NAME IS NULL:2006/11/01(水) 14:24:06 ID:???
これ忘れたころに出てくんだが
なんとかならんのか?

  cd    date    value1  value2
---------------------------------
  1  2006/09/01   1     1
  1  2006/09/02   2     1
  2  2006/09/02   3     1

↑のようなデータから、全てのcdのdateが最新の行を抽出するには
どうすればいいのでしょうか。
上の例だと、下の二行を抽出したいのですが。

  1  2006/09/02   2     1
  2  2006/09/02   3     1


122 :NAME IS NULL:2006/11/01(水) 15:14:04 ID:???
>>118
実装によって違うというのはそういうこと、
OracleはFunction内でデータの更新を許していない。
他のではOKだったり、selectで使わない限りOKというものがある。

123 :NAME IS NULL:2006/11/03(金) 00:23:25 ID:GYI4IqD6
SQLからカレンダー情報を取得することはできないでしょうか?

例えば2006年11月の日付全てを取得したい

 date
2006-11-01
2006-11-02
2006-11-03
2006-11-04
  ・
  ・
  ・
2006-11-30


みたいな感じです。


124 :NAME IS NULL:2006/11/03(金) 03:22:03 ID:???
ソフトやバージョンによるのかもしれないが、SQLは結構アバウトな検索条件でも想定通りに動いてくれたりする。
date>='2006-11-01' とか。


125 :NAME IS NULL:2006/11/03(金) 06:56:44 ID:???
普通の方法かどうかはしらんがこうじゃねーの?

select
*
from
hoge
where
YEAR(DATE) = 2006 and
MONTH(DATE) = 11

ちなみにDB2な。

126 :NAME IS NULL:2006/11/03(金) 07:19:45 ID:???
日付のレコードが既にあるんじゃなくて生成したいんじゃないの?

127 :NAME IS NULL:2006/11/03(金) 08:02:13 ID:???
入力ファイルもなしでSQL一つで任意の一ヶ月分insertするって事?
出来るなら漏れも知りたいんだが。

漏れはJavaのCalendarクラス使いながら任意の月のカレンダーを
insertするアプリ作ったことはあるけどさ。

128 :123:2006/11/03(金) 09:38:55 ID:GYI4IqD6
はい、データがあるわけではなく、生成したいんです。
やはり無理なもんなんでしょうか。

129 :NAME IS NULL:2006/11/03(金) 10:01:43 ID:???
0から30までを返してくれる関数なり、テーブルを作っておけば、
なんとかならんわけでもない。

130 :NAME IS NULL:2006/11/03(金) 10:11:18 ID:???
レコードを生成する手もあることはあるがDB依存になる。
ORACLEならDUALにCONNECT BYを使うとか。PL/SQLで表関数を自作するとか。
どっかの適当なテーブルかディクショナリービューから引っ張ってくるのが一番楽だが。

そして適当な数のレコードを確保したらSELECT句で日付型の'2006/11/01'に
ROWNUMとかの行カウントをもつ疑似列を足せばいい。

131 :NAME IS NULL:2006/11/03(金) 10:43:14 ID:???
アプリ側でやるとか、前もって日付テーブルを作っておくとかの方が後々楽だと思うのですが

132 :NAME IS NULL:2006/11/03(金) 12:42:29 ID:???
>>131
アプリに頼るとは貴様それでもSQLerか!
どんなことでも1つのSQLでやる!それがSQLerだ!!!1111

133 :NAME IS NULL:2006/11/03(金) 13:29:01 ID:???
SELECT
 TO_DATE('2006/11/01')+DAY
FROM
(
 SELECT 1 DAY FROM DUAL
 UNION
 SELECT 2 DAY FROM DUAL
 UNIOM
  :
 UNION
 SELECT 31 DAY FROM DUAL
) D
WHERE TO_DATE('2006/11/01')+DAY < TO_DATE('2006/12/01');

むりくり

134 :NAME IS NULL:2006/11/04(土) 00:27:31 ID:???
学校でデータベース入門みたいな授業取ったんですが、変なプリントだけですすめる授業で
ついていけません・・・初心者向けの解説サイトかいい本ってないでしょうか?
CREATEなんたらの辺でつまづいてます

135 :NAME IS NULL:2006/11/04(土) 00:43:55 ID:???
SQLの絵本

136 :NAME IS NULL:2006/11/04(土) 08:46:21 ID:???
>>134
10日で出来る〜とかのシリーズでRDBについてもあるから家のPCにMySQL入れて、本読みながら実際に操作してみるのが
よろし

137 :NAME IS NULL:2006/11/04(土) 12:02:02 ID:???
変なプリントってどんな感じの?

138 :NAME IS NULL:2006/11/04(土) 14:11:40 ID:07MrGocL
質問させていただきます。
一つのフィールドに複数の外部キー(数は可変)を入れたいのですが、
どのようにテーブルを組めば良いでしょうか?

139 :NAME IS NULL:2006/11/04(土) 14:33:28 ID:???
意味が解らんが、ひとつのフィールドに制約を複数つけるって事か?
事例を具体的に汁。

140 :NAME IS NULL:2006/11/04(土) 16:46:48 ID:???
一つの列に複数のデータを入れるって事?
だとしたら止めとけ。列はアトミックじゃないといかん。

141 :138:2006/11/04(土) 23:23:56 ID:07MrGocL
>>139
すみません。。
一つのフィールドに複数のデータを入れたいんです。。(MySQLのENUMやSETみたいな。)
>>140
そうなんですが、こういう時ってみなさんどうしていらっしゃるのか知りたくて。。
別にテーブル作ってなんとか出来ないかな、と考えていますが方法がおもいつきませんorz

142 :NAME IS NULL:2006/11/05(日) 00:05:38 ID:???
Genre  Name
--------------------
  A  りんご
  A  ぶどう
  B  いちご
  B  おっぱい
  B  みかん
  C  かき


じゃ駄目なの?


143 :138:2006/11/05(日) 00:55:50 ID:???
>>142
!!!!!
アッ――全然思いつきませんでした。。
本当にありがとうございました。

144 :NAME IS NULL:2006/11/05(日) 00:55:48 ID:D+FbnAE+
すいません、Oracleのcreate databaseとcreate tablespaceのサンプルってどっかにありませんか?
ネット上探しても文法は載っててもsqlそのものは置いてなかったりなんで・・。

145 :NAME IS NULL:2006/11/05(日) 03:33:58 ID:???
関係モデルのときのデータモデルの概念について、データ構造・操作演算・インテグリティ制約
について説明せよって問題で、データ構造はデータモデルの要素間の関係を定義するもの、
操作演算はデータ構造に対しての操作のことでそのうちデータベースにするものってのは
わかった(あってるのかな?)んですが、インテグリティ制約ってのが
ググってもちゃんとした説明が見つからず何なのかわかりません・・・
インテグリティってのは完全性って意味だからデータベースが完全じゃなきゃいけないって
制約・・・?教えてください

146 :NAME IS NULL:2006/11/05(日) 05:31:49 ID:???
>>145
普通にDBにある制約全般のこと

147 :NAME IS NULL:2006/11/05(日) 10:30:02 ID:???
>144
マニュアルにあるサンプルじゃ足りないって話なら、
何が足りないのか明確にして、
Oracleスレに行きませう

148 :NAME IS NULL:2006/11/05(日) 19:20:39 ID:???
3階層アーキテクチャって内部層 概念層外部層 でいいんですか?

149 :NAME IS NULL:2006/11/05(日) 19:55:52 ID:???
SQLだけで3階層アーキテクチャするのかと。

150 :NAME IS NULL:2006/11/05(日) 22:31:36 ID:???
ビューを使用したことがないのでビューというものがよく分からないのですが
ストアドと比べ、ビューを利用するメリットって何かあるのでしょうか?
パラメータが設定できない簡易ストアドと考えればいいのかな?と

151 :NAME IS NULL:2006/11/05(日) 22:35:36 ID:???
>>149
違いました?じゃあなんのことでしょう・・・

152 :NAME IS NULL:2006/11/05(日) 23:28:25 ID:???
>151
違うも何も、SQLっていうのはただの言語。
ここで3階層アーキテクチャって何?って問うのが意味不明。
ム板にいってらっしゃい。

153 :NAME IS NULL:2006/11/05(日) 23:43:16 ID:???
>>150
ビューのメリットをどう捕らえるかは人それぞれだけど、
ウチの近所ではテーブルのテーブル名は英語表記で
ビューのテーブル表記を日本語にしてたりするな。

プログラマーは英数字でゴリゴリとコーティングして、
クライアントはAccess,Excelでアクセスするから日本語って感じ。

ストアドはバッチ処理で使っている。

154 :NAME IS NULL:2006/11/06(月) 03:13:47 ID:???
すいません、質問がありあす。

実験的に、レビューサイトみたいなものを作ろうかと思っていまして
データベース全体の設計を考えているんですが、ちょっと路頭に迷っています。

例えば、漫画を題材に作るとしたら

テーブル名 ドラゴンボール

評価項目(フィールド) キャラクター ストーリー 演出

レビュー投稿者(レコード) キャラの得点 ストーリーの得点 演出の得点

というような感じで、漫画の種類ごとに、テーブルを増量していけば、いいのでしょうか?

一日中、考えていたのですが、なかなか結論が出ません。
もし、先輩達が作るとしたら、どのようにしますか?教えてください。



155 :NAME IS NULL:2006/11/06(月) 06:13:11 ID:???
○テーブル名 漫画マスタ
漫画ID 漫画名

○テーブル名 レビュー
漫画ID レビュー投稿者 キャラの得点 ストーリーの得点 演出の得点

○テーブル名 レビュー集計
漫画ID レビュー件数 各平均〜

レビュー数が少ないなら集計テーブルはいらんかも。
あんまりよくはないが漫画マスタに集計値を持つのも可。

レビュー投稿者が登録制ならレビュー投稿者マスタもあった方がいい。


156 :NAME IS NULL:2006/11/06(月) 07:02:32 ID:???
マスタってどういう意味?

157 :154:2006/11/06(月) 07:37:24 ID:???
>>155
そのような考え方も、あるのですね。
こっちの方が、将来的に増えるテーブルの数も極力抑えることが、出来そうです。
とても参考になります。

漫画IDの概念を持たせて、表示させたいページへ、細工すればいいわけですか。
まだ、一つのレコードにID属性を与える方法や、具体的に表示させる方法も
わからないので、考え方が間違えているかもしれませんが、
何となく構図みたいなものが、つかめてきました。

お年玉で買った参考書を持って、学校でもっと勉強してきます。
ありがとうございました。


158 :NAME IS NULL:2006/11/07(火) 18:25:31 ID:???
>>157
>そのような考え方も、あるのですね。
つーか、データをテーブル名に持たせるとこで終わっとる

159 :NAME IS NULL:2006/11/07(火) 19:01:13 ID:???
>>158
こんなDB設計あがってきたら
設計者ぶんなぐってやる所だなw


160 :NAME IS NULL:2006/11/07(火) 20:22:18 ID:URmt18+L
質問です。

テーブルfooから、フィールドcodeの最も大きい値の
フィールドnameを取得するSQLを作ってみたのですが
もっとDBに負荷のかからない方法がありますでしょうか?

TABLE foo

code name
0001 AAAA
0002 BBBB
0003 CCCC

SELECT
MAX(CODE),
NAME
FROM
foo A
(
SELECT
MAX(CODE) AS CODE
FROM
foo
) B
WHERE
A.CODE = B.CODE



161 :NAME IS NULL:2006/11/07(火) 20:33:54 ID:yW4ILo2h
>>160

テーブルのサイズにもよるが、こっちのがいいんじゃないかな。
君のやり方だと、一度メモリ上に中間テーブルBが作られるだろ。

SELECT name
FROM foo
WHERE code = (SELECT MAX(code) FROM foo);

162 :NAME IS NULL:2006/11/07(火) 20:40:57 ID:URmt18+L
>>161
どうもありがとうございます

163 :NAME IS NULL:2006/11/07(火) 21:56:37 ID:esrXqfnU
一つの項目の中に、10001,10002,10003...20001,20003,20004...30001,30002,30003,....とある中から
○万台中の各最大値を取り出したいのですが・・・わかりません凹○
ヒントになるサイト等ないでしょうか、よろしくお願いします



164 :NAME IS NULL:2006/11/07(火) 22:39:01 ID:???
>>163
SELECT max(num) FROM Table GROUP BY trunc(num,-4);

165 :164:2006/11/07(火) 22:42:51 ID:???
truncが使えるかどうかワカランので補足
要は千以下を切り捨てた値でGROUP BY
num/10000 をint型にキャストした値でも桶。

166 :NAME IS NULL:2006/11/07(火) 23:30:40 ID:JIU7J0zh
質問です。

mysql 上なのですが、グループごとに項目番号をつけて出力したいのですが、
どのようにしたらよいのでしょうか。

167 :NAME IS NULL:2006/11/07(火) 23:57:41 ID:pACtuQaW
MySQLを使っています。
カラム numに100が入っていて、update でこの値に100を足したい
場合どすればいいですか?

※num を 200にしたい。

168 :NAME IS NULL:2006/11/07(火) 23:59:59 ID:???
update table
  set column = column + 100

じゃ駄目なの?

169 :NAME IS NULL:2006/11/08(水) 00:05:01 ID:???
>>168
出来ました!
ありがとうございました。

170 :NAME IS NULL:2006/11/08(水) 14:29:18 ID:???
>>164-165san
勉強になります!すんなりいけました
ありがとうございました

171 :NAME IS NULL:2006/11/08(水) 15:00:37 ID:???
>>166
項目番号の定義を

172 :NAME IS NULL:2006/11/09(木) 15:08:23 ID:Wrn+ZO8y
hogeテーブルのカラムAをhogeテーブルのカラムBにまるままコピーしたいのですが
この場合どういったSQL文を書けばいいのでしょうか?
素直にselectとupdateを件数分だけ繰り返すしかないのでしょうか?
件数が多いので一括コピーみたいなことが出来たら楽なのですが…

データベースはpostgres7.4を使用しています。

173 :NAME IS NULL:2006/11/09(木) 15:55:21 ID:???
>>172
UPDATE hoge SET B = A;

174 :NAME IS NULL:2006/11/09(木) 16:15:24 ID:???
>>173
テストDBで教えていただいたSQLでうまく出来ました
ありがとうございます


175 :NAME IS NULL:2006/11/09(木) 16:26:38 ID:???
データベースってC:\mysql\dataでしか作れないの?
E:\Web\につくりたいんだが

176 :NAME IS NULL:2006/11/09(木) 16:30:05 ID:???
>>175
SQL関係無いので、MySQLのスレでお願いします

177 :NAME IS NULL:2006/11/09(木) 16:31:43 ID:???
>>176
すんません、SQL総合かと思いました

178 :NAME IS NULL:2006/11/09(木) 16:36:12 ID:???
>>177
その前に、DBMS=SQLと思ってるのを何とかした方がいいぞ。

179 :NAME IS NULL:2006/11/09(木) 21:21:55 ID:C9bV7Hin
TABLE1、TABLE2それぞれ最大1レコードしか存在しない場合、
下記のSQLを発行したところ、TABLE1、TABLE2どちらかが
レコードカウント0の場合、クエリー結果もレコード0となって
しまいます。

2つテーブルのうちいずれかのレコードが0の場合でも結果を
返す方法はないでしょうか?


SELECT
NVL(A.FIELD1,' '),
NVL(B.FILED2,' ')
FROM
TABLE1.A,
TABLE2 B




180 :NAME IS NULL:2006/11/09(木) 21:53:49 ID:lmWNdE2f
質問です。


あるテーブルAがあり、そこにはID,名前があります。また別のテーブルBがあり、そこにはAのIDとその値段が書かれています。しかしテーブルAにある全てのIDに値段がついているわけではありません。

この状況で僕はテーブルAの値段のついているものとそうでないものを受け取るsqlを書こうとしています。欲しいのは名前と値段がついているかついていないかのフラグです。

そこで僕はテーブルAの行を1行ずつforでまわしてそのIDがBにあるかを調べてあったら1、なかったら0を返すストアドプロシージャを作りました。

これをこれを使って上記の結果を返すsql書くにはどうしたらいいでしょうか?わかる方いらっしゃったら教えて下さい。よろしくお願いします。

181 :NAME IS NULL:2006/11/09(木) 22:04:09 ID:C9bV7Hin
>>180
これじゃだめ?
値段がNullのレコードが値段無し、それ以外が値段有り。

SELECT
A.ID,
B.値段
FROM
A,
B
WHERE
A.ID = B.ID(+)


182 :180:2006/11/09(木) 22:15:16 ID:lmWNdE2f
>>181
早速のレスありがとうございます。でもそれだと駄目なんですよねぇ。sql結果を使うアプリのほうが0 or 1しか駄目な仕様なんです。僕が一つ思いついた方法が以下です。

declare @id
declare @flag

declare test cursor for
select ID from A

fetch next from test into @id

open test

while @@fetch_status=0
begin
 @flag = exec <IDがBにあるか調べるプロシージャ> @id
 insert into C(
   id, flag
 ) values (
   @id, @flag
 )
 fetch next from test into @id
end
close test
deallocate test

このように一度IDとflagをCテーブルに入れてから取り出す方法です。

insertできるならそれを結果として出力できる方法もあるのかなと思うのですがないのかなぁ…。

183 :NAME IS NULL:2006/11/09(木) 22:33:27 ID:C9bV7Hin
>>182
その方法(ストアド)ではできないんでしょうか?
詳しくないので、私なら下記のSQLでCテーブルのデータを入れます。


INSERT INTO C
(
SELECT
A.ID,
CASE WHEN B.値段 IS NULL THEN 0 ELSE 1
FROM
A,
B
WHERE
A.ID = B.ID(+)
)

184 :NAME IS NULL:2006/11/09(木) 22:56:35 ID:???
>>179
SELECT
NVL(A.FIELD1,' '),
NVL(B.FILED2,' ')
FROM
TABLE1 A FULL OUTER JOIN TABLE2 B;


185 :182:2006/11/09(木) 23:10:06 ID:lmWNdE2f
>>183
ありがとうございます!解決しました!

186 :NAME IS NULL:2006/11/09(木) 23:27:57 ID:C9bV7Hin
>>184
ありがとう御座います。

もうひとつ質問させてください。
TABLE1とTABLE2がそれぞれサブクエリーの場合はどうしたらいいでしょうか?
FULL OUTER JOINを使用すると、missing keywordとなってしまします。

TABLE1 → (SELECT MAX(FIELD1) AS FIELD1 FROM TABLE_3)
TABLE2 → (SELECT MAX(FIELD2) AS FIELD2 FROM TABLE_4)







187 :184:2006/11/10(金) 00:24:14 ID:???
>>186
すいません。もしかして>>184も動かない?試さずに書いてしまいました。
ポスグレだと↓みたいにしないとだめだった。オラクルはちょっと環境がないので未確認です。

SELECT
NVL(A.FIELD1,' '),
NVL(B.FILED2,' ')
FROM
TABLE1 A FULL OUTER JOIN TABLE2 B
ON 1=1

188 :NAME IS NULL:2006/11/10(金) 02:51:49 ID:WvgQViKV
現在まったく同じ構造のテーブルが2つ、TABLE_2005とTABLE_2006がありまして、
それぞれに該当する年のデータが入っています。

この2つのテーブル両方からitem_idが26のものだけを拾ってきたいのですが、

SELECT * FROM TABLE_2005, TABLE_2006
WHERE
TABLE_2005.item_id = 25
OR
TABLE_2006.item_id = 25

とやっても何もかえってきません。
両方のテーブルから指定したitem_idの行を全て返すにはどうしたらいいのでしょうか。

189 :NAME IS NULL:2006/11/10(金) 04:00:12 ID:3FgvYcaH
>>188
UNIONを使えばテーブルの結合ができるよ。

SELECT
*
FROM
TABLE_2005
WHERE
TABLE_2005.item_id = 25
UNION
SELECT
*
TABLE_2006
WHERE
TABLE_2006.item_id = 25


190 :NAME IS NULL:2006/11/10(金) 04:02:13 ID:WvgQViKV
>>189
ありがとうございます!

191 :NAME IS NULL:2006/11/10(金) 23:36:31 ID:???
日付と時刻関数を使って、
過去一週間の日付をすべて返すにはどうしたらいいんでしょうか?

日付を記録したフィールドがあるので、
一週間分のデータをWHERE を使って検索したいのですが・・・

192 :NAME IS NULL:2006/11/11(土) 06:06:06 ID:???
  id  val
------------
  1  100
  2  200
  3  300
  4  400

SELECT id FROM tbl HAVING val = MAX(val)

最大値を持つ行を取り出したく
上記のSQL文を使ってみたのですが・・・駄目でした。
何がよい手はありませんか?
MySQL 4.0.26


193 :NAME IS NULL:2006/11/11(土) 08:16:07 ID:QhU9wHgR
>>191
current dateみたいな関数が使えるかマニュアルを見れ。

>>192
SELECT id,MAX(val) FROM tbl GROUP BY id HAVING val=MAX(val)
では駄目なのか?

194 :NAME IS NULL:2006/11/11(土) 18:16:11 ID:VWYitA5m
すみません、>>188ですが、再度UNIONについて質問させてください。
UNIONで結合したテーブルから上位10件のみを拾ってきたいのですが

SELECT TOP 10 * FROM
(
 (SELECT * FROM TABLE_2005 WHERE item_id = 25)
 UNION
 (SELECT * FROM TABLE_2006 WHERE item_id = 25)
)

とやるとエラーとなって実行されません。

DECLARE @TEMPTBL TABLE(user_id INT, friend_id INT, friend_message NVARCHAR(128))
 INSERT INTO @TEMPTBL (user_id, friend_id, friend_message)
 (
  SELECT user_id, friend_id, friend_message FROM TBL_FRIEND_LINK_0
  UNION
  SELECT user_id, friend_id, friend_message FROM TBL_FRIEND_LINK_1
 )
SELECT TOP 10 * FROM @TEMPTBL

のように、テーブル変数を使うしか方法はないのでしょうか?

195 :NAME IS NULL:2006/11/11(土) 18:17:16 ID:???
>>194
いろいろ試していたのをそのままコピペしてしまったので
あ、列名がむちゃくちゃになってしまいました。
すみません

196 :NAME IS NULL:2006/11/11(土) 18:31:22 ID:???
select top 10 * とかテーブル変数とか、どこの方言だ?

197 :NAME IS NULL:2006/11/11(土) 18:32:13 ID:???
>>196
プ

198 :NAME IS NULL:2006/11/11(土) 18:33:44 ID:???
>>196
MSSQL

199 :NAME IS NULL:2006/11/11(土) 18:37:05 ID:???
          ____
       / \  /\  キリッ
.     / (ー)  (ー)\
    /   ⌒(__人__)⌒ \    select top 10 * とかテーブル変数とか、どこの方言だ?
    |      |r┬-|    |
     \     `ー'´   /
    ノ            \
  /´               ヽ
 |    l              \
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))


          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / //   だってお!!!!!wwwwwwwww
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー'´      ヽ /    /
 |    |   l||l 从人 l||l      l||l 从人 l||l
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))

       ____
     /_ノ  ヽ、_\
   o゚((●)) ((●))゚o
  /::::::⌒(__人__)⌒::::: \
  |     |r┬-|     |    (⌒)      答えられないならレスしてんじゃねえよwwwwwww
  |     | |  |     |   ノ ~.レ-r┐、
  |     | |  |     |  ノ__  | .| | |
  \      `ー'´     /〈 ̄   `-Lλ_レレ
                  ̄`ー‐---‐‐´

200 :NAME IS NULL:2006/11/11(土) 20:26:20 ID:???
>>196
MSAccess

201 :NAME IS NULL:2006/11/11(土) 23:43:29 ID:???
>194
エラーを書いてくんないかな?
そこにヒントがあるはずなんだけど。

あと、その二つのテーブルレイアウトはまったくいっしょなのかな。
多少の桁数違いぐらいならいいけど、カラムの順番が違うとかだとアウトだよ。
違うのなら、後で書いているDECLARE文つきのUNION使ったSELECT文のように
ちゃんとカラム名書いてやったらいいんじゃないの?

202 :NAME IS NULL:2006/11/11(土) 23:50:52 ID:JmoTKbEE
iddate
12006-11-10
22006-11-09
42006-11-03
32006-11-03
62006-10-10
52006-10-09

こんな表があるとします。並び順は「date DESC, id DESC」です。

この表を「SELECT * FROM tbl WHERE id = 3」で検索したとして、
その前後のID(この例でいうと前:id=4, 後:id=6)を同時に取得したいのです。
こんなことは可能でしょうか?

203 :NAME IS NULL:2006/11/11(土) 23:52:13 ID:JmoTKbEE
ごめんなさい。表がずれました。もう一度。
id   date
1    2006-11-10
2    2006-11-09
4    2006-11-03
3    2006-11-03
6    2006-10-10
5    2006-10-09

こんな表があるとします。並び順は「date DESC, id DESC」です。

この表を「SELECT * FROM tbl WHERE id = 3」で検索したとして、
その前後のID(この例でいうと前:id=4, 後:id=6)を同時に取得したいのです。
こんなことは可能でしょうか?

204 :NAME IS NULL:2006/11/12(日) 00:18:08 ID:???
>>203
WHERE id=n OR id=n-1 OR id= n+1
ではいかんのん?

205 :NAME IS NULL:2006/11/12(日) 00:26:46 ID:h3d66FlB
>>204
ORDER BY date DESC, id DESC
なんです。
またレコードが削除されることもあります。

206 :NAME IS NULL:2006/11/12(日) 00:35:45 ID:???
まずソートして、連番振って、id=3の連番を取得する。
上とは別に同じようにソート・連番ふったインラインビューに
連番 between 取得連番-1 and 取得連番+1

with使うとシンプルにはなるが重そうだな・・・

207 :NAME IS NULL:2006/11/12(日) 00:42:04 ID:???
可能だがすんごい無駄っぽい。俺が思いついたヒントだけ。

SELECT * FROM (SELECT
(SELECT count(*) FROM tbl WHERE T1.date <date OR (T1.date = date AND T1.id<id)) AS cnt,
* FROM tbl AS T1)AS T2;

とりあえずこれで整列後の通し番号cntが付く
id=3のときcntを求めて(サンプルだと3)前後のcntを含めるように
WHRER句を足せば桶。相関サブクエリがいくつできるやら...
あー、当然id,dateでユニークな場合な。

ここまで書いて>>206さんにさき越されたw

208 :207:2006/11/12(日) 00:44:18 ID:???
あ、チョット違うかな。一応1行で取得できるともう。
んでも>>206さんが言うようにテンポラリシーケンスかなにかで
連番振って2段階の方が速いかもしれん。

209 :206:2006/11/12(日) 01:13:58 ID:???
おれも横着せんとSQLで書くか・・・

WITH TMPV AS(
  SELECT
    ROWNUM SEQ,
    *
  FROM
  (
    SELECT
      *
    FROM
      TBL
    ORDER BY
      DATE DESC,
      ID DESC
  )
SELECT
  T1.*
FROM
  TMPV T1,
  TMPV T2
WHERE
    T1.SEQ BETWEEN T2.SEQ-1 AND T2.SEQ+1
  AND T2.ID = 3

眠いから細かいとこまであってるかわからん。
インラインビューよりマテビューにして行連番を主キーにした方がいいかも。

じゃ寝るノシ

210 :NAME IS NULL:2006/11/12(日) 12:04:35 ID:???
Postgresqlで、

LIST      OBJ          LIST
no| name   id | LIST_no    no | name
---------- ------------ → ------------
1 | みかん  1 | 2         2 | りんご
2 | りんご   2 | 4         1 | みかん
3 | すいか               3 | すいか
4 | ぶどう                4 | ぶどう

という風に、
「select LIST_no from OBJ where ID='1'」のnoだけ常に先頭にしつつ、
条件外のものは2位以下にno順でLIST表をソートする方法が思いつきません。
ご教示頂けると有難いです

211 :NAME IS NULL:2006/11/12(日) 13:08:24 ID:???
>>204-209
みなさんありがとうございます。
連番をふる方法は素晴らしいのですが、件数が増えてくると遅そうなので、
SQLerとしては失格ですが、ロジック側でSQLを3回実行する方法にしました。

1回目:SELECT * FROM tbl WHERE id = 3;
2回目:SELECT id FROM tbl WHERE (date = '[1のdate]' AND id < '[1のid]') OR (date < '[1のdate]') ORDER BY date DESC, id DESC
3回目:SELECT id FROM tbl WHERE (date = '[1のdate]' AND id > '[1のid]') OR (date > '[1のdate]') ORDER BY date, id

※ひょっとしてサブクエリを使えば1行で実行も可能だったり?

212 :NAME IS NULL:2006/11/12(日) 13:30:50 ID:???
>>210
愚直な俺はこんなのしか思いつかないが。もっといいやり方があるかも。

select * from LIST where no = (select LIST_no from OBJ where ID='1')
UNION ALL
(select * from LIST where no not in (select LIST_no from OBJ where ID='1') order by no);


213 :NAME IS NULL:2006/11/12(日) 15:52:50 ID:???
>>210
SELECT CASE id WHEN 1 THEN 0 ELSE no END,* FROM OBJ ORDER BY 1;
noが1以上でしかない場合だけどな。

214 :NAME IS NULL:2006/11/12(日) 16:00:09 ID:???
すまん、LISTとOBJを結合するの忘れてた。
SELECT CASE id WHEN 1 THEN 0 ELSE no END,LIST.*
FROM LIST LEFT JOIN OBJ ON LIST.no=OBJ.LIST_no
ORDER BY 1;

215 :NAME IS NULL:2006/11/12(日) 17:23:14 ID:???
外部結合してソートするといいよ。

216 :NAME IS NULL:2006/11/13(月) 02:58:11 ID:???
2000/01/01と2005/0101の二つの値から
各年(00,01,02,03,04,05)を得たいのですが、どういう感じになるのでしょうか

217 :NAME IS NULL:2006/11/13(月) 03:13:02 ID:???
なんか、先日からこんな質問多いな。
基本的にSQLではデータを生成するもんじゃない。
既にあるデータを抽出したり集計したりするもんだがな。

218 :NAME IS NULL:2006/11/13(月) 06:42:54 ID:???
>>217
スルー力w

219 :194:2006/11/13(月) 11:03:58 ID:z5bCqrg8
>>196
Microsoft SQL Server 2005 Express EditionのTransact-SQLというものみたいで、
一般的なSQLではないみたいでした。

>>201
メッセージ 102、レベル 15、状態 1、行 7
')' 付近に不適切な構文があります。

としか表示されません。 
テーブルレイアウトはまったく同じで、カラム名指定しても同じ結果でした。
実行したクエリは下記のとおりです。
----------------------------------
use my_table
go

SELECT item_id, item_name FROM
(
SELECT item_id, item_name FROM TABLE_2005
UNION
SELECT item_id, item_name FROM TABLE_2006
)
----------------------------------

( )でくくるなど、いろいろ試してみましたが、どうしてもうまく動きません。
Transact-SQLというのは、他データベースでは動かないようなので
あまり使いたくないので、なにかヒントがあれば宜しくお願いします。

220 :NAME IS NULL:2006/11/13(月) 12:49:31 ID:???
>>211
目的のもの、目的未満で最大のもの、目的より大きくて最小のものの3つでいいじゃん

221 :NAME IS NULL:2006/11/13(月) 12:53:42 ID:???
>>219
LIMITは使えないの?
ソートはしてるだろうと思うから省略で。

SELECT item_id, item_name FROM TABLE_2005
UNION
SELECT item_id, item_name FROM TABLE_2006
LIMIT 100

222 :NAME IS NULL:2006/11/13(月) 15:31:43 ID:???
初級シスアドレベル以下の知識なんだけど
SQLに興味もって勉強しようと思います。

んで、勉強するにあたって何かソフトを用意しようと思うんだけど
ACCESSとかオラクルとか買えば、SQLの勉強できる?

223 :NAME IS NULL:2006/11/13(月) 15:56:16 ID:???
>>222
キミの現在のスキル次第。

とりあえず、MySQLとかPostgreSQLとかを使っても勉強できる

224 :NAME IS NULL:2006/11/13(月) 16:07:16 ID:???
>>223
シスアドのテキストでしかSQLを見たことがないので
スキルは0です。

MySQLやPostgreSQLってフリーソフトみたいなので
まずはこれを使って勉強したいと思います。

ありがとうございました。

225 :NAME IS NULL:2006/11/13(月) 17:00:13 ID:???
いや、SQL以外のスキルね。
インストールしたりツール使ったりできればフリーで試せるかなと。
まあがんばって

226 :NAME IS NULL:2006/11/13(月) 23:13:19 ID:???
>219
SELECT item_id, item_name FROM
(
SELECT item_id, item_name FROM TABLE_2005
UNION
SELECT item_id, item_name FROM TABLE_2006
) TBL
^^^^

>221
SQL Server系にLIMITはない。
今回の要件だとTOP句でいける。

227 :NAME IS NULL:2006/11/13(月) 23:15:34 ID:???
>224
君の文章から察するに、Windowsに突っ込む気なら、Postgreはやめといたほうがいいとおもう。
多分トラブルシューティングに時間がかかりすぎて勉強どころじゃないと思う。
MySQLかMSDN、Oracleでも勉強用のフリーのがあるから、そっちのほうがいい。

228 :NAME IS NULL:2006/11/13(月) 23:36:56 ID:???
Postgre?
MSDN?

229 :NAME IS NULL:2006/11/14(火) 00:27:29 ID:???
テーブルのフィールド名を返す関数はありますか?

230 :210:2006/11/14(火) 00:40:06 ID:???
>>212
union allってのがあるんですね。
これでいけました。ありがとうございます。
>>213-214
こちらは少しトリッキーな方法ですね。
order by 1というやり方は初めて知りました。勉強になります。

231 :NAME IS NULL:2006/11/14(火) 10:05:28 ID:???
SQL以前の話だけど、「select * 〜」と全フィールド指定か、フィールドを列挙するじゃないですか。
なんで除外したいフィールドって指定できないんだろ。

232 :NAME IS NULL:2006/11/14(火) 14:04:13 ID:???
意味が無いから

233 :NAME IS NULL:2006/11/14(火) 17:04:08 ID:???
いや手前に-付けたらできるだろ。

234 :NAME IS NULL:2006/11/14(火) 23:08:31 ID:???
>233
それは引き算っていうんだよ。

つーか、SELECTの英語の意味わかってるよな?
SELECTっていう単語には「除外」だとかそういう意味はないの。
どーしてもやりたいんだったら、「除外」を表現する句を実装したエンジンを作ればいい。
がんばれ。

235 :NAME IS NULL:2006/11/15(水) 02:52:33 ID:???
preg_match見たいな
正規表現の文字列抽出は可能でしょうか?

236 :NAME IS NULL:2006/11/15(水) 06:27:11 ID:ROBlrBon
perlスクリプトからユーザを作成・権限設定するにはどのようにすれば
良いのでしょうか。
`mysqladmin -u root --password=pass create NEW_DB`;
これでデータベースの作成はできたのですが、GRANTを使用できる方法が
思いつきません。

237 :236:2006/11/15(水) 08:12:32 ID:???
自己解決しました。
mysqlデータベース内のuser/db/hostテーブルを書き換えで。

238 :NAME IS NULL:2006/11/15(水) 14:34:03 ID:tGEekk8B
mysqlで、二つのカラムがユニークでないとinsertを許さないといったことは出来るでしょうか?
カラムのuniqueが二つ揃わないと駄目みたいな設定は出来ないのでしょうか?

239 :NAME IS NULL:2006/11/15(水) 14:58:58 ID:???
>>234
>つーか、SELECTの英語の意味わかってるよな?
>SELECTっていう単語には「除外」だとかそういう意味はないの。
〜以外を「選択」したいといっているんだがバカかアホかどっちだ。

240 :NAME IS NULL:2006/11/15(水) 15:15:40 ID:???
>>238
MySQLで可能かどうか知らんが、
CREATE TABLE T1 (
c1 int,
c2 int,
UNIQUE(c1,c2)
);
こんな感じでできるんじゃないかなと。
出来なかったら別構文かもしれないので
MySQLスレで聞いた方が早そげ。

241 :NAME IS NULL:2006/11/15(水) 15:41:20 ID:???
>>210に対する>>212のSQLについて皆さんにチョット質問。

>>212のSQLで>>210さんが期待する結果がほとんどのDBMSで得られるのは
間違いなさそうなんだけど、本来のSQLではUNION ALLする時点で、前後の
クエリから返ってくる順序は保証されないはずだったと思う。
例えばUNION ALLじゃなくてUNIONのみだったら、重複チェック及び削除を
速くに行うためにソートしてからUNIONするので、>>212なら後ろのクエリの
ORDER BY は無駄になってしまう。UNION ALLの場合は、そのような必要が
ないので"たまたま">>210が期待する結果が得られるが...

もうほとんど半仕様的になってて気にしなくてもいいような気もするが、
皆さんはどぉお?

※このレスで>>212さん気に触ったらごめんなさい。他意はございませんので...

242 :238:2006/11/15(水) 17:18:19 ID:tGEekk8B
>>240
ありがとうございます、その構文でいけそうです。

243 :NAME IS NULL:2006/11/15(水) 21:55:17 ID:???
SQL SERVER 2000 でALTER TABLEが構文エラーになります。

変更しようとする前のFIELD_1の制約は varchar (255)です。
で、
ALTER TABLE [AAA] MODIFY ( [FIELD_1] varchar (1024));

何が悪いのかさっぱりです。

244 :NAME IS NULL:2006/11/15(水) 22:22:04 ID:???
スレ違い
および
マニュアル読め

245 :NAME IS NULL:2006/11/15(水) 22:35:58 ID:???
ケチややっちゃ。
ちょっと教えてくれたらいいのに。
知らんのちゃうか。

246 :NAME IS NULL:2006/11/15(水) 22:56:55 ID:???
>239
SELECTには「〜以外を」という意味はまったく含んでないといっているんだが。

247 :NAME IS NULL:2006/11/15(水) 23:05:11 ID:???
つーかさ、SELECTが除外をサポートしたとして、
後でテーブル設計が変更になってカラムが増えたり減ったりしたら
逆に使いにくいだけだと思うんだが。
INSERT INTO HOGE SELET * -カラム...
なんて処理があった日には悲劇がまってるし。

248 :NAME IS NULL:2006/11/15(水) 23:35:20 ID:???
SELECT おっぱい -Aカップ FROM インターネッツ

249 :NAME IS NULL:2006/11/15(水) 23:52:19 ID:???
>>241
俺もUNION ALLの前→後の順序は保証されてないと思う。
UNION ALLは「ソートしない」というだけだからたまたまそうなるだけ
だから>>212のSQLではソートしているとは言えないんじゃないだろうか

250 :NAME IS NULL:2006/11/16(木) 05:29:41 ID:???
すいません、基本的なことかもですが質問してもいいですか?
SELECT 文で、列数がたくさんあるので、全部列挙したくないんですけど
たとえば、「列5以外の全部の列を列挙する」ときに
どういった構文が使えますか?
SELECT * FROM TABLE;
だと全部列挙してしまうし・・・
よろしくお願いしますm(__)m

251 :NAME IS NULL:2006/11/16(木) 06:46:47 ID:???
>>250
藻前は5個ほど前の発言も読めないなら2chで発言しない方がいい。

252 :NAME IS NULL:2006/11/16(木) 07:28:22 ID:???
>>248
それ言うなら
select おっぱい from アイドル where ブラのサイズ > Aカップ
とかだろ。

だからSELECTで除外は意味不明と小一時間(ry

253 :nobodyさん:2006/11/16(木) 09:52:58 ID:???
テーブルのレコードを更新する際に、いずれかのフィールドに同じ値(文字列)が
入っているレコードは差分をとった上で、統合するということをしたいので
すが、どのように記述すればよいのでしょうか?
データベースはSQLiteを使用しております。

254 :NAME IS NULL:2006/11/16(木) 11:03:04 ID:???
プライマリーキーに文字列使うのってどうなのかな。
クエリーで頻繁に他のテーブルとマッチングさせるとき
やっぱり数値に比べてパフォーマンス落ちますか?
気にするほどじゃないのなら良いのですが。

255 :nobodyさん:2006/11/16(木) 11:11:05 ID:???
ありがとうございます。試してみますね。

256 :NAME IS NULL:2006/11/16(木) 12:20:39 ID:mhu4nRZG
質問させてください。
MySQL4.1で下記のようなテーブルがあり

tbl
id   sum
1    12  ←2^2 + 2^3
2    30  ←2^1 + 2^2 + 2^3 + 2^4
3    598 ←2^1 + 2^2 + 2^4 + 2^6 + 2^9
4    122 ←2^1 + 2^3 + 2^4 + 2^5 + 2^6
5    6  ←2^1 + 2^2

SELECT id FROM tbl WHERE 数学 = 値

とかで

値が2であれば2^2を含むものをSELECTしたいのですが
どうしたら良いでしょうか?

257 :NAME IS NULL:2006/11/16(木) 14:15:06 ID:???
>>256

WHERE (tbl.sum & POW(2, 値)) <> 0

とかは駄目?
確認はしていないから間違ってる可能性もあるが・・・

258 :NAME IS NULL:2006/11/16(木) 23:20:33 ID:???
>>246
「〜以外を」という意味を含まないのと同時に、「〜を」という意味も含まないがな。
さらに言えば、SELECTが選択するのは行であって列ではないぞ。

259 :NAME IS NULL:2006/11/16(木) 23:25:22 ID:???
日本語でおk

260 :NAME IS NULL:2006/11/17(金) 01:27:53 ID:???
SELECT 文で除外は無理なんですね・・・知れませんでした↓
では、あるテーブルの列名を列挙するには、どうすればいいですか?

261 :NAME IS NULL:2006/11/17(金) 06:38:27 ID:???
手で入力するか、ORマッパー使ってそういうクラスを自作汁

262 :NAME IS NULL:2006/11/17(金) 07:56:03 ID:???
ADOで (VBAで作ったやつの一部)

Dim wkRs1 As New ADODB.Recordset

'コレクションの名前を調べる方法
For i = 1 To wkRs1.Fields.Count
MsgBox wkRs1.Fields(i - 1).Name
Next

263 :NAME IS NULL:2006/11/17(金) 09:39:20 ID:???
>>260
列名を持ってるディクショナリービューがある。
オラクルなら確かUSER_TAB_COLUMNSとかだったと思う。他はしらん。

264 :NAME IS NULL:2006/11/17(金) 09:42:44 ID:???
>>257
お返事遅くなりました。
ありがとうございます。
ばっちりでした。

265 :NAME IS NULL:2006/11/17(金) 10:46:59 ID:6Uf69TYK
MySQLで、特定のカラムの値の順番にレコードを取得して、並べて表示することはできたのですが、任意のレコードが何番目なのかという情報を取得することはできますか?
できれば方法を教えてください。
現在は全データ取得してPHPで順番に回してカウントしてますが、明らかに効率が悪いですOTZ

266 :NAME IS NULL:2006/11/17(金) 11:57:19 ID:2WkXRhEF
突然ですがご教授願います。

テーブルの指定項目に対して
全角・半角が混在しているかのチェックをしたい、
かつそのデータを抽出したいのですが
何か良い方法はないでしょうか。

267 :NAME IS NULL:2006/11/17(金) 13:00:27 ID:???
SELECT (CASE flag WHEN 1 THEN 'ぬるぽ' ELSE 'ガッ' END) AS hoge FROM tbl
 GROUP BY hoge

上記のSQL文では「列名hogeは無効です」とエラーが出て実行できません。

CASEの実行結果でグループ化したい場合はどのようにすればいいのでしょうか?

268 :NAME IS NULL:2006/11/17(金) 14:21:58 ID:???
SELECT *
FROM
(
SELECT (CASE flag WHEN 1 THEN 'ぬるぽ' ELSE 'ガッ' END) AS hoge FROM tbl
)
GROUP BY hoge

かな?

269 :NAME IS NULL:2006/11/17(金) 14:29:48 ID:EPfzBoj4
>>250
残念ながらありません。

予め除外するフィールドが分かっている場合は、データを取得する
SQLで対応するのではなく、クエリー結果を格納する処理で対応し
た方がいいと思います。

270 :267:2006/11/17(金) 15:48:33 ID:???
>>268
うーむ、サブクエリ使わないと駄目なのか・・・

それで試してみます。ありがとうございました。

271 :NAME IS NULL:2006/11/17(金) 17:55:20 ID:???
SELECT (CASE flag WHEN 1 THEN 'ぬるぽ' ELSE 'ガッ' END) AS hoge FROM tbl
 GROUP BY (CASE flag WHEN 1 THEN 'ぬるぽ' ELSE 'ガッ' END)


272 :NAME IS NULL:2006/11/18(土) 02:01:20 ID:MmIzoEzY
どなたかご教示お願いします。
MySQL4.1で、複数フィールドに関して一意なものを取り出す方法はあるでしょうか。
   A    B
----------------------
1 | 11111 | 22222 |
2 | 11111 | 33333 |
3 | 11111 | 22222 |
4 | 33333 | 33333 |
A,Bの組で一意を決定し、レコード1,2,4を取り出す方法を探しています。
select Distinct(A,B) from table としたいところですが、怒られました。

273 :NAME IS NULL:2006/11/18(土) 02:02:40 ID:???
>>262 >>263

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

274 :NAME IS NULL:2006/11/18(土) 06:30:03 ID:8IZSUN/7
(A = 11111 && B = 22222) || (A = 11111 && B = 33333) || (A = 33333 && B = 33333)

275 :NAME IS NULL:2006/11/18(土) 12:33:50 ID:???
MySQLだったら、過去のレスからしてこんなSQLが通るんじゃね。
SELECT * FROM Table GROUP BY A,B;
1,2,4と2,3,4どちらが取り出せるのかはしらんが...

276 :NAME IS NULL:2006/11/18(土) 12:50:58 ID:???
連結すれば?

277 :NAME IS NULL:2006/11/18(土) 12:58:05 ID:???
括弧は必要なの?

278 :NAME IS NULL:2006/11/18(土) 15:56:51 ID:???
select distinct A,B from table

↑こうじゃないのか?distinctは関数じゃないぞ。

279 :NAME IS NULL:2006/11/19(日) 05:06:16 ID:RPWkpia/
次のSQLの意味を出来るだけ詳細に説明しなさい。
SELECT名簿 氏名、 情報概論得点+情報実習点
FROM 名簿 成績表
WHERE 名簿 学生証番号=成績表 学生証番号
AND 科目 LIKE “情報%”
↑これらを実行するとどのような結果が得られますか?
って事ですが、問題の意味すらわかりません。
助けて。。。。。

280 :NAME IS NULL:2006/11/19(日) 06:04:35 ID:???
>>279
とりあえずシンタックスエラーってことでいいんじゃね?

281 :NAME IS NULL:2006/11/19(日) 07:52:21 ID:???
>>279
ここは宿題スレなのか?

282 :NAME IS NULL:2006/11/19(日) 14:55:47 ID:FjZbaufY
>>274-278
ありがとうございます。distinct A, B でもいけるんですね。
distinctはAだけにかかると思ってました。

283 :NAME IS NULL:2006/11/19(日) 21:48:18 ID:3hf8NU1A
新規質問です

int型のフィールドbarを持ったテーブルfooがあるとします。
barの値が最も小さいレコードの行を取り出したい時

SELECT * FROM foo WHERE barが一番小さい;
という意味になるクエリーはどのように書けばいいのでしょうか?


284 :283:2006/11/19(日) 22:17:01 ID:???
事故解決しましたスマソ

SELECT * FROM foo WHERE bar=(SELECT MIN(bar) FROM foo);

285 :NAME IS NULL:2006/11/19(日) 23:41:12 ID:???
DB板自治・質問・雑談スレに書いたのですが、ちと板違い
だったようですので、こちらで質問します。

SELECT文のLIKE句で、”%”の文字は全角/半角、ともに
あいまい文字列と解釈されてしまうようですが、
全角のパーセントそのものを条件として検索したい場合は
どのように記述すれば良いのでしょうか。

TABLE_A
COLUMN_A
-------------
ABC


SELECT * FROM TABLE_A WHERE COLUMN_A LIKE '%';

上記のようなテーブルとSQLがあった場合、LIKE句では
全角%が条件になっているため2つ目のレコードしか
取得したくないのです。

よろしくお願いします。

286 :NAME IS NULL:2006/11/19(日) 23:57:12 ID:???
処理系やフロントエンドにもよるが、
'\%' か '\\%'
でいけるんじゃね。

287 :NAME IS NULL:2006/11/20(月) 00:23:27 ID:???
全角もそうだというのは処理系依存だと思うが、
LIKE でアンダーバーとパーセント記号は特殊な意味を持つのはその通り。
ANSI SQLではLIKE '\%' ESCAPE '\' とこんな感じじゃね。

288 :NAME IS NULL:2006/11/20(月) 13:58:59 ID:???
SQLに付いて教えてください。
キーが2つあって

01 A 〜
01 A 〜
01 B 〜
01 B 〜
01 C 〜
02 A 〜
02 A 〜
03 B 〜
03 C 〜

となっている明細行に対して

01 A 〜 1 1
01 A 〜 1 2
01 B 〜 2 1
01 B 〜 2 2
01 C 〜 3 1
---------
02 A 〜 4 1
02 A 〜 4 2
---------
03 B 〜 5 1
03 C 〜 6 1

キー1, 2でGROUP化した上での明細行番号、GROUP内での
明細行番号を得る方法が分かりません。

カーソルを使って回すしかないでしょうか?

289 :NAME IS NULL:2006/11/20(月) 16:25:01 ID:PAsvlASp
質問です
MySqlでバックアップ(バックアップ用テーブルに同じ内容をコピー)で、1週間ごとに以下のクエリーを発行してるのですが、こんなんで問題ないのでしょうか?
DELETE FROM backup
CREATE TABLE backup AS SELECT * FROM table


290 :NAME IS NULL:2006/11/20(月) 19:23:13 ID:???
購入履歴のようにユーザに対してレコードが蓄積されるテーブルがあります。
ユーザ毎に最新の30件以内の履歴のみを一括で取得したいのですが、どのようにSQLを
書けばいいのか悩んでいます。

テーブル構造は以下のような感じです。
ID(連番)  |  ユーザID  | 購入日時
---
0001      | user_1     | 2006/11/01 00:00
0002      | user_2     | 2006/11/11 00:00
0003      | user_2     | 2006/11/12 00:00

DBはOracleなのですが、ORDER BYやROWNUMなどでどうにか取得しようにも
うまくいきません。どなたか良い方法をお願いします。



291 :NAME IS NULL:2006/11/20(月) 20:34:42 ID:???
>>290
row_number使うといいよ。

292 :NAME IS NULL:2006/11/20(月) 21:22:00 ID:???
>>289
バックアップを消すのはバックアップが成功してからにしたほうがいいよ。

CREATE TABLE _backup AS SELECT * FROM table
DROP TABLE backup
RENAME _backup to backup

こんな感じで。

293 :NAME IS NULL:2006/11/20(月) 22:57:06 ID:???
質問です。
現在MySQL 5.0.24aを使い、
Genre | Name
--------------------
  A  | りんご
  A  | ぶどう
  A  | みかん
  B  | りんご
  B  | ぶどう
  B  | いちご
  C  | りんご
  C  | みかん
  C  | いちご
上記のようなDBをつくり、Name「りんご」、「ぶどう」を選択してGenre「A」、「B」を結果として返すSELECT文を作ろうとしています。
しかし、
SELECT * FROM test WHERE Name = 'りんご' AND Name = 'ぶどう'
と書いても結果が返ってきません。
これはSELECT文の書き方が間違っているのでしょうか?
それともSQLにはそのような選択の方法はないのでしょうか?

294 :NAME IS NULL:2006/11/20(月) 23:14:48 ID:???
>>293
OR

295 :NAME IS NULL:2006/11/20(月) 23:22:57 ID:???
select Genre from test where Name = 'りんご'
union
select Genre from test where Name = 'ぶどう’

かな?

296 :NAME IS NULL:2006/11/20(月) 23:35:12 ID:???
IN ('りんご', 'ぶどう')
でもいい

ANDは口語の「〜と」の意味ではなく、数学の「かつ」の意味だな。

297 :293:2006/11/20(月) 23:38:01 ID:???
>>294
ANDのかわりにORということでしょうか?
前それをやったときには、上記の例ですとCにも「りんご」が含まれているのでA、B、C全部返ってきたんです。

>>295
UNIONは初耳だったので調べてみました。確かにコレはいけるかもしれません。
ただ、同じフィールドで実行出来るのか気になります。とりあえず試してみることにします。
ありがとうございました。

298 :293:2006/11/20(月) 23:46:08 ID:???
>>296
SELECT * FROM test WHERE Name IN('りんご','ぶどう')
ということでしょうか?
試してみます。

299 :NAME IS NULL:2006/11/20(月) 23:46:32 ID:???
INTERSECT じゃねーの?

300 :293:2006/11/20(月) 23:54:04 ID:???
>>299
UNIONがORに近いのに対してINTERSECTはANDに近いものなのですね。
ありがとうございました。

301 :NAME IS NULL:2006/11/21(火) 00:04:37 ID:???
>>293
やりたいのは関係除算かな?
書き方はいくつかあるから、そのキーワードでググるか本探してみそ。
本だったら「プログラマのためのSQL」にわかりやすく説明されて太。

302 :NAME IS NULL:2006/11/21(火) 00:22:31 ID:???
>>301
ちょっと関係除算がいまいち理解できなかったのでググってます。
自分がやりたいことは、検索の絞込み、とでも言うのでしょうか。
プログラムで、一回目のループで「りんご」を有するGenreを絞り込み、
二回目のループで「ぶどう」を有するGenreを絞り込み…
とやろうとしています。
一回目のループ結果から、SELECT * FROM test WHERE Name = 'りんご'
と入れてループの上に返せば、とりあえず「りんご」を有するGnereは絞り込めるのですが、
二回目、三回目と続けるとなるとANDでは出来なかったので…。

303 :NAME IS NULL:2006/11/21(火) 00:39:06 ID:???
SELECT t1.Genre FROM test t1 INNER JOIN test t2 ON t1.Genre = t2.Genre
WHERE t1.Name = 'りんご' AND t2.Name = 'ぶどう'

これでどお?

304 :290:2006/11/21(火) 02:02:23 ID:???
>>291
row_number()はorder by句と一緒に使えるrownum程度の認識だったのですが
グループ毎の番号がつけられるなどの使い方は初めて知りました。
期待通りのクエリも実現でき、ありがとうございました。


305 :289:2006/11/21(火) 04:27:49 ID:j75IEcjK
>>292
亀レスすいません。
はぁ、なるほど。失敗したらおしまいですからね。
ありがとうございます、参考にいたします。

306 :NAME IS NULL:2006/11/21(火) 05:16:01 ID:???
テーブルA,Bが下記のようにあったとします。

テーブルA:
名前     値段
---------------------
いちご    1円
みかん    1円
キャベツ   1円
トマト    1円

テーブルB:
名前     値段
---------------------
パイナップル 1円
みかん    1円
トマト    1円
さんま    1円

で、AとB両方にあるものだけ残したいんです。
みかん、キャベツがA,B両方にあるので、それ以外の行は削除します。
テーブルA:
名前     値段
---------------------
みかん    1円
キャベツ   1円

テーブルB:
名前     値段
---------------------
みかん    1円
キャベツ   1円

こういうことしたいのですが、SQL文で簡単にできるでしょうか。
よろしくお願いします。

307 :NAME IS NULL:2006/11/21(火) 05:17:55 ID:???
あ、キャベツ両方にありませんでした。
すみません、書き直します。

308 :NAME IS NULL:2006/11/21(火) 05:20:20 ID:???
>>306
(再投稿になります)
テーブルA,Bが下記のようにあったとします。

テーブルA:
名前     値段
---------------------
いちご    1円
みかん    1円
キャベツ   1円
トマト    1円

テーブルB:
名前     値段
---------------------
パイナップル 1円
みかん    1円
トマト    1円
さんま    1円

で、AとB両方にあるものだけ残したいんです。
みかん、トマトがA,B両方にあるので、それ以外の行は削除します。
テーブルA:
名前     値段
---------------------
みかん    1円
トマト    1円

テーブルB:
名前     値段
---------------------
みかん    1円
トマト    1円

こういうことしたいのですが、SQL文で簡単にできるでしょうか。
よろしくお願いします。

309 :NAME IS NULL:2006/11/21(火) 05:38:29 ID:???
>>308
DELETE FROM TableA WHERE NOT EXISTS (SELECT * FROM TableB WHERE TableA.名前=TableB.名前);
DELETE FROM TableB WHERE NOT EXISTS (SELECT * FROM TableA WHERE TableA.名前=TableB.名前);


310 :NAME IS NULL:2006/11/21(火) 06:52:24 ID:???
>>309
ありがとうございます!
同じじゃないのを削除するというかんじですか。
なるほどです。

311 :NAME IS NULL:2006/11/21(火) 16:11:11 ID:b5GT0DJg
テーブルに word,word1,word2,word3,word4 
といったフィールドがあります。
そして、新たにテーブルにレコードを格納する際に、すでに格納されているレコード
のwordまたはword1と一致している要素があった場合、元からあったレコードと新たに
格納するレコードの差分をとって、元からあったレコードにプラスして結合するという
ことをしたいと思っています。
しかし、これをSQLでどう記述すれば良いのかわからない状況です。よろしければ
ご教授を願えないでしょうか?

312 :NAME IS NULL:2006/11/21(火) 16:59:47 ID:???
レコードセットを使ってレコードセットを更新する事は出来ますか?
例えば、今、テーブルA・Bの2つがあるとして、

テーブルA:会社コード、商品コード、金額
テーブルB:会社コード、商品コード、商品名称、金額(ただしnull)

となっている時に、BにAの金額をセットしてやりたいんです。
こういう時にEXISTを使えばいいのでしょうか?

313 :312:2006/11/21(火) 17:11:34 ID:???
すみません。
312はなんか自己解決しちゃいました。

ところで別件なんですが

UPDATE TBL
SET MAXNUM = (SELECT MAX(PAGE) FROM TBL T WHERE TBL.GRP = T.GRP GROUP BY GRP)

みたいな、UPDATE文におけるサブクエリがうまく機能するのがどうにも不思議
でなりません。

314 :NAME IS NULL:2006/11/21(火) 17:22:02 ID:???
>>312
UPDATE TableB SET 金額 = TableA.金額 FROM TableA WHERE TableA.商品コード=TableB.商品コード;

必要ならWHERE句に
AND TableA.会社コード = TableB.会社コード
も追加。

って書いてたんだけど、解決したのか。

315 :312:2006/11/21(火) 17:24:42 ID:???
>>314
すみません、

 カ ー ソ ル 使 っ て 解 決 し た

だけなので、早速314氏の書き方を取り入れてみます。

316 :NAME IS NULL:2006/11/21(火) 19:34:23 ID:???
質問です。
PHP5、postgresql8.1を用いて
グループになっている以下のようにデータを入力したいと思っています。
しかしながら[group No.]によって行数が異なるデータです。
データはPHP5でクエリを実行する際に$Q[$a]=[value1][value2]の形になっています。

group No.  
(primary key)  value1     value2
-----------  --------   ------
  1        りんご       12
           かき        25
           はなげ       9


このような時に[value1][value2]を配列で管理すれば[group No.]に連番を使うことが
できるのでデータ入力や検索が簡単と思っているのですが他によい方法はありますか?


317 :NAME IS NULL:2006/11/22(水) 01:30:05 ID:???
MySQL 5.0.27 をつかってます。

Table: Something
{
   something_id, 要素いっぱい
}

Table: Something_history
{
   pkey, something_id, timestamp
}

こんな2つのテーブルがあります。

Something は CVS からとにかくデータを SQL にあげたデータ群で、
それを別の database に正規化して格納するという作業をしています。
もともと処理したデータは消すつもりだったのですが、やっぱりとっておこう、
ということになり、どの row を処理したかを記録する table をつくりました。
何らかの理由で something_history には、
重複する something_id が記録される可能性もあります。

質問は、Something_history に記録された id 以外を、
Something から select するにはどうするの?ということです。
よろしくお願いします。

318 :NAME IS NULL:2006/11/22(水) 01:49:35 ID:???
>>317
SELECT * FROM Something WHERE NOT EXISTS
(SELECT * FROM Something_history WHERE Something_history.something_id = Something.something_id);

319 :317:2006/11/22(水) 02:47:25 ID:???
>> 318
ありがとうございます。うまく行きました。

320 :NAME IS NULL:2006/11/22(水) 14:29:56 ID:???
質問です

SELECT employee_id, UPPER(first_name), UPPER(last_name), job_id
FROM employees
WHERE SUBSTR(first_name, 4) = 'n'
ORDER BY job_id;

SUBSTR関数を使いfirst_nameの4文字目がnの人物のみ
絞りたいのですが、うまくいきません。 何が原因なのでしょうか?


321 :NAME IS NULL:2006/11/22(水) 14:34:23 ID:???
>>320
SUBSTR(first_name, 4, 1)

322 :NAME IS NULL:2006/11/22(水) 14:37:17 ID:???
>>321
そこでしたか、こんな所でミスをorz
本当に助かりました、ありがとうございました。

323 :NAME IS NULL:2006/11/22(水) 21:51:21 ID:lxFJMiKY
すいません、以下の文章の意味が分からないのですが、どなたか解説していただけないでしょうか。
っていうか下記のページ、全体的に日本語がおかしい気がします・・・。

http://dev.mysql.com/doc/refman/4.1/ja/tips.html
>大量に更新された MyISAM テーブルに対して複雑な SELECT クエリを使用しないようにする。これでテーブルロックを回避する。

324 :NAME IS NULL:2006/11/23(木) 16:37:25 ID:/q3dcXYj
プライマリキーについて、いまいち理解できていないので教えてください。
A,B,C,D というフィールドがあって、Aをプライマリキーとした
場合、Aにみかんという要素があるとして、みかんはBやCのフィールド
では使うことはできるのでしょうか?

325 :NAME IS NULL:2006/11/23(木) 16:43:31 ID:???
>>324
質問が漠然としすぎて答えられないんだが。
使えるといえば使えるが、そんなテーブル実際に使えないだろうに。

326 :NAME IS NULL:2006/11/23(木) 16:50:06 ID:/q3dcXYj
>>325
ありがとうございます。
もうひとつお聞きしたいのですが、フィールドではなく、テーブル全体で
一意の要素というのを設定したいのですが、そういうのはどうすれば良い
のでしょうか?(nullを含んでしまうフィールドもあります)

327 :NAME IS NULL:2006/11/23(木) 18:08:06 ID:???
>>326
いくつか方法があるが…
primary key (A,B,C,D) とか
unique A,B,C,D とか
SEQUENCE オブジェクトとか
IDENTITYプロパティとか
好きなのを使えばいいのでは。

DBによってnullだとkey指定できないのもあるので
詳しい事は各RDBのスレいって聞いてください。


328 :NAME IS NULL:2006/11/23(木) 23:02:05 ID:???
>>323
たしかに「大量に」とか「複雑な」とか、曖昧すぎて意味がわからんな。

329 :NAME IS NULL:2006/11/24(金) 03:42:00 ID:Sjq62Wnn
MySQL 3.23です。

  名前|キー|値
  --------------------
  鈴木|職業|会社員
  鈴木|生年|1970
  鈴木|出身|東京
  山田|職業|会社員
  山田|出身|大阪

というような構成のテーブルがあります。
ユニークな「名前」に対し、1個以上の「キー」および「値」が設定されています。

「職業」が「会社員」であり、かつ、「出身」が「東京」である人を抽出したいです。
(例で言えば「鈴木」が抽出されます)

ここで私は

  SELECT 名前 FROM テーブル名
  WHERE (キー='職業' AND 値='会社員') OR (キー='出身' AND 値='東京')
  GROUP BY 名前 HAVING COUNT(*) >= 2;

というクエリを考えました。(最後の2は条件式の数)

これはこれで一見問題ないように思えるのですが、
もっとスマートな方法、定番などありませんでしょうか?

ちなみにMySQLのバージョンの関係で、サブクエリとかunionは使えないみたいです。

330 :NAME IS NULL:2006/11/24(金) 03:59:37 ID:???
>>329
スマートな定番は、テーブルが
名前| 職 業 |生年|出身
鈴木|会社員|1970|東京
山田|会社員|(null)|大阪

の様になっていることなんじゃなかな。
まぁ、例として出しただけかもしんないけど。
SQLはそれでいんじゃない。職業に大阪とか出身に公務員って
入らないなら、キー=... は省いてもいけるが。

331 :329:2006/11/24(金) 04:07:43 ID:???
ありがとうございます。

>定番
まあ、そうなんですが。テーブル既にありきなもので。

>職業に大阪とか
大丈夫だとは思いますが怖いのでやめておきます(笑)

332 :NAME IS NULL:2006/11/24(金) 05:29:46 ID:???
>>329
自己結合すべし。

333 :U ◆CZtFsGiu0c :2006/11/24(金) 10:08:24 ID:???
>>323
原文は、
Try to avoid complex SELECT queries on MyISAM tables that are
updated frequently, to avoid problems with table locking that
occur due to contention between readers and writers.
読み出し側と書き込み側の競合で発生するテーブルロックの問題を
回避するために、頻繁に更新されるMyISAMテーブルに対しては複雑な
SELECTクエリを実行しないようにする。

というわけで、訳がおかしいだけでなく妙な省略があるようですね。


334 :329:2006/11/24(金) 12:10:21 ID:???
>332
なるほど、自己結合ですか。検討してみます。

ただ、検索条件が増えると、結合の回数も比例して多くなってしまい、
速度などに問題が出てきてしまいそうな気がするのですが……。

もしかすると、私が考えているものと全然違う方法なのかもしれません。


335 :NAME IS NULL:2006/11/24(金) 15:17:26 ID:???
>>329
あ、俺、今ちょうど似たようなことを仕事でやっている。

こんなのとか。

select a.名前 from テーブル a, テーブル b
where a.名前 = b.名前
and a.キー = '職業' and a.値 = '会社員'
and b.キー = '出身' and b.値 = '東京';

復問い合わせ使ってもできる。

select 名前 from テーブル
where キー = '職業' and 値 = '会社員'
and 名前 in (select 名前 from テーブル where キー = '出身' and 値 = '東京');

どっちが効率いいかは分からない。


336 :NAME IS NULL:2006/11/24(金) 16:24:13 ID:/eEXwCce
DBMS、インデックス状況によって異なる。
前者の場合は、キーと値にそれぞれ or 複合でインデックスあれば、実データ検索しないと思う。
後者の場合、副問い合わせが必ず行われるので遅いような。

337 :NAME IS NULL:2006/11/24(金) 16:43:07 ID:a70TfyFd
テーブル作成時に以下のようなエラーが出るのですが・・・

エラー : SQL logic error or missing database
near "TABLE document_word": syntax error

テーブル作成時のSQL
CREATE TABLE document_word (
filename TEXT NOT NULL PRIMARY KEY,
word1 TEXT,word2 TEXT,word3 TEXT,word4 TEXT,word5 TEXT);

テーブルが作成できないのは何故なんでしょうか?





338 :NAME IS NULL:2006/11/24(金) 17:27:41 ID:???
>>336
どちらにしろMysql3.xってサブクエリ使えないらしいし、
んでも流石にINやEXSTSでは使えるのかな。
つかえねぇと意味ないような...

>>337
TABLEの後ろの全角空白。最後のセミコロンも全角になってるが、
それは関係ないのか?

339 :NAME IS NULL:2006/11/24(金) 17:38:28 ID:a70TfyFd
>>338
おっしゃるとおりで。ありがとうございました。

340 :NAME IS NULL:2006/11/24(金) 18:51:26 ID:???
質問です。

 date          Val
------------------------------
2006/11/01 00:00   20
2006/11/01 01:00   25
2006/11/01 02:00   30
2006/11/01 03:00   20

2006/11/30 22:00   15
2006/11/30 23:00   20
2006/12/01 00:00   35
2006/12/01 01:00   15

この様なデータから

 date          Val
------------------------------
2006/11/01      580(1日の合計値)
2006/11/02      650(2日の合計値)

2006/11/30      500(30日の合計値)

の様に、1日の合計値が欲しいのですが
どうすればよいでしょうか?

宜しくお願いします。


341 :NAME IS NULL:2006/11/24(金) 21:19:07 ID:???
>>340
GROUP BYすれば。

342 :NAME IS NULL:2006/11/24(金) 23:48:42 ID:???
>>339
MySQL 3.23って確かキリスト的バージョンだったような気がするが...
何かの制約で3.23しか使えないってこと?
もし許される環境であればビュートリガストアドという
RDBMSの基本中の基本を抑えとる5.0を超推奨なんだが

343 :NAME IS NULL:2006/11/24(金) 23:53:46 ID:???
>>338
>んでも流石にINやEXSTSでは使えるのかな。
>つかえねぇと意味ないような...
使えないよ。4 でも使えない。サブクエリは 4.1 から。

344 :329:2006/11/25(土) 22:22:26 ID:???
バイトの身分で、DBのソフト変えろとは言えんのです(笑)


というか断られました。
現状で問題なく動いてるので、下手にバージョンアップしてトラブると怖いというか。
社員3名の会社で、システムが分かる人となるともっと少なくなるので。


345 :NAME IS NULL:2006/11/26(日) 07:13:20 ID:???
>社員3名の会社で、システムが分かる人となるともっと少なくなるので。

社員が3人しかいないなら、むしろ全員システム詳しくないと組織としてどーかと思った。
誰かが病欠した時点でダメじゃん。ソレ。

346 :NAME IS NULL:2006/11/26(日) 20:10:35 ID:tio4PAPQ
#SQL

テーブルから引っ張っていたデータを
一行一行別テーブルに挿入することは
可能でしょうか?
Selectではできたが、
一行ずつ(Insert)で、つまずいています。

347 :NAME IS NULL:2006/11/26(日) 20:16:45 ID:???
>>346
日本語でおk

348 :NAME IS NULL:2006/11/26(日) 20:27:48 ID:???
>>346
よーわからんが、insert into hoge1,hoge2,hoge3 select * from ( select * from 〜
みたいな事ができるか?って聞いてるの?

ストアド作れ(w

とりあえず、そのSQLを晒してくれ。

349 :429:2006/11/26(日) 21:44:21 ID:???
>>346
Oracleの新らしいやつならマルチテーブルインサート使って、
1文で複数のテーブルに入れれた。他のデータベースでそういう機能なきゃ、
ストアド作るしかないね。


350 :NAME IS NULL:2006/11/26(日) 22:27:28 ID:tio4PAPQ
BEGIN TRAN
INSERT INTO a(a) VALUES(@a) --(@a)を指定したい
COMMIT TRAN
>>348
のように定義していくしかないのでしょうか。
>>Oracleの新らしいやつならマルチテーブルインサート使って、
>>1文で複数のテーブルに入れれた。他のデータベースでそういう機能なきゃ、
>>ストアド作るしかないね。
ストアド作って、ループでまわすってこと?

351 :NAME IS NULL:2006/11/26(日) 22:34:01 ID:???
>>350
なんか抽象的すぎて、わからんがテーブルaとカラムaと数値@aは
全て動的に変化するのか?

手抜きせずに具体的なテーブルの設計とSQLと、実現したい機能を
提示しろよ。

藻前の質問はエスパーでないと答えるのは難しい。

352 :NAME IS NULL:2006/11/26(日) 23:01:59 ID:tio4PAPQ
SELECT * FROM a --(*1)
WHILE(1=1)
BEGIN
BEGIN TRAN
    INSERT INTO a(a) VALUES(@a) --(*2)
@b = @b + 1
COMMIT TRAN
IF @b > 9 --(*3)
BEGIN
BREAK
END
END

(*1)で取得したデータを
(*2),(*3)を動的に変更させ、
Insertしていくことは可能か?


353 :NAME IS NULL:2006/11/26(日) 23:20:37 ID:???
サブクエリが使えるDBならINSERT文一つで書けると思う。

ただ、どんな業務内容をRDBシステムにすると、
こんなテーブル操作が必要なのか思いつかんのだが。

これは根本的にテーブル設計が失敗してる例なのか?
一行目のSELECT *からしてアリエネーし、途中で現れる@bも
意味不明だし…。

354 :NAME IS NULL:2006/11/26(日) 23:29:05 ID:???
テーブル分だけINSERT-SELECT文を書けないの?

それと動的SQLは極力避けるべき。SQLはソースそのものなので、
ソースを動的に編集するというのは可読性がかなり落ちる。
テーブル名だけなら仕方ないが。

355 :NAME IS NULL:2006/11/26(日) 23:33:11 ID:???
処理にもよるが処理をある程度共通化ライブラリしたくなるときは
ストアドで動的SQL作るのはアリだと思うが。

つか、その為のストアドでもあると思うが。

356 :NAME IS NULL:2006/11/27(月) 01:26:19 ID:BID+zT24
ありがとう。

357 :NAME IS NULL:2006/11/27(月) 01:32:58 ID:BID+zT24
質問なんですが・・・

BEGIN TRAN
--Update処理
IF @@ERROR<>0 GOTO PROBLEM
COMMIT TRAN
PROBLEM:
ROLLBACK TRAN

トランザクション処理を展開するとき、
GOTO文を使わなければ、ロールバック処理は
できないのでしょうか?
何かいい方法はありますでしょうか?

358 :NAME IS NULL:2006/11/27(月) 06:56:52 ID:???
>>357
ストアドプロシージャはDBMSで全く互換が無いからDBMSの名前はちゃんと書けよな。
MSSQLのTransact-SQLとして答えるがこれじゃいかんの?
IF @@ERROR = 0
  COMMIT TRAN 
ELSE
  ROLLBACK TRAN

359 :NAME IS NULL:2006/11/27(月) 18:46:23 ID:???
>>355
アリかもしれんが、そんな必要にせまられたことはめったにない。
ウンコ設計のシステム開発してんのか?


360 :NAME IS NULL:2006/11/27(月) 19:09:04 ID:???
なにこの日曜プログラマ丸出しの初心者

361 :NAME IS NULL:2006/11/28(火) 17:14:02 ID:???
「動的SQLを作るため」のストアドって。それがストアドの本来の目的じゃ、
クライアントでSQL組み立てるのとなんら変わりないわな。
ぷぷぷ


362 :NAME IS NULL:2006/11/28(火) 18:35:56 ID:???
なんでこの人、一人だけで優越感に浸ってるんだろう・・・。

363 :NAME IS NULL:2006/11/28(火) 19:39:04 ID:???
ヒント:相手が優越感にひたってるんじゃなくて、君が劣等感のかたまり。


364 :NAME IS NULL:2006/11/28(火) 20:25:54 ID:???
頭のおかしいヤツがいるな。

365 :NAME IS NULL:2006/11/29(水) 07:52:58 ID:qFMACpfa
日付、購入金額、購入者名の表から、各人が最後に購入した日に、一番多く費やした金額がいくらであったかを求めたいと思っています。

日付 購入金額 購入者名
27 3000 太郎
27 4000 二郎
28 5000 太郎
29 1000 太郎
29 1000 太郎
29 2000 花子
29 2000 花子
29 1000 花子
という場合であれば、
27 4000 二郎
29 1000 太郎
29 2000 花子
というものを得たいのですがどうすればよいのでしょうか?
すぐ出来るだろうと思っていたのですが・・・数時間考えたのですが、私の力ではSQLで表現することが出来なさそうです。
MySQLを使用しているのですが、他に一時的な表を用意するしかないのでしょうか?

366 :U ◆CZtFsGiu0c :2006/11/29(水) 10:05:40 ID:???
>>365
MySQLのバージョンが書いてないけど、サブクエリが使えるなら
こんなかんじでできるかな?

SELECT 日付, MAX(購入金額), 購入者名 FROM table main
inner join
(SELECT MAX(日付) 最終購入日, 購入者名 FROM table
group by 購入者名) sub
on main.日付 = sub.最終購入日 and main.購入者名 = sub.購入者名
group by 日付, 購入者名

367 :365:2006/11/29(水) 10:59:14 ID:???
>>366
どうもありがとうございます。
結合の問題だともよく理解していませんでした。
出直してきます。

368 :NAME IS NULL:2006/11/29(水) 17:03:27 ID:FZUQz2Ny
↓URLに載せてあるERDを以下の仕様通りのSQL文に書き直したいのですが、
どのように書けば良いのでしょうか?
ttp://www.imgup.org/iup293818.jpg.html

仕様は
・すべてのIDはIntegerで設定
・すべてのNAME、TITLEは最高50文字まで入力可能に設定
・POS_DESC、BEN_DESCはvery long stringに設定
・Salaryはcurrencyに設定
・Phone NumberはStringとfixed length of 12に設定
・それぞれのテーブルに新たに、自分の好きなアトリビュートを二つ追加せよ。(ADDを使う)

369 :U ◆CZtFsGiu0c :2006/11/29(水) 17:27:01 ID:???
>>368
SQL文って…CREATE TABLE文てこと?
ADDを使う、ってのはALTER TABLEってことかな?

370 :NAME IS NULL:2006/11/29(水) 17:35:26 ID:FZUQz2Ny
>>369
はい。ERD自体はVisioで書いているのですが、
これと同じ仕様+それぞれのテーブルに好きなアトリビュートを二つ
で、SQL文(CREATE TABLE〜ですね)を書くみたいなんですがよく分かりません・・・
友人の研修課題らしいのですが、データベースの知識はまったくと言ってよいほどないので、
困り果てています。

371 :U ◆CZtFsGiu0c :2006/11/29(水) 18:12:32 ID:???
>>370
こういう課題が出るって事は、ERDの読み方とかCREATE TABLE文の
書き方とか習ってると思うんだけど。まずは、ERDが読めないのか
SQL文が書けないのかどっち? それと、データベースの知識がない
のは、友人とあなたのどっち?

372 :NAME IS NULL:2006/11/29(水) 18:23:08 ID:gkFpLiWZ
交通費には、バス代と電車代しかないとして、
交通費テーブル(日付,使用者,交通費種別,金額)から
交通費種別による総交通費テーブル合(日付、バス代、電車代、タクシー代)
と取得するにはどうすればいいでしょうか。

日付 使用者 種別 金額
11/30 Aさん バス 200
11/30 Aさん 電車 150
11/30 Bさん バス 200
11/30 Bさん 電車 450
12/1 Bさん 電車 450
から

日付  バス代 電車代
11/30  400   600
12/1   0   450


373 :NAME IS NULL:2006/11/29(水) 19:02:53 ID:???
クロス集計すれ。

374 :NAME IS NULL:2006/11/29(水) 21:47:39 ID:dolUdZUS
table A に IDとAAを作り ID1にAAA、2にBBB、3にCCC、4にDDD というデータを入れました。
table B に ID Z1 Z2 Z3 Z4 を作り ZxすべてをTableAと結合させたいです

table BのID1 に 1 3 2 4 と登録すれば
AAA、CCC、BBB、DDD と表示できればと思っています。

なかなかうまくいかなくて、
この考え方が不味いのかなと思ったりしたり・・行き詰まっています。
SELECT文しだいで可能なのでしょうか。

375 :NAME IS NULL:2006/11/29(水) 22:01:12 ID:???
テーブルBにテーブルAをLEFT JOINすればいいように思えるが、うまく行かないってことは違うんだろうなあ。
図示してくれると助かるぞっと。

376 :NAME IS NULL:2006/11/29(水) 22:19:08 ID:dolUdZUS
テーブル A
ID AA
── ───
1 AAA
2 BBB
3 CCC
4 DDD

テーブルB
ID Z1 Z2 Z3 Z4
── ── ── ── ──
1 1 2 3 4
2 3 3 3 3
3 1 3 2 1
4 1 1 1 2

/* 求める実行結果 */
ID Z1 Z2 Z3 Z4
── ── ── ── ──
1 AAA BBB CCC DDD
2 CCC CCC CCC CCC
3 AAA CCC BBB AAA
4 AAA AAA AAA BBB


こんな感じです。


377 :NAME IS NULL:2006/11/29(水) 22:39:49 ID:???
>>376
SELECT B.ID, A1.AA as Z1, A2.AA as Z2, A3.AA as Z3, A4.AA as Z4
FROM B
JOIN A A1 ON B.Z1 = A1.ID
JOIN A A2 ON B.Z2 = A2.ID
JOIN A A3 ON B.Z3 = A3.ID
JOIN A A4 ON B.Z4 = A4.ID


378 :368:2006/11/29(水) 23:54:44 ID:???
>>371
レスありがとうございます。
私はERDはアクセス、Visioで書いてきたので分かるのですが、
SQLは実際に書いたことがないのでよく分からないです。(現在、ネット上のSQL関連サイトを見ながらやっています…)

友人は学生時代に初級シスアドは取っているのですが、コンピュータの言語はまったく勉強していない上、
データベースが専門外なのに研修でSQLを書く課題を与えられたらしく、私に相談をしてきました。

379 :NAME IS NULL:2006/11/30(木) 01:56:21 ID:Lm+NGEnN
ttp://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=28809

ネット上のSQL関連サイトを見て組んでみました。
ALTER TABLEも書いてみたのですが、このような感じで良いでしょうか?

380 :368:2006/11/30(木) 01:58:13 ID:Lm+NGEnN

すいません。368です。
ひとつのソースにまとめる為に
***************〜〜〜 TABLE***************
といった感じで区切りましたが、実際は別々に書いてあります。

381 :368:2006/11/30(木) 11:48:12 ID:bAhOQ6Un
後でチェックしてみたら酷いコードだったので書き直しました。

ttp://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=28814

それぞれのテーブルに新たに、自分の好きなアトリビュートを二つ追加せよ。(ADDを使う)
は勘違いで、データを追加すれば良いらしくINSERT INTOを使用したのですが、
OFFERING のコンポジットテーブルはどのようにすればよいか分かりませんでした。

382 :NAME IS NULL:2006/11/30(木) 12:40:54 ID:yD5JcOlX
COMMITの逆ってなんでしたっけ?

383 :NAME IS NULL:2006/11/30(木) 12:58:49 ID:???
ROLL PANNACHAN

384 :NAME IS NULL:2006/11/30(木) 13:26:15 ID:???
>>377
で、できたあああああああああああああああああああああ
A1A2A3A4と作っていけば良かったんですね。
A1固定しかできないと思っていました。おはづかしい。
頭が少し柔らかくなりました。

385 :NAME IS NULL:2006/11/30(木) 14:45:53 ID:uSFKhVrK
質問です。
下記のような表が出来たとします。

first_name second_name
------------------------------
brown white
green black
white brown
black green
pink red

これを、同じ組み合わせは1つしか表示させないためにはどうしたらいいんですか?
例えば・・

first_name second_name
-------------------------------
brown white
black green
pink red

となるように・・。

386 :NAME IS NULL:2006/11/30(木) 14:55:32 ID:???
MySQL使っています。
INT型のauto_incrementフィールドで、
普通は1,2,3...
とINSERTしていくたびに順番に増えていくと思います。
0詰めの3桁のフォーマットにすることできるでしょうか?
001,002,003...
こういう感じです。
よろしくお願いします。

387 :NAME IS NULL:2006/11/30(木) 15:13:25 ID:???
386です。
自己解決しました。
ZEROFILLオプションがありました。

388 :NAME IS NULL:2006/11/30(木) 15:45:44 ID:???
>>385
思いつきで、
SELECT * FROM Table AS T1 WHERE NOT EXISTS
(SELECT * FROM Table AS T2 WHERE T1.first_name=T2.second_name AND T1.second_name=T2.first_name)
OR T1.first_name<T2.second_name;

但しまったく同名の場合はまとめない、必要なら
GROUP BY (first_name,second_name)
を追加かな。


相関サブクエリを使わずに外部自己結合でも出来るな。

389 :NAME IS NULL:2006/11/30(木) 15:57:11 ID:???
教えてください
データーベースはAccessです。

ID  日付      商品コード  価格
1  11/29    100      900
2  11/30    100      1000
3  11/30    100      1010
4  11/30    200      2000
5  12/1     200      3000

のようなデータから商品コード毎の最新日付の価格(安い方)を取り出したいです。
上記データだと
商品コード   日付    価格
100       11/30  1000
200       12/1   3000
となります。

どのような処理をすればよろしいのでしょうか?

390 :NAME IS NULL:2006/11/30(木) 16:23:22 ID:HKTYjIui
質問です。

Mysqlのテーブルにデータを追加するinsert文の中にループを組み込むことは可能でしょうか
例えば

mysql_query("insert into table_1(ID_C)values
while ($a < 4){
('999'),
$a++;
}
('999')");

こんな感じで、$aの値が4になるまでテーブルのID_Cというカラムの中に999という
データを入れるプログラムを作りたいんですけど上手く行きません。誰か教えてください

391 :390:2006/11/30(木) 16:26:15 ID:HKTYjIui
あ、すみません>>390はPHPの話です。
PHPスレで質問してみたんですけど、Mysqlスレで聞けと言われました。

392 :NAME IS NULL:2006/11/30(木) 17:13:05 ID:uSFKhVrK
385です。
すみません、前の質問の書き方が悪かったんですが、自分で作ったコードで

select faculty.name first_faculty_name, teaches.name second_faculty_name
from faculty, course, section, teaches
where (teaches.cdesc = course.cdesc and course.c_num = section.c_num and section.fss_num = faculty.fss_num)
and (teaches.name != faculty.name);

というのがあって(前の表は例えで質問したので、内容はこれとは全然違います)、
でも表示された結果に重複した組み合わせがあったんで、
その重複した組み合わせはどちらか片方のみを表示させるには何をコードに加えればいいのかという質問です。

ちなみにfirst_faculty_nameとsecond_faculty_nameが全く同じになる事はないです。

393 :NAME IS NULL:2006/11/30(木) 17:29:52 ID:???
>>390
ここはMySQLのスレじゃないし、そのコードをMySQLスレに持っていくとPHPスレで聞けと言われるだろうな。
while ($a<4) {
mysql_query("insert into table_1(ID_C) values('999')";
$a++;
}

>>392
>>388のSQLのTableの代わりに>>392のSQLをサブクエリとして突っ込めば桶。
カラム名はあわせなあかんけど。

394 :NAME IS NULL:2006/11/30(木) 19:10:31 ID:uSFKhVrK
>>393

as T1  のところがエラーになって
「SQL command not properly ended」
ってなるんですけどなんででしょう?

395 :NAME IS NULL:2006/11/30(木) 19:25:03 ID:FczYGQNu
mysql の show tables ってlimitきかないんだけど、バージョンが古いだけでしょうか?
ものすごいたくさんあるテーブルをちょっとずつ見るのはどうしたらいいのでしょうか?


396 :NAME IS NULL:2006/12/01(金) 09:32:49 ID:if/DbWjf
質問です。

where(それかhaving)句でcountを使いたいのですが、
selectのところにはcountの数を表示させたくありません。
それは可能ですか?
エラーになってしまうのですが・・。

397 :NAME IS NULL:2006/12/01(金) 10:39:42 ID:???
>396
自分のような初心者には
HAVINGはともかく、どういう状況においてWHEREでCOUNTを使うのか分かりません。
ちょっと気になったので、もしよければ教えてください。

398 :NAME IS NULL:2006/12/01(金) 11:21:27 ID:???
べたべた

SELECT
 列A     AS A,
 count(列A) AS cnt
FROM
 てーぶるA
GROUP BY
 列A
HAVING
 count(列A) > 1

399 :NAME IS NULL:2006/12/01(金) 15:28:40 ID:E463S5op
初心者と思うなら、入門本とかサイトとか見ろよ。
SQLの基本構文なんて1週間あればマスタできんべさ。

400 :397:2006/12/01(金) 17:21:53 ID:???
>399
自分の手元の入門書にはWHERE句で使う手法には一切触れてなかったんで、
特殊なテクニックなのかなとばかり。

401 :NAME IS NULL:2006/12/01(金) 17:29:38 ID:vSVjo59R
こちらで質問するのが適当かどうかわからない素人です

マイクロソフトのアクセスで、3000程度のデータが溜まったのですが、
文字列で検索をかけて、該当するデータを抽出するプログラムを作成してほしい場合、
どんなところにどのように依頼すれば良いのでしょうか?
数十人で使いたいのですが・・・よろしくお願いいたします。

402 :酔いちくれ ◆J0rwikii8c :2006/12/01(金) 18:23:43 ID:???

やろうと思えば、スクリプトだけでもできるような
おいしい仕事だw

403 :NAME IS NULL:2006/12/02(土) 01:33:56 ID:???
WHERE句使わん入門書なんか
そもそも入門書とは言わん


404 :NAME IS NULL:2006/12/02(土) 04:08:00 ID:???
WHERE句でCOUNTの使い方がわからんっていってるんじゃないの。
俺もわからんが。てかそこでCOUNTが使えりゃHAVINGの存在意義が無いよ。

405 :NAME IS NULL:2006/12/02(土) 11:39:51 ID:Tfx17Nq/
以下方法ではSQLが2度も実行されている。1度でやれ!

a b
1 1
2 1
1 2
2 2

update t set a=3 where a=1;
update t set b=3 where b=1;

a b
3 3
2 3
3 2
2 2

406 :NAME IS NULL:2006/12/02(土) 14:36:06 ID:???
>>405
CASE使え!

407 :NAME IS NULL:2006/12/02(土) 17:15:21 ID:???
指定フィールドの最大値+1、にUPDATEということは可能でしょうか?
現在はPHPに一旦渡してやってるんですが、
非常にだるいです。

408 :NAME IS NULL:2006/12/02(土) 20:42:19 ID:???
>>407
CASE使え!

409 :NAME IS NULL:2006/12/02(土) 22:05:22 ID:???
>>408
やぱビッグドライブ対応か?

410 :NAME IS NULL:2006/12/05(火) 16:29:31 ID:???
>>407
え? こんな風なの? って、これ、できなかったっけ?
update xxxx set hoge = max(fuga)+1;
できないならこうとか?
update xxxx set hoge = (select max(fuga)+1 from xxxx);


411 :NAME IS NULL:2006/12/05(火) 16:33:43 ID:???
>>401
そのぐらい自分で作れよ。


412 :NAME IS NULL:2006/12/05(火) 16:36:42 ID:???
>>396
where では count() って使えないんじゃない?
ああいう関数が使えるのは select か having の所だと思ったが。
で、実際どういうのを書いたらどういうエラーになったんだ?


413 :NAME IS NULL:2006/12/06(水) 01:20:02 ID:???
合計売り上げ上位の人数を出したいんだが、方法ない?

name |  day            | amount
--------------------------------
sato    | 2006-10-10 | 10
suzuki | 2006-10-10 | 5
tanaka | 2006-10-10 | 1
sato    | 2006-10-11 | 20
suzuki | 2006-10-11 | 20
tanaka | 2006-10-11 | 1
sato    | 2006-10-12 | 5
suzuki | 2006-10-12 | 5
tanaka | 2006-10-12 | 1
sato    | 2006-11-01 | 5
suzuki | 2006-11-01 | 5
tanaka | 2006-11-01 | 1

みたいな感じで、10月の個人合計が30越えた人数を出したい。
可能かな?

414 :NAME IS NULL:2006/12/06(水) 01:42:15 ID:???
>>413
SELECT count(*) FROM
(SELECT name FROM Table WHERE date_trunc('month',day) = '2006-10-1' GROUP BY name HAVING sum(amount)>30);

415 :NAME IS NULL:2006/12/06(水) 13:30:36 ID:66Ngl6RX
テーブルに格納された文字列の置換についてお聞きしたいのですが。

テーブル:A
word word1 word2 word3
果物 フルーツ fruit くだもの
本  書籍   書物  null

テーブル:B
phrase1 phrase2 phrase3
ああ   いい   うう
書籍   くだもの null

テーブルBの最期に登録されたレコードのフィールドの値を、1つ1つ
テーブルAに投げてヒットしたら、ヒットしたレコードのwordフィールドと
同じ値に置換したいのですが、どのようにすれば可能でしょうか?
よろしければ、ご教授いただけないでしょうか?


416 :NAME IS NULL:2006/12/06(水) 14:07:58 ID:???
SQLを聞いてるのか仕組みを聞いてるのかわからん
ストアドにしてトリガで起動すればいいのでは

417 :NAME IS NULL:2006/12/06(水) 14:18:29 ID:66Ngl6RX
>>416
出来ましたら、SQLを教えていただきたいのですが。。。

418 :NAME IS NULL:2006/12/06(水) 15:17:08 ID:???
トリガを使わないのなら、最後に登録されたものが何かわかるようにしないと無理

で、Bのphase1 か phase2 か phase3 がAの何にヒット(ヒットって何?)したら
Aのwordに何を入れるの?

419 :417:2006/12/06(水) 15:20:43 ID:66Ngl6RX
>>418
ヒット→該当するレコードがあるか
Aのwordに入れるのでなく、Aのwordの値に置換
です。


420 :NAME IS NULL:2006/12/06(水) 17:43:01 ID:???
>>415の例で言うと、結果はどうなるの?

421 :NAME IS NULL:2006/12/06(水) 18:41:13 ID:???
後から検索しやすいように一般的な単語に変換する、って感じなのかしら?
漢字やカタカナを全部平仮名に直して格納、とかは使い道ありそうだし。


422 :NAME IS NULL:2006/12/06(水) 20:05:19 ID:???
まずはテーブルAを正規化すべてはそれからだ。
word word123 
果物 フルーツ
果物 fruit
果物 くだもの 
本 書籍
本 書物



423 :413:2006/12/06(水) 20:41:12 ID:???
>>414
出来た!!ありがとう。
下の行までは到達出来てたんだが、select2重にするだけでよかったのか…。
かなり、視野狭窄なまぬけだった。

424 :NAME IS NULL:2006/12/06(水) 21:02:10 ID:???
課長視野狭窄

425 :NAME IS NULL:2006/12/06(水) 22:14:11 ID:wAcTjtz2
MySQLなんですが、どうクエリ書けばいいのか分かりません...

[ table1 ]
id name
---------------------------------
1  A
2  B
3  C
4  D
5  E

[ table2]
id title    table1_id
---------------------------------
1  title1  4
2  title1  1
3  title2  3
4  title3  1
5  title3  5
6  title4  4
↑以降レコードが追加されていきます。

このようなテーブルがあって以下のようにtable1のどのnameに
titleがあるかが知りたいのですが、
この場合該当しないB、C、Eも値なし(空)という結果で欲しいんです。

[ title1を条件にした結果 ]
table1_id  table1_name  title
---------------------------------
1             A                  title1
2             B
3             C
4             D                  title1
5             E

SELECT table1.id AS table_id, 〜〜
FROM table1 LEFT JOIN table2 on table1.id = table2.table1_id
とか、それにGROUP BYとかしてみたんですが、
もうこれ以上すすめません....
どなたかご教示ください。お願いします。

426 :NAME IS NULL:2006/12/06(水) 22:31:41 ID:???
where table2.title='title1'
を付けるだけじゃ無いん?

427 :425:2006/12/06(水) 22:45:47 ID:wAcTjtz2
>>426
レスありがとうございます。

SELECT table1.id AS table_id, 〜〜
FROM table1 LEFT JOIN table2 on table1.id = table2.table1_id
where table2.title='title1'
ということですよね?

これだと
table1_id  table1_name  title
---------------------------------
1             A                  title1
4             D                  title1

になってしまうのでちょっと欲しいのと違うんですよ。
B、C、Eのレコードもtitleフィールドには値なしで欲しいんです。
すいません変な質問で。

428 :NAME IS NULL:2006/12/06(水) 22:53:10 ID:???
どういう結果が欲しいのかわからんなぁ。
>>425の3つめの表が欲しい結果なんかな?

429 :425:2006/12/06(水) 23:05:58 ID:wAcTjtz2
>>428
そうです!そのままズバリです。
>>427の結果をもらってプログラム側で対応するのもいいんですが、
3つめの表のかたちで取れる方法はないのかと考えています。

430 :428:2006/12/06(水) 23:11:03 ID:???
>>429
細かいところは適当に
SELECT * FROM table1 LEFT JOIN (SELECT * FROM table2 WHERE title='title1')AS foo USING(id);
サブクエリも使えるMySQLなんかどうかしらんが。

431 :425:2006/12/06(水) 23:37:08 ID:wAcTjtz2
>>429
4.0系なのでサブクエリ使えません...すみませんバージョン書いてたつもりでした...
MySQL4.027の環境です。
サブクエリ使えれば良かったんですけど、ダメなので悩んでいた次第です。

せっかくお付き合い頂いたのに、ちょっとオチないといけなくなりました。
色々考えてくれて有難うございました。
また明日覗きますので何かアドバイスでもあれば、
適当に残しておいて貰えると助かります。

432 :425:2006/12/06(水) 23:39:39 ID:wAcTjtz2

>>429 ×
>>428
感謝

433 :428:2006/12/06(水) 23:53:32 ID:???
USING(id)じゃダメじゃん俺...orz

>>431
SELECT table1.*,CASE title WHEN 'title1' THEN title ELSE NULL END AS title FROM table1 LEFT JOIN table2 ON table1.id=table2.table1_id;
これだと、table1.*の行が複数回出てきてしまうんだが、
MySQLなら、ここへGROUP BY table1.id を追加しても通るんだっけか。
ORDER BY table1.id,title も必要かな? なんかすんげぇぁゃιぃが。

434 :NAME IS NULL:2006/12/07(木) 12:49:32 ID:???
SQL Serverだと

SELECT table1.id AS table_id, 〜〜
FROM table1 LEFT JOIN table2 on table1.id = table2.table1_id and table2.title='title1'

でいけるけど、MySQLじゃダメかね?


435 :425:2006/12/07(木) 14:10:52 ID:kGrXAXz9
>>428 >>434
アドバイス有難うございます。
おかげさまで欲しい結果が取れました!

>>428
GROUP BY 付けても通りました。
CASEってこんな使い方するんですね。勉強になります。

>>434
そのままMySQLでも使えました。
最後のand〜がポイントで、そこに気付きませんでした。
...ついWHEREとかで絞込もうとしてしまってハマリました。

今回はプログラム側の処理を楽にできるように、
こういう形でデータを受け取りたいと思ったんですが
実際レコードが増えた時の事考えるとこういうのダメなんですかね?
自分まだ経験が浅いのでどういうのが定石か分かっていないんです。
データベース側とプログラム側でどちらがどこまで負担するとか...
なにはともあれ勉強になりました。有難うございました。

436 :NAME IS NULL:2006/12/08(金) 01:05:16 ID:???
列の射影について質問です。"SELECT 列A"では指定した列Aのみを
抽出しますが、逆に指定した列のみを抽出しないようにする命令は
どう作ればよいのでしょうか?

437 :U ◆CZtFsGiu0c :2006/12/08(金) 01:25:00 ID:???
>>436
少なくとも標準SQLにはない。
独自構文だとしても、主要なRDBMSにはないと思う。

438 :NAME IS NULL:2006/12/08(金) 15:11:21 ID:???
LIKE で比較するパターンを列や SELECT から作るにはどう書けばいい?

439 :NAME IS NULL:2006/12/08(金) 16:21:03 ID:???
超能力者に相談すればいいんじゃないかな。


440 :NAME IS NULL:2006/12/09(土) 01:23:36 ID:???
なんでMySQL使いはVer4.xに拘泥するかねぇ
MySQLはビュー・トリガ・ストアドが実装される5.0以降でないと
はっきり言って使いモンにならんがな

441 :NAME IS NULL:2006/12/09(土) 02:37:41 ID:???
>>438

列 || '%'

↑これの事?

442 :NAME IS NULL:2006/12/10(日) 22:18:23 ID:A4HOrmPS
質問
Test1
t1
1
2

Test2
tt1 tt2 tt3
1  1  aa
1  2  bb -ココ
2  1  cc
2  2  dd
2  3  ee -ココ

結果
Test1とTest2を関連付けて
t1 tt1 tt2 tt3
1 1 2 aa
1 2 3 ee
Test2.tt2をmax関数で参照。
group by句の制約のせいで
うまくいかない・・・。

443 :NAME IS NULL:2006/12/10(日) 22:43:41 ID:???
そうですか

444 :NAME IS NULL:2006/12/10(日) 22:53:11 ID:A4HOrmPS
>>442
うまく出来やした。


445 :NAME IS NULL:2006/12/11(月) 07:35:09 ID:???
MySQL 4.0 を使用しています。
SQL でテーブル内にデータが存在しない場合のみ入力する、なんてことはできるのでしょうか。
ユーザーのIDをプライマリキーで持っておき、新規IDの場合は追加するといったことがしたいのです。

はじめにSELECTで検索して無ければ追加すればいい話なのですが、一文だけでできる方法があれば教えてください。

446 :NAME IS NULL:2006/12/11(月) 07:41:21 ID:???
>>445
NOT EXISTSを使いたまへ。

447 :NAME IS NULL:2006/12/11(月) 07:42:19 ID:???
ん4.0?サブクエリ使えない?ならあきらめれ。

448 :NAME IS NULL:2006/12/11(月) 10:29:29 ID:???
>>445
マニュアルに答えがあるから嫁

449 :NAME IS NULL:2006/12/11(月) 21:43:38 ID:???
スレ違いでしたら、ごめんなさい。
良くCGIで、都道府県をリストから選択するのありますが、
東京都選んだら、市町村もリスト選択できるようにしたいのですが、
都道府県の市町村までのなにか使いやすい
データあるでしょうか?
CSVでも何でも良いですが。

東京都 〜市,〜市,〜市,,,
北海道 〜市,〜市,〜市,,,

手書きで市町村書いてくとすごく大変ですが、
みなさんどこからデータ持ってきて使ってるんでしょうか。
よろしくお願いします。

450 :NAME IS NULL:2006/12/11(月) 21:45:48 ID:???
>>449
ttp://yubin.senmon.net/service/xmlrpc.html

451 :NAME IS NULL:2006/12/11(月) 22:56:30 ID:???
>>450
ありがとうございます!

452 :NAME IS NULL:2006/12/11(月) 23:19:42 ID:jn2QwuJt
select count(数学点数)
from 点数表
where 数学点数 = 100
group by 数学点数

select count(数学点数)
from 点数表
where 数学点数 = 0
group by 数学点数


上記のように点数が100点と0点をカウントしたいんだけど
2つのselect文を1つにまとめるにはどうすればいいですか?

453 :NAME IS NULL:2006/12/11(月) 23:27:05 ID:???
数学点数 = 0 or 数学点数 = 100 
ですまんか?


454 :452:2006/12/11(月) 23:41:07 ID:???
>>453
0と100の場合で別々にカウントしたいんです。
or だと0と100の両方をカウントすることになりませんか?

455 :NAME IS NULL:2006/12/11(月) 23:46:08 ID:???
>>454
>or だと0と100の両方をカウントすることになりませんか?

453じゃないが、ならんよ。やってみれ。

456 :452:2006/12/11(月) 23:53:07 ID:???
>>455
ありがとう。無知ですまそ。

ちなみに
数学100点と英語0点をカウントするとしたらどうすればいいですか?

457 :NAME IS NULL:2006/12/12(火) 00:08:59 ID:???
>>456
UNIONでもサブクエリでもCASEでもお好きなのドゾー。

458 :NAME IS NULL:2006/12/12(火) 15:45:39 ID:t9HsFvWX
プロ野球選手のデータを検索して出力するシステムを作っているのですが、2006年度の成績のデータをSQLに入れるとこまでは終わって、その後をどうすればいいか困っています。どなたか教えてもらえませんか?

459 :NAME IS NULL:2006/12/12(火) 17:12:14 ID:???
>SQLに入れる
ってなんだ。

>データを検索して出力するシステム
を作ってるなら、まずは検索して出力するやつを作っては

460 :NAME IS NULL:2006/12/12(火) 20:58:43 ID:???
CREATE TABLE s04e137book(id INT UNSIGNED PRIMARY KEY, title VARCHAR(100), price INT UNSIGNED);

これを数値型のフィールドを基準にデータを並び替える問題を作成する問題とSQL
そして識別番号が大きい順番から二つのレコードについて、値段を1000に変更するSGLを作成する方法

いまいちよくわからないので、ご指導願います


461 :NAME IS NULL:2006/12/12(火) 20:59:43 ID:t9HsFvWX
>>459
MySQLにデータを入れるということです。

462 :NAME IS NULL:2006/12/12(火) 22:40:48 ID:???
>>461
そこから先はアウトプットの世界
検索用のSQL作るのとODBCで接続出来るようにして
Webで吐き出すのがスタンダード

まあがんばれ

463 :NAME IS NULL:2006/12/13(水) 11:26:02 ID:???
>>460
>並び替える問題を作成する問題とSQL
>変更するSGL

少し落ち着いてから出直せ


464 :NAME IS NULL:2006/12/14(木) 12:02:22 ID:FlUI8LcX
SQLについて質問です(ORACLE 8i以上ならなんでも可)
NULLだったら違う値を返す関数NVLがありますが
 SELECT NVL( COL1 , 'HOGE') FROM HOGEHOGE;
項目が数値の0だったら違う値を返す関数ってありますでしょうか?
DECODE関数だと ELSEにあたる部分を記述しなくてはいけなくて。。
  × SELECT DECODE ( COL2 , 0 , NULL , COL2 ) FROM HOGEHOGE;
というのも、↓のようにCOL2の部分が計算式になっている場合に、ELSEに相当する部分に再度計算式を書くのが大変なので。
  SELECT DECODE( 1+2-3 , NULL , 1+2-3) FROM HOGEHOGE;
↓のようなやり方、またはスマートにできるやり方ありますでしょうか。調べてみたのですが見つからなくてorz
  ○ SELECT HOGE_FUNC( COL2 , NULL ) FROM HOGEHOGE;

465 :NAME IS NULL:2006/12/14(木) 13:31:32 ID:ApxXT0kl
SQLクエリで質問があります。映画と監督の情報が入力されたテーブルがあり、
以下の条件の下にSQL文を書いているのですが、思うように結果表示が出来ません。

映画、監督のテーブル:ttp://deaikei.biz/up/up/3774.jpg.html パス:sql

条件)

MOVIEテーブルのLengthの平均値を求めて、Nominationsでグループ化した物を出力するのですが、
グループ化されるのは、Lengthが100分以上の映画と平均Nominationsよりもノミネートされている
回数が多いNominationsのみで、100分以下、平均Nominations以下の場合は省かれます。

用語の意味ですが、Lengthは映画の分数、Nominationsは何かの賞に何回ノミネートされたか、です。

466 :NAME IS NULL:2006/12/14(木) 14:28:02 ID:ApxXT0kl
もうひとつ質問があります。
Movie Number、Movie Title、Movie Type、Director Name を表示する場合、

SELECT MOVIE_NUMBER, MOVIE_TITLE, MOVIE_TYPE, DIRECTOR_NAME
FROM MOVIE, DIRECTOR
WHERE MOVIE.DIRECTOR_CODE=DIRECTOR.DIRECTOR_CODE;

以外の文で表示させる事は可能でしょうか?

467 :NAME IS NULL:2006/12/14(木) 14:45:19 ID:???
>>464
組み合わせでも無理なら
関数作ればいいのでは

468 :nobodyさん:2006/12/14(木) 17:32:19 ID:???
SQLでレコードを取り出す際に、値がnull以外のフィールドを
取り出したいのですが、どう記述すれば良いのでしょうか?

469 :NAME IS NULL:2006/12/14(木) 17:42:12 ID:???
IS NOT NULL

470 :464:2006/12/14(木) 18:45:23 ID:???
>>467
やはり関数作るしかないのでしょうか><
1つのSQL文でしか使わないため、ユーザー定義関数作るのもなんだかなっと思いまして。


471 :468:2006/12/14(木) 22:36:16 ID:???
>>469
SELECT IS NOT NULL FROM document_word WHERE name = 'PC';

このようにしたのですが、うまくいきません。↓のSQLでいうと、
どのようになるでしょうか?

SELECT FROM document_word WHERE name = 'PC';

472 :NAME IS NULL:2006/12/14(木) 23:09:43 ID:???
whereのところに書く。

473 :NAME IS NULL:2006/12/14(木) 23:16:20 ID:???
>>464
SELECT NULLIF(式1, 0) FROM HOGEHOGE;
・式1 = 0 → NULL を返す
・式1 ≠ 0 → 式1 を返す
注.式1に対しては NULL 値を指定することはできない。
  式1がNULL値を返す事がありうる場合は以下の方法で回避可。
  SELECT NULLIF(NVL(式1,0), 0) FROM HOGEHOGE;

474 :NAME IS NULL:2006/12/14(木) 23:34:21 ID:???
>>466
SELECT A.MOVIE_NUMBER, A.MOVIE_TITLE, A.MOVIE_TYPE, B.DIRECTOR_NAME
FROM MOVIE A, DIRECTOR B
WHERE A.DIRECTOR_CODE = B.DIRECTOR_CODE;

あるいは

SELECT A.MOVIE_NUMBER, A.MOVIE_TITLE, A.MOVIE_TYPE, B.DIRECTOR_NAME
FROM MOVIE A
INNER JOIN DIRECTOR B ON A.DIRECTOR_CODE = B.DIRECTOR_CODE;

475 :468:2006/12/14(木) 23:34:57 ID:???
>>472
SELECT * FROM tablename WHERE fieldname IS NOT NULL
ということでしょうか?
でも、これだとフィールドにnullが含まれているレコードが抽出されなく
なってしまいますよね?


476 :NAME IS NULL:2006/12/15(金) 00:50:41 ID:???
>>468

自分が何をしたいのかを「確実に」他人に伝える手段を身に付けてから出直せ。

477 :468:2006/12/15(金) 01:12:20 ID:???
>>476
えーとですね、
テーブル名:word
A  B  C  D  F・・・フィールド
PC IP UDP null null
TCP MAC ARP RIP null

として、PCという値のあるレコードを取り出す際に、null以外つまり、
フィールドA,B,Cのみを取り出したいということです。





478 :NAME IS NULL:2006/12/15(金) 07:34:10 ID:???
>>477
SQLの範疇じゃないな。自分でNULLの分抜いてコレクションを作り直せ。

479 :NAME IS NULL:2006/12/15(金) 08:18:09 ID:???
↓のような算数の問題をSQL文で計算したいのですが、頭がこんがらがって計算できません。。
分析関数を使って考えてみたのですが、前日のAを取得することができないです。(再帰処理?)
どなたかSQLのパズルが得意な方ご教授ください。
COL1   COL2
20061211 2
20061212 5
20061213 2
20061214 10
20061215 3
A = 0.5 * AVG(過去3日間COL2) + 当日のCOL2
B = 0.5 * 前日のA + 当日のCOL2
※前日のAがない場合NULL
結果
COL1   COL2  答え
20061211 2   
20061212 5
20061213 2   
20061214 10  
20061215 3   0.5 * (11.5) + 3 = 8.75
20061216 8   0.5 * (8.75) + 8 = 12.375
※20061214でA=11.5になるが前日のAがないため20061214はNULL

ちなみに、ない頭振り絞って以下のような計算式を出したのですが、最初の1件だけ正しい値が取れるのですが
前日のAを元に計算してなくて。。
SELECT COL1,COL2,
 0.5 * LAG_HEIKIN3 + COL2
FROM (
 SELECT COL1,COL2,
 Lag(HEIKIN3) over(order by COL1) as LAG_HEIKIN3
 FROM (
  select COL1 , COL2
   case when count(*) over(order by COL1) >= 3
    then AVG(COL2)
    over(order by COL1 Rows (3-1) Preceding)
   end as HEIKIN3
  FROM TBL1
 )
)

480 :NAME IS NULL:2006/12/15(金) 09:28:46 ID:???
>>479
20061215のA(翌16日の計算式にあるカッコ内の値)は5.8333.... じゃないのか?

SELECT col1,col2,
(
(SELECT CASE count(*) WHEN 3 THEN avg(col2)*0.5 ELSE NULL END FROM Table WHERE col1 BETWEEN T1.col1-'4 days'::INTERVAL AND T1.col1-'2 day'::INTERVAL )
+
(SELECT col2 FROM Table WHERE col1 = T1.col1-'1 day'::INTERVAL)
)*0.5+col2 FROM Table AS T1;

キャスト演算子がPostgreSQL表記になっているので適当に変えてくれ。
なお、col1はDATE型のつもり。必要ならそちらもDATE型へ変換してくれ。

481 :480:2006/12/15(金) 09:31:31 ID:???
あ、最初のサブクエリ(前日のAを計算している所)の後ろの方にある'2 day'は'2 days' のタイポ
まぁ、そのままでも通るだろうけど。

482 :480:2006/12/15(金) 09:42:49 ID:???
もうチョット補足。
前日のAと言うのは、
「4〜2日前の平均*0.5+前日のCOL1」
と考えれば、>>479が出したSQLをチョット改造する程度でも
いけるんじゃないのかな?
見慣れないSQLなんではっきりとは知らんが。

483 :479:2006/12/15(金) 12:05:55 ID:???
ありがとうございます。
480さんのSQLだと ↓のような解釈になり 結果1のようになるような気がするのですが、どうでしょうか?
カレント行の2日前〜4日前の件数が3件なら
( ( 2日前〜4日前の平均) * 0.5 )
+ (カレント行の1日前 * 0.5) + (カレント行)

結果1
COL1   COL2 A                  B
20061211 2
20061212 5
20061213 2
20061214 10
20061215 3  (2+5+2)/3 * 0.5 + 10*0.5 + 3  9.5
20061216 8  (5+2+10)/3 * 0.5 + 3*0.5 + 8  12.33・・


すみません、それと私の説明が間違ってました。
×A = 0.5 * AVG(過去3日間COL2) + 当日のCOL2
○B = A = 0.5 * 前日のA + 当日のCOL2
 ではAはどうやって求まるのかというと
 最初に前三日分のデータが存在した場合のみ
 A=0.5 * AVG(過去3日間COL2) + 当日のCOL2 でAを求めます。
 以降の行は A=0.5 * 前日のA + 当日のCOL2 になります。
 また、結果も B=0.5 * 前日のA + 当日のCOL2 になります。

正しい結果は
COL1   COL2 A               B
20061211 2  前3行がないため NULL     NULL
20061212 5  前3行がないため NULL     NULL
20061213 2  前3行がないため NULL     NULL
20061214 10  (2+5+2)/3*0.5 + 10=11.5   前日のAがないためNULL
20061215 3  前日のA * 0.5 + 3=8.75   8.75
20061216 8  前日のA * 0.5 + 3=12.375  12.375

むずかしい・・

484 :480:2006/12/15(金) 13:10:02 ID:???
あーあぁ〜〜〜あ゛
再帰ってことじゃないけど、前行の値を保持しておかなきゃならないんでたぶんSQLでは無理。
少なくとも俺には無理。
ストアドつかえばLOOPさせるだけなんで、簡単にできるとは思うけど。

485 :NAME IS NULL:2006/12/15(金) 13:37:14 ID:???
>>479
移動平均でググレカス

486 :479:2006/12/15(金) 13:39:55 ID:???
出来るかなっと思ってたのですが、考え始めたら嵌まっちゃって。。
やはりSQLじゃ無理なんですかね。お騒がせしました。

487 :479:2006/12/15(金) 14:07:46 ID:???
>>485
ググったけどわかりませんでした(泣)
移動平均とは
(カレント行 - 1) 〜 (カレント行 - 5とか6とか7とか)
の平均値を求めることであってますでしょうか?
それだと480さんのやり方で取得できると思うのですが。
それとももっと別のことなんでしょうか。。

488 :NAME IS NULL:2006/12/15(金) 15:34:16 ID:???
SQL 移動平均
でググレカス

489 :NAME IS NULL:2006/12/15(金) 19:15:56 ID:XBDMrFkG
たすけて下さい!

現在、レコードのNUMをDESCで表示させています。
ーーー
TABLE BBS
KEY NUM NAME COMMENT
1 96 あああ あーなんです
2 97 いいい いーなんです
3 98 ううう うーなんです
4 99 えええ えーなんです
5 100 おおお おーなんです
・表示
おおお おーなんです (任意の数で上下させる処理)
えええ えーなんです (任意の数で上下させる処理)
ううう うーなんです (任意の数で上下させる処理)
いいい いーなんです (任意の数で上下させる処理)
あああ あーなんです (任意の数で上下させる処理)
ーーー
しかし!順番をたまに手動で変えたい。

例えば「おおお」は3番目にしたいとかです。
おおお表示のhtmlにて 下げるキーをPOST等で二回押すとか、
もしくは下2を打ち込み下げる、
そのような感じで「おおお」の表示を3番目にさせる
こういう事は可能でしょうか。

いろいろ調べてみたのですが、わからずで・・
全レコードを取り出しNUMを全部書き換えるとかでおこなうのでしょうか、
取り出してから、php側で処理し直すとかするのでしょうか・・

考え方がわからず 助けていただきたいです。
それとも98の位置にわりこませると、後はNUMが自動ずれるとか・・
よろしくお願いします。

490 :NAME IS NULL:2006/12/15(金) 19:17:07 ID:???
初歩的な質問だと思いますがよろしくお願いします。
name1 name2 name3の重複したレコードを1つにまとめるSQL文おしえてください。

491 :NAME IS NULL:2006/12/15(金) 19:40:47 ID:???
>>489
別に順番用のテーブルを作るのが吉

492 :NAME IS NULL:2006/12/15(金) 19:41:39 ID:???
>>490
GROUP BY

493 :490:2006/12/16(土) 04:11:45 ID:???
SELECT * FROM hoge GROUP BY name1
だと、name1だけをグループ化ですよね?
name1 name2 name3の重複を取り除きたいです。
よろしくお願いしますm(_ _)m


494 :NAME IS NULL:2006/12/16(土) 06:34:59 ID:???
それぞれ別のカラムなのか?

495 :NAME IS NULL:2006/12/16(土) 07:48:56 ID:???
別のカラムだったらそれぞれgroup byした後にunionで結合すれば?

496 :NAME IS NULL:2006/12/16(土) 08:21:59 ID:???
てすと

497 :NAME IS NULL:2006/12/16(土) 08:29:08 ID:???
すんませ〜ん……
ちょっとおたずねしたいのですが

DATE型の日付から曜日別にログを抽出するって可能ですか???

例えば掲示板の書き込みをDBに保存するとして
日付をDate型で保存してるとします

土曜日の書き込みをすべて抽出したい場合

SELECT * FROM hoge Where Date=(この部分でWEEK=5みたいな)

みたいな感じでお願いします

最悪WeekDayフィールドを用意して 書き込み時の処理で 土曜なら5とかでもいいんですが
できればクールにやりたいので……


498 :NAME IS NULL:2006/12/16(土) 08:42:25 ID:???
>>497
とりあえず使っているDBの名称くらいかいたらどうだ?
ちなみにDB2なら標準でそういう用途の関数がある。

そういう関数がないとあまりクール(?)にはできんと思う。

499 :NAME IS NULL:2006/12/16(土) 08:45:17 ID:???
クールよりはエレガントだな。

500 :490:2006/12/16(土) 09:00:53 ID:???
>>494
それぞれ別のカラムです。
>>495
GROUP BY を UNION で結合してもうまくいきませんでした(重複が取り除かれてなかった)

ちなみにDISTINCT使うと表示するとき変なスペース(重複を取り除いた部分なのかな?)が表示されてしまいます。。
よろしくお願いします。

501 :NAME IS NULL:2006/12/16(土) 09:16:00 ID:???
>498
すいません!忘れてました
DBはmysqlです

>499
まぁ いけてる ってことです

502 :NAME IS NULL:2006/12/16(土) 09:56:14 ID:???
>>497
DATE_FORMAT

503 :NAME IS NULL:2006/12/16(土) 10:13:15 ID:???
>502
ありがとう!
そのヒントでもうちょっとがんばってみます

504 :NAME IS NULL:2006/12/16(土) 14:05:18 ID:???
SQLserver2000使ってます。

M得意先のテーブルに得意先名という列があります。
得意先名の中に「山田株式会社  」といったように会社名の右側に
空白が入っている場合、一括でその空白を削除するクエリを教えてください。
rtrim関数で空白を削除した後の文字列を返すことはできると思うのですが
updateで一括痴漢したいのです。どなたかご教授願えますか。

505 :NAME IS NULL:2006/12/16(土) 14:06:31 ID:???
おれも痴漢したいな アッー

506 :NAME IS NULL:2006/12/16(土) 14:20:50 ID:???
>503
select * from log where date_format(Date,'%w')=6

で 解決しました!!アドバイス感謝します!


507 :NAME IS NULL:2006/12/16(土) 15:19:43 ID:FiTaYTiR
>491
ありがとうございます。489です。
別テーブルはどういう形で
IDをKEYにして id、順序という形でしょうか。

508 :NAME IS NULL:2006/12/16(土) 19:43:45 ID:???
>>507
そうだね。
で、LEFT JOIN とかして
ORDER BY 順序テーブル.順序

509 :NAME IS NULL:2006/12/16(土) 20:05:57 ID:???
>>504
Update 得意先 Set 会社名 = Rtrim(会社名)でいいだろうに。


510 :504:2006/12/16(土) 21:22:07 ID:???
回答ありがとうございます。
やってみたんですがどうもだめです。
「山田株式会社 」といったように右側の空白が半角スペースだと
rtrimで切り取ってくれるのですが
「山田株式会社  」といったように全角スペースが混じると
「山田株式会社  」と、何も変化せずに返されてしまいます。。。


511 :NAME IS NULL:2006/12/16(土) 21:31:02 ID:???
そもそもそんなデータ入れるな

512 :NAME IS NULL:2006/12/16(土) 21:48:34 ID:???
>>510
ヒント:文字列の置き換え

513 :NAME IS NULL:2006/12/16(土) 22:18:23 ID:56UzO0+c
#SQL

集合関数(UNION)使う時って、
Selectの数をあわせなければ
いけないのでしょうか?

514 :NAME IS NULL:2006/12/17(日) 01:08:19 ID:???
YES

515 :NAME IS NULL:2006/12/17(日) 09:48:28 ID:???
>513
数だけでなく、型も合わせなきゃダメだよ。

516 :NAME IS NULL:2006/12/17(日) 14:56:50 ID:NLx29Tuk
>>513
有難う御座います。

517 :NAME IS NULL:2006/12/17(日) 15:30:04 ID:NLx29Tuk
#TSQL

LEFT JOINと
LEFT OUTER JOINの
違いはあるのでしょうか?

518 :489:2006/12/17(日) 16:47:37 ID:8+QonOK/
>508
すこし別のアプローチでやってみました。
id numstr
0 21,12,13,14,15〜
1 43,54,57,43〜
2 555,666,444,333〜
idはカテゴリでくくり、numstrに文字列として格納してみました。
文字列をexplodeし配列からforeachで本テーブルから引っ張ってみました。
いろいろな角度からやってみるのは、とてもおもしろいです。
負荷という点で、どちらの処理が重いのか、ベストなのかとか
思ったり、色々とプログラムを楽しんでいます。ありがとうございました。


519 :NAME IS NULL:2006/12/17(日) 18:05:22 ID:???
>517
ない

520 :NAME IS NULL:2006/12/18(月) 07:23:02 ID:W84oHfQv
SQL識者の方、どうかご教授下さい!

SELECT ***** AS num,user FROM user_table WHERE ....
みたいな感じで、numを0から自動的に1づつ増やした値を取得って出来ますでしょうか?
DBはMySQL4.0です。

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

521 :NAME IS NULL:2006/12/18(月) 09:09:32 ID:???
>>520
MAX(num)

522 :520:2006/12/18(月) 20:14:41 ID:W84oHfQv
MAXって最大値を求めるんじゃ?
MAX(num)のnumには何を入れればいいのでしょうか?

523 :NAME IS NULL:2006/12/18(月) 21:36:54 ID:???
>>522
>>520に自分で書いておろうが。


524 :520:2006/12/18(月) 21:45:19 ID:W84oHfQv
いや、実行してもエラーが出たもんで・・・。

525 :NAME IS NULL:2006/12/18(月) 21:50:43 ID:???
>>520
_
だが、RDBMSによっては便利な関数があるかもしれない。
よって、MySQLで聞くほうが早い。
もしくはテンポラリーシーケンスを用意するか。

526 :NAME IS NULL:2006/12/18(月) 22:13:57 ID:???
oracleならrownumがあるな。
SELECT rownum AS num,user FROM user_table WHERE ....

MYSQLで使えるかどうかは知らない

527 :520:2006/12/18(月) 22:43:45 ID:W84oHfQv
>525
なるほど。
ありがとうございます。
今後のために参考にします。

>526
オラクル便利ですねぇ。
MySQLでは使えませんでしたorz

結局プログラム側でやった方が早いのでそうしました。
読み出して新しい配列に挿入するのはスマートではないと思いましたが、
SQLヘボマスターの俺には仕方のない事です。
ありがとうございました。

528 :NAME IS NULL:2006/12/18(月) 23:59:42 ID:???
>>527
そもそも何がしたいのか良く判らんのだが、
連番を作って会員番号とかに使いたいって事なら、
オートインクリメントで良いんじゃないのかい?

529 :NAME IS NULL:2006/12/19(火) 00:06:21 ID:???
MySQL4.0って内部結合使えないの?

530 :520:2006/12/19(火) 08:50:45 ID:MhqlDpzQ
>528
会員番号じゃないですよ。
最初は一覧表示からmember.php?user=****の様に
詳細を見れる様にしてたんだけど、これだと会員番号が丸出しだから
member.php?list=0&area=1&etc=n...
member.php?list=1&area=1&etc=n...
って連番と検索条件をパラメーターで渡して、
limit 0,1
limit 1,1
とやってみようかと思ってやってみたけど、
ロジック的にどうなのか自信なくなってきた・・・orz

内容がSQLじゃなくなっちゃったな。
すんません。

>529
内部結合使えますよ



531 :520:2006/12/19(火) 10:38:08 ID:???
もはやSQLではなくなったので、webprog版に移動しました。
ありがとうございました。

532 :NAME IS NULL:2006/12/19(火) 10:58:55 ID:???
DBの中身を一気にぶっこぬいてphp側で処理するのと
ID単位でDBのレコードを1づつ引っこ抜いていく処理とでは
どちらが負荷かかるのでしょうか。

533 :NAME IS NULL:2006/12/19(火) 14:00:32 ID:???
>>532
ケースバイケース

534 :NAME IS NULL:2006/12/19(火) 14:32:48 ID:???
>>533 d
結構レコード数が多いのですが(数千件)
レコードの順番管理としていい方法はないでしょうか。
順番テーブルから順番いれているフィールドを抜いて処理し
KEYIDでforeachで数千回SQL文流して書き込んでいくという形
でいいのでしょうか・・・。

535 :NAME IS NULL:2006/12/19(火) 14:55:36 ID:???
数千件って少ないほうじゃないの

536 :NAME IS NULL:2006/12/19(火) 14:57:11 ID:???
どっちも試してみたらいいと思うよ
インタラクティブな処理で、ループで一回一回やるのなら
かなりの待ち時間が発生するだろうな

537 :NAME IS NULL:2006/12/19(火) 15:39:58 ID:???
すいませんが、教えてください。
あるレコードが別のレコードのIDを参照するような、
ツリー構造を表現するような↓のようなテーブルがあるとして、
rootなレコード(parent=0)に関連するすべてのレコードを
取得するにはどうしたらよいのでしょうか?

id    name     parent
-----+-----------+----------
1   | rootA    | 0
2   | rootB    | 0
3   | A−1    | 1
4   | A−1−1  | 3
5   | A−1−2  | 3
6   | B−1    | 2
7   | A−2    | 1
8   | A−2−1  | 7
・・・・

上の例で言うと、rootAの関連するレコードとして、
idの1,3,4,5,7,8を一度に取得したいのですが・・・
DBはPostgreSQLの8.1です。
すみませんが、よろしくお願いします。

538 :NAME IS NULL:2006/12/19(火) 15:52:42 ID:???
>>535
レコード毎の表示に他のDBからデータを
引っ張ってきてはhtml作成したりしてるのもあって
一件が重たかったりします。。設計まちがったかな・・

>>536
実はインタラクティブな感じで使用します。
検索サイトの検索結果の一つ毎に順番の上下ボタンがあると
イメージしてもらうとわかりやすいかもです。


539 :NAME IS NULL:2006/12/19(火) 15:56:08 ID:???
>>537
WHERE name LIKE '%A%' じゃ駄目かな

540 :NAME IS NULL:2006/12/19(火) 17:01:32 ID:???
>>537
PL/pgSQL で関数作るとか

541 :NAME IS NULL:2006/12/19(火) 21:34:49 ID:???
>530
いまさらだけど、内部結合できるんなら、
ttp://d.hatena.ne.jp/CAMUS/20060105/1136469086

542 :NAME IS NULL:2006/12/20(水) 00:10:27 ID:gFXhyA0/
NVARCHAR2 呼び方は、なんと呼んでいるのでしょうか?

543 :NAME IS NULL:2006/12/20(水) 01:48:44 ID:???
んばーちゃーつーに決まってるだろ

544 :NAME IS NULL:2006/12/20(水) 07:00:06 ID:???
そうか。俺はてっきり、えぬばーきゃーに って呼ぶもんだと思ってたよ

545 :NAME IS NULL:2006/12/21(木) 18:19:49 ID:M88ezNHc
userid 
-----+--
112  |
231  |
331  |
41   |
テーブルにこんな感じに入っててこの中から
useridが一番大きいのを選択するにはどうすればorz(*useridはテキスト型です)

546 :NAME IS NULL:2006/12/21(木) 19:43:05 ID:???
>>545
設計からやり直し

547 :NAME IS NULL:2006/12/21(木) 19:50:21 ID:???
useridに入ってるのが数字だけなら、何の工夫もなく取得できそうな気がするわけだが。

548 :NAME IS NULL:2006/12/21(木) 21:42:21 ID:???
なら、数値に変換してmaxで括ればすむじゃね。

549 :NAME IS NULL:2006/12/21(木) 23:26:22 ID:???
もしくはorder byしておいて1件取得か。

550 :NAME IS NULL:2006/12/22(金) 10:32:35 ID:???
大きいの定義が無いとな
文字コードとして最大でいいならそのままMAX
数字として大きいなら数値に変換してMAX
変換の仕方はRDBMSによる

551 :545:2006/12/22(金) 10:49:04 ID:???
たくさん返信ありがとうございます。
>>550
数字として大きいのを取り出したいんですが変換の仕方がいまいちよくわかりません。
色々探してCASTっていう関数使えばいけるのかなってとこまではいったんですが
うまくいきません。orz
使ってるのはmysqlです。

552 :545:2006/12/22(金) 10:57:45 ID:???
ちなみに
rs = st.executeQuery("select MAX(CAST(フィールド名 as 型名)) from テーブル名 order by フィールド名");
こんな感じで使ったんですがだめでした。orz

553 :NAME IS NULL:2006/12/22(金) 11:05:05 ID:???
>>552
ちょw、みんなの意見を全部取り入れるなよ。
>>548-550のどれかひとつでいいんだよ。

554 :NAME IS NULL:2006/12/22(金) 11:10:15 ID:???
MySQL よくしらんが、 + 0 とかで0足せば数字になるみたいだな、10進数ならそのままいけそう

555 :545:2006/12/22(金) 11:53:04 ID:???
クエリ式MAX(CAST(userid as UNSIGNED))の構文エラー:演算子がありません。
こんなエラーがでるんですがCAST関数の書き方間違ってるんでしょうかorz

556 :NAME IS NULL:2006/12/22(金) 12:02:12 ID:???
>>555
マニュアル嫁
つttp://dev.mysql.com/doc/refman/4.1/ja/cast-functions.html

557 :NAME IS NULL:2006/12/22(金) 15:05:56 ID:???
name value
ABC AXYZ
ABC CXYZ

上記のようなテーブルで

name count value
ABC 2 AXYZ,CXYZ

のように取り出したい場合どうすればいいでしょうか?
SELECT name,value,COUNT(NAME) FROM table_A GROUP BY name,value ORDER BY name;
ですとname,valueがバラバラになってしまいます。

GROUP_CANCATなるものがあるようですが、使用しているMySQLがMySQL 4.0.2xで
使用できませんでした。


558 :NAME IS NULL:2006/12/22(金) 15:33:32 ID:???
>>557
1つだけの時はどう表示すればいいの?
3つ以上のときは?

559 :557:2006/12/22(金) 15:40:45 ID:???
name count value
ABC 1 AXYZ



name count value
ABC 5 AXYZ,BXYZ,CXYZ,DXYZ,EXYZ

可能であれば

name count value
ABC 5 AXYZ(3),BXYZ(2)

こんな感じでしょうか?
不可能ならphp側の処理で逃げようと思ってました。


560 :NAME IS NULL:2006/12/23(土) 13:41:00 ID:???
Webプログラミング板から誘導されてまいりますた。

n a b c ←フィールド名
-------
1 o t t
2 o u t
3 s p p
4 s o p
5 s q p

上記のようなデータベースのテーブルがある場合に
cフィールドの値が異なるものだけ1行ずつ取得したい、
つまり上の場合、1と3のaフィールドの値(oとs)だけ取得できれば良い、
という場合、スマートな取得方法はあるでしょうか?

PHPを使用しておりまして、その際に上記を取得したいのですが、
PHP側の処理として思いついたのは、全行一旦配列として取得して、
cが重複する値を含む配列は重複分を削除、です。
ただ、これだとデータ量が多い場合にメモリを食って、すごい無駄な作業が多いかな
と思っています。

SQL文でスマートに取得する方法のご教授どうかお願いします。

561 :NAME IS NULL:2006/12/23(土) 14:13:49 ID:???
FAQ

select a from tbl where n in (
select min(n) from tbl group by c
)

562 :NAME IS NULL:2006/12/26(火) 12:17:01 ID:???
1対多の関係にあるヘッダーテーブルと明細テーブルが有ります

ヘッダーテーブル項目
日時
運転者
走行距離

明細テーブル
明細行番号
運賃


二つのテーブルを結合させて一覧表を作りたいのですが
その際にヘッダーにある走行距離は明細行番号が1のレコードだけ表示して
その他はnullまたは0を返すSQLって出来ませんか。
DBはアクセス97です。


563 :NAME IS NULL:2006/12/26(火) 13:54:28 ID:???
〜 WHERE (複数行返る問合せ) LIKE パターン

とすると「1行以上返る問合せがある」とエラーが出るんだが、どうすればいい?

564 :NAME IS NULL:2006/12/26(火) 14:16:33 ID:???
>>562
CASE を使え

>>563
WHERE EXISTS (サブクエリ WHERE LIKE パターン)

565 :NAME IS NULL:2006/12/26(火) 14:18:40 ID:???
それを避けるようにすればいいと思うよ
やりかたは目的による

566 :564:2006/12/26(火) 14:19:16 ID:???
っと、

Access97でCASEが使えなかったらスマソ。

それと下は

WHERE EXISTS (サブクエリ WHERE カラム LIKE パターン)
な。

567 :NAME IS NULL:2006/12/27(水) 20:08:44 ID:???
質問させてください
マンションのデータベースがあり
各都道府県の登録件数を出すとき(例えば北海道500件、青森20件など)
47回SQL文発行しないといけないのでしょうか?
もっと簡単な方法があると思うのですが、あったら教えてください。
お願いします。

568 :NAME IS NULL:2006/12/27(水) 21:42:29 ID:???
>>567
SELECT 都道府県,count(都道府県) FROM マンションテーブル GROUP BY 都道府県;

569 :NAME IS NULL:2006/12/28(木) 07:55:19 ID:???
>>568
ありがとうございます。その方法でできました。
しかし問題が…
高知県だけ取得できない…


570 :569:2006/12/28(木) 08:07:57 ID:???
default-character-set=ujisに変えて解決しました。m(_ _)mぺこ

571 :NAME IS NULL:2006/12/28(木) 10:31:43 ID:qim9OQQX
使用データベース : postgres
テーブル名 : test_tbl
カラム id | name
上記条件のテーブルがあります、ここにカラムnameに重複が無い時にのみ
インサートを実行し新しい値を挿入したいのですが
一文で書くことはできないでしょうか?

caseを使えば出来そうな気がしたので、一度やってみたのですが
結果にインサート文が表示されるだけで出来ませんでした

572 :NAME IS NULL:2006/12/28(木) 15:45:37 ID:???
uniqueの制約でもつけとけば、重複がなければinsertできるだろうし、
重複があれば例外が発生してinsert不可になる。

しかし、そういう事を一文で書く事に拘る心境が理解できんが。

普通にselectしてから後続処理を分岐させれ。

573 :NAME IS NULL:2006/12/28(木) 16:33:39 ID:???
処理往復回数が増えることを嫌うのが"普通"。

SELECT COUNT(*)してUPD or INS ってのは典型的な愚図のプログラム。
INSERTが多いなら、INSERTで重複エラーでUPDATE、逆ならUpdateで更新0件ならINSERT。

で、君はなぜオラクルにマージが出来たと思うのよ。
そういうことを一文で書くこだわりをオラクルとそこに要望した数多の技術者は理解したけど、君は理解してないってだけでしょ?

574 :NAME IS NULL:2006/12/28(木) 16:40:48 ID:???
まぁ、クライアントからSQL文を発行するときだけだわな。ラウントドリップの回数を気にするのは。


575 :NAME IS NULL:2006/12/28(木) 16:43:49 ID:???
まあいろいろあるじゃん。

でもま、キーが確定してるのにそのキーのデータがあるのか無いのか
わからない状況って変な気もするし、でもやっぱりそういうケースはある、よなあ

576 :NAME IS NULL:2006/12/28(木) 16:54:50 ID:???
>>575
人の入力に対してはなんともいえないんじゃないの?
あと、マスタの洗い変え処理なんかでは良く出るよ。
元データとDBで、元に有りDB無しなら追加、・・・ってパターン。

元データの有無を一々確認するってのがSELECTするってことだろうけど、知らないで弾かせればいいじゃん。
そのための主キー設定だし。


577 :572:2006/12/28(木) 17:51:41 ID:???
漏れUDBでないDB2がメインだからマージなんて使わんし使えない(w
しかしアレが特に便利な仕組みだと思わんけど。

あれで障害を発生させるOracle信者多いし。

Oracleを持ち出されてもアレが美しい設計思想とも思わんけど。
と言うかOracleは独自の我侭思想だな感じるが、コレは宗教論だからどーでもいい。
margeが時と場合によっては便利なのは認める。

検索対象とするカラムには索引をつけて、それに対して最小限のロックとなる
selectを投げて、更新対象に正しくロックをかけて色々と判定してから更新する。
なければロックの影響のないinsertするってのが、使う側にとって影響の少ない更新方法だと思う。

なんでも一文ってオナニー技術者が使いたがるけどアフォが使うとアフォみたいにロックが
かかるから、普通にコストベースでモノを考えて欲しい。

578 :NAME IS NULL:2006/12/28(木) 18:26:50 ID:???
100万件のそういうデータがあったときに、100万回主キーでSELECTするんかい?


579 :NAME IS NULL:2006/12/28(木) 18:39:52 ID:???
オマエは何を言ってるんだ

580 :NAME IS NULL:2006/12/28(木) 21:51:22 ID:???
>571
ORACLEふうに書くけど、他のDBでもできそうな感じで。

insert into test_tbl
select
'id', 'name'
from dual
where not exists (select * from test_tbl where name='name');

これで一発でいける。


581 :NAME IS NULL:2006/12/29(金) 00:36:59 ID:???
>>580
MySQL4では無理だね・・・

582 :NAME IS NULL:2006/12/29(金) 03:46:08 ID:???
PostgreSQLなら、
INSERT INTO 'id','name' test_tbl WHERE NOT EXISTS (SELECT * FROM test_tbl WHERE name='name');
でいける。

583 :582:2006/12/29(金) 06:25:58 ID:???
ゴメソ 寝ぼけてた。
INSERT INTO test_tbl SELECT 'id','name' WHERE NOT EXISTS (SELECT * FROM test_tbl WHERE name='name');
の間違い。

584 :NAME IS NULL:2006/12/29(金) 11:19:17 ID:???
>>577
SELECTかけてロックって何かどんなデータベースを使ってても、すっきりコードがかけない
というか、なんかきもいんだよな。
普通にみんなやりそうなのが、
あるキーの範囲でSELECTする(ロック完了)。
10件返ってきた。
で、更新するために、同じキーの範囲でUpdateする。
で、これでOKそうに見えるが、SELECTとUpdateの間には時間差があるわけで、
この間に、他のトランザクションのよって、行が追加、コミットされ、
実を言うと、Updateされたのは11件(いわいるファントム行?)でした。
うぉー。
これを毎回適切に処理する必要があるか判断することやその処理には骨がおれる。
たぶん、みんな何も考えてないんだろうな。
気楽でいいや。


585 :NAME IS NULL:2006/12/29(金) 11:27:34 ID:???
>>577の続き、
いや、ただ、SELECTの件数保存しておいて、Updateの件数と違えうとき、ロールバックさせるのが手っ取りはやいね。


586 :NAME IS NULL:2006/12/29(金) 11:53:45 ID:/nhPd5rf
>>584
ロック完了とかいっといて、更新時に書きかわってる?
書いてる内容が不明ですよ。


587 :NAME IS NULL:2006/12/29(金) 12:07:09 ID:???
範囲指定のロックの場合2種類あって、
ひとつはヒットした(読めた)行に対してのみのロック。この場合は>>584のいってるファントムが発生する。
共有ロック式のDBMSの場合リピータブルリード分離レベルの場合のロックのかけ方。
もうひとつは指定された範囲、またはその範囲を含むページなどでロックをかける方式で、
読めなかった部分にもロックがかかるのでファントムは発生しない。
ロックのコストが高く、範囲指定のフィールドには必ず索引が必要としている処理系が多い。
共有ロック式のDBMSの場合シリアライザブル分離レベルの場合のロックのかけ方。

588 :NAME IS NULL:2006/12/29(金) 12:36:16 ID:???
>>586
俺の表現不足かな?上記の例だと更新された11行(自分でロックした10行+ファントム1行)
>>587
そうそうその意味。俺はOracleしかみっちり触ったことないから、ページロックの事
詳しくなかったけど、その範囲のページでロックかけて、他のトランザクションによる
その範囲の行が挿入できなくなら、確かに問題ないな。

589 :NAME IS NULL:2006/12/30(土) 00:48:56 ID:???
SQL文的には等価結合
(単純にテーブル1.フィールド=テーブル2.フィールドをWHERE句に追加)
が非常に使いやすいのですが、
一方が存在しない場合に結果に含まれないのは困ります。

一方で外部結合は、JOIN句を使う必要があるため、
極力使いたくないです。

他に良い方法ないでしょうか。


590 :NAME IS NULL:2006/12/30(土) 01:01:04 ID:???
八百屋は気楽に入れるので買いやすいですが、
一方、魚を売っていないのは困ります。

一方でスーパーは買い物籠を提げてレジにも並ぶ必要があるため
極力使いたくないです。

他に良い方法ないでしょうか?

591 :NAME IS NULL:2006/12/30(土) 01:04:24 ID:???
outer join だとjoin句を使う必要があって
inner join だとjoin句を使う必要が無いという意味がわからない。

innerにしろouterにしろ、join句でもwhere句でも書けるだろ

592 :NAME IS NULL:2006/12/30(土) 01:04:25 ID:???
>>589
等価結合でもJOIN句つかえよ(笑
旧構文でJOIN句を使わず外部結合を表記することが出来るものがある。
where A *= B
where A = B (+) とか。余計わかりづらくなると思うがね。

>>590
コンビニ弁当だけで生きろ

593 :589:2006/12/30(土) 01:53:17 ID:???
>>590
たぶんバカにしてるんだろうけど、
そういう指摘の仕方ユーモラスがあって笑ってしまいました。

>>591-592
そうなんですね、MySQL関連の書籍には
結合関係が書いてあるものが少なく、
ネットで調べた断片的な知識でした orz

where A *= B
where A = B (+)
これ使いたいんですが、
MySQL4.0ではエラーが出てしまいます。
MySQL4.0でも使えるでしょうか?

178 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)