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

このエントリーをはてなブックマークに追加
1NAME IS NULL
2NAME 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/
3NAME IS NULL:2006/10/10(火) 18:08:03 ID:SmWQiBwg
ある変数のデータの中でn番目に大きなもの(小さいもの)を選択したいのですが、
どうしたらよいですか。エクセルだとlarge(n,変数名)という関数があるのですが。
43:2006/10/10(火) 18:12:11 ID:SmWQiBwg
忘れていましたが
OS:WindowsXP
使用ソフトはAccessで、かなり古い97です。
5NAME IS NULL:2006/10/11(水) 06:30:22 ID:???
>>1

SELECT
    '乙'
FROM
    ALL_OBJECTS
/
6NAME 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
7NAME IS NULL:2006/10/11(水) 11:16:49 ID:???
FAQ
8NAME IS NULL:2006/10/11(水) 11:20:06 ID:???
>>6
FAQと過去ログ嫁
厨房
9NAME IS NULL:2006/10/11(水) 21:40:36 ID:Qe2UBQfX
FROM句はトランザクションテーブルを一番右に、それに付帯する各マスタを左に並べると早いってのは本当?
駆動軸がどうとか
10NAME IS NULL:2006/10/11(水) 23:09:23 ID:???
>>9
試してみればいいのでは?
DB2とかだと小さいテーブルはメモリ参照って具合に最適化するけど、
OracleやPostgreがそうだとは限らんし。
11NAME IS NULL:2006/10/11(水) 23:27:01 ID:???
>>9
ネタが古いw
てか古いオラクルでも順番だけで駆動テーブルが決まる訳じゃないし。
そんなくだらない知識よりまず実行計画の読み方から勉強した方がいいよ。
12NAME 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()で元テーブルと結合するのは
かなり重そうだし、そもそもこのやり方自体間違っている気がするので…

13NAME IS NULL:2006/10/15(日) 13:54:56 ID:???
>>12
オラクル(たしか9i以降)ならGROUP BYで、
MIN() KEEP (DENSE_RANK FIRST/LAST〜)が使えるんだが、他のはワカラン。
14NAME IS NULL:2006/10/15(日) 15:56:19 ID:???
>>12
つ NOT EXISTS
15NAME IS NULL:2006/10/15(日) 19:12:29 ID:???
一方ロシアはNOT EXISTSを使った。
16NAME IS NULL:2006/10/15(日) 23:02:40 ID:e8jqgW9b
>>12
論理としては、「重複して困った」というその集合を、
さらにSHOPで集計してITEMのMAX取ればいいだけなんだけど、
ビューとか使ってたら当然重くなるね。

一気に2重3重の副問合せ書いて効率良く絞るとか、
ストアドで途中で一時テーブル使いながら単純化し、最後に結果を返すとか、
どうやると高速にできるか勉強した方がいいと思う。
17NAME IS NULL:2006/10/15(日) 23:24:22 ID:???
>>12
サブクエリ使えば簡単だろ

select * from (select * from T1 order by PRICE desc) TMP_T1 group by SHOP;
18NAME 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;
19NAME 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
20NAME IS NULL:2006/10/16(月) 05:32:58 ID:EmB35BHi
select 1 from 〜

この列選択リストの「1」って何ですか?
21NAME IS NULL:2006/10/16(月) 05:49:01 ID:???
>>19
MySQLだけどどこか特殊な構文ある?
値の出し方がトリッキーなのは認めるけどね
22NAME IS NULL:2006/10/16(月) 06:14:16 ID:???
>>20
何の話だか分からんがリテラルだろ
23NAME IS NULL:2006/10/16(月) 06:17:49 ID:???
>>20
定数。数値。算数における基本単位。1+1の1。
24NAME IS NULL:2006/10/16(月) 06:23:59 ID:???
>>21
19じゃないけどMySqlと聞いて納得。でもMySqlと断りをいれるべきだろ。他のやつでは動きすらしないよ。
25NAME IS NULL:2006/10/16(月) 06:29:05 ID:???
>>24
へーそうなんだ
もしかして最後のgroup byのところが問題かな
group by TMP_T1.SHOP ならどう?
26NAME IS NULL:2006/10/16(月) 07:13:53 ID:???
>>25
いや、select * のとこ。もちろん列名書いても無理。

これでITEMやPRICEの逆ソートされた最初の値返してくれるのはMySQLだけ。
27NAME IS NULL:2006/10/16(月) 07:18:19 ID:???
つまり他のDBだとfrom 句にサブクエリ使えないってことか?
そりゃ不便だな
28NAME IS NULL:2006/10/16(月) 09:52:59 ID:???
違うよ
group by 使ったときは、選択リストにはgroup byに指定した項目か集計関数しか使えない。
29NAME IS NULL:2006/10/16(月) 10:29:20 ID:zQ3wf1ji
ほー。MySQLってすげーな。
Limit も、他のDBからすれば夢みたいな機能だけど。
将来は標準規格の方に入るかな。
でも集合の定義としてちょっと変だから、集計関数として追加されるかな。
SELECT TOP *
ならぬ、
SELECT TOP(*)
とか。
30NAME IS NULL:2006/10/16(月) 12:35:33 ID:???
つーか、こんなアホなのが許されるのがおかしい。
りくつにあってないだろ
31NAME IS NULL:2006/10/16(月) 18:47:22 ID:???
まー、group by の時にselectに*が許されてもいいじゃん。とは初心者の頃激しくオモタな。
32NAME IS NULL:2006/10/16(月) 22:30:37 ID:???
>>16
...いや、おまいも自己流じゃなくてちゃんと勉強した方がいいと思う
33NAME 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での接続で、探しています。
35NAME IS NULL:2006/10/17(火) 13:55:13 ID:???
複数テーブルの指定列から最大値を求めるにはどうしたらいい?

例えば、hoge1のid列とhoge2のid列から最大値を求めるとか
36NAME IS NULL:2006/10/17(火) 14:17:20 ID:???
>>353
両方求めて比較すればいい
37NAME 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/
あたりかな?
38NAME IS NULL:2006/10/17(火) 15:40:22 ID:s0a+dHjv
>>35
greatな関数を使え
39NAME IS NULL:2006/10/17(火) 17:07:39 ID:???
>>35
SELECT MAX(ID) FROM (
 SELECT ID FROM HOGE1
 UNION
 SELECT ID FROM HOGE2
 ) T
40NAME IS NULL:2006/10/17(火) 17:10:08 ID:???
ていうか、求めたいのが「ID」って名前なのが気になる。一意保証の危うい設計やめれ。
41NAME IS NULL:2006/10/17(火) 19:42:58 ID:???
質問


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

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

みなさんの考えをお聞かせください。(.NETを使うと簡単すぎだし、解決にならんので
office2002+VBAの環境下でお願いします(アセンブリも))。
42NAME IS NULL:2006/10/17(火) 21:22:44 ID:???
>40
hogeとかfooみたいなもんじゃないの?
43NAME IS NULL:2006/10/18(水) 00:49:01 ID:???
>>41
通信の遅い環境で、INSERT文を100行分ずつ束ねて送信したことはあるけど。
その時はVPNじゃなくてASPに対して送信だったので、HTTP POSTの限界考慮して区切った。
限界がないなら全行分まとめて送信してみれば?
44big: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プールは作成されませんでした。自動的に作成することはできません
-----------------------------------------------------

何か間違い、見落としている点等あるのでしょうか?
どなたかお解かりになる方、よろしくお願いいたします。
45NAME IS NULL:2006/10/18(水) 08:24:18 ID:???
>>44
>スレ違いかもですが。。
 
わかってるなら・・・
46NAME IS NULL:2006/10/18(水) 09:20:26 ID:???
見たこともないSQLだ・・・
47NAME IS NULL:2006/10/18(水) 13:30:19 ID:???
>>38-39
サンクス

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

とすると、どちらかのテーブルに行が無い場合、結果が出ないね…
48NAME IS NULL:2006/10/18(水) 13:45:07 ID:CntbNDNh
>>47
そこで完全外部結合だお
49NAME IS NULL:2006/10/18(水) 19:23:52 ID:???
>>48
それ駄目。ぜーッ怠惰目。UNIONでできるものはUNIONで。速度が全然ちがーう。
50NAME IS NULL:2006/10/19(木) 09:33:37 ID:???
一概に言えんと思うが。
DBMSによっても違うし、インデックスの適用によっても違うし。
51NAME IS NULL:2006/10/19(木) 11:36:50 ID:rYPEA4U9
>>49
は?
完全外部結合に命をかけたファーアーバードを知らんのか?
52NAME 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はアクセスできません。


53NAME IS NULL:2006/10/19(木) 15:19:18 ID:SHleJobA
>>52
まず、日本語で何をしたいのか説明しろ。
それにすれ違い。ORACLE限定ならばORACLEスレへ。
54NAME 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には同一値は入りません。
55NAME 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;
だとどお?
56NAME IS NULL:2006/10/20(金) 22:24:40 ID:Rf9Ei9dc
>>55
explainやってみてるんですが、orだと駄目っぽいんですよね。
さらにバージョンが4.0.26なんでサブクエリも使えませんでした。
57NAME 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;

これでどお?ネストする必要無いはずだが。
58NAME IS NULL:2006/10/21(土) 00:32:58 ID:???
SQL Server と MY SQL の違いってなんですか?
59NAME IS NULL:2006/10/21(土) 04:14:20 ID:???
>>58
MYSQL/MSSQL、Yと佐賀違う。
60NAME IS NULL:2006/10/21(土) 09:06:31 ID:???
今日はいやに佐賀の話題が多いな
何かあったのか?
61NAME IS NULL:2006/10/21(土) 10:53:54 ID:???
ニュー速+行け。すぐ分かる。
62NAME IS NULL:2006/10/21(土) 11:14:20 ID:???
佐賀ってどんな意味ですか?
SQL Server と MY SQL は使い方はかわらないのですか?
63NAME IS NULL:2006/10/21(土) 14:06:20 ID:zFcqxEeh
>>57
動きました。explainしてみたところ設定したindexも
使用されているようです。ありがとうございました。
64NAME IS NULL:2006/10/21(土) 15:52:56 ID:vg/WQ1gp
ここで聞くのが適切かどうかわからないのですが…(違ってたら誘導していただけるとありがたいです)

PL/SQLに関する質問です。
PL/SQLで複雑なプログラムを作ったときに、どこかでエクセプションが発生してしまった際に
それがどこで発生したか簡単に調べる方法はあるでしょうか?(つまり1行ずつトレース文を
はさむような事をせず)
65NAME IS NULL:2006/10/21(土) 19:36:01 ID:0YEftnXD
>62
SQLの使い方は違う。
どうちがうかをかたるのはこのスレの範疇ではないから
別のスレにおききなされ。
66NAME IS NULL:2006/10/21(土) 19:38:10 ID:0YEftnXD
しまったまとめて送信すりゃよかったあるよ

>64
EXCEPTIONのCATCHの仕方でドコで発生したかがわかるようになるよ。
詳しくは、Oracleのスレでお聞きなされ。
PL/SQLはSQLも使うけど、君の聞いているコトはOracle固有のお話だから。
67NAME IS NULL:2006/10/21(土) 22:47:43 ID:???
>>65
ありがとうございました。
68NAME 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なレコードは複数あってもよい、
というのがやりたいのです。
テーブルの属性の設定などでは無理なのでしょうか?
69NAME IS NULL:2006/10/22(日) 16:42:01 ID:???
>68
テーブルの制限でユニーク値を求めるストアドプロシージャを使えばいいんじゃないの?
あと、ここはSQL Serverのスレじゃないから。
続きをしたければSQL Serverのスレでヨロ。

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

テーブル設計の人がNULLの意味を理解していないじゃないかと思うけど。
7168:2006/10/22(日) 18:21:33 ID:???
失礼しました。SQL Serverのスレがあったんですね。
移動します。
ちなみにフィールドBはユニークですが、キーのフィールドは別にあります。
72NAME IS NULL:2006/10/22(日) 18:28:41 ID:???
んなら外部制約でも使えばって気がするが・・・。
SQLServerで使えるか知らんが。
使えないから質問しているのか…。ガンガレ
73NAME IS NULL:2006/10/22(日) 20:09:06 ID:???
あれ、UNIQUE制約ってNULLは複数あっても化。
>>68の期待する制約だと思うんだが、SQL Serverってそうじゃないんか。
74NAME IS NULL:2006/10/22(日) 20:25:28 ID:???
DB2だとNULL可のフィールドはUNIQUE制約できんぞ。
75NAME IS NULL:2006/10/22(日) 20:27:40 ID:???
だよねぇ。たしかにNULLは入るけど一つだけ、ってのが欲しいと思ったことも
あるけど、普通の仕様はNULL複数可だと思うが。

ところでSQLServerがそんな動作するってことは、is nullにもindexが効くって事か。
それはそれで便利かもしれん。
76NAME IS NULL:2006/10/22(日) 20:35:31 ID:???
>>75
便利かも知れんがNULLがINDEX含まれるって事は
NULL判定する分、検索がトロくなる印象があるんだが。

つか、DB2だとNULL禁止つけたほうが動作が高速化
するといわれているので、漏れはKEYにはNULL禁止な設計するし、
普段からマメにNULL禁止にしているなぁ。
77NAME IS NULL:2006/10/22(日) 20:40:58 ID:???
それってNULLは値だっていってるようなもんだな
7873:2006/10/22(日) 21:18:49 ID:???
>>73な様なことを書いておきながら、SQL ServerでもUNIQUE制約でNULLは複数可って
仕様になっていると思ってて、きっと>>68の勘違いじゃって考えてんだが、
このスレにはSQL Server使いがいないんかw

>>76
KEYに使われるようなカラムは当然のこと、それ以外でもなるべくNOT NULL制約は
かけておいた方がいいよな。NULLを許可すると便利なときもあるけど、
集約関数ではCOALESCEを挟まなきゃなんなくなるし。
79NAME IS NULL:2006/10/22(日) 22:56:02 ID:???
>78
おいらは>69でSQL Server使いだけど、
そもそもUNIQUE制約つけるのに、
NOT NULLじゃないなんてありえねーなんて思ってるし。
NULLオッケーってするなら、UNIQUE制約はTABLEにつけるんじゃなくて、
実装するのが運用ラクじゃねーの?って考えですわ。
80NAME IS NULL:2006/10/23(月) 13:11:01 ID:xbTShaHm
>>66 わかりました。ありがとうございます。
81NAME IS NULL:2006/10/24(火) 05:09:44 ID:???
mysql標準付属の関数としてis_nullなどははあるようですが、is_numericやis_stringのような関数はありませんか?
82NAME IS NULL:2006/10/24(火) 10:57:03 ID:NVuTF5PR
>>81
あるよ
83NAME 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つとして扱っていたからで、
それとの互換のためにこうなっているものと思われる。
それでもそろそろオプションで切り替えがきくようにしてもらいたいものだ。
84NAME IS NULL:2006/10/24(火) 14:02:54 ID:153RAHGk
SQLのDBを市販のバックアップソフトを使ってテープやDISKにバックアップする事って
出来ますか?
初心者でスマソ 
教えてください
85NAME IS NULL:2006/10/24(火) 14:09:03 ID:???
>>84
できる。それ以上のことはスレ違いだから、お前の使ってるDBの専門スレへいってくれ。
8673:2006/10/24(火) 15:50:14 ID:???
>>83
> その代償としてユニークな索引の場合NULLもユニークである必要が出てくる。

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

>>79
貴方の考え方は概ね同意だが、各自の考え方とUNIQUE制約の仕様は切り分けてね。
87NAME IS NULL:2006/10/26(木) 12:48:51 ID:???
配列のi番目の要素を削除したい場合って
hoge[1:i-1] || hoge[i+1:n]

みたいなやり方しか無い?
88NAME IS NULL:2006/10/27(金) 15:58:04 ID:???
VIEWについてよく分からないんだが、
PostgreSQLのドキュメントにはVIEWが参照される度に問い合わせが実行されるとある
つまり、ある問い合わせにおいて、よく参照する問い合わせ結果はTABLEに格納した方がいいってこと?
89NAME IS NULL:2006/10/27(金) 17:35:24 ID:7Yc/x2jD
>>82
関数名は?
90NAME 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
91NAME IS NULL:2006/10/27(金) 18:24:46 ID:j+JTiTDC
オラクルの8iで結合にjoinのANSI標準って使えないの?
なんか、8iにもバージョンがあるけど、もう9にならないとダメ?
92NAME IS NULL:2006/10/27(金) 20:00:00 ID:???
>>90
「何 度 目 だ ナ ウ シ カ」

>>91
9iから。マニュアル嫁。
93NAME IS NULL:2006/10/28(土) 12:19:59 ID:???
gas117bunt740

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

select * from でやってるのですが、*指定は時間がかかると聞いたので
1つ1つ指定しようと思ってもSQL文が長くなってしまいます。
ストアド使ったり、とか何でもいいのでどなたか良い方法を教えてもらえませんか?
9493:2006/10/28(土) 12:21:01 ID:???
一番上の文字列は無視してください
ゴメンナサイ
95NAME IS NULL:2006/10/28(土) 12:35:14 ID:???
*でいいじゃん
96NAME IS NULL:2006/10/28(土) 13:14:17 ID:???
時間かかるったって人間に判別できるレベルじゃないだろ。
実行前の解析時の問題だし。
9793:2006/10/28(土) 14:03:47 ID:???
>>95>>96
即レスありがとです。
テストプログラム作って試してみたら、客から要求されるスペックぎりぎりなので
他の方法があれば試してみようと思ったのであります(本当は10万レコード取得する必要有り)。


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

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

だとしたらボトルネックはハードディスクだろうからそっちを早くしたら?
99NAME IS NULL:2006/10/29(日) 10:20:16 ID:???
>>97

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

あと、例えば20万件のテーブルから1000件取り出す場合と10万件取り出す
場合では最適な方法が変わる。
それから、CPU100%になってるのはクライアント側じゃないよな?
100NAME IS NULL:2006/10/29(日) 14:21:00 ID:???
>>97
SQLServer2000で64ビット化は8Gバイト越えたあたりから効果が出た。
それほど細かい単位でテストしたわけではないが、6Gバイト以下なら
32ビットで/3GB オプション+AWEの方がパフォーマンスがよかった。
10193: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の方がパフォーマンスがよかった
やはり、メモリを増設するのがスピードアップに欠かせないみたいですね。


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

102NAME IS NULL:2006/10/29(日) 17:03:25 ID:???
*が時間がかかるって本当だろうか?
カラムを列挙する方がそのパースとチェックに時間がかかりそうだ。
*ならテーブルのスキーマやサブクエリの指定から持ってくればそれで終わり。
103NAME 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 で抽出されている
と良いのですがそのような方法はありますでしょうか?

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

通常はそう。気になるならプランを確認しなされ。
105NAME 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 するにはどんな方法がある?
106NAME IS NULL:2006/10/30(月) 09:52:55 ID:mzvVOSKf
OracleでWITH句ってあるっぽいんだけど
誰か意味と文法教えてくださいorz
107NAME IS NULL:2006/10/31(火) 00:17:33 ID:???
>>105
それは配列か?
そういう疑問が出るって事は、お前が使うべきものじゃないってことだ。
108NAME IS NULL:2006/10/31(火) 05:57:27 ID:???
>>106
インラインビュー定義。

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

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

109NAME 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;
他に効率のいい方法はある?
110NAME 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だろうが、値が残れば何でも構いません。
111NAME 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;
112NAME IS NULL:2006/11/01(水) 04:01:59 ID:1j/d4EoT
助けて下さい!!
MySQL5.0の環境設定がどうしてもできません…
113NAME IS NULL:2006/11/01(水) 08:24:04 ID:???
>>112
http://pc8.2ch.net/test/read.cgi/db/1081818145/
ここで聞いたほうがいいんじゃないですかね?
114NAME IS NULL:2006/11/01(水) 11:53:40 ID:wuXOdbma
>>111
ありがとん
115NAME IS NULL:2006/11/01(水) 12:04:20 ID:???
Oracleのストアドプロシージャとファンクションについてなんですが、
ストアドプロシージャはINSERT、UPDATE、DELETEなどを断続的に実行するもので、
ファンクションは複雑なSELECT文の結果を戻り値として取得するのものであるという認識でいいんでしょうか。
あと、ファンクションの内部ではINSERT、UPDATE、DELETEは使用できないのでしょうか。
よろしければ助言をお願いします orz
116NAME IS NULL:2006/11/01(水) 12:12:34 ID:???
>>115
ここは、DB版の案内所なのか?
つ Oracle 総合 Session6

ストアド関連は標準が無いに等しいので一般的な話で言えばその通りで、
更新は出来ないことにしている実装が多い。selectでこっそり更新してたらややこしいだろう。
117NAME IS NULL:2006/11/01(水) 12:50:26 ID:???
>>115
プロシージャとファンクションの違いは戻り値を返すか返さないかの違いのみ。
どちらでもSELECTだろうとINSERTだろうとCREATEだろうとなんでも可能。
118NAME 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;

なお、まったく同じ内容でストアドプロシージャを定義したら、正しく実行されました。
119NAME IS NULL:2006/11/01(水) 13:12:34 ID:???
>>118
それは実行の仕方に問題があるんでないの?
SELECT文の中で呼んでるとか?
120NAME IS NULL:2006/11/01(水) 14:21:12 ID:???
>>90
FAQと過去ログ嫁
厨房
121NAME 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
122NAME IS NULL:2006/11/01(水) 15:14:04 ID:???
>>118
実装によって違うというのはそういうこと、
OracleはFunction内でデータの更新を許していない。
他のではOKだったり、selectで使わない限りOKというものがある。
123NAME 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


みたいな感じです。
124NAME IS NULL:2006/11/03(金) 03:22:03 ID:???
ソフトやバージョンによるのかもしれないが、SQLは結構アバウトな検索条件でも想定通りに動いてくれたりする。
date>='2006-11-01' とか。
125NAME IS NULL:2006/11/03(金) 06:56:44 ID:???
普通の方法かどうかはしらんがこうじゃねーの?

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

ちなみにDB2な。
126NAME IS NULL:2006/11/03(金) 07:19:45 ID:???
日付のレコードが既にあるんじゃなくて生成したいんじゃないの?
127NAME IS NULL:2006/11/03(金) 08:02:13 ID:???
入力ファイルもなしでSQL一つで任意の一ヶ月分insertするって事?
出来るなら漏れも知りたいんだが。

漏れはJavaのCalendarクラス使いながら任意の月のカレンダーを
insertするアプリ作ったことはあるけどさ。
128123:2006/11/03(金) 09:38:55 ID:GYI4IqD6
はい、データがあるわけではなく、生成したいんです。
やはり無理なもんなんでしょうか。
129NAME IS NULL:2006/11/03(金) 10:01:43 ID:???
0から30までを返してくれる関数なり、テーブルを作っておけば、
なんとかならんわけでもない。
130NAME IS NULL:2006/11/03(金) 10:11:18 ID:???
レコードを生成する手もあることはあるがDB依存になる。
ORACLEならDUALにCONNECT BYを使うとか。PL/SQLで表関数を自作するとか。
どっかの適当なテーブルかディクショナリービューから引っ張ってくるのが一番楽だが。

そして適当な数のレコードを確保したらSELECT句で日付型の'2006/11/01'に
ROWNUMとかの行カウントをもつ疑似列を足せばいい。
131NAME IS NULL:2006/11/03(金) 10:43:14 ID:???
アプリ側でやるとか、前もって日付テーブルを作っておくとかの方が後々楽だと思うのですが
132NAME IS NULL:2006/11/03(金) 12:42:29 ID:???
>>131
アプリに頼るとは貴様それでもSQLerか!
どんなことでも1つのSQLでやる!それがSQLerだ!!!1111
133NAME 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');

むりくり
134NAME IS NULL:2006/11/04(土) 00:27:31 ID:???
学校でデータベース入門みたいな授業取ったんですが、変なプリントだけですすめる授業で
ついていけません・・・初心者向けの解説サイトかいい本ってないでしょうか?
CREATEなんたらの辺でつまづいてます
135NAME IS NULL:2006/11/04(土) 00:43:55 ID:???
SQLの絵本
136NAME IS NULL:2006/11/04(土) 08:46:21 ID:???
>>134
10日で出来る〜とかのシリーズでRDBについてもあるから家のPCにMySQL入れて、本読みながら実際に操作してみるのが
よろし
137NAME IS NULL:2006/11/04(土) 12:02:02 ID:???
変なプリントってどんな感じの?
138NAME IS NULL:2006/11/04(土) 14:11:40 ID:07MrGocL
質問させていただきます。
一つのフィールドに複数の外部キー(数は可変)を入れたいのですが、
どのようにテーブルを組めば良いでしょうか?
139NAME IS NULL:2006/11/04(土) 14:33:28 ID:???
意味が解らんが、ひとつのフィールドに制約を複数つけるって事か?
事例を具体的に汁。
140NAME IS NULL:2006/11/04(土) 16:46:48 ID:???
一つの列に複数のデータを入れるって事?
だとしたら止めとけ。列はアトミックじゃないといかん。
141138:2006/11/04(土) 23:23:56 ID:07MrGocL
>>139
すみません。。
一つのフィールドに複数のデータを入れたいんです。。(MySQLのENUMやSETみたいな。)
>>140
そうなんですが、こういう時ってみなさんどうしていらっしゃるのか知りたくて。。
別にテーブル作ってなんとか出来ないかな、と考えていますが方法がおもいつきませんorz
142NAME IS NULL:2006/11/05(日) 00:05:38 ID:???
Genre  Name
--------------------
  A  りんご
  A  ぶどう
  B  いちご
  B  おっぱい
  B  みかん
  C  かき


じゃ駄目なの?
143138:2006/11/05(日) 00:55:50 ID:???
>>142
!!!!!
アッ――全然思いつきませんでした。。
本当にありがとうございました。
144NAME IS NULL:2006/11/05(日) 00:55:48 ID:D+FbnAE+
すいません、Oracleのcreate databaseとcreate tablespaceのサンプルってどっかにありませんか?
ネット上探しても文法は載っててもsqlそのものは置いてなかったりなんで・・。
145NAME IS NULL:2006/11/05(日) 03:33:58 ID:???
関係モデルのときのデータモデルの概念について、データ構造・操作演算・インテグリティ制約
について説明せよって問題で、データ構造はデータモデルの要素間の関係を定義するもの、
操作演算はデータ構造に対しての操作のことでそのうちデータベースにするものってのは
わかった(あってるのかな?)んですが、インテグリティ制約ってのが
ググってもちゃんとした説明が見つからず何なのかわかりません・・・
インテグリティってのは完全性って意味だからデータベースが完全じゃなきゃいけないって
制約・・・?教えてください
146NAME IS NULL:2006/11/05(日) 05:31:49 ID:???
>>145
普通にDBにある制約全般のこと
147NAME IS NULL:2006/11/05(日) 10:30:02 ID:???
>144
マニュアルにあるサンプルじゃ足りないって話なら、
何が足りないのか明確にして、
Oracleスレに行きませう
148NAME IS NULL:2006/11/05(日) 19:20:39 ID:???
3階層アーキテクチャって内部層 概念層外部層 でいいんですか?
149NAME IS NULL:2006/11/05(日) 19:55:52 ID:???
SQLだけで3階層アーキテクチャするのかと。
150NAME IS NULL:2006/11/05(日) 22:31:36 ID:???
ビューを使用したことがないのでビューというものがよく分からないのですが
ストアドと比べ、ビューを利用するメリットって何かあるのでしょうか?
パラメータが設定できない簡易ストアドと考えればいいのかな?と
151NAME IS NULL:2006/11/05(日) 22:35:36 ID:???
>>149
違いました?じゃあなんのことでしょう・・・
152NAME IS NULL:2006/11/05(日) 23:28:25 ID:???
>151
違うも何も、SQLっていうのはただの言語。
ここで3階層アーキテクチャって何?って問うのが意味不明。
ム板にいってらっしゃい。
153NAME IS NULL:2006/11/05(日) 23:43:16 ID:???
>>150
ビューのメリットをどう捕らえるかは人それぞれだけど、
ウチの近所ではテーブルのテーブル名は英語表記で
ビューのテーブル表記を日本語にしてたりするな。

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

ストアドはバッチ処理で使っている。
154NAME IS NULL:2006/11/06(月) 03:13:47 ID:???
すいません、質問がありあす。

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

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

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

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

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

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

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

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

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

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

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

レビュー投稿者が登録制ならレビュー投稿者マスタもあった方がいい。
156NAME IS NULL:2006/11/06(月) 07:02:32 ID:???
マスタってどういう意味?
157154:2006/11/06(月) 07:37:24 ID:???
>>155
そのような考え方も、あるのですね。
こっちの方が、将来的に増えるテーブルの数も極力抑えることが、出来そうです。
とても参考になります。

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

お年玉で買った参考書を持って、学校でもっと勉強してきます。
ありがとうございました。
158NAME IS NULL:2006/11/07(火) 18:25:31 ID:???
>>157
>そのような考え方も、あるのですね。
つーか、データをテーブル名に持たせるとこで終わっとる
159NAME IS NULL:2006/11/07(火) 19:01:13 ID:???
>>158
こんなDB設計あがってきたら
設計者ぶんなぐってやる所だなw
160NAME 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

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

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

SELECT name
FROM foo
WHERE code = (SELECT MAX(code) FROM foo);
162NAME IS NULL:2006/11/07(火) 20:40:57 ID:URmt18+L
>>161
どうもありがとうございます
163NAME IS NULL:2006/11/07(火) 21:56:37 ID:esrXqfnU
一つの項目の中に、10001,10002,10003...20001,20003,20004...30001,30002,30003,....とある中から
○万台中の各最大値を取り出したいのですが・・・わかりません凹○
ヒントになるサイト等ないでしょうか、よろしくお願いします

164NAME IS NULL:2006/11/07(火) 22:39:01 ID:???
>>163
SELECT max(num) FROM Table GROUP BY trunc(num,-4);
165164:2006/11/07(火) 22:42:51 ID:???
truncが使えるかどうかワカランので補足
要は千以下を切り捨てた値でGROUP BY
num/10000 をint型にキャストした値でも桶。
166NAME IS NULL:2006/11/07(火) 23:30:40 ID:JIU7J0zh
質問です。

mysql 上なのですが、グループごとに項目番号をつけて出力したいのですが、
どのようにしたらよいのでしょうか。
167NAME IS NULL:2006/11/07(火) 23:57:41 ID:pACtuQaW
MySQLを使っています。
カラム numに100が入っていて、update でこの値に100を足したい
場合どすればいいですか?

※num を 200にしたい。
168NAME IS NULL:2006/11/07(火) 23:59:59 ID:???
update table
  set column = column + 100

じゃ駄目なの?
169NAME IS NULL:2006/11/08(水) 00:05:01 ID:???
>>168
出来ました!
ありがとうございました。
170NAME IS NULL:2006/11/08(水) 14:29:18 ID:???
>>164-165san
勉強になります!すんなりいけました
ありがとうございました
171NAME IS NULL:2006/11/08(水) 15:00:37 ID:???
>>166
項目番号の定義を
172NAME IS NULL:2006/11/09(木) 15:08:23 ID:Wrn+ZO8y
hogeテーブルのカラムAをhogeテーブルのカラムBにまるままコピーしたいのですが
この場合どういったSQL文を書けばいいのでしょうか?
素直にselectとupdateを件数分だけ繰り返すしかないのでしょうか?
件数が多いので一括コピーみたいなことが出来たら楽なのですが…

データベースはpostgres7.4を使用しています。
173NAME IS NULL:2006/11/09(木) 15:55:21 ID:???
>>172
UPDATE hoge SET B = A;
174NAME IS NULL:2006/11/09(木) 16:15:24 ID:???
>>173
テストDBで教えていただいたSQLでうまく出来ました
ありがとうございます
175NAME IS NULL:2006/11/09(木) 16:26:38 ID:???
データベースってC:\mysql\dataでしか作れないの?
E:\Web\につくりたいんだが
176NAME IS NULL:2006/11/09(木) 16:30:05 ID:???
>>175
SQL関係無いので、MySQLのスレでお願いします
177NAME IS NULL:2006/11/09(木) 16:31:43 ID:???
>>176
すんません、SQL総合かと思いました
178NAME IS NULL:2006/11/09(木) 16:36:12 ID:???
>>177
その前に、DBMS=SQLと思ってるのを何とかした方がいいぞ。
179NAME 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


180NAME 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書くにはどうしたらいいでしょうか?わかる方いらっしゃったら教えて下さい。よろしくお願いします。
181NAME IS NULL:2006/11/09(木) 22:04:09 ID:C9bV7Hin
>>180
これじゃだめ?
値段がNullのレコードが値段無し、それ以外が値段有り。

SELECT
A.ID,
B.値段
FROM
A,
B
WHERE
A.ID = B.ID(+)
182180: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できるならそれを結果として出力できる方法もあるのかなと思うのですがないのかなぁ…。
183NAME 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(+)
)
184NAME 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;
185182:2006/11/09(木) 23:10:06 ID:lmWNdE2f
>>183
ありがとうございます!解決しました!
186NAME 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)





187184: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
188NAME 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の行を全て返すにはどうしたらいいのでしょうか。
189NAME 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
190NAME IS NULL:2006/11/10(金) 04:02:13 ID:WvgQViKV
>>189
ありがとうございます!
191NAME IS NULL:2006/11/10(金) 23:36:31 ID:???
日付と時刻関数を使って、
過去一週間の日付をすべて返すにはどうしたらいいんでしょうか?

日付を記録したフィールドがあるので、
一週間分のデータをWHERE を使って検索したいのですが・・・
192NAME 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
193NAME 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)
では駄目なのか?
194NAME 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

のように、テーブル変数を使うしか方法はないのでしょうか?
195NAME IS NULL:2006/11/11(土) 18:17:16 ID:???
>>194
いろいろ試していたのをそのままコピペしてしまったので
あ、列名がむちゃくちゃになってしまいました。
すみません
196NAME IS NULL:2006/11/11(土) 18:31:22 ID:???
select top 10 * とかテーブル変数とか、どこの方言だ?
197NAME IS NULL:2006/11/11(土) 18:32:13 ID:???
>>196
プ
198NAME IS NULL:2006/11/11(土) 18:33:44 ID:???
>>196
MSSQL
199NAME 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λ_レレ
                  ̄`ー‐---‐‐´
200NAME IS NULL:2006/11/11(土) 20:26:20 ID:???
>>196
MSAccess
201NAME IS NULL:2006/11/11(土) 23:43:29 ID:???
>194
エラーを書いてくんないかな?
そこにヒントがあるはずなんだけど。

あと、その二つのテーブルレイアウトはまったくいっしょなのかな。
多少の桁数違いぐらいならいいけど、カラムの順番が違うとかだとアウトだよ。
違うのなら、後で書いているDECLARE文つきのUNION使ったSELECT文のように
ちゃんとカラム名書いてやったらいいんじゃないの?
202NAME 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)を同時に取得したいのです。
こんなことは可能でしょうか?
203NAME 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)を同時に取得したいのです。
こんなことは可能でしょうか?
204NAME IS NULL:2006/11/12(日) 00:18:08 ID:???
>>203
WHERE id=n OR id=n-1 OR id= n+1
ではいかんのん?
205NAME IS NULL:2006/11/12(日) 00:26:46 ID:h3d66FlB
>>204
ORDER BY date DESC, id DESC
なんです。
またレコードが削除されることもあります。
206NAME IS NULL:2006/11/12(日) 00:35:45 ID:???
まずソートして、連番振って、id=3の連番を取得する。
上とは別に同じようにソート・連番ふったインラインビューに
連番 between 取得連番-1 and 取得連番+1

with使うとシンプルにはなるが重そうだな・・・
207NAME 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
208207:2006/11/12(日) 00:44:18 ID:???
あ、チョット違うかな。一応1行で取得できるともう。
んでも>>206さんが言うようにテンポラリシーケンスかなにかで
連番振って2段階の方が速いかもしれん。
209206: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

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

じゃ寝るノシ
210NAME 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表をソートする方法が思いつきません。
ご教示頂けると有難いです
211NAME 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行で実行も可能だったり?
212NAME 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);
213NAME 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以上でしかない場合だけどな。
214NAME 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;
215NAME IS NULL:2006/11/12(日) 17:23:14 ID:???
外部結合してソートするといいよ。
216NAME IS NULL:2006/11/13(月) 02:58:11 ID:???
2000/01/01と2005/0101の二つの値から
各年(00,01,02,03,04,05)を得たいのですが、どういう感じになるのでしょうか
217NAME IS NULL:2006/11/13(月) 03:13:02 ID:???
なんか、先日からこんな質問多いな。
基本的にSQLではデータを生成するもんじゃない。
既にあるデータを抽出したり集計したりするもんだがな。
218NAME IS NULL:2006/11/13(月) 06:42:54 ID:???
>>217
スルー力w
219194: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というのは、他データベースでは動かないようなので
あまり使いたくないので、なにかヒントがあれば宜しくお願いします。
220NAME IS NULL:2006/11/13(月) 12:49:31 ID:???
>>211
目的のもの、目的未満で最大のもの、目的より大きくて最小のものの3つでいいじゃん
221NAME 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
222NAME IS NULL:2006/11/13(月) 15:31:43 ID:???
初級シスアドレベル以下の知識なんだけど
SQLに興味もって勉強しようと思います。

んで、勉強するにあたって何かソフトを用意しようと思うんだけど
ACCESSとかオラクルとか買えば、SQLの勉強できる?
223NAME IS NULL:2006/11/13(月) 15:56:16 ID:???
>>222
キミの現在のスキル次第。

とりあえず、MySQLとかPostgreSQLとかを使っても勉強できる
224NAME IS NULL:2006/11/13(月) 16:07:16 ID:???
>>223
シスアドのテキストでしかSQLを見たことがないので
スキルは0です。

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

ありがとうございました。
225NAME IS NULL:2006/11/13(月) 17:00:13 ID:???
いや、SQL以外のスキルね。
インストールしたりツール使ったりできればフリーで試せるかなと。
まあがんばって
226NAME 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句でいける。
227NAME IS NULL:2006/11/13(月) 23:15:34 ID:???
>224
君の文章から察するに、Windowsに突っ込む気なら、Postgreはやめといたほうがいいとおもう。
多分トラブルシューティングに時間がかかりすぎて勉強どころじゃないと思う。
MySQLかMSDN、Oracleでも勉強用のフリーのがあるから、そっちのほうがいい。
228NAME IS NULL:2006/11/13(月) 23:36:56 ID:???
Postgre?
MSDN?
229NAME IS NULL:2006/11/14(火) 00:27:29 ID:???
テーブルのフィールド名を返す関数はありますか?
230210:2006/11/14(火) 00:40:06 ID:???
>>212
union allってのがあるんですね。
これでいけました。ありがとうございます。
>>213-214
こちらは少しトリッキーな方法ですね。
order by 1というやり方は初めて知りました。勉強になります。
231NAME IS NULL:2006/11/14(火) 10:05:28 ID:???
SQL以前の話だけど、「select * 〜」と全フィールド指定か、フィールドを列挙するじゃないですか。
なんで除外したいフィールドって指定できないんだろ。
232NAME IS NULL:2006/11/14(火) 14:04:13 ID:???
意味が無いから
233NAME IS NULL:2006/11/14(火) 17:04:08 ID:???
いや手前に-付けたらできるだろ。
234NAME IS NULL:2006/11/14(火) 23:08:31 ID:???
>233
それは引き算っていうんだよ。

つーか、SELECTの英語の意味わかってるよな?
SELECTっていう単語には「除外」だとかそういう意味はないの。
どーしてもやりたいんだったら、「除外」を表現する句を実装したエンジンを作ればいい。
がんばれ。
235NAME IS NULL:2006/11/15(水) 02:52:33 ID:???
preg_match見たいな
正規表現の文字列抽出は可能でしょうか?
236NAME IS NULL:2006/11/15(水) 06:27:11 ID:ROBlrBon
perlスクリプトからユーザを作成・権限設定するにはどのようにすれば
良いのでしょうか。
`mysqladmin -u root --password=pass create NEW_DB`;
これでデータベースの作成はできたのですが、GRANTを使用できる方法が
思いつきません。
237236:2006/11/15(水) 08:12:32 ID:???
自己解決しました。
mysqlデータベース内のuser/db/hostテーブルを書き換えで。
238NAME IS NULL:2006/11/15(水) 14:34:03 ID:tGEekk8B
mysqlで、二つのカラムがユニークでないとinsertを許さないといったことは出来るでしょうか?
カラムのuniqueが二つ揃わないと駄目みたいな設定は出来ないのでしょうか?
239NAME IS NULL:2006/11/15(水) 14:58:58 ID:???
>>234
>つーか、SELECTの英語の意味わかってるよな?
>SELECTっていう単語には「除外」だとかそういう意味はないの。
〜以外を「選択」したいといっているんだがバカかアホかどっちだ。
240NAME IS NULL:2006/11/15(水) 15:15:40 ID:???
>>238
MySQLで可能かどうか知らんが、
CREATE TABLE T1 (
c1 int,
c2 int,
UNIQUE(c1,c2)
);
こんな感じでできるんじゃないかなと。
出来なかったら別構文かもしれないので
MySQLスレで聞いた方が早そげ。
241NAME 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さん気に触ったらごめんなさい。他意はございませんので...
242238:2006/11/15(水) 17:18:19 ID:tGEekk8B
>>240
ありがとうございます、その構文でいけそうです。
243NAME 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));

何が悪いのかさっぱりです。
244NAME IS NULL:2006/11/15(水) 22:22:04 ID:???
スレ違い
および
マニュアル読め
245NAME IS NULL:2006/11/15(水) 22:35:58 ID:???
ケチややっちゃ。
ちょっと教えてくれたらいいのに。
知らんのちゃうか。
246NAME IS NULL:2006/11/15(水) 22:56:55 ID:???
>239
SELECTには「〜以外を」という意味はまったく含んでないといっているんだが。
247NAME IS NULL:2006/11/15(水) 23:05:11 ID:???
つーかさ、SELECTが除外をサポートしたとして、
後でテーブル設計が変更になってカラムが増えたり減ったりしたら
逆に使いにくいだけだと思うんだが。
INSERT INTO HOGE SELET * -カラム...
なんて処理があった日には悲劇がまってるし。
248NAME IS NULL:2006/11/15(水) 23:35:20 ID:???
SELECT おっぱい -Aカップ FROM インターネッツ
249NAME IS NULL:2006/11/15(水) 23:52:19 ID:???
>>241
俺もUNION ALLの前→後の順序は保証されてないと思う。
UNION ALLは「ソートしない」というだけだからたまたまそうなるだけ
だから>>212のSQLではソートしているとは言えないんじゃないだろうか
250NAME IS NULL:2006/11/16(木) 05:29:41 ID:???
すいません、基本的なことかもですが質問してもいいですか?
SELECT 文で、列数がたくさんあるので、全部列挙したくないんですけど
たとえば、「列5以外の全部の列を列挙する」ときに
どういった構文が使えますか?
SELECT * FROM TABLE;
だと全部列挙してしまうし・・・
よろしくお願いしますm(__)m
251NAME IS NULL:2006/11/16(木) 06:46:47 ID:???
>>250
藻前は5個ほど前の発言も読めないなら2chで発言しない方がいい。
252NAME IS NULL:2006/11/16(木) 07:28:22 ID:???
>>248
それ言うなら
select おっぱい from アイドル where ブラのサイズ > Aカップ
とかだろ。

だからSELECTで除外は意味不明と小一時間(ry
253nobodyさん:2006/11/16(木) 09:52:58 ID:???
テーブルのレコードを更新する際に、いずれかのフィールドに同じ値(文字列)が
入っているレコードは差分をとった上で、統合するということをしたいので
すが、どのように記述すればよいのでしょうか?
データベースはSQLiteを使用しております。
254NAME IS NULL:2006/11/16(木) 11:03:04 ID:???
プライマリーキーに文字列使うのってどうなのかな。
クエリーで頻繁に他のテーブルとマッチングさせるとき
やっぱり数値に比べてパフォーマンス落ちますか?
気にするほどじゃないのなら良いのですが。
255nobodyさん:2006/11/16(木) 11:11:05 ID:???
ありがとうございます。試してみますね。
256NAME 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したいのですが
どうしたら良いでしょうか?
257NAME IS NULL:2006/11/16(木) 14:15:06 ID:???
>>256

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

とかは駄目?
確認はしていないから間違ってる可能性もあるが・・・
258NAME IS NULL:2006/11/16(木) 23:20:33 ID:???
>>246
「〜以外を」という意味を含まないのと同時に、「〜を」という意味も含まないがな。
さらに言えば、SELECTが選択するのは行であって列ではないぞ。
259NAME IS NULL:2006/11/16(木) 23:25:22 ID:???
日本語でおk
260NAME IS NULL:2006/11/17(金) 01:27:53 ID:???
SELECT 文で除外は無理なんですね・・・知れませんでした↓
では、あるテーブルの列名を列挙するには、どうすればいいですか?
261NAME IS NULL:2006/11/17(金) 06:38:27 ID:???
手で入力するか、ORマッパー使ってそういうクラスを自作汁
262NAME 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
263NAME IS NULL:2006/11/17(金) 09:39:20 ID:???
>>260
列名を持ってるディクショナリービューがある。
オラクルなら確かUSER_TAB_COLUMNSとかだったと思う。他はしらん。
264NAME IS NULL:2006/11/17(金) 09:42:44 ID:???
>>257
お返事遅くなりました。
ありがとうございます。
ばっちりでした。
265NAME IS NULL:2006/11/17(金) 10:46:59 ID:6Uf69TYK
MySQLで、特定のカラムの値の順番にレコードを取得して、並べて表示することはできたのですが、任意のレコードが何番目なのかという情報を取得することはできますか?
できれば方法を教えてください。
現在は全データ取得してPHPで順番に回してカウントしてますが、明らかに効率が悪いですOTZ
266NAME IS NULL:2006/11/17(金) 11:57:19 ID:2WkXRhEF
突然ですがご教授願います。

テーブルの指定項目に対して
全角・半角が混在しているかのチェックをしたい、
かつそのデータを抽出したいのですが
何か良い方法はないでしょうか。
267NAME 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の実行結果でグループ化したい場合はどのようにすればいいのでしょうか?
268NAME 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

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

予め除外するフィールドが分かっている場合は、データを取得する
SQLで対応するのではなく、クエリー結果を格納する処理で対応し
た方がいいと思います。
270267:2006/11/17(金) 15:48:33 ID:???
>>268
うーむ、サブクエリ使わないと駄目なのか・・・

それで試してみます。ありがとうございました。
271NAME 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)
272NAME 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 としたいところですが、怒られました。
273NAME IS NULL:2006/11/18(土) 02:02:40 ID:???
>>262 >>263

やってみます!ありがとうございました。
274NAME IS NULL:2006/11/18(土) 06:30:03 ID:8IZSUN/7
(A = 11111 && B = 22222) || (A = 11111 && B = 33333) || (A = 33333 && B = 33333)
275NAME IS NULL:2006/11/18(土) 12:33:50 ID:???
MySQLだったら、過去のレスからしてこんなSQLが通るんじゃね。
SELECT * FROM Table GROUP BY A,B;
1,2,4と2,3,4どちらが取り出せるのかはしらんが...
276NAME IS NULL:2006/11/18(土) 12:50:58 ID:???
連結すれば?
277NAME IS NULL:2006/11/18(土) 12:58:05 ID:???
括弧は必要なの?
278NAME IS NULL:2006/11/18(土) 15:56:51 ID:???
select distinct A,B from table

↑こうじゃないのか?distinctは関数じゃないぞ。
279NAME IS NULL:2006/11/19(日) 05:06:16 ID:RPWkpia/
次のSQLの意味を出来るだけ詳細に説明しなさい。
SELECT名簿 氏名、 情報概論得点+情報実習点
FROM 名簿 成績表
WHERE 名簿 学生証番号=成績表 学生証番号
AND 科目 LIKE “情報%”
↑これらを実行するとどのような結果が得られますか?
って事ですが、問題の意味すらわかりません。
助けて。。。。。
280NAME IS NULL:2006/11/19(日) 06:04:35 ID:???
>>279
とりあえずシンタックスエラーってことでいいんじゃね?
281NAME IS NULL:2006/11/19(日) 07:52:21 ID:???
>>279
ここは宿題スレなのか?
282NAME IS NULL:2006/11/19(日) 14:55:47 ID:FjZbaufY
>>274-278
ありがとうございます。distinct A, B でもいけるんですね。
distinctはAだけにかかると思ってました。
283NAME IS NULL:2006/11/19(日) 21:48:18 ID:3hf8NU1A
新規質問です

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

SELECT * FROM foo WHERE barが一番小さい;
という意味になるクエリーはどのように書けばいいのでしょうか?
284283:2006/11/19(日) 22:17:01 ID:???
事故解決しましたスマソ

SELECT * FROM foo WHERE bar=(SELECT MIN(bar) FROM foo);
285NAME 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つ目のレコードしか
取得したくないのです。

よろしくお願いします。
286NAME IS NULL:2006/11/19(日) 23:57:12 ID:???
処理系やフロントエンドにもよるが、
'\%' か '\\%'
でいけるんじゃね。
287NAME IS NULL:2006/11/20(月) 00:23:27 ID:???
全角もそうだというのは処理系依存だと思うが、
LIKE でアンダーバーとパーセント記号は特殊な意味を持つのはその通り。
ANSI SQLではLIKE '\%' ESCAPE '\' とこんな感じじゃね。
288NAME 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内での
明細行番号を得る方法が分かりません。

カーソルを使って回すしかないでしょうか?
289NAME IS NULL:2006/11/20(月) 16:25:01 ID:PAsvlASp
質問です
MySqlでバックアップ(バックアップ用テーブルに同じ内容をコピー)で、1週間ごとに以下のクエリーを発行してるのですが、こんなんで問題ないのでしょうか?
DELETE FROM backup
CREATE TABLE backup AS SELECT * FROM table
290NAME 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などでどうにか取得しようにも
うまくいきません。どなたか良い方法をお願いします。

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

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

こんな感じで。
293NAME 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にはそのような選択の方法はないのでしょうか?
294NAME IS NULL:2006/11/20(月) 23:14:48 ID:???
>>293
OR
295NAME IS NULL:2006/11/20(月) 23:22:57 ID:???
select Genre from test where Name = 'りんご'
union
select Genre from test where Name = 'ぶどう’

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

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

>>295
UNIONは初耳だったので調べてみました。確かにコレはいけるかもしれません。
ただ、同じフィールドで実行出来るのか気になります。とりあえず試してみることにします。
ありがとうございました。
298293:2006/11/20(月) 23:46:08 ID:???
>>296
SELECT * FROM test WHERE Name IN('りんご','ぶどう')
ということでしょうか?
試してみます。
299NAME IS NULL:2006/11/20(月) 23:46:32 ID:???
INTERSECT じゃねーの?
300293:2006/11/20(月) 23:54:04 ID:???
>>299
UNIONがORに近いのに対してINTERSECTはANDに近いものなのですね。
ありがとうございました。
301NAME IS NULL:2006/11/21(火) 00:04:37 ID:???
>>293
やりたいのは関係除算かな?
書き方はいくつかあるから、そのキーワードでググるか本探してみそ。
本だったら「プログラマのためのSQL」にわかりやすく説明されて太。
302NAME IS NULL:2006/11/21(火) 00:22:31 ID:???
>>301
ちょっと関係除算がいまいち理解できなかったのでググってます。
自分がやりたいことは、検索の絞込み、とでも言うのでしょうか。
プログラムで、一回目のループで「りんご」を有するGenreを絞り込み、
二回目のループで「ぶどう」を有するGenreを絞り込み…
とやろうとしています。
一回目のループ結果から、SELECT * FROM test WHERE Name = 'りんご'
と入れてループの上に返せば、とりあえず「りんご」を有するGnereは絞り込めるのですが、
二回目、三回目と続けるとなるとANDでは出来なかったので…。
303NAME 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 = 'ぶどう'

これでどお?
304290:2006/11/21(火) 02:02:23 ID:???
>>291
row_number()はorder by句と一緒に使えるrownum程度の認識だったのですが
グループ毎の番号がつけられるなどの使い方は初めて知りました。
期待通りのクエリも実現でき、ありがとうございました。
305289:2006/11/21(火) 04:27:49 ID:j75IEcjK
>>292
亀レスすいません。
はぁ、なるほど。失敗したらおしまいですからね。
ありがとうございます、参考にいたします。
306NAME 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文で簡単にできるでしょうか。
よろしくお願いします。
307NAME IS NULL:2006/11/21(火) 05:17:55 ID:???
あ、キャベツ両方にありませんでした。
すみません、書き直します。
308NAME 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文で簡単にできるでしょうか。
よろしくお願いします。
309NAME 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.名前);
310NAME IS NULL:2006/11/21(火) 06:52:24 ID:???
>>309
ありがとうございます!
同じじゃないのを削除するというかんじですか。
なるほどです。
311NAME IS NULL:2006/11/21(火) 16:11:11 ID:b5GT0DJg
テーブルに word,word1,word2,word3,word4 
といったフィールドがあります。
そして、新たにテーブルにレコードを格納する際に、すでに格納されているレコード
のwordまたはword1と一致している要素があった場合、元からあったレコードと新たに
格納するレコードの差分をとって、元からあったレコードにプラスして結合するという
ことをしたいと思っています。
しかし、これをSQLでどう記述すれば良いのかわからない状況です。よろしければ
ご教授を願えないでしょうか?
312NAME IS NULL:2006/11/21(火) 16:59:47 ID:???
レコードセットを使ってレコードセットを更新する事は出来ますか?
例えば、今、テーブルA・Bの2つがあるとして、

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

となっている時に、BにAの金額をセットしてやりたいんです。
こういう時にEXISTを使えばいいのでしょうか?
313312: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文におけるサブクエリがうまく機能するのがどうにも不思議
でなりません。
314NAME IS NULL:2006/11/21(火) 17:22:02 ID:???
>>312
UPDATE TableB SET 金額 = TableA.金額 FROM TableA WHERE TableA.商品コード=TableB.商品コード;

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

って書いてたんだけど、解決したのか。
315312:2006/11/21(火) 17:24:42 ID:???
>>314
すみません、

 カ ー ソ ル 使 っ て 解 決 し た

だけなので、早速314氏の書き方を取り入れてみます。
316NAME 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.]に連番を使うことが
できるのでデータ入力や検索が簡単と思っているのですが他によい方法はありますか?
317NAME 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 するにはどうするの?ということです。
よろしくお願いします。
318NAME 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);
319317:2006/11/22(水) 02:47:25 ID:???
>> 318
ありがとうございます。うまく行きました。
320NAME 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の人物のみ
絞りたいのですが、うまくいきません。 何が原因なのでしょうか?
321NAME IS NULL:2006/11/22(水) 14:34:23 ID:???
>>320
SUBSTR(first_name, 4, 1)
322NAME IS NULL:2006/11/22(水) 14:37:17 ID:???
>>321
そこでしたか、こんな所でミスをorz
本当に助かりました、ありがとうございました。
323NAME IS NULL:2006/11/22(水) 21:51:21 ID:lxFJMiKY
すいません、以下の文章の意味が分からないのですが、どなたか解説していただけないでしょうか。
っていうか下記のページ、全体的に日本語がおかしい気がします・・・。

http://dev.mysql.com/doc/refman/4.1/ja/tips.html
>大量に更新された MyISAM テーブルに対して複雑な SELECT クエリを使用しないようにする。これでテーブルロックを回避する。
324NAME IS NULL:2006/11/23(木) 16:37:25 ID:/q3dcXYj
プライマリキーについて、いまいち理解できていないので教えてください。
A,B,C,D というフィールドがあって、Aをプライマリキーとした
場合、Aにみかんという要素があるとして、みかんはBやCのフィールド
では使うことはできるのでしょうか?
325NAME IS NULL:2006/11/23(木) 16:43:31 ID:???
>>324
質問が漠然としすぎて答えられないんだが。
使えるといえば使えるが、そんなテーブル実際に使えないだろうに。
326NAME IS NULL:2006/11/23(木) 16:50:06 ID:/q3dcXYj
>>325
ありがとうございます。
もうひとつお聞きしたいのですが、フィールドではなく、テーブル全体で
一意の要素というのを設定したいのですが、そういうのはどうすれば良い
のでしょうか?(nullを含んでしまうフィールドもあります)
327NAME 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のスレいって聞いてください。
328NAME IS NULL:2006/11/23(木) 23:02:05 ID:???
>>323
たしかに「大量に」とか「複雑な」とか、曖昧すぎて意味がわからんな。
329NAME 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は使えないみたいです。
330NAME IS NULL:2006/11/24(金) 03:59:37 ID:???
>>329
スマートな定番は、テーブルが
名前| 職 業 |生年|出身
鈴木|会社員|1970|東京
山田|会社員|(null)|大阪

の様になっていることなんじゃなかな。
まぁ、例として出しただけかもしんないけど。
SQLはそれでいんじゃない。職業に大阪とか出身に公務員って
入らないなら、キー=... は省いてもいけるが。
331329:2006/11/24(金) 04:07:43 ID:???
ありがとうございます。

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

>職業に大阪とか
大丈夫だとは思いますが怖いのでやめておきます(笑)
332NAME IS NULL:2006/11/24(金) 05:29:46 ID:???
>>329
自己結合すべし。
333U ◆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クエリを実行しないようにする。

というわけで、訳がおかしいだけでなく妙な省略があるようですね。
334329:2006/11/24(金) 12:10:21 ID:???
>332
なるほど、自己結合ですか。検討してみます。

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

もしかすると、私が考えているものと全然違う方法なのかもしれません。
335NAME 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 値 = '東京');

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

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



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

>>337
TABLEの後ろの全角空白。最後のセミコロンも全角になってるが、
それは関係ないのか?
339NAME IS NULL:2006/11/24(金) 17:38:28 ID:a70TfyFd
>>338
おっしゃるとおりで。ありがとうございました。
340NAME 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日の合計値が欲しいのですが
どうすればよいでしょうか?

宜しくお願いします。
341NAME IS NULL:2006/11/24(金) 21:19:07 ID:???
>>340
GROUP BYすれば。
342NAME IS NULL:2006/11/24(金) 23:48:42 ID:???
>>339
MySQL 3.23って確かキリスト的バージョンだったような気がするが...
何かの制約で3.23しか使えないってこと?
もし許される環境であればビュートリガストアドという
RDBMSの基本中の基本を抑えとる5.0を超推奨なんだが
343NAME IS NULL:2006/11/24(金) 23:53:46 ID:???
>>338
>んでも流石にINやEXSTSでは使えるのかな。
>つかえねぇと意味ないような...
使えないよ。4 でも使えない。サブクエリは 4.1 から。
344329:2006/11/25(土) 22:22:26 ID:???
バイトの身分で、DBのソフト変えろとは言えんのです(笑)


というか断られました。
現状で問題なく動いてるので、下手にバージョンアップしてトラブると怖いというか。
社員3名の会社で、システムが分かる人となるともっと少なくなるので。
345NAME IS NULL:2006/11/26(日) 07:13:20 ID:???
>社員3名の会社で、システムが分かる人となるともっと少なくなるので。

社員が3人しかいないなら、むしろ全員システム詳しくないと組織としてどーかと思った。
誰かが病欠した時点でダメじゃん。ソレ。
346NAME IS NULL:2006/11/26(日) 20:10:35 ID:tio4PAPQ
#SQL

テーブルから引っ張っていたデータを
一行一行別テーブルに挿入することは
可能でしょうか?
Selectではできたが、
一行ずつ(Insert)で、つまずいています。
347NAME IS NULL:2006/11/26(日) 20:16:45 ID:???
>>346
日本語でおk
348NAME IS NULL:2006/11/26(日) 20:27:48 ID:???
>>346
よーわからんが、insert into hoge1,hoge2,hoge3 select * from ( select * from 〜
みたいな事ができるか?って聞いてるの?

ストアド作れ(w

とりあえず、そのSQLを晒してくれ。
349429:2006/11/26(日) 21:44:21 ID:???
>>346
Oracleの新らしいやつならマルチテーブルインサート使って、
1文で複数のテーブルに入れれた。他のデータベースでそういう機能なきゃ、
ストアド作るしかないね。
350NAME IS NULL:2006/11/26(日) 22:27:28 ID:tio4PAPQ
BEGIN TRAN
INSERT INTO a(a) VALUES(@a) --(@a)を指定したい
COMMIT TRAN
>>348
のように定義していくしかないのでしょうか。
>>Oracleの新らしいやつならマルチテーブルインサート使って、
>>1文で複数のテーブルに入れれた。他のデータベースでそういう機能なきゃ、
>>ストアド作るしかないね。
ストアド作って、ループでまわすってこと?
351NAME IS NULL:2006/11/26(日) 22:34:01 ID:???
>>350
なんか抽象的すぎて、わからんがテーブルaとカラムaと数値@aは
全て動的に変化するのか?

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

藻前の質問はエスパーでないと答えるのは難しい。
352NAME 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していくことは可能か?
353NAME IS NULL:2006/11/26(日) 23:20:37 ID:???
サブクエリが使えるDBならINSERT文一つで書けると思う。

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

これは根本的にテーブル設計が失敗してる例なのか?
一行目のSELECT *からしてアリエネーし、途中で現れる@bも
意味不明だし…。
354NAME IS NULL:2006/11/26(日) 23:29:05 ID:???
テーブル分だけINSERT-SELECT文を書けないの?

それと動的SQLは極力避けるべき。SQLはソースそのものなので、
ソースを動的に編集するというのは可読性がかなり落ちる。
テーブル名だけなら仕方ないが。
355NAME IS NULL:2006/11/26(日) 23:33:11 ID:???
処理にもよるが処理をある程度共通化ライブラリしたくなるときは
ストアドで動的SQL作るのはアリだと思うが。

つか、その為のストアドでもあると思うが。
356NAME IS NULL:2006/11/27(月) 01:26:19 ID:BID+zT24
ありがとう。
357NAME 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文を使わなければ、ロールバック処理は
できないのでしょうか?
何かいい方法はありますでしょうか?
358NAME IS NULL:2006/11/27(月) 06:56:52 ID:???
>>357
ストアドプロシージャはDBMSで全く互換が無いからDBMSの名前はちゃんと書けよな。
MSSQLのTransact-SQLとして答えるがこれじゃいかんの?
IF @@ERROR = 0
  COMMIT TRAN 
ELSE
  ROLLBACK TRAN
359NAME IS NULL:2006/11/27(月) 18:46:23 ID:???
>>355
アリかもしれんが、そんな必要にせまられたことはめったにない。
ウンコ設計のシステム開発してんのか?
360NAME IS NULL:2006/11/27(月) 19:09:04 ID:???
なにこの日曜プログラマ丸出しの初心者
361NAME IS NULL:2006/11/28(火) 17:14:02 ID:???
「動的SQLを作るため」のストアドって。それがストアドの本来の目的じゃ、
クライアントでSQL組み立てるのとなんら変わりないわな。
ぷぷぷ
362NAME IS NULL:2006/11/28(火) 18:35:56 ID:???
なんでこの人、一人だけで優越感に浸ってるんだろう・・・。
363NAME IS NULL:2006/11/28(火) 19:39:04 ID:???
ヒント:相手が優越感にひたってるんじゃなくて、君が劣等感のかたまり。
364NAME IS NULL:2006/11/28(火) 20:25:54 ID:???
頭のおかしいヤツがいるな。
365NAME 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を使用しているのですが、他に一時的な表を用意するしかないのでしょうか?
366U ◆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 日付, 購入者名
367365:2006/11/29(水) 10:59:14 ID:???
>>366
どうもありがとうございます。
結合の問題だともよく理解していませんでした。
出直してきます。
368NAME 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を使う)
369U ◆CZtFsGiu0c :2006/11/29(水) 17:27:01 ID:???
>>368
SQL文って…CREATE TABLE文てこと?
ADDを使う、ってのはALTER TABLEってことかな?
370NAME IS NULL:2006/11/29(水) 17:35:26 ID:FZUQz2Ny
>>369
はい。ERD自体はVisioで書いているのですが、
これと同じ仕様+それぞれのテーブルに好きなアトリビュートを二つ
で、SQL文(CREATE TABLE〜ですね)を書くみたいなんですがよく分かりません・・・
友人の研修課題らしいのですが、データベースの知識はまったくと言ってよいほどないので、
困り果てています。
371U ◆CZtFsGiu0c :2006/11/29(水) 18:12:32 ID:???
>>370
こういう課題が出るって事は、ERDの読み方とかCREATE TABLE文の
書き方とか習ってると思うんだけど。まずは、ERDが読めないのか
SQL文が書けないのかどっち? それと、データベースの知識がない
のは、友人とあなたのどっち?
372NAME 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
373NAME IS NULL:2006/11/29(水) 19:02:53 ID:???
クロス集計すれ。
374NAME 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文しだいで可能なのでしょうか。
375NAME IS NULL:2006/11/29(水) 22:01:12 ID:???
テーブルBにテーブルAをLEFT JOINすればいいように思えるが、うまく行かないってことは違うんだろうなあ。
図示してくれると助かるぞっと。
376NAME 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


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

友人は学生時代に初級シスアドは取っているのですが、コンピュータの言語はまったく勉強していない上、
データベースが専門外なのに研修でSQLを書く課題を与えられたらしく、私に相談をしてきました。
379NAME IS NULL:2006/11/30(木) 01:56:21 ID:Lm+NGEnN
ttp://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=28809

ネット上のSQL関連サイトを見て組んでみました。
ALTER TABLEも書いてみたのですが、このような感じで良いでしょうか?
380368:2006/11/30(木) 01:58:13 ID:Lm+NGEnN

すいません。368です。
ひとつのソースにまとめる為に
***************〜〜〜 TABLE***************
といった感じで区切りましたが、実際は別々に書いてあります。
381368:2006/11/30(木) 11:48:12 ID:bAhOQ6Un
後でチェックしてみたら酷いコードだったので書き直しました。

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

それぞれのテーブルに新たに、自分の好きなアトリビュートを二つ追加せよ。(ADDを使う)
は勘違いで、データを追加すれば良いらしくINSERT INTOを使用したのですが、
OFFERING のコンポジットテーブルはどのようにすればよいか分かりませんでした。
382NAME IS NULL:2006/11/30(木) 12:40:54 ID:yD5JcOlX
COMMITの逆ってなんでしたっけ?
383NAME IS NULL:2006/11/30(木) 12:58:49 ID:???
ROLL PANNACHAN
384NAME IS NULL:2006/11/30(木) 13:26:15 ID:???
>>377
で、できたあああああああああああああああああああああ
A1A2A3A4と作っていけば良かったんですね。
A1固定しかできないと思っていました。おはづかしい。
頭が少し柔らかくなりました。
385NAME 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

となるように・・。
386NAME IS NULL:2006/11/30(木) 14:55:32 ID:???
MySQL使っています。
INT型のauto_incrementフィールドで、
普通は1,2,3...
とINSERTしていくたびに順番に増えていくと思います。
0詰めの3桁のフォーマットにすることできるでしょうか?
001,002,003...
こういう感じです。
よろしくお願いします。
387NAME IS NULL:2006/11/30(木) 15:13:25 ID:???
386です。
自己解決しました。
ZEROFILLオプションがありました。
388NAME 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)
を追加かな。


相関サブクエリを使わずに外部自己結合でも出来るな。
389NAME 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
となります。

どのような処理をすればよろしいのでしょうか?
390NAME 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という
データを入れるプログラムを作りたいんですけど上手く行きません。誰か教えてください
391390:2006/11/30(木) 16:26:15 ID:HKTYjIui
あ、すみません>>390はPHPの話です。
PHPスレで質問してみたんですけど、Mysqlスレで聞けと言われました。
392NAME 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が全く同じになる事はないです。
393NAME 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をサブクエリとして突っ込めば桶。
カラム名はあわせなあかんけど。
394NAME IS NULL:2006/11/30(木) 19:10:31 ID:uSFKhVrK
>>393

as T1  のところがエラーになって
「SQL command not properly ended」
ってなるんですけどなんででしょう?
395NAME IS NULL:2006/11/30(木) 19:25:03 ID:FczYGQNu
mysql の show tables ってlimitきかないんだけど、バージョンが古いだけでしょうか?
ものすごいたくさんあるテーブルをちょっとずつ見るのはどうしたらいいのでしょうか?
396NAME IS NULL:2006/12/01(金) 09:32:49 ID:if/DbWjf
質問です。

where(それかhaving)句でcountを使いたいのですが、
selectのところにはcountの数を表示させたくありません。
それは可能ですか?
エラーになってしまうのですが・・。
397NAME IS NULL:2006/12/01(金) 10:39:42 ID:???
>396
自分のような初心者には
HAVINGはともかく、どういう状況においてWHEREでCOUNTを使うのか分かりません。
ちょっと気になったので、もしよければ教えてください。
398NAME 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
399NAME IS NULL:2006/12/01(金) 15:28:40 ID:E463S5op
初心者と思うなら、入門本とかサイトとか見ろよ。
SQLの基本構文なんて1週間あればマスタできんべさ。
400397:2006/12/01(金) 17:21:53 ID:???
>399
自分の手元の入門書にはWHERE句で使う手法には一切触れてなかったんで、
特殊なテクニックなのかなとばかり。
401NAME IS NULL:2006/12/01(金) 17:29:38 ID:vSVjo59R
こちらで質問するのが適当かどうかわからない素人です

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

やろうと思えば、スクリプトだけでもできるような
おいしい仕事だw
403NAME IS NULL:2006/12/02(土) 01:33:56 ID:???
WHERE句使わん入門書なんか
そもそも入門書とは言わん
404NAME IS NULL:2006/12/02(土) 04:08:00 ID:???
WHERE句でCOUNTの使い方がわからんっていってるんじゃないの。
俺もわからんが。てかそこでCOUNTが使えりゃHAVINGの存在意義が無いよ。
405NAME 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
406NAME IS NULL:2006/12/02(土) 14:36:06 ID:???
>>405
CASE使え!
407NAME IS NULL:2006/12/02(土) 17:15:21 ID:???
指定フィールドの最大値+1、にUPDATEということは可能でしょうか?
現在はPHPに一旦渡してやってるんですが、
非常にだるいです。
408NAME IS NULL:2006/12/02(土) 20:42:19 ID:???
>>407
CASE使え!
409NAME IS NULL:2006/12/02(土) 22:05:22 ID:???
>>408
やぱビッグドライブ対応か?
410NAME 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);
411NAME IS NULL:2006/12/05(火) 16:33:43 ID:???
>>401
そのぐらい自分で作れよ。
412NAME IS NULL:2006/12/05(火) 16:36:42 ID:???
>>396
where では count() って使えないんじゃない?
ああいう関数が使えるのは select か having の所だと思ったが。
で、実際どういうのを書いたらどういうエラーになったんだ?
413NAME 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越えた人数を出したい。
可能かな?
414NAME 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);
415NAME 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フィールドと
同じ値に置換したいのですが、どのようにすれば可能でしょうか?
よろしければ、ご教授いただけないでしょうか?
416NAME IS NULL:2006/12/06(水) 14:07:58 ID:???
SQLを聞いてるのか仕組みを聞いてるのかわからん
ストアドにしてトリガで起動すればいいのでは
417NAME IS NULL:2006/12/06(水) 14:18:29 ID:66Ngl6RX
>>416
出来ましたら、SQLを教えていただきたいのですが。。。
418NAME IS NULL:2006/12/06(水) 15:17:08 ID:???
トリガを使わないのなら、最後に登録されたものが何かわかるようにしないと無理

で、Bのphase1 か phase2 か phase3 がAの何にヒット(ヒットって何?)したら
Aのwordに何を入れるの?
419417:2006/12/06(水) 15:20:43 ID:66Ngl6RX
>>418
ヒット→該当するレコードがあるか
Aのwordに入れるのでなく、Aのwordの値に置換
です。
420NAME IS NULL:2006/12/06(水) 17:43:01 ID:???
>>415の例で言うと、結果はどうなるの?
421NAME IS NULL:2006/12/06(水) 18:41:13 ID:???
後から検索しやすいように一般的な単語に変換する、って感じなのかしら?
漢字やカタカナを全部平仮名に直して格納、とかは使い道ありそうだし。
422NAME IS NULL:2006/12/06(水) 20:05:19 ID:???
まずはテーブルAを正規化すべてはそれからだ。
word word123 
果物 フルーツ
果物 fruit
果物 くだもの 
本 書籍
本 書物

423413:2006/12/06(水) 20:41:12 ID:???
>>414
出来た!!ありがとう。
下の行までは到達出来てたんだが、select2重にするだけでよかったのか…。
かなり、視野狭窄なまぬけだった。
424NAME IS NULL:2006/12/06(水) 21:02:10 ID:???
課長視野狭窄
425NAME 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とかしてみたんですが、
もうこれ以上すすめません....
どなたかご教示ください。お願いします。
426NAME IS NULL:2006/12/06(水) 22:31:41 ID:???
where table2.title='title1'
を付けるだけじゃ無いん?
427425: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フィールドには値なしで欲しいんです。
すいません変な質問で。
428NAME IS NULL:2006/12/06(水) 22:53:10 ID:???
どういう結果が欲しいのかわからんなぁ。
>>425の3つめの表が欲しい結果なんかな?
429425:2006/12/06(水) 23:05:58 ID:wAcTjtz2
>>428
そうです!そのままズバリです。
>>427の結果をもらってプログラム側で対応するのもいいんですが、
3つめの表のかたちで取れる方法はないのかと考えています。
430428:2006/12/06(水) 23:11:03 ID:???
>>429
細かいところは適当に
SELECT * FROM table1 LEFT JOIN (SELECT * FROM table2 WHERE title='title1')AS foo USING(id);
サブクエリも使えるMySQLなんかどうかしらんが。
431425:2006/12/06(水) 23:37:08 ID:wAcTjtz2
>>429
4.0系なのでサブクエリ使えません...すみませんバージョン書いてたつもりでした...
MySQL4.027の環境です。
サブクエリ使えれば良かったんですけど、ダメなので悩んでいた次第です。

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

>>429 ×
>>428
感謝
433428: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 も必要かな? なんかすんげぇぁゃιぃが。
434NAME 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じゃダメかね?
435425:2006/12/07(木) 14:10:52 ID:kGrXAXz9
>>428 >>434
アドバイス有難うございます。
おかげさまで欲しい結果が取れました!

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

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

今回はプログラム側の処理を楽にできるように、
こういう形でデータを受け取りたいと思ったんですが
実際レコードが増えた時の事考えるとこういうのダメなんですかね?
自分まだ経験が浅いのでどういうのが定石か分かっていないんです。
データベース側とプログラム側でどちらがどこまで負担するとか...
なにはともあれ勉強になりました。有難うございました。
436NAME IS NULL:2006/12/08(金) 01:05:16 ID:???
列の射影について質問です。"SELECT 列A"では指定した列Aのみを
抽出しますが、逆に指定した列のみを抽出しないようにする命令は
どう作ればよいのでしょうか?
437U ◆CZtFsGiu0c :2006/12/08(金) 01:25:00 ID:???
>>436
少なくとも標準SQLにはない。
独自構文だとしても、主要なRDBMSにはないと思う。
438NAME IS NULL:2006/12/08(金) 15:11:21 ID:???
LIKE で比較するパターンを列や SELECT から作るにはどう書けばいい?
439NAME IS NULL:2006/12/08(金) 16:21:03 ID:???
超能力者に相談すればいいんじゃないかな。
440NAME IS NULL:2006/12/09(土) 01:23:36 ID:???
なんでMySQL使いはVer4.xに拘泥するかねぇ
MySQLはビュー・トリガ・ストアドが実装される5.0以降でないと
はっきり言って使いモンにならんがな
441NAME IS NULL:2006/12/09(土) 02:37:41 ID:???
>>438

列 || '%'

↑これの事?
442NAME 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句の制約のせいで
うまくいかない・・・。
443NAME IS NULL:2006/12/10(日) 22:43:41 ID:???
そうですか
444NAME IS NULL:2006/12/10(日) 22:53:11 ID:A4HOrmPS
>>442
うまく出来やした。
445NAME IS NULL:2006/12/11(月) 07:35:09 ID:???
MySQL 4.0 を使用しています。
SQL でテーブル内にデータが存在しない場合のみ入力する、なんてことはできるのでしょうか。
ユーザーのIDをプライマリキーで持っておき、新規IDの場合は追加するといったことがしたいのです。

はじめにSELECTで検索して無ければ追加すればいい話なのですが、一文だけでできる方法があれば教えてください。
446NAME IS NULL:2006/12/11(月) 07:41:21 ID:???
>>445
NOT EXISTSを使いたまへ。
447NAME IS NULL:2006/12/11(月) 07:42:19 ID:???
ん4.0?サブクエリ使えない?ならあきらめれ。
448NAME IS NULL:2006/12/11(月) 10:29:29 ID:???
>>445
マニュアルに答えがあるから嫁
449NAME IS NULL:2006/12/11(月) 21:43:38 ID:???
スレ違いでしたら、ごめんなさい。
良くCGIで、都道府県をリストから選択するのありますが、
東京都選んだら、市町村もリスト選択できるようにしたいのですが、
都道府県の市町村までのなにか使いやすい
データあるでしょうか?
CSVでも何でも良いですが。

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

手書きで市町村書いてくとすごく大変ですが、
みなさんどこからデータ持ってきて使ってるんでしょうか。
よろしくお願いします。
450NAME IS NULL:2006/12/11(月) 21:45:48 ID:???
451NAME IS NULL:2006/12/11(月) 22:56:30 ID:???
>>450
ありがとうございます!
452NAME 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つにまとめるにはどうすればいいですか?
453NAME IS NULL:2006/12/11(月) 23:27:05 ID:???
数学点数 = 0 or 数学点数 = 100 
ですまんか?
454452:2006/12/11(月) 23:41:07 ID:???
>>453
0と100の場合で別々にカウントしたいんです。
or だと0と100の両方をカウントすることになりませんか?
455NAME IS NULL:2006/12/11(月) 23:46:08 ID:???
>>454
>or だと0と100の両方をカウントすることになりませんか?

453じゃないが、ならんよ。やってみれ。
456452:2006/12/11(月) 23:53:07 ID:???
>>455
ありがとう。無知ですまそ。

ちなみに
数学100点と英語0点をカウントするとしたらどうすればいいですか?
457NAME IS NULL:2006/12/12(火) 00:08:59 ID:???
>>456
UNIONでもサブクエリでもCASEでもお好きなのドゾー。
458NAME IS NULL:2006/12/12(火) 15:45:39 ID:t9HsFvWX
プロ野球選手のデータを検索して出力するシステムを作っているのですが、2006年度の成績のデータをSQLに入れるとこまでは終わって、その後をどうすればいいか困っています。どなたか教えてもらえませんか?
459NAME IS NULL:2006/12/12(火) 17:12:14 ID:???
>SQLに入れる
ってなんだ。

>データを検索して出力するシステム
を作ってるなら、まずは検索して出力するやつを作っては
460NAME 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を作成する方法

いまいちよくわからないので、ご指導願います
461NAME IS NULL:2006/12/12(火) 20:59:43 ID:t9HsFvWX
>>459
MySQLにデータを入れるということです。
462NAME IS NULL:2006/12/12(火) 22:40:48 ID:???
>>461
そこから先はアウトプットの世界
検索用のSQL作るのとODBCで接続出来るようにして
Webで吐き出すのがスタンダード

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

少し落ち着いてから出直せ
464NAME 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;
465NAME 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は何かの賞に何回ノミネートされたか、です。
466NAME 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;

以外の文で表示させる事は可能でしょうか?
467NAME IS NULL:2006/12/14(木) 14:45:19 ID:???
>>464
組み合わせでも無理なら
関数作ればいいのでは
468nobodyさん:2006/12/14(木) 17:32:19 ID:???
SQLでレコードを取り出す際に、値がnull以外のフィールドを
取り出したいのですが、どう記述すれば良いのでしょうか?
469NAME IS NULL:2006/12/14(木) 17:42:12 ID:???
IS NOT NULL
470464:2006/12/14(木) 18:45:23 ID:???
>>467
やはり関数作るしかないのでしょうか><
1つのSQL文でしか使わないため、ユーザー定義関数作るのもなんだかなっと思いまして。
471468: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';
472NAME IS NULL:2006/12/14(木) 23:09:43 ID:???
whereのところに書く。
473NAME 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;
474NAME 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;
475468:2006/12/14(木) 23:34:57 ID:???
>>472
SELECT * FROM tablename WHERE fieldname IS NOT NULL
ということでしょうか?
でも、これだとフィールドにnullが含まれているレコードが抽出されなく
なってしまいますよね?
476NAME IS NULL:2006/12/15(金) 00:50:41 ID:???
>>468

自分が何をしたいのかを「確実に」他人に伝える手段を身に付けてから出直せ。
477468: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のみを取り出したいということです。



478NAME IS NULL:2006/12/15(金) 07:34:10 ID:???
>>477
SQLの範疇じゃないな。自分でNULLの分抜いてコレクションを作り直せ。
479NAME 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
 )
)
480NAME 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型へ変換してくれ。
481480:2006/12/15(金) 09:31:31 ID:???
あ、最初のサブクエリ(前日のAを計算している所)の後ろの方にある'2 day'は'2 days' のタイポ
まぁ、そのままでも通るだろうけど。
482480:2006/12/15(金) 09:42:49 ID:???
もうチョット補足。
前日のAと言うのは、
「4〜2日前の平均*0.5+前日のCOL1」
と考えれば、>>479が出したSQLをチョット改造する程度でも
いけるんじゃないのかな?
見慣れないSQLなんではっきりとは知らんが。
483479: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

むずかしい・・
484480:2006/12/15(金) 13:10:02 ID:???
あーあぁ〜〜〜あ゛
再帰ってことじゃないけど、前行の値を保持しておかなきゃならないんでたぶんSQLでは無理。
少なくとも俺には無理。
ストアドつかえばLOOPさせるだけなんで、簡単にできるとは思うけど。
485NAME IS NULL:2006/12/15(金) 13:37:14 ID:???
>>479
移動平均でググレカス
486479:2006/12/15(金) 13:39:55 ID:???
出来るかなっと思ってたのですが、考え始めたら嵌まっちゃって。。
やはりSQLじゃ無理なんですかね。お騒がせしました。
487479:2006/12/15(金) 14:07:46 ID:???
>>485
ググったけどわかりませんでした(泣)
移動平均とは
(カレント行 - 1) 〜 (カレント行 - 5とか6とか7とか)
の平均値を求めることであってますでしょうか?
それだと480さんのやり方で取得できると思うのですが。
それとももっと別のことなんでしょうか。。
488NAME IS NULL:2006/12/15(金) 15:34:16 ID:???
SQL 移動平均
でググレカス
489NAME 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が自動ずれるとか・・
よろしくお願いします。
490NAME IS NULL:2006/12/15(金) 19:17:07 ID:???
初歩的な質問だと思いますがよろしくお願いします。
name1 name2 name3の重複したレコードを1つにまとめるSQL文おしえてください。
491NAME IS NULL:2006/12/15(金) 19:40:47 ID:???
>>489
別に順番用のテーブルを作るのが吉
492NAME IS NULL:2006/12/15(金) 19:41:39 ID:???
>>490
GROUP BY
493490:2006/12/16(土) 04:11:45 ID:???
SELECT * FROM hoge GROUP BY name1
だと、name1だけをグループ化ですよね?
name1 name2 name3の重複を取り除きたいです。
よろしくお願いしますm(_ _)m
494NAME IS NULL:2006/12/16(土) 06:34:59 ID:???
それぞれ別のカラムなのか?
495NAME IS NULL:2006/12/16(土) 07:48:56 ID:???
別のカラムだったらそれぞれgroup byした後にunionで結合すれば?
496NAME IS NULL:2006/12/16(土) 08:21:59 ID:???
てすと
497NAME IS NULL:2006/12/16(土) 08:29:08 ID:???
すんませ〜ん……
ちょっとおたずねしたいのですが

DATE型の日付から曜日別にログを抽出するって可能ですか???

例えば掲示板の書き込みをDBに保存するとして
日付をDate型で保存してるとします

土曜日の書き込みをすべて抽出したい場合

SELECT * FROM hoge Where Date=(この部分でWEEK=5みたいな)

みたいな感じでお願いします

最悪WeekDayフィールドを用意して 書き込み時の処理で 土曜なら5とかでもいいんですが
できればクールにやりたいので……
498NAME IS NULL:2006/12/16(土) 08:42:25 ID:???
>>497
とりあえず使っているDBの名称くらいかいたらどうだ?
ちなみにDB2なら標準でそういう用途の関数がある。

そういう関数がないとあまりクール(?)にはできんと思う。
499NAME IS NULL:2006/12/16(土) 08:45:17 ID:???
クールよりはエレガントだな。
500490:2006/12/16(土) 09:00:53 ID:???
>>494
それぞれ別のカラムです。
>>495
GROUP BY を UNION で結合してもうまくいきませんでした(重複が取り除かれてなかった)

ちなみにDISTINCT使うと表示するとき変なスペース(重複を取り除いた部分なのかな?)が表示されてしまいます。。
よろしくお願いします。
501NAME IS NULL:2006/12/16(土) 09:16:00 ID:???
>498
すいません!忘れてました
DBはmysqlです

>499
まぁ いけてる ってことです
502NAME IS NULL:2006/12/16(土) 09:56:14 ID:???
>>497
DATE_FORMAT
503NAME IS NULL:2006/12/16(土) 10:13:15 ID:???
>502
ありがとう!
そのヒントでもうちょっとがんばってみます
504NAME IS NULL:2006/12/16(土) 14:05:18 ID:???
SQLserver2000使ってます。

M得意先のテーブルに得意先名という列があります。
得意先名の中に「山田株式会社  」といったように会社名の右側に
空白が入っている場合、一括でその空白を削除するクエリを教えてください。
rtrim関数で空白を削除した後の文字列を返すことはできると思うのですが
updateで一括痴漢したいのです。どなたかご教授願えますか。
505NAME IS NULL:2006/12/16(土) 14:06:31 ID:???
おれも痴漢したいな アッー
506NAME IS NULL:2006/12/16(土) 14:20:50 ID:???
>503
select * from log where date_format(Date,'%w')=6

で 解決しました!!アドバイス感謝します!
507NAME IS NULL:2006/12/16(土) 15:19:43 ID:FiTaYTiR
>491
ありがとうございます。489です。
別テーブルはどういう形で
IDをKEYにして id、順序という形でしょうか。
508NAME IS NULL:2006/12/16(土) 19:43:45 ID:???
>>507
そうだね。
で、LEFT JOIN とかして
ORDER BY 順序テーブル.順序
509NAME IS NULL:2006/12/16(土) 20:05:57 ID:???
>>504
Update 得意先 Set 会社名 = Rtrim(会社名)でいいだろうに。
510504:2006/12/16(土) 21:22:07 ID:???
回答ありがとうございます。
やってみたんですがどうもだめです。
「山田株式会社 」といったように右側の空白が半角スペースだと
rtrimで切り取ってくれるのですが
「山田株式会社  」といったように全角スペースが混じると
「山田株式会社  」と、何も変化せずに返されてしまいます。。。
511NAME IS NULL:2006/12/16(土) 21:31:02 ID:???
そもそもそんなデータ入れるな
512NAME IS NULL:2006/12/16(土) 21:48:34 ID:???
>>510
ヒント:文字列の置き換え
513NAME IS NULL:2006/12/16(土) 22:18:23 ID:56UzO0+c
#SQL

集合関数(UNION)使う時って、
Selectの数をあわせなければ
いけないのでしょうか?
514NAME IS NULL:2006/12/17(日) 01:08:19 ID:???
YES
515NAME IS NULL:2006/12/17(日) 09:48:28 ID:???
>513
数だけでなく、型も合わせなきゃダメだよ。
516NAME IS NULL:2006/12/17(日) 14:56:50 ID:NLx29Tuk
>>513
有難う御座います。
517NAME IS NULL:2006/12/17(日) 15:30:04 ID:NLx29Tuk
#TSQL

LEFT JOINと
LEFT OUTER JOINの
違いはあるのでしょうか?
518489: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で本テーブルから引っ張ってみました。
いろいろな角度からやってみるのは、とてもおもしろいです。
負荷という点で、どちらの処理が重いのか、ベストなのかとか
思ったり、色々とプログラムを楽しんでいます。ありがとうございました。
519NAME IS NULL:2006/12/17(日) 18:05:22 ID:???
>517
ない
520NAME 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です。

よろしくお願い致します。
521NAME IS NULL:2006/12/18(月) 09:09:32 ID:???
>>520
MAX(num)
522520:2006/12/18(月) 20:14:41 ID:W84oHfQv
MAXって最大値を求めるんじゃ?
MAX(num)のnumには何を入れればいいのでしょうか?
523NAME IS NULL:2006/12/18(月) 21:36:54 ID:???
>>522
>>520に自分で書いておろうが。
524520:2006/12/18(月) 21:45:19 ID:W84oHfQv
いや、実行してもエラーが出たもんで・・・。
525NAME IS NULL:2006/12/18(月) 21:50:43 ID:???
>>520
_
だが、RDBMSによっては便利な関数があるかもしれない。
よって、MySQLで聞くほうが早い。
もしくはテンポラリーシーケンスを用意するか。
526NAME IS NULL:2006/12/18(月) 22:13:57 ID:???
oracleならrownumがあるな。
SELECT rownum AS num,user FROM user_table WHERE ....

MYSQLで使えるかどうかは知らない
527520:2006/12/18(月) 22:43:45 ID:W84oHfQv
>525
なるほど。
ありがとうございます。
今後のために参考にします。

>526
オラクル便利ですねぇ。
MySQLでは使えませんでしたorz

結局プログラム側でやった方が早いのでそうしました。
読み出して新しい配列に挿入するのはスマートではないと思いましたが、
SQLヘボマスターの俺には仕方のない事です。
ありがとうございました。
528NAME IS NULL:2006/12/18(月) 23:59:42 ID:???
>>527
そもそも何がしたいのか良く判らんのだが、
連番を作って会員番号とかに使いたいって事なら、
オートインクリメントで良いんじゃないのかい?
529NAME IS NULL:2006/12/19(火) 00:06:21 ID:???
MySQL4.0って内部結合使えないの?
530520: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
内部結合使えますよ

531520:2006/12/19(火) 10:38:08 ID:???
もはやSQLではなくなったので、webprog版に移動しました。
ありがとうございました。
532NAME IS NULL:2006/12/19(火) 10:58:55 ID:???
DBの中身を一気にぶっこぬいてphp側で処理するのと
ID単位でDBのレコードを1づつ引っこ抜いていく処理とでは
どちらが負荷かかるのでしょうか。
533NAME IS NULL:2006/12/19(火) 14:00:32 ID:???
>>532
ケースバイケース
534NAME IS NULL:2006/12/19(火) 14:32:48 ID:???
>>533 d
結構レコード数が多いのですが(数千件)
レコードの順番管理としていい方法はないでしょうか。
順番テーブルから順番いれているフィールドを抜いて処理し
KEYIDでforeachで数千回SQL文流して書き込んでいくという形
でいいのでしょうか・・・。
535NAME IS NULL:2006/12/19(火) 14:55:36 ID:???
数千件って少ないほうじゃないの
536NAME IS NULL:2006/12/19(火) 14:57:11 ID:???
どっちも試してみたらいいと思うよ
インタラクティブな処理で、ループで一回一回やるのなら
かなりの待ち時間が発生するだろうな
537NAME 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です。
すみませんが、よろしくお願いします。
538NAME IS NULL:2006/12/19(火) 15:52:42 ID:???
>>535
レコード毎の表示に他のDBからデータを
引っ張ってきてはhtml作成したりしてるのもあって
一件が重たかったりします。。設計まちがったかな・・

>>536
実はインタラクティブな感じで使用します。
検索サイトの検索結果の一つ毎に順番の上下ボタンがあると
イメージしてもらうとわかりやすいかもです。
539NAME IS NULL:2006/12/19(火) 15:56:08 ID:???
>>537
WHERE name LIKE '%A%' じゃ駄目かな
540NAME IS NULL:2006/12/19(火) 17:01:32 ID:???
>>537
PL/pgSQL で関数作るとか
541NAME IS NULL:2006/12/19(火) 21:34:49 ID:???
>530
いまさらだけど、内部結合できるんなら、
ttp://d.hatena.ne.jp/CAMUS/20060105/1136469086
542NAME IS NULL:2006/12/20(水) 00:10:27 ID:gFXhyA0/
NVARCHAR2 呼び方は、なんと呼んでいるのでしょうか?
543NAME IS NULL:2006/12/20(水) 01:48:44 ID:???
んばーちゃーつーに決まってるだろ
544NAME IS NULL:2006/12/20(水) 07:00:06 ID:???
そうか。俺はてっきり、えぬばーきゃーに って呼ぶもんだと思ってたよ
545NAME IS NULL:2006/12/21(木) 18:19:49 ID:M88ezNHc
userid 
-----+--
112  |
231  |
331  |
41   |
テーブルにこんな感じに入っててこの中から
useridが一番大きいのを選択するにはどうすればorz(*useridはテキスト型です)
546NAME IS NULL:2006/12/21(木) 19:43:05 ID:???
>>545
設計からやり直し
547NAME IS NULL:2006/12/21(木) 19:50:21 ID:???
useridに入ってるのが数字だけなら、何の工夫もなく取得できそうな気がするわけだが。
548NAME IS NULL:2006/12/21(木) 21:42:21 ID:???
なら、数値に変換してmaxで括ればすむじゃね。
549NAME IS NULL:2006/12/21(木) 23:26:22 ID:???
もしくはorder byしておいて1件取得か。
550NAME IS NULL:2006/12/22(金) 10:32:35 ID:???
大きいの定義が無いとな
文字コードとして最大でいいならそのままMAX
数字として大きいなら数値に変換してMAX
変換の仕方はRDBMSによる
551545:2006/12/22(金) 10:49:04 ID:???
たくさん返信ありがとうございます。
>>550
数字として大きいのを取り出したいんですが変換の仕方がいまいちよくわかりません。
色々探してCASTっていう関数使えばいけるのかなってとこまではいったんですが
うまくいきません。orz
使ってるのはmysqlです。
552545:2006/12/22(金) 10:57:45 ID:???
ちなみに
rs = st.executeQuery("select MAX(CAST(フィールド名 as 型名)) from テーブル名 order by フィールド名");
こんな感じで使ったんですがだめでした。orz
553NAME IS NULL:2006/12/22(金) 11:05:05 ID:???
>>552
ちょw、みんなの意見を全部取り入れるなよ。
>>548-550のどれかひとつでいいんだよ。
554NAME IS NULL:2006/12/22(金) 11:10:15 ID:???
MySQL よくしらんが、 + 0 とかで0足せば数字になるみたいだな、10進数ならそのままいけそう
555545:2006/12/22(金) 11:53:04 ID:???
クエリ式MAX(CAST(userid as UNSIGNED))の構文エラー:演算子がありません。
こんなエラーがでるんですがCAST関数の書き方間違ってるんでしょうかorz
556NAME IS NULL:2006/12/22(金) 12:02:12 ID:???
557NAME 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で
使用できませんでした。
558NAME IS NULL:2006/12/22(金) 15:33:32 ID:???
>>557
1つだけの時はどう表示すればいいの?
3つ以上のときは?
559557: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側の処理で逃げようと思ってました。
560NAME 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文でスマートに取得する方法のご教授どうかお願いします。
561NAME 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
)
562NAME IS NULL:2006/12/26(火) 12:17:01 ID:???
1対多の関係にあるヘッダーテーブルと明細テーブルが有ります

ヘッダーテーブル項目
日時
運転者
走行距離

明細テーブル
明細行番号
運賃


二つのテーブルを結合させて一覧表を作りたいのですが
その際にヘッダーにある走行距離は明細行番号が1のレコードだけ表示して
その他はnullまたは0を返すSQLって出来ませんか。
DBはアクセス97です。
563NAME IS NULL:2006/12/26(火) 13:54:28 ID:???
〜 WHERE (複数行返る問合せ) LIKE パターン

とすると「1行以上返る問合せがある」とエラーが出るんだが、どうすればいい?
564NAME IS NULL:2006/12/26(火) 14:16:33 ID:???
>>562
CASE を使え

>>563
WHERE EXISTS (サブクエリ WHERE LIKE パターン)
565NAME IS NULL:2006/12/26(火) 14:18:40 ID:???
それを避けるようにすればいいと思うよ
やりかたは目的による
566564:2006/12/26(火) 14:19:16 ID:???
っと、

Access97でCASEが使えなかったらスマソ。

それと下は

WHERE EXISTS (サブクエリ WHERE カラム LIKE パターン)
な。
567NAME IS NULL:2006/12/27(水) 20:08:44 ID:???
質問させてください
マンションのデータベースがあり
各都道府県の登録件数を出すとき(例えば北海道500件、青森20件など)
47回SQL文発行しないといけないのでしょうか?
もっと簡単な方法があると思うのですが、あったら教えてください。
お願いします。
568NAME IS NULL:2006/12/27(水) 21:42:29 ID:???
>>567
SELECT 都道府県,count(都道府県) FROM マンションテーブル GROUP BY 都道府県;
569NAME IS NULL:2006/12/28(木) 07:55:19 ID:???
>>568
ありがとうございます。その方法でできました。
しかし問題が…
高知県だけ取得できない…
570569:2006/12/28(木) 08:07:57 ID:???
default-character-set=ujisに変えて解決しました。m(_ _)mぺこ
571NAME IS NULL:2006/12/28(木) 10:31:43 ID:qim9OQQX
使用データベース : postgres
テーブル名 : test_tbl
カラム id | name
上記条件のテーブルがあります、ここにカラムnameに重複が無い時にのみ
インサートを実行し新しい値を挿入したいのですが
一文で書くことはできないでしょうか?

caseを使えば出来そうな気がしたので、一度やってみたのですが
結果にインサート文が表示されるだけで出来ませんでした
572NAME IS NULL:2006/12/28(木) 15:45:37 ID:???
uniqueの制約でもつけとけば、重複がなければinsertできるだろうし、
重複があれば例外が発生してinsert不可になる。

しかし、そういう事を一文で書く事に拘る心境が理解できんが。

普通にselectしてから後続処理を分岐させれ。
573NAME IS NULL:2006/12/28(木) 16:33:39 ID:???
処理往復回数が増えることを嫌うのが"普通"。

SELECT COUNT(*)してUPD or INS ってのは典型的な愚図のプログラム。
INSERTが多いなら、INSERTで重複エラーでUPDATE、逆ならUpdateで更新0件ならINSERT。

で、君はなぜオラクルにマージが出来たと思うのよ。
そういうことを一文で書くこだわりをオラクルとそこに要望した数多の技術者は理解したけど、君は理解してないってだけでしょ?
574NAME IS NULL:2006/12/28(木) 16:40:48 ID:???
まぁ、クライアントからSQL文を発行するときだけだわな。ラウントドリップの回数を気にするのは。
575NAME IS NULL:2006/12/28(木) 16:43:49 ID:???
まあいろいろあるじゃん。

でもま、キーが確定してるのにそのキーのデータがあるのか無いのか
わからない状況って変な気もするし、でもやっぱりそういうケースはある、よなあ
576NAME IS NULL:2006/12/28(木) 16:54:50 ID:???
>>575
人の入力に対してはなんともいえないんじゃないの?
あと、マスタの洗い変え処理なんかでは良く出るよ。
元データとDBで、元に有りDB無しなら追加、・・・ってパターン。

元データの有無を一々確認するってのがSELECTするってことだろうけど、知らないで弾かせればいいじゃん。
そのための主キー設定だし。
577572:2006/12/28(木) 17:51:41 ID:???
漏れUDBでないDB2がメインだからマージなんて使わんし使えない(w
しかしアレが特に便利な仕組みだと思わんけど。

あれで障害を発生させるOracle信者多いし。

Oracleを持ち出されてもアレが美しい設計思想とも思わんけど。
と言うかOracleは独自の我侭思想だな感じるが、コレは宗教論だからどーでもいい。
margeが時と場合によっては便利なのは認める。

検索対象とするカラムには索引をつけて、それに対して最小限のロックとなる
selectを投げて、更新対象に正しくロックをかけて色々と判定してから更新する。
なければロックの影響のないinsertするってのが、使う側にとって影響の少ない更新方法だと思う。

なんでも一文ってオナニー技術者が使いたがるけどアフォが使うとアフォみたいにロックが
かかるから、普通にコストベースでモノを考えて欲しい。
578NAME IS NULL:2006/12/28(木) 18:26:50 ID:???
100万件のそういうデータがあったときに、100万回主キーでSELECTするんかい?
579NAME IS NULL:2006/12/28(木) 18:39:52 ID:???
オマエは何を言ってるんだ
580NAME 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');

これで一発でいける。
581NAME IS NULL:2006/12/29(金) 00:36:59 ID:???
>>580
MySQL4では無理だね・・・
582NAME 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');
でいける。
583582:2006/12/29(金) 06:25:58 ID:???
ゴメソ 寝ぼけてた。
INSERT INTO test_tbl SELECT 'id','name' WHERE NOT EXISTS (SELECT * FROM test_tbl WHERE name='name');
の間違い。
584NAME IS NULL:2006/12/29(金) 11:19:17 ID:???
>>577
SELECTかけてロックって何かどんなデータベースを使ってても、すっきりコードがかけない
というか、なんかきもいんだよな。
普通にみんなやりそうなのが、
あるキーの範囲でSELECTする(ロック完了)。
10件返ってきた。
で、更新するために、同じキーの範囲でUpdateする。
で、これでOKそうに見えるが、SELECTとUpdateの間には時間差があるわけで、
この間に、他のトランザクションのよって、行が追加、コミットされ、
実を言うと、Updateされたのは11件(いわいるファントム行?)でした。
うぉー。
これを毎回適切に処理する必要があるか判断することやその処理には骨がおれる。
たぶん、みんな何も考えてないんだろうな。
気楽でいいや。
585NAME IS NULL:2006/12/29(金) 11:27:34 ID:???
>>577の続き、
いや、ただ、SELECTの件数保存しておいて、Updateの件数と違えうとき、ロールバックさせるのが手っ取りはやいね。
586NAME IS NULL:2006/12/29(金) 11:53:45 ID:/nhPd5rf
>>584
ロック完了とかいっといて、更新時に書きかわってる?
書いてる内容が不明ですよ。
587NAME IS NULL:2006/12/29(金) 12:07:09 ID:???
範囲指定のロックの場合2種類あって、
ひとつはヒットした(読めた)行に対してのみのロック。この場合は>>584のいってるファントムが発生する。
共有ロック式のDBMSの場合リピータブルリード分離レベルの場合のロックのかけ方。
もうひとつは指定された範囲、またはその範囲を含むページなどでロックをかける方式で、
読めなかった部分にもロックがかかるのでファントムは発生しない。
ロックのコストが高く、範囲指定のフィールドには必ず索引が必要としている処理系が多い。
共有ロック式のDBMSの場合シリアライザブル分離レベルの場合のロックのかけ方。
588NAME IS NULL:2006/12/29(金) 12:36:16 ID:???
>>586
俺の表現不足かな?上記の例だと更新された11行(自分でロックした10行+ファントム1行)
>>587
そうそうその意味。俺はOracleしかみっちり触ったことないから、ページロックの事
詳しくなかったけど、その範囲のページでロックかけて、他のトランザクションによる
その範囲の行が挿入できなくなら、確かに問題ないな。
589NAME IS NULL:2006/12/30(土) 00:48:56 ID:???
SQL文的には等価結合
(単純にテーブル1.フィールド=テーブル2.フィールドをWHERE句に追加)
が非常に使いやすいのですが、
一方が存在しない場合に結果に含まれないのは困ります。

一方で外部結合は、JOIN句を使う必要があるため、
極力使いたくないです。

他に良い方法ないでしょうか。
590NAME IS NULL:2006/12/30(土) 01:01:04 ID:???
八百屋は気楽に入れるので買いやすいですが、
一方、魚を売っていないのは困ります。

一方でスーパーは買い物籠を提げてレジにも並ぶ必要があるため
極力使いたくないです。

他に良い方法ないでしょうか?
591NAME IS NULL:2006/12/30(土) 01:04:24 ID:???
outer join だとjoin句を使う必要があって
inner join だとjoin句を使う必要が無いという意味がわからない。

innerにしろouterにしろ、join句でもwhere句でも書けるだろ
592NAME IS NULL:2006/12/30(土) 01:04:25 ID:???
>>589
等価結合でもJOIN句つかえよ(笑
旧構文でJOIN句を使わず外部結合を表記することが出来るものがある。
where A *= B
where A = B (+) とか。余計わかりづらくなると思うがね。

>>590
コンビニ弁当だけで生きろ
593589:2006/12/30(土) 01:53:17 ID:???
>>590
たぶんバカにしてるんだろうけど、
そういう指摘の仕方ユーモラスがあって笑ってしまいました。

>>591-592
そうなんですね、MySQL関連の書籍には
結合関係が書いてあるものが少なく、
ネットで調べた断片的な知識でした orz

where A *= B
where A = B (+)
これ使いたいんですが、
MySQL4.0ではエラーが出てしまいます。
MySQL4.0でも使えるでしょうか?
594NAME IS NULL:2006/12/30(土) 09:23:28 ID:e2tsG0Yb
>>593
ちゃんとSQL99の書式を使えとマジレス
595NAME IS NULL:2006/12/30(土) 21:55:22 ID:uJEZ7tfY
SELECT文でASを2回以上使えますか?
SELECT name AS 名前 age AS 年齢 FROM EMPROYEE
の様な感じは大丈夫ですか?
596NAME IS NULL:2006/12/30(土) 23:28:52 ID:???
ID、時間、部署という3つのカラムをSELECTしたいのですが
IDはGROUP BYで、時間はその時の最大値MAXで、部署はそのままで抽出したいと思っております。

SELECT ID,MAX(時間),部署 FROM ****
GROUP BY ID

とすると部署がGROUP BY句に含まれていないため失敗してしまいます。
アドバイスよろしくお願いいたします。
597NAME IS NULL:2006/12/30(土) 23:42:49 ID:???
>>596
IDと部署が1対1の関係なら部署もGROUP BYの条件に加えるか、MAX(部署)かMIN(部署)とでも指定しておく。
そうじゃないなら部署の抽出条件があるはずだからそれを示せ。
598596:2006/12/31(日) 00:30:34 ID:???
>>597
ご返事ありがとうございます。
抽出条件としましては
GROUP BY したIDで時刻がMAXのものを抽出しそれに紐づいている
部署をつけたいと思っております。
599NAME IS NULL:2006/12/31(日) 04:26:40 ID:???
>>598
BROUP BYしたIDとMAX(時刻) で相関サブクエリ。
600NAME IS NULL:2006/12/31(日) 04:27:15 ID:???
BROUP ってなんだよ...orz
601NAME IS NULL:2007/01/05(金) 09:46:07 ID:ZLnsQKzx
カラムAとカラムBの平均でORDER BYしてSELECTしたいのですが
どのようなSQL文になるでしょうか?
よろしくお願いします。
602NAME IS NULL:2007/01/05(金) 11:43:18 ID:???
>>601
select * from テーブル order by (カラムA+カラムB)/2
603601:2007/01/05(金) 11:50:11 ID:???
>>602さん。ありがとう!
604NAME IS NULL:2007/01/05(金) 13:45:17 ID:???
COMMENTなどのテーブルは作らないほうがいいのでしょうか?
ブラウザでSQL実行したとき、CREATEやTABLEやCOMMENTなどの文字が赤く表示されていたので気になりました。
605NAME IS NULL:2007/01/05(金) 17:03:39 ID:???
>>604
作っていいからきにすんな。ハゲるぜ?
606NAME IS NULL:2007/01/05(金) 18:35:35 ID:???
>>605
もうハゲてます。(24歳)
作っていいんですね。ありがとう!
607NAME IS NULL:2007/01/06(土) 11:42:02 ID:???
table1
1ID(PK)   |  NAME
-----------+------------
1         太郎
2         花子
3         次郎


table2
2ID(PK)   | 1ID   | date   |price
-----------+-------+--------+-------
1          1      1/3   200
2          1            
3          1      1/5   300
4          2      1/3   400
5          2      1/4   500
6          2           
7          3      1/3   600
8          3      1/4   700
9          3      1/5   800
10         3      1/6   900

というデータから、

date   | (太郎)price   | (花子)price    | (次郎)price
--------+---------------+---------------+--------------
1/3      200        400         600
1/4                500         700
1/5      300                   800
1/6                           900

という結果を算出するviewを作りたいのですが、可能ですか・・?
postgresです。


608607:2007/01/06(土) 11:44:29 ID:WzBTUHcP
書き忘れました。
table1はマスタではなく、データは動的に増減します。
それにあわせてtable2もです。
609607:2007/01/06(土) 11:48:58 ID:???
ごめんなさい。よくみたらデータが動的に増えると、
算出したい結果の表のカラム数も増えて、viewは不可能ですね。。

sqlならわかるのですが、posgreで書くとすごく冗長になりません・?
from句にsql3つ書いてleftjoinして、、と。
oracleなら(+)でいいのに。

トリッキーなことしてるんですかね・・?
610NAME IS NULL:2007/01/06(土) 16:52:53 ID:PVXLuJDc
(select some_col from a_table ...) UNION ALL (select some_col from b_table...)
のようなとき、a_table 又は b_table の結果が NULL になったら、(subquery
のどれか一つでも NULL になったら) 結果も NULL にしたいのですが、
どういう方法があるでしょうか。一応 postgres を利用中です。
611NAME IS NULL:2007/01/06(土) 17:43:29 ID:???
>>609
標準ではないかもしれないがPIVOT演算子がそれに近いのかな。
その手の演算はSQL直接でなくて、データ分析ソフトがカバーしてる例が多いな。

外部結合だけど、Oracleでもjoinを使う構文が標準になって、(+)は旧構文扱いになっている。
先に覚えたやり方が使いやすいというのはわかるが、Joinを使ったほうが結合関係がわかりやすい。
612NAME IS NULL:2007/01/06(土) 17:45:04 ID:???
>>610
結果ゼロ件とNULLを混同してない?
613610:2007/01/06(土) 17:53:18 ID:PVXLuJDc
>>612
失礼しました。「NULL になったら」→「空集合になったら」です。
つまり、subquery の UNION を取りたいが、ただし subquery のどれか
一つでも空集合だったら、結果も空集合になる、という操作をしたいの
ですが。
614607:2007/01/06(土) 19:25:09 ID:???
>611
>その手の演算はSQL直接でなくて、データ分析ソフトがカバーしてる例が多いな。
なるほど。
今回はSQLで書きます。。

それとSQLでやるとこんな感じになってしまうのですが、
もっとうまい方法ないですかね。。
改行数の関係でindexが見難いかもですが。
select dt.date,t1.price,t2.price,t3.price
from
(((
SELECTdate
FROM table2
whereid = 1
order by date
union
SELECTdate
FROM table2
whereid = 2
order by date
union
SELECTdate
FROM table2
whereid = 3
order by date
)dt left outer join
(selectprice,date
fromtable1 tt1,table2 tt2
wherett1.id = tt2.id
andtt1.id = 1
)t1 on dt.date = t1.date )
left outer join
(selectprice,date
fromtable1 tt1,table2 tt2
wherett1.id = tt2.id
andtt1.id = 2
)t2 on dt.date = t2.date )
left outer join
(selectprice,date
fromtable1 tt1,table2 tt2
wherett1.id = tt2.id
andtt1.id = 3
)t3 on dt.date = t3.date

>外部結合だけど、Oracleでもjoinを使う構文が標準になって、(+)は旧構文扱いになっている。
そうなんですか!!
ここ4年くらい技術的なことから遠ざかってたので、新鮮な情報です。
やっぱ勉強し続けてないとダメですね。。
615NAME IS NULL:2007/01/06(土) 21:27:38 ID:???
MySQLでアカウントごとにそれぞれ指定したデータベースにしかアクセスできないようにしたいのですが、
どういう権限の設定をすればいいのでしょうか?
616NAME IS NULL:2007/01/09(火) 16:12:52 ID:XyyYfyk9
こちらでいいのかわかりませんが失礼します。

ある表から、PHPでチェックボックスを用いて(複数も可)選択し、
その選択した項目をMySQLでデータベース上で削除するという作業をしたいのですが、
チェックボックスの方のvalue(連番になっています)と
データベース上のidなどの項目とに関連性がないため、
どうやって削除したらいいのかというのがわかりません。
何かいい方法はないでしょうか?
何かありましたら、よろしくお願いします。
617NAME IS NULL:2007/01/09(火) 20:36:07 ID:???
>>616
いい方法はないのであきらめれ。
仕事なら外注して、勉強なら友達に相談汁。
618NAME IS NULL:2007/01/09(火) 22:46:20 ID:???
>>610
WHERE EXISTS
(
select some_col from a_table ...
)
AND EXSITS
(
select some_col from b_table...
)
みたいな条件をくっつければいいんでは
619NAME IS NULL:2007/01/09(火) 22:59:08 ID:???
>>616
valueにid入れりゃいいだろ。
620NAME IS NULL:2007/01/10(水) 15:56:43 ID:tD4O0MUc
教えて下さい。
select で 「TableA を調べて、該当データが見つからなかったら TableB を調べる」といった事を
スマートに実現するには、どのように書けば良いのでしょうか?

 select * from TableA where 条件
  union select * from TableB where 条件

という、ブサイコな書き方をするか、VBA で2回レコードセットを開くくらいしか思いつきませんで・・・
621610:2007/01/10(水) 17:56:35 ID:???
>>618  >where exists () .. AND exists () ...
正攻法。
有り難うございます。やってみます。
622NAME IS NULL:2007/01/10(水) 18:42:09 ID:???
>>620
「調べる」の意味がRowが欲しいのか、それともあるかないかだけ調べたいのか不明だが、
Rowが欲しいなら2回クエリを投げるのがもっともシンプル。
最初のにあれば2回目のクエリは不要になるなら効率も悪くない。
あえてunionを使いたいなら
select * from TableA where 条件 
union all
select * from TableB where 条件 and not exists (select * from TableA where 条件)
623620:2007/01/11(木) 12:08:07 ID:???
>>622
ありがとうございます。
なるべくプログラム触りたくなかったのでなんとか良い方法を‥とおもいましたが、
やはり2回クエリ発行するほうが良いみたいですね。
union を使った方法だと余計にややこいので、クエリ2回投げるよう改良したいと
思います。 ありがとうございました。
624NAME IS NULL:2007/01/11(木) 23:51:20 ID:???
EXISTSじゃダメなの?
625NAME IS NULL:2007/01/12(金) 02:43:19 ID:ylSbXRrR
SQL習い始めのヒヨっこです。
以下のSQL文がわかる方教えてもらえませんか?

1,S2が売った部品を少なくとも1つ売った販売業者名を表示
2,2社以上が売った商品名一覧の表示
3,商品2を売っていない業者番号一覧の表示
4,販売業者S1と同じ所在の販売業者の表示


テーブル名;販売者
業者番号 販売業者名 所在
---------------------------
S1    Smith   London
S2    Jones   Paris
S3    Blake   Paris
S4    Clark   London
S5    Adams   Athens


テーブル名:商品
商品番号 商品名  色  重さ 製造元
-----------------------------------
P1    Nut   Red  12  London
P2    Bolt  Green 17  Paris
P3    Screw  Blue 17  Rome
P4    Screw  Red  14  London
P5    Cam   Blue 12  Paris
P6    Cog   Red  19  London

626続き:2007/01/12(金) 02:45:02 ID:ylSbXRrR
テーブル名;販売
業者番号 商品番号 販売量
------------------------
S1    P1    300
S1    P2    200
S1    P3    400
S1    P4    200
S1    P5    100
S1    P6    100
S2    P1    300
S2    P2    400
S3    P2    200
S4    P2    200
S4    P4    300
S4    P5    400
627NAME IS NULL:2007/01/12(金) 05:33:12 ID:???
> 1,S2が売った部品を少なくとも1つ売った販売業者名を表示
SELECT * FROM 販売者 WHERE 業者番号 IN (SELECT DISTINCT T1.業者番号 FROM 販売 AS T1 JOIN (SELECT * FROM 販売 WHERE 業者番号 ='S2')AS T2 on T1.商品番号=T2.商品番号);

> 2,2社以上が売った商品名一覧の表示
SELECT * FROM 商品 WHERE 商品番号 IN (SELECT 商品番号 FROM 販売 GROUP BY 商品番号 HAVING count(業者番号)>=2);

> 3,商品2を売っていない業者番号一覧の表示
SELECT * FROM 販売者 AS T1 WHERE NOT EXISTS (SELECT * FROM 販売 WHERE 商品番号='P2' AND 業者番号=T1.業者番号);

> 4,販売業者S1と同じ所在の販売業者の表示
>>625の宿題。
628NAME IS NULL:2007/01/15(月) 21:07:23 ID:???
(種族表)
コード|種族名
------------
1|魚類
2|両性類
3|爬虫類
4|哺乳類

(登録データ)
コード|番号|名前
---------------
1|07010|さんま
1|07011|さけ
4|07012|ハムスター
2|07013|トノサマガエル

などとなっているとします。このとき登録データ表の各種族別の登録数を知りたいのですが、合計数が0の種族も表示したい場合どのようなSELECT文を書けばよろしいでしょうか?
上の例では3:爬虫類の登録データがないのですが、「3:0個」というふうに表示したいのです・・・
629NAME IS NULL:2007/01/15(月) 21:46:00 ID:???
SELECT A.コード,B.件数
FROM 種族表 A
INNER JOIN ( SELECT コード,COUNT(*) AS 件数 FROM 登録データ GROUP BY コード ) B
ON A.コード = B.コード
630629:2007/01/15(月) 21:47:05 ID:???
INNER JOIN じゃねえ。 LEFT OUTER JOINだ
631629:2007/01/15(月) 22:01:49 ID:???
あー、さらにNVLだかISNULLだかしないと件数がNULLだ。

SELECT A.コード,NVL(B.件数,0)
FROM 種族表 A
LEFT OUTER JOIN ( SELECT コード,COUNT(*) AS 件数 FROM 登録データ GROUP BY コード ) B
ON A.コード = B.コード

こうだ
632NAME IS NULL:2007/01/15(月) 22:47:32 ID:???
>>629 ありがとうございます
いま確認できないので明日やってみます
633NAME IS NULL:2007/01/17(水) 02:00:20 ID:BfO7MAF5
どなたか分かる方いましたら教えて下さい。

DB : PostgreSQL

ID(PK)   |  NAME
-----------+------------
1         太郎
2         花子
3         次郎


このようなテーブルから
IDが1と2と3のNAMEを、サブクエリを使わずに
項目名をAS等で変えるなど1列で取得できないでしょうか?


NAME1   |NAME2   |NAME3   
-----------+-----------+-----------
太郎     花子    次郎
634NAME IS NULL:2007/01/17(水) 02:57:32 ID:???
>>633
要件がイマイチわからない。

テーブルの全レコードを繋げたいのか?
レコード数(つまり検索結果のカラム数)は動的なのか?
IDはシーケンスになってるのか?(NAMEXのXと対応しなきゃならんのか)
ポスグレなのにサブクエリ使えない理由は何か?

条件によっちゃ、出来ないと思うが。
635NAME IS NULL:2007/01/17(水) 14:45:22 ID:???
MySQL4.0を使用しているのですが、
下のSQLでテーブルを作成した場合、
UNIQUE KEY によって「インデックス」されていることになるのでしょうか。

CREATE TABLE `table` (
`user` varchar(10) NOT NULL default '',
`passwd` varchar(15) NOT NULL default '',
UNIQUE KEY `user` (`user`),
)

またインデックスされてないあるテーブルを
インデックス化した場合、
インデックス化してなかったときに通っていたSELECT文
(例:SELECT table from user WHERE passwd='password')
がインデックス用に修正しなければ、通らなくなる、なんてことは
ないですよね?
2つ目の質問については自分が調べた限り問題なさそうですが、
念のため聞かせてください。

というのも現在あるデータベースの負荷が大きいので、
まずインデックスというものをクリアできているのか調べている状況で、
create index インデックス名 on テーブル名 (フィールド名);
としてインデックスを設定したとして、
検索SQL文まで変えなきゃいけないことになると大幅な調整が必要になってしまうためです。

1つ目の質問については
色々ぐぐったのですが確実なことがわかりませんでした。
駄文ですが、ご教授お願いします。
636NAME IS NULL:2007/01/17(水) 15:54:53 ID:J+VdbExh
インデックスの勉強しろよ。
その時点で2つめの質問はこっぱずかしくなるから。
1つめはMySQLの仕様の問題だからすれ違い。

昔はSQLServerが多かったが、最近はMySQLだな。
DBMSの名前としてのSQLxxxと、このスレが指しているSQL言語の違いが判らない初心者が多いのは。w
637NAME IS NULL:2007/01/17(水) 20:26:51 ID:???
>>635
>インデックス化してなかったときに通っていたSELECT文
>(例:SELECT table from user WHERE passwd='password')
>がインデックス用に修正しなければ、通らなくなる、なんてことは
>ないですよね?

通らなくなることは無いけど
「インデックスを張れば勝手に速くなる」わけじゃなくて
・インデックスを張ることによって速くなるSQL文
・インデックスを張ってもインデックスが使われず、速度が変わらないSQL文
・インデックスを張ることで遅くなるSQL文
てのがあるから、どのみちインデックスを意識した書き方に書き換える必要がある。
影響が小さい部分については無視してもいいだろうけど。
638NAME IS NULL:2007/01/17(水) 21:17:32 ID:BjRUYc3Y
MySQL 4.1だけど、3つのテーブルを left join したいんだけど、
どうやってかけばいいのですか?

whereならかけるのですが。。
639NAME IS NULL:2007/01/17(水) 23:37:47 ID:???
640NAME IS NULL:2007/01/18(木) 01:40:13 ID:08DKmF0L
ORACLEに詳しい方々

ちょっと教えて下さい。

@
↓のようなSQL文をファイルに出力したときに、
スペース埋めをしたいのに、タブで埋められてしまうときがあります。
どうしたら良いかわかる方がいたら教えてください。

select RPAD(a,12,' ') from table;

A
もう一つ教えてください。
↓のようなSQL文をファイルに出力したときに、
スペースの部分が出力されません。(a,bのみ出力)
どうしたら良いかわかる方がいたら教えてください。

select a,b,'    ' from table;
641NAME IS NULL:2007/01/20(土) 03:58:28 ID:wO82ibq/
>640
MySQLだと2番は問題ないなあ。(1番は調べてない)
まだこのスレを見てるならOracleスレにでも聞いてきたら?


ところで。
UPDATEは、WHERE句で指定した条件に一致するレコードが無い時はデータが更新されませんが、
一致するときはそのままUPDATEし、一致しない時はINSERT、つまりレコードを新規作成したいと思います。
どういう方法がスマートでしょうか? ちなみにMySQL 3.23です。

  id INT UNIQUE,
  x INT,
  y INT,
  z INT

(1)REPLACE
idとxのみを指定した時、既にyやzにデータがあっても消える。

(2)ON DUPLICATE KEY UPDATE
MySQL 3.23には対応してないっぽい。

(3)プログラム側でなんとかする
最終手段。
642NAME IS NULL:2007/01/20(土) 09:12:02 ID:???
>>641
答えは既に出ている気がするが?
643NAME IS NULL:2007/01/20(土) 17:06:09 ID:???
ハハハ、自分もそんな気はしてたんだ。
644NAME IS NULL:2007/01/20(土) 23:40:53 ID:nSU7I88I
これの様なER図で
http://new1314.freespace.jp/log/up/log/2686.png

装置名、セット製品名、構成製品名
を得るSQLはどう書けばいいでしょうか?
645NAME IS NULL:2007/01/21(日) 02:08:17 ID:???
>>644
宿題っぽいな

select t2.装置名 as 装置名, t3.製品名 as セット製品名, t4.製品名 as 構成性品名
from セット構成 t1
join 装置 t2 on t1.装置番号 = t2.装置番号
join 製品 t3 on t1.セット製品番号 = t3.製品番号
join 製品 t4 on t1.構成製品番号 = t4.製品番号
646NAME IS NULL:2007/01/23(火) 11:41:38 ID:FIn0GMHp
教えてください。

A,B,Cのテーブルがあって抽出条件にAに存在するIDと同じIDがBのIDもしくはCのIDに存在する場合は
Aのレコードを表示するというSQL文を作成したいです。テーブルが2つだけの場合は

SELECT * FROM A,B WHERE ID IN (SELECT ID FROM B WHERE ID)

とすることで期待する結果を得ることができたのですが、テーブルが3つ以上に
なった場合にどうしたらいいかわからず悩んでいます。
初心者なのでわけのわからない質問をしているかもしれませんが答えていただければ
幸いです。よろしくお願いしますm(_ _)m
647NAME IS NULL:2007/01/23(火) 15:16:15 ID:B3ToTsu2
SELECT users.var_staff AS Expr1, seals.var_staff AS Expr2
FROM users INNER JOIN
seals ON users.seals_id = seals.id

というテーブルがあり、seals.var_staffに格納されている「hoge」という値(複数行有り)のみを
users.var_staffにごっそりUPDATEしたいと考えています。
UPDATE users
SET var_staff = 'hoge'
WHERE (seals_id =
(SELECT id
FROM seals
WHERE (var_staff = 'hoge')))
という式を作りましたが「サブクエリは複数の値を返しました・・・」とエラーが出ます。
何か足りないとは思いますがわかりません。
ヒントだけでもいいので教えてください
648NAME IS NULL:2007/01/23(火) 15:19:35 ID:???
seals_id =
を、IN かEXISTS にするとか
649NAME IS NULL:2007/01/23(火) 18:38:49 ID:???
プログラム板で質問したら、こちらの板を案内されました。

次のようなデータ構造に対するRDBのテーブル設計について教えてください。

・(ID、分類、値)のデータの組が数十万件あります。
・「ID」はこのデータの組を一意に識別します。
・「分類」は、このデータの組を階層化して分類する次のような文字列
 例えばトップレベルの分類が"A"で次のレベルの分類が"B"、
 さらにその次のレベルが"C"だとすると、"A.B.C"
・「分類」の階層は少なくとも1レベル以上で上限はありません。
・「分類」の階層の数はデータの組ごとに異なります。
・「分類」の文字列は、各階層ごとに辞書的順序で順序付けされています。
 例えば、全てのデータの組を「分類」の順序でソートしたとすると、
 順に、Aの属するもの、A.Aに属するもの、A.Bに属するもの、A.B.Aに属するもの、
 A.B.Bに属するもの…、となります。ここで、Aに属するものは、A.AやA.Bなどに
 属するものとは重複して属することはなく、Aには属するがA.AやA.Bなどには
 属しないものとします。また、同じ分類に属するもの同士の順序は任意とします。

以上のようなデータ構造で、あるときにはトップレベルの分類だけでソートしたり、
あるときには、例えば分類A.Bだけは第三層まで見てあとは全て第二層までの
分類でソートする、あるいは、途中の階層にXの分類があるのみもの集計する、
といった具合に自由な階層構造でソートしたり集計したりしたいとします。
このような場合、どのようにテーブル設計をするのが良いでしょうか?
あるいは、参考になるURLなどを教えていただければ幸いです。
よろしくお願いします。
650NAME IS NULL:2007/01/23(火) 18:53:36 ID:???
>>648
INで出来ました!!
ありがとうございました!!
651NAME IS NULL:2007/01/23(火) 19:11:02 ID:???
>>649
分類が文字の辞書順であらわせてるわけだから単純にID、分類、値のテーブル1つでいい。
IDを主キーで分類に非ユニーク索引設定。
652NAME IS NULL:2007/01/23(火) 21:09:06 ID:???
>>651
レスをありがとうございます。

例えば、分類ごとの合計値が欲しく、A.B.CとX.Y.Zについては第四階層目の合計だが、
それら以外については第二階層目での集計が欲しい場合にはどのようになるのでしょうか?
あるいは、集計したい分類のリストが与えられているような場合はどのようになるのでしょうか?
653NAME IS NULL:2007/01/23(火) 21:50:44 ID:???
>>652
select 集計関数( ... ) from table1 group by SUBSTRING(分類,1,4) where 分類 like 'ABC%' or  分類 like 'XYZ%'
union all
select 集計関数( ... ) from table1 group by SUBSTRING(分類,1,2) where 分類 not like 'ABC%' and not like 'XYZ%'

関数は処理系で違ったりするから調べてみてくれ。
654NAME IS NULL:2007/01/23(火) 22:22:06 ID:???
話が抽象的過ぎて見えない。
長崎県長崎市、佐賀県佐賀市については町立小学校の生徒数の合計を出したいが
それ以外の都道府県については市立小学校の生徒数の合計を出したい、とかそんなイメージ?

・id、分類、値を持ったテーブル
・自身の分類コードと、1つ上位の分類コードを持った階層管理用のテーブル
・集計条件を設定するテーブル

をつくって管理すればいいんでは。
655NAME IS NULL:2007/01/24(水) 07:15:26 ID:???
質問です。
登録してあるプロシージャやパッケージの一覧を見たいのですが、
それを取得できるSQL文はありますでしょうか?
656NAME IS NULL:2007/01/24(水) 07:48:22 ID:1HbO06Nl
中河原、フォークリフトのブレーキに細工と聞いたが?
中河原、市会議員のコネで校に就職と聞いたが?
中河原、訓練生時代テストはカンニングと聞いたが?
中河原、裏口人生と聞いたが?
中河原、在日朝鮮人犯罪者組織・朝鮮総連創価学会の手先と聞いたが?
中河原、元々は出来損ないで、今は粉飾して立派に見せていると聞いたが?
中河原がなぜ首にならない。
657NAME IS NULL:2007/01/24(水) 18:45:39 ID:8TpZMG18
where like で大文字が含まれてる物だけを抽出したいのですがどうしたら良いでしょうか?
658NAME IS NULL:2007/01/24(水) 21:38:10 ID:???
where lower(カラム名) != カラム名
659NAME IS NULL:2007/01/25(木) 11:51:17 ID:qmqni+7N
再帰(階層構造)的に処理を行いたいのですが、どうしてもSQLが組み立てられなかったので知恵をお貸しください
------------------
本人 上司 給与
鈴木    100万円
山田 鈴木
斉藤 山田
-----------------
鈴木さんの給与を100万円として、直属の部下である山田さんには8割の80万円を給与としてます。
さらに山田さんの部下である斉藤さんには山田さんの給与の8割である64万円を支給します。
というように、上司の給与をもとに本人の給与を求めるようなSQLとしたいのですが。。
ちなみに上司がいない鈴木さんがROOTであり、給与は明確となってます。
START WITH 、CONNECT BYでなんとかなると思ってたのですが解を得ることができませんでした。
RDBMSはORACLEを使用してます。
660NAME IS NULL:2007/01/25(木) 13:03:18 ID:D7Zpx58m
得られないSQLをさらすとか。
方針はあってるからがんばってみるとか。
661NAME IS NULL:2007/01/25(木) 13:32:27 ID:???
>>659
SQL99のCTEで再帰クエリを使うとこうなった。
START WITH CONNECT BYは使ったことがないのですまん。

with emp2(本人, 上司, 給与, level)
as
(
 select 本人, 上司, 給与, 1 from emp1 where 上司 is null
 union all
 select emp1.本人, emp1.上司, cast(emp2.給与 * 0.8 as int), level+1 from emp1 
 join emp2 on emp1.上司 = emp2.本人
)
select * from emp2
662NAME IS NULL:2007/01/25(木) 18:24:57 ID:???
>>661
with句で宣言した名前emp2を、同じwith句の中で使用することってできるのでしょうか?
ora-32031でwith句の問い合わせの参照先が不正ですと怒られてしまいます。。
ちなみに私は↓でループして給与を求めようとしたのですが、鈴木さんの部下までしか
給与が求められませんでした。

begin
 for rec in (
  select 本人, 上司, 給与 , level
  from emp
  start with 上司 is null
  connect by prior 本人 = 上司
  order by level
 ) Loop
 update emp
 set 給与 = rec.給与 * 0.8
 where 上司 = rec.本人;
end Loop;
end;
/
663659:2007/01/25(木) 18:43:55 ID:qmqni+7N
↓のようにしたら欲しい結果は得られたんですが、どうみてもbatch処理でした。。

truncate table emp2;
begin
 for rec in (
 select 本人, 上司,  給与 , level
 from emp1 t1
 start with t1.上司 is null
 connect by prior 本人 = 上司
 order by level
  ) Loop

  INSERT INTO emp2
  SELECT T1.本人,T1.上司, NVL(T2.給与,rec.給与) * 0.8
  FROM emp1 T1 LEFT JOIN TABLE2 T2
  ON T1.上司 = T2.本人
  where T1.上司 = rec.本人;
end Loop;
end;
/
select * from emp1 where 上司 is null
union select * from emp2
664659:2007/01/25(木) 19:24:44 ID:qmqni+7N
で、できました!
出来上がったSQLの簡潔さにどっと疲れがでました。。。

select 本人, 上司, 給与,
CONNECT_BY_ROOT 給与 * power(0.8,level-1)
from emp
start with 上司 is null
connect by prior 本人 = 上司
665NAME IS NULL:2007/01/26(金) 23:47:08 ID:fnJFDcFV
OracleでどのカラムがPRIMARY KEYを取得できるSQLはありますか?
666NAME IS NULL:2007/01/27(土) 00:24:09 ID:???
>>665
SQLはないがたいていViewでスキーマの情報は取れる。
あとはOracleすれで聞いてくれ。
667NAME IS NULL:2007/01/27(土) 09:53:16 ID:???

SQLを始めたばかりの初心者です。
oo4oやADOを使用して、オラクルサーバーのデータをSELECT文でオラクル内の
複数のテーブルを結合してListViewで表示するプログラムを作成中です。

オラクルサーバーにメインデーターがあり
各クライアントにMDB形式でマスタデータがあります。
MDBのマスタデータにはたとえばですが、テーブル名 [商品テーブル]
フィールド名[コードナンバー]、[商品名]...
となっており、サーバーには、テーブル名[商品コード] 
フィールド名[コードナンバー]、[受注日]....があるとします。
クライアントからoo4oやADOを使用して、サーバーのデータをSELECT文でオラクル内の
複数のテーブルを結合してListViewで表示するのはできます。しかし
[コードナンバー]は取得できるのですが、サーバーのテーブルには、
[商品名]がないためとうぜん表示できません。
この場合、オラクルから取得したデータをマスタデータのあるMDBに新しくテーブルを
作りそこに一度格納して再度ADOで結合処理して
商品名を表示する方法しか考えつかないのですが、
ほかに良い方法はありますでしょうか?
ADOで接続MDBに保存再度ADOで接続して表示では
レスポンスが悪いかなと思いまして...

*VB6 winXP-pro オラクル9i
668NAME IS NULL:2007/01/27(土) 10:42:33 ID:O+RfWf9V
>>667
なんでマスタデータをクライアントで管理してるのさ?
マスタデータをクライアントから参照する仕組みじゃなくて
Oracleサーバ側で管理する仕組みにした方がよくないか?
669NAME IS NULL:2007/01/27(土) 12:02:00 ID:???
>>668
667です。たしかに私もマスタをOracleサーバ側で管理する
のが良いかと思いますが、このシステムを作り導入した業者
の仕様であり、マスタデータの管理場所を変更するとは不可
とのことです。
670NAME IS NULL:2007/01/27(土) 12:11:39 ID:???
>>667
mdbとoracleの両方をado接続にすれば異種ソースでの結合は出来る。あとは専用スレへ。

といってもADOの専門スレはないから近めのこの辺で質問して大丈夫だと思う。
ADO DAO など接続方法について
http://pc10.2ch.net/test/read.cgi/db/1059027812/l50
671NAME IS NULL:2007/01/27(土) 19:48:42 ID:???
MySQL 4.1.11
日付テーブルが一つ date_tbl
kyuujituflg は土日(休日)の時は"a"、平日はスペース
workdate kyuujituflg
2007-01-04 " "
2007-01-05 " "
2007-01-06 "a"
2007-01-07 "a"
2007-01-08 "a"
2007-01-09 " "
2007-01-10 " "

Aデータテーブル A_Data
inputDate hoge hoge2 〜
2007-01-04 dddd sssss
2007-01-10 wwww ggggg
とあった時に平日でA_Dataへの入力漏れを調べたいのですが、
どのように書けばいいのか教えてくだされ m(__)m
この例だと 2007-01-04と2007-01-09が漏れている日付だという
ことになるのですけど。
672NAME IS NULL:2007/01/27(土) 19:51:44 ID:???
select workdate from kyuujituflg
where kyuujituflg = " "
  and workdate not in (select inputDate from A_Data)
673NAME IS NULL:2007/01/27(土) 21:06:06 ID:???
>>672
素早いレス、有難うございますm(__)m
実際にはないはずだがな〜と思いながらやってみたら、
1件漏れを発見してしまいました(^^;
674NAME IS NULL:2007/01/28(日) 01:47:44 ID:???
テーブル:本
ISBN タイトル 出版社 定価

テーブル:売上
ISBN 売り上げ日 得意先名 数量

テーブル:得意先
得意先名 住所 郵便番号

こういう3つのテーブルがあったとして、
これらを自然結合すると、

ISBN タイトル 出版社 定価 売り上げ日 得意先名 数量 住所 郵便番号

となるんでしょうか?
単純に重複しないようにまとめるって認識してるんですが、あってるんでしょうか?
675NAME IS NULL:2007/01/28(日) 03:14:47 ID:???
やっかいなことに、
ISBN タイトル 出版社 定価 ISBN 売り上げ日 得意先名 数量 得意先名 住所 郵便番号
となるます。
676NAME IS NULL:2007/01/28(日) 03:38:58 ID:???
>>674
あってるよ。
677NAME IS NULL:2007/01/28(日) 12:03:29 ID:cfqNQTKv
MySQL4.0.24でクエリを書いていて、困ったことが出てきたのでご意見をお聞かせ下さい。

今、掲示板のデータを保存するテーブルtbl_bbsがあり、ここにsubjectとcontentsというカラムがあります。
この2つのカラムを連結させて、検索キーワードを基にLIKE演算子を使って検索したいのですが、
MySQL4.2.24ではインラインビューやビューがサポートされていません。

そのため、例えば
SELECT concat(subject, IFNULL(contents, '')) AS sc FROM tbl_bbs;
でsubjectとcontentsを結合したカラムは取り出せるのですが、これを基にLIKE演算子で検索することが出来なくて困っております。

インラインビューやビューが使えない場合、一度SELECTした結果をもとに検索をする場合は
クエリを2回に分けるしかないのでしょうか??
678NAME IS NULL:2007/01/28(日) 12:32:12 ID:???
mysqlは知らないけど、サブクエリを使わなければいい、ということであれば
where concat(subject, IFNULL(contents, '')) like '%キーワード%'
とか
where subject like '%キーワード%' or contents like '%キーワード%'
でいけるのでは
679NAME IS NULL:2007/01/28(日) 12:47:51 ID:???
>677
やぁ、数週間前の俺。MySQLのバージョンは違うがな。(3.2…)

自分も最初は>678のような方法でやってたんだけど、
結局、検索用のテーブルを作っちゃったよ。
680677:2007/01/28(日) 13:01:11 ID:???
>>678
どうもありがとうございます。後者だと複数キーワードで検索するときにちょっと厳しいですが、前者でいけますね・・・なんでこんなに単純なことに気付かなかったんだろう。
複数キーワードになったときにクエリ文が異常に長くなりそうですけど。。。

>>679
検索用のテーブルを作っちゃうの、ありですね。そっちの方が早いかも!ありがとうございます。
681NAME IS NULL:2007/01/29(月) 22:01:11 ID:2jSggXiy
IsolationがREAD UNCOMMITTEDで
2つ別々の接続で
同一キーにてInsertした場合ってどうなります?

Tran A

Insert a

Tran B

insert a

てな感じで

競合の概念がいまだによくわかりません。
682NAME IS NULL:2007/01/29(月) 22:18:48 ID:???
READ COMMITTEDの場合、TranBは先行したTranAがコミットかロールバックするまで待機。
もしコミットしたらキーの重複でエラーが発生する。
READ UNCOMMITTEDの場合、即座にキーの重複でエラーが発生する。
683NAME IS NULL:2007/01/29(月) 22:31:15 ID:???
ただし待機する処理系も多いかもしれないな。
OracleだとUNCOMMITTEDを指定しても実際にはCOMMITTEDと同じ扱いになる。
684NAME IS NULL:2007/01/29(月) 22:33:36 ID:2jSggXiy
>>682
ありがとうございます。

もうひとつ
例えば主キー以外の項目のある値
日付とかがあって
Insertの際にその日付の中からMAX+1の値をInsertする場合
(現状MAXが2007/01/01だとして)

TranA、TranBが上記のようなタイミングで発生した場合に
確実にあとの(2つめ)コミットが2007/01/03でコミットされるためには
ファントムインサートが発生しない、SERIALIZEでないと無理でしょうか?

こういう情報についての良書とかもあれば教えていただきたい。
685NAME IS NULL:2007/01/30(火) 00:01:37 ID:???
>>684
難しい質問だにゃ。
Serializableで共有ロック方式の場合
(パターン1)
MAXで求まる値を10と仮定する。
TranAがMax値(10)を取得。Max以上がキー範囲の共有ロック(ネクストキーロックなど)となる。
TranAがMax+1(11)で新レコードを追加する。
TranBがMax値を取得しようとするがTranAのロックのため待機。
TranAコミット後TranB処理続行。
TranBがMax値(11)を取得。Max以上がキー範囲の共有ロック(ネクストキーロックなど)となる。
TranAがMax+1(12)で新レコードを追加する。
コミット
(パターン2)
TranAがMax(10)値を取得。Max以上がキー範囲の共有ロック(ネクストキーロックなど)となる。
TranBがMax(10)値を取得。Max以上がキー範囲の共有ロック(ネクストキーロックなど)となる。
TranAがMax+1(11)で新レコードを追加しようとするがTranBによるロックで待機。
TranBがMax+1(11)で新レコードを追加しようとするがTranAによるロックで待機。
デットロックのためTranAかBのどちらかが失敗となる。仮にTranBが失敗とする。
TranA新レコードを追加完了。コミット。

insert select は1文だからパターン1になることが保障されてる処理系が多いと思う。
686NAME IS NULL:2007/01/30(火) 00:11:21 ID:???
マルチバージョニング方式のSerializable場合
(パターン1)
TranAがMax(10)値を取得。
TranAがMax+1(11)で新レコードを追加する。
TranBがMax(10)値を取得。
TranBがMax+1(11)で新レコードを追加する。(注)
TranAコミット
TranBコミット

(パターン2)
TranAがMax(10)値を取得。
TranBがMax(10)値を取得。
TranAがMax+1(11)で新レコードを追加する。
TranBがMax+1(11)で新レコードを追加する。(注)
TranAコミット
TranBコミット

注:日付+値でユニークキーが設定されている場合はここで待機。TranAがコミットした時点で重複エラー
687NAME IS NULL:2007/01/30(火) 01:00:22 ID:???
>>685
共有ロックのパターン1の最後2行訂正
TranBがMax+1(12)で新レコードを追加する。 
TranBコミット

まとめると、キー範囲式の排他ロックをfor update構文などで指定できるDBMSなら対応できるが、
分離レベルで対応するのは不可能か失敗が発生する。あとはテーブルロックをかける手も無くはない。
MAX+1よりシーケンスやIdentity属性列を使うことをすすめる。

もっともMyISAMの更新は常にテーブルロックなのでID列はMAX+1で実装してたりする。
688674:2007/01/30(火) 01:16:03 ID:???
>>675
そうなんですか??
重複した属性を除去した結合演算を自然結合と言うのではないのですか?

>>676さんとどちらが正しいのでしょうか?
それとも、私の書いた情報だけではどちらも正しいと言えるのでしょうか
689NAME IS NULL:2007/01/30(火) 01:27:22 ID:???
rdb?
690NAME IS NULL:2007/01/30(火) 01:57:19 ID:???
>>688
select ほにゃらら
from 売上 natural join 本 natural join 得意先

ほにゃららの部分は下のようにかけるわけだが、
1) select *
2) select 売上.*, 本.*, 得意先.*
3) select 売上.ISBN, タイトル, 出版社, 定価, 売り上げ日, 売上.得意先名, 数量, 住所, 郵便番号

1) に関してはどう出るかは処理系依存だろうな。MySQLは2)と同じ出方だと思う。
確実に結合した使ったキーのダブりを消したいなら 3)のように書く。
691NAME IS NULL:2007/01/31(水) 23:47:24 ID:???
よくあるパターンだと思うのですが、意外に情報少なくて困ってます。
お願いいたします。

店テーブルと商品テーブルとお互いのIDを主キーにしたラインナップテーブルがあったとして
例えば商品4を扱っている店とその店が扱っている全ての商品を下のような形の配列で取得したいです。

[shop_id] => 1
   [shop_name] => 店1
   [item] => Array
      [item_id] => 1
      [item_name] => 商品1

      [item_id] => 3
      [item_name] => 商品4

[shop_id] => 3
[shop_name] => 店3
   [item] => Array
      [item_id] => 4
      [item_name] => 商品4

[shop_id] => 6
[shop_name] => 店6
   [item] => Array
      [item_id] => 2
      [item_name] => 商品2

      [item_id] => 4
      [item_name] => 商品4

こんな感じの多重配列を取り出したいのですが、
今のところ、一回、店テーブルから商品4を扱っている店の列を副問い合わせして、取り出した後
その配列をまわし、もう一度ラインナップテーブルにSELECTを発行して上のような配列を得ています。

プログラム版で「内部的なSELECT回数は別としてSQL一発でいける」といわれたのですが
どのようなSQLでいけるのでしょうか?いちおうpostgreSQLを使ってるのですが、だめだったらMySQLでも構いません。

また、上の例の、商品を扱ってる店をSELECTする方法ですが、商品が複数の時でも対応できるように
(例えばid 4、5の商品を扱っている店)
select * from 店テーブル where shop_id in
   (select shop_id from ラインナップテーブル where item_id in (4,5) group by shop_no having count(item_id) = 2);
とやってるのですが、あんまり一般的じゃないでしょうか?
もっとスマートな書き方があったらお願いいたします。

長文 and 駄文失礼します
692691:2007/01/31(水) 23:53:01 ID:+SZ2fAsV
うぎゃ
あげ忘れました。

Janeに変えたらデフォでsageになってて・・・

お願いします
693NAME IS NULL:2007/01/31(水) 23:54:35 ID:???
select lineup.shop_id, lineup.shop_name, item.item_id, item.item_name
from lineup, item
where lineup.item_id = item.item_id
and lineup.shop_id in (select shop_id from lineup where item_id = 4)

でいいんじゃね?
694NAME IS NULL:2007/02/01(木) 01:15:30 ID:???
select
shop_id,(select shop_name from 店テーブル where shop_id=ラインナップテーブル.shop_id),
item_id,(select item_name from 商品テーブル where item_id=ラインナップテーブル.item_id)
from ラインナップテーブル A where
exists(select * from ラインナップテーブル where shop_id=A.shop_id and item_id=4)
and
exists(select * from ラインナップテーブル where shop_id=A.shop_id and item_id=5)
695NAME IS NULL:2007/02/02(金) 02:30:46 ID:???
SQLの学習をしているのですが
「==」で列を連結する方法がわかりません
おねがいします
696NAME IS NULL:2007/02/02(金) 10:50:17 ID:???
||'=='|| とか?
697NAME IS NULL:2007/02/03(土) 18:31:49 ID:ys+p5+nY
黒本のSQLやってんだけど
全く意味が分からん…

18pの例で
SQL> SELECT * FROM 部署 ;
って打つと

10 経理    東京
20 研究開発 名古屋
30 営業    大阪
40 管理    東京

って出てくるらしいが
俺がやると何度やっても

行1でエラーが発生しました。:
表またはビューが存在しません。

となってデータが全く表示されない
698NAME IS NULL:2007/02/03(土) 18:36:34 ID:???
まずはテーブル作れ。サンプルテーブルとか付いてないのか?
699NAME IS NULL:2007/02/07(水) 13:00:38 ID:8Sa1sPL2
ACCESSを弄っているのですが

SELECT * FROM テストテーブル WHERE '日付/時刻' < '2007/02/07'
で結果が返ってきません

SELECT * FROM テストテーブル WHERE '日付/時刻' > '2007/02/07'
だと全データが検索結果に表示されます

日付時刻以外の検索は上手くいっているのですが
間違っている箇所があれば指摘お願いします
700NAME IS NULL:2007/02/07(水) 13:09:59 ID:???
>>699
日付/時刻 ってのはフィールド名?何でシングルクォートで囲んでるの?
あと、Access では、#07/02/07# と日付を書く場合もあるよ。
701NAME IS NULL:2007/02/07(水) 13:11:33 ID:???
'日付/時刻'という文字列

'2007/02/07'という文字列

の比較をしているんだから、正しい動作だな。

「日付/時刻」というのがフィールドならそれなりの扱いをしなきゃ

702NAME IS NULL:2007/02/07(水) 13:19:18 ID:???
>>700,701
レスありがとうございます。

「日付/時刻」はフィールド名なのですが
間に/が入っているために動作がおかしくなります
703NAME IS NULL:2007/02/07(水) 13:39:50 ID:???
>>702
Accessはようしらんがダブルクォート(")で括るとか、なんか試せば?
つーか、動作がおかしくなるようなフィールド名つけるほうが悪い。
704236:2007/02/07(水) 14:07:34 ID:IUHHkPFV
友達の好きな物テーブル
友達ID | 好きなものID
--------------------
  5  |   1
--------------------
  5  |   2
--------------------
  5  |   5
--------------------
  5  |   8
--------------------
  1  |   1
--------------------
  1  |   2
--------------------
  1  |   3
--------------------
好きな物が 1 と 8 が有る場合
友達id5のみを結果セットするにはどうすればよろしいでしょうか。
下記でやってもうまくいきません・・さっぱりです。

友達ID=autonum
SELECT
DISTINCT
p.autonum as autonum,
p.name1 as name1,
p.name2 as name2,
p.e_name1 as e_name1,
p.e_name2 as e_name2
FROM 友達TBL p
LEFT JOIN 友達の好きな物テーブル o2 ON p.autonum = o2.友達ID
where o2.好きなものID like 1 AND o2.好きなものID like 8

ANDを使わず条件を一つだけにすれば出てくるのですが・・
アドバイスよろしくです。
705NAME IS NULL:2007/02/07(水) 14:08:38 ID:IUHHkPFV
名前番号まちがえましたスマセン
706NAME IS NULL:2007/02/07(水) 14:57:49 ID:WH4ReGmf
SQLServerで文字型で日付を持つ列と時間を持つ列があってこれを
日付型に変換したいんですけどいい方法あれば教えてくださいm(_ _)m

例えば
A     B
20060101 103040

2006/01/01 10:30:40
のように。
707NAME IS NULL:2007/02/07(水) 15:27:32 ID:???
>>704
最終的に欲しい結果のイメージがわからないのだが、AND を OR にするとかそう話じゃない?

>>706
あまりスマートな方法はない。
substringで yyyy-mi-dd hh:mm:ss の形に編集して
convert(datetime, '2006-01-01 10:30:40', 120)
708NAME IS NULL:2007/02/07(水) 15:56:06 ID:???
>>704
意味ワカランがこんな感じか?
SELECT name FROM
(SELECT * FROM 友達TBL WHERE e_name=1)
JOIN
(SELECT * FROM 友達TBL WHERE e_name=8)
USING(name);

>>706
そのままキャストしてもダメかな?
SELECT cast(A AS DATE),cast(B AS TIME) FROM ...
709704:2007/02/07(水) 16:29:39 ID:IUHHkPFV
>707
or にすると 友達ID 1 もでてきちゃうのです。

>良く分からない
友達TBLと友達の好きな物テーブルというテーブルが二つあり
好きな物テーブルに
友達ID5と1リンゴ、ID5と2バナナ、ID5と5チェリー、ID5と8みかん
と保存してます。

検索時に1リンゴと8ミカンを好きな友達を検索します。
それを満たしてる人の表示をさせたいです。

autonum name1 name2 ename1 ename2
5、東京、太郎、tokyo、tarou
31、大阪、次郎、osaka、jirou

分かっていただけたでしょうか。
もしくは、、やりかた(考え方)自体まちがってるのかな。
710NAME IS NULL:2007/02/07(水) 17:01:27 ID:???
>>709
select * from 友達TBL p
 where exists (select * from 友達の好きな物テーブル where 友達ID = p.autonum and 好きなものID = 1)
  and exists (select * from 友達の好きな物テーブル where 友達ID = p.autonum and 好きなものID = 8)
711NAME IS NULL:2007/02/07(水) 17:08:31 ID:WH4ReGmf
>>707
ありがとうございます!確かに少し長くはなりましたが期待する
結果を得ることがができました!!

>>706
説明不足ですみません。日付と時間をどうしても1つの列で
持ちたかったのでCASTだけではだめでした。ただCASTの存在
すら知らなかったのですが^^;、勉強になりました。


レス頂いた方ありがとうございますm(_ _)m
助かりました。


712704:2007/02/07(水) 17:15:42 ID:IUHHkPFV
>710
ぎゃぁ!できた!ありがとうございます!

検索方法として探す条件が10-20個になっても問題なさそうですか?
もしかして皆もっと複雑で凄いのとかなんでしょうか
SQLは使った事がなくて、
一般的なのかどうか皆目検討がつかない状態です。
713NAME IS NULL:2007/02/07(水) 17:16:52 ID:???
>>709
>>710で回答されちゃってるが、こんなのも思いついた。
SELECT P.* FROM 友達TBL AS P JOIN (
SELECT * FROM 友達の好きなものテーブル AS L1,友達の好きなものテーブル AS L2
USING (友達ID) WHERE L1.好きなものID=1 AND L2.好きなものID=8
) AS T1 ON P.autonum=T1.友達ID;

>>711
キャストが通れば足し算すればいいじゃん。
SELECT cast(A AS DATE) + cast(B AS TIME) FROM ...
714NAME IS NULL:2007/02/07(水) 17:56:09 ID:???
MSSQLではdatetimeでcastを使うとシステムが適当に推論するので
バージョンやロケールの違いで変換できなかったり違った意味に変換されたりする。
故にconvertが推奨。

日付時刻型はDBMS間で統一のとれてない部分のひとつ。
ANSI SQLでかなり後から標準化したのだが、キーワードが既存のものとかぶりすぎてどこもサポートに熱心じゃない。
日付時刻 timestamp、日付だけ date、時刻 interval
なんだけど、timestampはデータの更新時に値が変更される機能を持つものが多いし、
dateはOracleでは日付時刻の意味。
普及させようとも思ったら既存のものと並存できるような名前と機能にしないとだめだと思う。
715NAME IS NULL:2007/02/09(金) 15:22:00 ID:???
質問です。
こんなテーブルがあったとして、

SHOP | ITEM |
-------------
A | 1 |
A | 2 |
A | 3 |
B | 4 |
B | 5 |
B | 6 |
C | 2 |
C | 4 |
C | 5 |
D | 8 |
D | 10 |
D | 12 |
この表は >12 の表を流用。


指定したお店の売ってる物を列挙するのは
SELECT ITEM FROM TABLE WHERE SHOP==A
で良いと思うのだけど、この結果を利用して
指定したお店と売ってる物がかち合うお店とかち合う商品を検索したい。

こういった、SQL の結果を利用してさらにSQLを作る方法を知りたいのだけど、
なんてキーワードでぐぐるといいのかが知りたい。


もひとつ基本的な質問。
インデックスっていうのは検索高速化のためのハッシュテーブル
みたいな物と考えていいのかな。
たとえば ITEM の列にインデックスを設定したら、
ITEM|ROW
1  |1
2  |2,7
3  |3
4  |4,8
5  |5,9
6  |6
みたいなテーブルが裏でできてて、ITEM==4の行を検索するときに
この表を参照して4,8行目を返す・・・みたいなイメージであってる?
716NAME IS NULL:2007/02/09(金) 16:27:13 ID:???
答1 : 副問い合わせ、サブクエリー
717NAME IS NULL:2007/02/09(金) 17:50:07 ID:Bf157FZO
MySQL 3.23.58 を使っています。

ID, DATE という2つのフィールドを持つテーブルがあるんですが、
DATEに入力されているレコードの日付毎に件数を求めるにはどうすればいいでしょうか?
DATEには以下のような書式でレコードが入っています。

2007-02-07 22:26:44

そして残念なことにDATEフィールドはCHAR型なのです。
前10文字だけ取り出してそこでGROUP BYとかできるのでしょうか?
よろしくお願いします。
718NAME IS NULL:2007/02/09(金) 17:56:21 ID:???
自己解決しました。こんな感じで。

SELECT SUBSTRING(DATE, 1, 10 ) AS DATE, COUNT( * ) FROM __TABLENAME__ GROUP BY DATE;
719NAME IS NULL:2007/02/09(金) 18:17:24 ID:???
group by の方もsubstring使わなくて平気なのかな
720NAME IS NULL:2007/02/09(金) 18:52:02 ID:???
>>715
インデックスの方は違うな。
それだと、UNIQUE制約のかかったカラムでは意味を成さない。

>>719
平気
721720:2007/02/09(金) 18:55:55 ID:???
ゴメソORDER BYと勘違いした。

>>718の場合、平気なものとそうでないものがあるはず。
PostgreSQLなんかは可能。
722NAME IS NULL:2007/02/12(月) 00:02:19 ID:???
集合論が好きな人がRDBに向いてそうだなあ。
723NAME IS NULL:2007/02/12(月) 10:51:31 ID:o/ZDMXEi
力を貸して下さい。お願いします。

下記の表で、←を付けた行のように
     各ID1の中で、DATE1+TIME1が一番大きい行
を抽出したいのですが、いいクエリーが思いつきません。

[TABLE1] Key(ID1, DATE1, TIME1)

ID1 DATE1 TIME1 VALUE1
---- ---------- -------- ------
0001 2007-01-01 12:00:00 AAAA
0001 2007-01-01 18:00:00 BBBB ←
0002 2007-01-01 07:00:00 CCCC
0002 2007-01-03 07:00:00 DDDD ←
0003 2007-01-02 04:00:00 EEEE ←
724NAME IS NULL:2007/02/12(月) 15:12:58 ID:???
>>723
分析関数使えるDBなら分析関数で。

使えないならこんな感じか。
select * from TABLE1 A where
not exists(select * from TABLE1 where ID1=A.ID1 and DATE1>A.DATE1)
and
not exists(select * from TABLE1 where ID1=A.ID1 and DATE1=A.DATE1 and TIME1>A.TIME1)
725NAME IS NULL:2007/02/12(月) 15:48:06 ID:COhphUXe
とても初歩的な質問で悪いのですがMySQLとPostgresSQLの両方をパソコンにインストールするのって
やらない方がいいですかね?

SQLのソフトのメモリの量とか実行のスピードとかよく分からないのでお願いします。
726NAME IS NULL:2007/02/12(月) 16:03:19 ID:o/ZDMXEi
>>724
ありがとう。勉強になりました。

分析関数というのはMax()とかのことですよね?

自分は、Max()を使ってどうにかしようとしたのですが、力及ばずでした。
後学のために、Max()を使った場合のクエリーも教えて下さい。
# なお、使用しているDBMは、IBM UDBのDB2です。
727NAME IS NULL:2007/02/12(月) 16:49:16 ID:???
>>726
MAX()でもできるんだろうけど、ランク関数みたいなやつのことです。
ID1ごとに順番振って順番が1のをもってくるとか。DB2は使えるみたい。

rank() over ( patition by ID1 order by DATE1 desc,TIME1 desc)
728NAME IS NULL:2007/02/12(月) 18:45:35 ID:o/ZDMXEi
>>727

ありがとうございます。
恥ずかしながら、RANK関数、DENSE_RANK関数の存在を初めて知りました。

それらをキーワードに調べた結果、ID1毎のRANK一位のレコードを抽出する
クエリーは下記となりましたが、これで良いのでしょうか?
# 下記のSQLを発行して期待の結果が出てきたのは確認したのですが、
# これが最適かどうかに自信を持てないもので。。。

Select *
From (
Select T.*
, Rank() Over( Partition By ID1 Order By DATE1 Desc,TIME1 Desc) RANK
From Table1 T
) As S
WHERE RANK = 1

また、コスト(検索速度、検索負荷)的には先ほど(724)のクエリより、こちらの方が
良いと考えればいいのでしょうか?
729NAME IS NULL:2007/02/12(月) 20:43:20 ID:???
>>728
分析関数使う方法はいろんなところで紹介されてるし、いいんじゃないかな。
http://oraclesqlpuzzle.hp.infoseek.co.jp/10-111.html
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=33067&forum=26&start=8&14

コスト的には、気になるなら実行計画確認したり時間くらべたりしてみては。
データがめちゃくちゃ多いとなるとテーブル設計からみなおしたほうがいいと思うけど。
730NAME IS NULL:2007/02/12(月) 22:41:59 ID:???
クエリの書き方について質問です。ORACLE 10gを使用しています。

1・FROM句中で宣言したインラインビューは、(同じ)FROM句で他テーブルとのJOINができないようなのですが、
どうしても同一クエリ中に収めたい場合に何か手段はありますでしょうか?
それともスキーマにVIEWを設定した上でその VIEWを用いるように対処しなくては実現は不可能でしょうか?

2・LEFT JOIN、RIGHT JOINの順序は、結合後にできる表に対して影響を及ぼさない認識でよいでしょうか?(よくない場合の反証を簡単に教えていただけると更にありがたいです)

3・INNER JOINはWHERE句と置き換えてしまってもよいでしょうか?また、置き換えてよい場合、例えばLEFT JOINする表にINNER JOINしている場合でも適用できますか?
731NAME IS NULL:2007/02/13(火) 07:43:57 ID:???
>>730
試してないけど1番はサブクエリに別名をつけてないからとかでない?
732NAME IS NULL:2007/02/17(土) 06:12:55 ID:???
おまいらSQL書くときのインデントってどうしてますか?

俺はなんとなく
SELECT col1,col2.col3
FROM table1
WHERE col1='0001'
みたいにSELECTのTを基準に中央揃えっぽく書いてるんだけど

SELECT
col1
,col2
,col3
FROM
table1
WHERE
col1='0001'
っつーソースを見つけたんでなんとなく気になった。
あとOUTER JOINとかサブクエリのときはどうするのがわかりやすいのかな?かな?
733NAME IS NULL:2007/02/17(土) 11:48:42 ID:rqmrrQP7
>>732
俺はTの後のスペースを中心にしてる。
. SELECT COL1
. ,COL2
. FROM HOGE
. WHERE COL1=1
. AND COL2=2
734NAME IS NULL:2007/02/17(土) 11:49:15 ID:rqmrrQP7
表現できてねぇ
735NAME IS NULL:2007/02/17(土) 14:21:38 ID:???
>733
736NAME IS NULL:2007/02/17(土) 14:24:35 ID:???
変更があったときに、その行だけ入れ替えればいい、って発想ね。
確かにそうなんだけど、文頭に「,」が来るのはなんか嫌な感じ。
737NAME IS NULL:2007/02/17(土) 14:33:05 ID:68lerIu8
>>736
後で検索列追加の場合に便利なんだよ、この記述

SELECT
A
,B
FROM

から
SELECT
A
,B
,C
FROM
への変更で、Bの列に影響なし、逆に削除も自己完結。
後ろについてると、最後の列の削除とかで前の列をいじるなど対応が必要。

まあ、とっても小さい話だけどね。w
738NAME IS NULL:2007/02/17(土) 14:35:04 ID:???
>>737
だから、それはわかってるってww
でも、見た目がきれいじゃないから嫌いなのよ。
739NAME IS NULL:2007/02/17(土) 14:38:55 ID:68lerIu8
まあ、私も列は麻雀のごとく列6個切りとかしてるけど。

意味(読んだときに切れると丁度良い句読点みたいな感じ)で切るときと、機械的に個数で切るときが併用
740NAME IS NULL:2007/02/17(土) 19:30:35 ID:???
行頭にカンマがあったほうが「ここは前行からの続きですよ」という表現になって見やすい
741NAME IS NULL:2007/02/18(日) 11:57:49 ID:STh+n8h3
テーブルの設計について質問です。
簡単な例として住所録を作ることを考えます。

1) 日本人、アメリカ人、などなど色々な国の人が登録される
2) 人物の基本情報(性、名、生年月日、国)は何人でも共通
3) ただし、国によって住所のフォーマットがばらばら
4) 日本人は都道府県市区町村だけど、
どっかの国の人は全然違う住所の表記法だとする

4)のような場合は、日本人は使わない列が出てきてしまいます。
C++とかの発想で言うと、
「人物テーブル」に人物クラスを入れたいが、
派生クラスである日本人クラスやアメリカ人クラスは、
それぞれ違うメンバー変数を持っている、という感じ。

こういうときって、
「人物テーブル」には基本情報だけを入れておいて、
国籍ごとに「日本人住所テーブル」、「アメリカ人住所テーブル」などを作り、
JOINさせるっていうのが普通でしょうか。
他に何かこうやればいいってやり方ありますか?
742NAME IS NULL:2007/02/18(日) 13:22:04 ID:???
>>741
XMLデータベースでも使えば。
DB2とか。
743NAME IS NULL:2007/02/18(日) 13:29:10 ID:???
>>741
あたりまえだけど、検索方法と件数、メインとなるデータに依存する。

都道府県や市、州などで検索したいなら、それ用のフィールドを用意するし、
そういう検索がないのなら、でかいテキストフィールドを用意しておいて、
その中に区切り文字を入れて突っ込む、という手もある。

データとして日本がほとんどなら、日本用の住所テーブルにアメリカや
その他の国の住所表記をカバーするフィールドを用意しておけばいいだろう。

メンテやらのことを考えると、別テーブルにするのはあんまりよくなさげ。
744NAME IS NULL:2007/02/18(日) 14:35:22 ID:???
>>741
PostgreSQLにはテーブルの継承ってのがあって、うまく使えば便利そうな気もするが、
どの派生テーブルを利用するかはホスト言語側で判断しなきゃならんだろうし、やや癖もある。
まぁ、SELECT時にJOINしなくて済む、INSERT時に一括でできる、と考えればいいかなと。
ttp://www.postgresql.jp/document/pg821doc/html/ddl-inherit.html

基底テーブルで検索して派生テーブルデータを取得しようとすると面倒だが、
それはC++等のOOPでも似たようなもんだろう。
745NAME IS NULL:2007/02/18(日) 14:49:50 ID:???
>>741
スーパータイプ/サブタイプの問題はここ数年のテクニカルエンジニア試験では
しょっちゅう出てきているので、まずは特定の実装に依存しない普遍的な
知識を得るためにその手の参考書を読んでみることをオススメする。
746NAME IS NULL:2007/02/18(日) 18:10:18 ID:KAlPoj7C
SQLで、データに半角カナが混ざってるレコードを抜き出す処理って可能でしょうか?
747741:2007/02/19(月) 04:58:46 ID:???
>>742-745
ありがとうございました。

これといった王道はないようですが、
検索ワードがわかりました。
調べて自分の環境に最適なものを探してみます。
748NAME IS NULL:2007/02/19(月) 15:04:00 ID:apNvUggO
対象期間内で連続したx日間(date型)データが存在する場合に対象データを抽出、
という処理を行いたいのですが可能でしょうか?
ちなみにMySQLです。
749730:2007/02/20(火) 04:25:09 ID:???
>>731
別名つけてます。うーん、弱ってます。
750NAME IS NULL:2007/02/20(火) 06:48:14 ID:???
>>749
一般的にはできるから、その出来ないSQLを晒したらいいと思うよ
751NAME IS NULL:2007/02/21(水) 00:23:02 ID:???
あるテーブルAがあって、Aには、Bという列だけがあります。

B(DateTime型, unique)
--------------------
1/1
1/5
1/4
1/9
--------------------

このテーブルAにorder by Bをかけた上で、
--------------------
1/1
1/4
1/5
1/9
--------------------

各レコードの日付間隔をとって、
列を1つだけ持つ以下のような結果セットを返すことって
SQL的には可能でしょうか?(SQL Server 2005)

(int型)
--------------------
3
1
4
--------------------

↑この結果セットの順番は別に1, 3, 4でも4, 3, 1でも3, 4, 1でも何でも構わないのですが・・・

ストアド使ってレコードを回しながら自前で処理するべきなのかどうか迷っています。
アドバイス、ヒント等いただければ幸いです。
752NAME IS NULL:2007/02/21(水) 00:50:56 ID:???
>>751
SELECT (SELECT min(b) FROM A WHERE T1.b<b) - b FROM A AS T1;
753NAME IS NULL:2007/02/21(水) 01:07:59 ID:???
>>752
試してみたら動きました。ありがとうございました。
SQLの凄さを実感しました。
754NAME IS NULL:2007/02/21(水) 18:06:36 ID:fA2XFasj
Firebirdで下のTABLE1から

■TABLE1
JOB   TIME   TYPE
-----------------------
A     2.0      X
B     3.5      Y
C     2.0      X
A     1.0      X
C     2.0      Y
B     2.5      Z


JOB   TYPE=X合計  TYPE=Y合計  TYPE=Z合計
------------------------------------------------
A     3.0        0.0         0.0
B     0.0        3.5         2.5
C     2.0        2.0         0.0

上記のような結果を取得したいのですが、こんなこと可能なんでしょうか。
ヒントでもよろしいのでご教授願います。
755NAME IS NULL:2007/02/21(水) 19:25:06 ID:???
>>754
CASE文, GROUP BY, SUM関数
756754:2007/02/22(木) 08:12:49 ID:???
>>755
ありがとうございます。
CASE文のことは全然知りませんで助かりました。
757NAME IS NULL:2007/02/24(土) 01:56:39 ID:???
質問です。

テーブル1のキーの上2桁で値を集約し、
テーブル2にデータを作成する処理をPLSQLで作ろうとしているのですが、
SQLでうまくデータをとれません。

テーブル1      ⇒     テーブル2
---------           ---------------
キー 値段            キー上2桁 値段
100  10             10       20
101  10             20       30
200  30

テーブル1からデータを取得するときに、
select substr(キー,1,2), sum(値)
from テーブル1
group by キー

とすると、キー3桁で集約されてしまいます。

カーソル1:テーブル1からデータを取得、集約
 ⇒1行ずつテーブル2にinsert

するように実装しようとしたのですが、
そもそもSQL一発でsubstringした値で集約する
ことはできませんか。
758NAME IS NULL:2007/02/24(土) 02:31:13 ID:cpeo3iSw
すいません、質問させてください。
今、ストアドプロシージャを書いているのですが
複数の行にUpdateかけて、その後、そのUpdateが何行にかかったか調べたいのですが
何か変数みたいなのがあるのでしょうか??
たとえば、

Update table1 set 列1 = 1;

って更新した後、列1=1という行は複数あるとき、当然複数の行が更新されるはずですが
その後、その行の数を調べるには、SELECT COUNT(*)で調べるしかないのでしょうか?
759NAME IS NULL:2007/02/24(土) 03:06:32 ID:RYL1/nEC
改行を除外した日本語文字列を取得したいのですが、どうしたらいいですか?
使ってるのはSymfowareとかいう奴です。
760NAME IS NULL:2007/02/24(土) 05:04:07 ID:???
>>757
GROUP BY substr(キー,1,2);

>>758
普通のSQLなら発行したホスト言語側で何行影響を受けたかを
返す関数なりメソッドなりあると思うが、ストアド内部で知りたいのなら
そのストアドで使われている言語仕様次第だろうな。

>>759
replace関数ってないの?
なけりゃホスト言語でやるとか。
っていうか、あんまりSQLでデータ加工しない方が...
そもそもそゆ言語じゃないし。
761757:2007/02/24(土) 14:45:54 ID:???
>>760

select substr(キー,1,2) 集約キー,  ←
sum(値)
from テーブル1
group by 集約キー

とすると、SQLエラーになってしまったので、
GROUP BY substr(キー,1,2);
は試していませんでした。
やってみます。
ありがとうございます。
762NAME IS NULL:2007/02/24(土) 14:56:25 ID:???
自社の作業日報の集計を行おうとしてるんですが行き詰ってしまいお知恵をおかしください。
tableAは休日マスターテーブルで各日の就業時間を設定しています。
tableBは作業日報でそれぞれの作業時間を記録しています。
●tableA
A_DATE   A_TIME
------------------------
07/01/01    0.0
07/01/02    0.0
07/01/03    0.0
07/01/04    8.0

●tableB
B_DATE   B_WORKER   B_JOB   B_TIME
--------------------------------------------
07/01/04   TANAKA    A-205    2.0
07/01/04   TANAKA    B-225    3.0
07/01/04   TANAKA    N-301    4.0
07/01/04   MAKITA    A-201    6.5
07/01/04   MAKITA    B-300    7.5
07/01/04   SASAKI    H-600    8.5

そこで各作業者の指定期間の残業時間及び休日出勤時間の合計を算出したいのですが
なかなかうまくいきません。下のようなSQLで残業及び休日出勤のある日はリストアップ
出来たのですが、そこからどうしていいのかわからなくなってしまいました。

select B_DATE, B_WORKER, sum(B_TIME) from tableB B
where B_DATE between '2007/1/1' and '2007/1/24'
group by B_DATE, B_WORKER having sum(B_TIME)>
(select A_TIME from tableA where A_DATE=B.B_DATE)
763NAME IS NULL:2007/02/24(土) 15:13:29 ID:???
>>758
質問するときはDBの製品名も書いた方が良いです。
ちなみにオラクルはSQL%ROWCOUNT。ただし当然コミット発行する前な。
764NAME IS NULL:2007/02/24(土) 15:19:58 ID:???
SQL Server なら @@ROWCOUNT 変数。
765NAME IS NULL:2007/02/26(月) 21:41:22 ID:A5pvB6Dy
UNIXのPIDの親子関係のように、あるプロセスの子供、そのまた子供
といった具合に、どんどん再帰的に検索をかけることは可能でしょうか?

PID | ProcessName | ParentPID

といった構造のテーブルから検索したいです。
766NAME IS NULL:2007/02/26(月) 21:51:36 ID:???
再帰(recursion)なの? ただの繰り返し(iteration)でもいい気もするけど。
767NAME IS NULL:2007/02/26(月) 22:12:16 ID:???
>>766
再帰か繰り返しか・・・・と言われるとその違いが分からないのですが
繰り返しというのは要はストアドってことですよね?
768NAME IS NULL:2007/02/26(月) 22:17:25 ID:???
>>765がやりたいのは再帰だと思うよ。
WITH RECURSIVE に対応されてれば可能だったかな。
一部のDBでCONNECT BYとかconnectby(..)等で可能。
769NAME IS NULL:2007/02/26(月) 22:31:20 ID:???
>>768
どうもありがとトン
770NAME IS NULL:2007/02/27(火) 14:10:56 ID:JvSY131s
order byについてお助けください。
Access2000を使用しています。

テーブルA、テーブルBがあり、
それぞれ日付とコードを持っています。

----------------------------
テーブルA     テーブルB
----------------------------
日付    コード 日付    コード
07/02/04 2    07/02/01 2
07/02/05 1    07/02/02 1
07/02/06 2    07/02/03 2

これを、テーブルBにて
日付の古いコードが出現したコード順に
テーブルAを取得したいのですが、
どのようにすれば取得可能でしょうか?
----------------------------
得たい結果 テーブルA
----------------------------
日付    コード
07/02/04 2
07/02/06 2
07/02/05 1

オラクルですと、order by に相関サブクエリが
使えるようですので以下のSQLでよさそうなのですが。
(オラクルで試してみたわけではないので間違っているかもしれません。。)
------------------------------------------------
select a.コード, a.日付 from テーブルA as a
order by (select b.コード, min(b.日付) from テーブルB as b
group by b.コード
order by min(b.日付));
------------------------------------------------
Access2000では構文エラーがでて
書き方がわかりません。
わかる方がいましたらご教授願います。

771NAME IS NULL:2007/02/27(火) 15:28:28 ID:???
>>770
すみません。
サブクエリーの中では
order by 句は使えないようですね。
失礼しました。
772NAME IS NULL:2007/02/27(火) 15:58:46 ID:FZHIf2Yf
少し考えれば使えないではなく、必要ないってなると思うが。
773NAME IS NULL:2007/02/27(火) 18:58:19 ID:???
>>770
脳内でテキトーに考えたSQLだけど

select
a.コード,a.日付
from
テーブルA as a,テーブルB as b
where
b.コード = a.コード
order by
b.日付;
774758:2007/02/28(水) 04:53:23 ID:0s+wgT0M
>>760 >>763 >>764

どうもありがとうございますm(__)m
お礼が遅れてすみませんです。
775NAME IS NULL:2007/02/28(水) 11:57:48 ID:???
>>773

ご返答ありがとうございます。
参考にさせていただき以下で出来ました。
------------------------------
select distinctrow
a.コード,a.日付
from
テーブルA as a,テーブルB as b
where
b.コード = a.コード
order by
b.日付,a.日付;
----------------------------

ありがとう御座いました!

776NAME IS NULL:2007/02/28(水) 14:36:09 ID:???
2つ以上のレコードから重複を取り除きたい

コード 住所1 住所2
1 東京都 中央区
2 東京都 新宿区
3 大阪府 中央区

住所1は東京都と大阪府
住所2は中央区と新宿区
を取り出したいのです。
どのようにすれば取得可能でしょうか?
777NAME IS NULL:2007/02/28(水) 15:00:41 ID:???
distinct
778NAME IS NULL:2007/02/28(水) 15:44:07 ID:???
たびたびすみません。>>770です。

出来たと思ったんですが、
データが以下の場合、
----------------------------------
テーブルA    テーブルB
----------------------------------
日付 コード 日付 コード
07/02/04 2 07/02/01 2
07/02/05 2 07/02/02 1
07/02/06 1 07/02/03 2
07/02/07 1 07/02/04 1
07/02/08 2 07/02/05 2
07/02/09 2 07/02/06 1
07/02/10 2 07/02/07 1
07/02/08 2
----------------------------------
select distinctrow
a.コード,a.日付
from
テーブルA as a,テーブルB as b
where
b.コード = a.コード
order by
b.日付,a.日付;
----------------------------------
を実行すると
----------------------------------
コード 日付
2 07/02/05
1 07/02/07
2 07/02/10
1 07/02/06
2 07/02/04
2 07/02/08
2 07/02/09
----------------------------------
になってしまいます。
テーブルBの日付が最初に出現した
コードの順番にするにはどのようにすれば
良いのでしょうか?
わかる方がいましたらご教授願います。
----------------------------------
得たい結果
テーブルBにて07/02/04に コード=2が
あるので コード=2 を優先。
次に07/02/06にコード=1が
あるのでコード=1を追加。
----------------------------------
コード 日付
2 07/02/04
2 07/02/05
2 07/02/08
2 07/02/09
2 07/02/10
1 07/02/06
1 07/02/07
779NAME IS NULL:2007/02/28(水) 23:33:48 ID:???
テーブルBをコードでGROUP BYして日付の最小値を取って、
それをサブクエリーとしてテーブルAとくっつければいいんでは
780NAME IS NULL:2007/03/01(木) 21:04:24 ID:vN9pA/9v
誰か教えてください。
今日初めてSQLでデータ抽出してみました。
DBはオラクルでSQLPlusWを使ったんですが、抽出したデータをエクセルとか吐き出すことってできるのでしょうか?
よろしくお願いします。
781NAME IS NULL:2007/03/01(木) 21:13:22 ID:???
>>780
SQLPlsuだとCSVで書き出すくらいしか出来なかったと思う。

あとは専門スレへ
> Oracle 質問総合スレ
http://pc11.2ch.net/test/read.cgi/db/1163907455/l50
782NAME IS NULL:2007/03/01(木) 21:52:58 ID:vN9pA/9v
>>781ありがとうございます。
CSVでもアクセスでもエクセルでもなんでもいいんです。
誘導していただいたスレでも聞いてみます。
783NAME IS NULL:2007/03/02(金) 17:50:00 ID:???
レコード挿入時に
表にキー1が存在しなければINSERT
   キー1が存在したら何もしない

という処理をしたいのですが一度検索処理をしないで
行えますか?
MERGEではキーが存在したら更新してしまうので・・
784NAME IS NULL:2007/03/02(金) 19:09:56 ID:???
>>783
そのキー1が主キーなら、そのままINSERTを投げればいいのでは?
なかったら追加できるし、あったら例外が発生するから。
785NAME IS NULL:2007/03/03(土) 09:55:22 ID:???
select 結果が下記のようなとき(c2でソートしています)
c3の通算が 70以内 の行のみ表示するのはどのように書けばいいんでしょうか

c1  | c2  | c3
----+----+-----
133 | 626 | 50 <-- 通算50
52  | 524 | 19 <-- 通算69
522 | 473 | 2 <-- 通算71
11  | 341 | 19 <-- 通算90

上記の場合2行目までselectで抜き出したいです
786NAME IS NULL:2007/03/03(土) 10:23:22 ID:???
>>785

select T1.c1, T1.c2, T1.c3
from t T1
join t T2 on T2.c2 <= T1.c2
group by T1.c1, T1.c2, T1.c3
having sum(T2.c3) <= 70
order by T1.c2
787785:2007/03/03(土) 10:41:15 ID:???
>>786
thx 勉強になりました
788NAME IS NULL:2007/03/03(土) 10:58:50 ID:???
>>786
不等号が逆のような気もするが、その不等号結合なんて久方ぶりに見た気がす。
使う機会が少ないから、必要なときに思い浮かばね。

んで別解で出したりする。
SELECT * FROM T AS T1 WHERE 70>=(SELECT sum(c3) FROM T WHERE c2>=T1.c2);
789785:2007/03/03(土) 11:06:22 ID:???
>>788
不等号は逆なのは気づきました、
別解のほうが見てわかりますね。
790785:2007/03/03(土) 11:11:10 ID:???
>>788
別解でも欲しい情報は抜き取れましたが
すげーおそかったです。
791NAME IS NULL:2007/03/03(土) 15:33:09 ID:???
小数点以下の値をそのままの形で出力したいのですが、指定の仕方がわからず悩んでいます。
下記のようにすると、スペースが入ってしまいます。
SELECT TO_CHAR(MONEY, '990.00') AS MONEY FROM DATA_BASE WHERE select_cd='M'


DBに格納されている値。→0.99
そのまま出力すると→.99
希望する出力→0.99

以上、よろしくお願いいたします。
792NAME IS NULL:2007/03/03(土) 16:15:13 ID:???
TRIM(TO_CHAR(MONEY, '990.00'))
793NAME IS NULL:2007/03/03(土) 18:44:30 ID:???
select c1,c2,c3
from (
select c1,c2,c3,
sum(c3)over(order by c2 desc) as s1
from t
)
where s1 <= 70
794NAME IS NULL:2007/03/03(土) 22:25:01 ID:???
CREATE TABLE `user_tbl` (
`seq` int(11) unsigned NOT NULL auto_increment,
`id` varchar(100) NOT NULL,
`pass` varchar(100) NOT NULL,
`title` varchar(200) NOT NULL,
PRIMARY KEY (`seq`)
) TYPE=MyISAM ;

このテーブルでidとpass,titleをINDEX化(よく検索するため)したいのですが
PHPMyadminでKEY (`id`,`pass`,`title`)をするとエラーがでます。

また、以下のsql文をこのテーブルを効率よく検索するにはどのようなテーブル構成がいいでしょうか?

SELECT * FROM `seq` FROM `user_tbl` WHERE `id`=ID;
SELECT * FROM `seq` FROM `user_tbl` WHERE `title`=TITLE;
SELECT * FROM `seq` FROM `user_tbl` WHERE `id`=ID and `pass`=PASS;

795NAME IS NULL:2007/03/03(土) 23:00:55 ID:???
MySQLってFROM..FROM...なんていうイカれた文法通るのか?

そして無理にPRIMARY KEYにする理由がわからんが。

普通にCREATE INDEXすればいいじゃん。
EXPLAINなりで計測してそんなに差が出るとも思えんし。
796794:2007/03/04(日) 00:22:18 ID:???
>>795さん
レスありがとうございます。

794のsql文はよく使用する3つをかいてます
1文ではないです。
データが100万程度、入るテーブルですので効率を最大限上げたいなあと思って
797NAME IS NULL:2007/03/04(日) 02:08:49 ID:???
>SELECT * FROM `seq` FROM `user_tbl` WHERE `id`=ID;
FROM `seq` FROM `user_tbl`ってFROMが2回連続して出てくるけどいいの?
それともselect * from user_tbl where ID='id'; の間違い?
798794:2007/03/04(日) 03:16:46 ID:???
>>797さん
…どこに目をつけてるんだもれ…(´・ω・`)
そのとおりです
799NAME IS NULL:2007/03/05(月) 00:02:53 ID:BZyfvGj7
計算式AS

たとえば  

SELECT 単価*在庫数 AS 在庫価格, 在庫.単価etc...
で名前を変更し、その中からいくら以上の価格だけ抽出したい場合
WHERE 在庫価格>=10000; とかだと思うのですが、

パラメータの入力
在庫金額  

と出てしまいます。どう書き換えればしっかり抽出出来ますでしょうか?
800572:2007/03/05(月) 00:16:25 ID:???
WHEREじゃなくて、
HAVING 在庫価格>=10000
でいいんじゃね?
801NAME IS NULL:2007/03/05(月) 00:54:45 ID:BZyfvGj7
>>800
ありがとうございます。無事抽出出来ました。

もう1つ質問なのですが、


単価 売上数
300 3
400 5
500 6

としてすべての売上総額の計算式はどういったものになるでしょうか?
802NAME IS NULL:2007/03/05(月) 01:00:45 ID:???
SELECT 単価 * 売上数 FROM ....
って藻前が>>799でやってることと変わらんと思うんだが。
803NAME IS NULL:2007/03/05(月) 01:01:30 ID:???
sum(単価*売上数) ってことじゃね。
804NAME IS NULL:2007/03/05(月) 01:02:56 ID:???
スマソ、SELECT SUM(単価 * 売上数) FROM...だと思う。 
805NAME IS NULL:2007/03/05(月) 01:03:23 ID:BZyfvGj7
>>802
説明不足でした、すいません
801に書いた式であれば

300x3=900
400x5=2000
500x6=3000

の合計で5900と表示されるSelect文が解らないのです・・。
806NAME IS NULL:2007/03/05(月) 21:23:13 ID:???
デッドロックの回避って具体的にどうやればいいんでしょうか。
update文にorder byでプライマリキー順に更新とかルール付ければ、おきないものなのでしょうか?
(その前にできるか知りませんが・・・)
807NAME IS NULL:2007/03/05(月) 21:38:16 ID:???
>>806
単発の行ロックならデッドロックは発生しないでしょ。
通常、複数のロックを一定でない順序で取得しようとするからデッドロックが発生する。
808806:2007/03/05(月) 21:46:39 ID:???
>>807
すみません。説明が足りなかったです。
1コミット中に1レコードだと問題ないのですが、
常に複数行を更新される恐れのあるテーブルの場合です。
大げさに言えば、全レコードを1コミットで更新するSQLが、複数処理から呼ばれる場合、
デッドロックが発生する可能性が大だと思います。

その場合どうすればいいのかと悩んでます。
809NAME IS NULL:2007/03/05(月) 21:56:34 ID:???
>>808
テーブルごとロックしてしまえば?
810NAME IS NULL:2007/03/06(火) 09:30:16 ID:7AABqwK/
仕様レベルで処理順序がきちんとしているならば、デットロックは発生しにくいし。
そもそも、DBMSによってロック管理が違うから、一概に難友言えないし。
811NAME IS NULL:2007/03/06(火) 14:09:15 ID:fZ+u7Psg
INSERT文、UPDATE文を個々に発行するより、複数行まとめての方が早いらしい…そこで具体的な構文についての質問です。
INSERT、UPDATE共に、SET文で、書きたいのです。↓試してみたんですが、上手くいかず…
ttp://ossipedia.ipa.go.jp/capacity/CS0604140044/
参照 ttp://www.mysql.gr.jp/Manual/mysql-3.23.16/manual.ja_Performance.html#Insert_speed

どなたかへるぷみ〜
812NAME IS NULL:2007/03/06(火) 15:24:45 ID:???
>>811
使ってるDBがMySQLでは無いと言うオチはなしだぞ
813NAME IS NULL:2007/03/06(火) 15:55:19 ID:fZ+u7Psg
>811
ごめん、素で書き忘れた
Mysql 5.0です;;
814NAME IS NULL:2007/03/06(火) 16:39:40 ID:???
>>811
何をどう試してどううまくいかないのかを書いてないものに答える気力は出ないわけです。
815NAME IS NULL:2007/03/07(水) 13:08:57 ID:???
INSERT table_a SELECT * FROM table_b

副問い合わせ出来ないと言われてるMySQL4.0を使っていて、
上記のSQLは有効みたいなのですが、これって副問い合わせって言わないんでしょうか?
816NAME IS NULL:2007/03/07(水) 13:13:37 ID:???
>>815
いわない。逆にselectの箇所にテーブル名をじかに持ってこれないだろ?
817NAME IS NULL:2007/03/07(水) 16:38:56 ID:PkZhI7eE
指定した順番でorderかけるにはどうすればいいですか
order by value = G, A, T, K
みたいなことがしたいです
818NAME IS NULL:2007/03/07(水) 17:25:54 ID:???
>>817
caseで1,2... に読み替えてorder by
819NAME IS NULL:2007/03/07(水) 17:32:36 ID:???
*を項目名にすると動かなくなりますね・・・ありがとうございます
・・・くそっMySQL4.0氏ねばいいのに
820819:2007/03/07(水) 17:33:15 ID:???
>>819>>816へのレスでした
821NAME IS NULL:2007/03/08(木) 11:24:27 ID:???
何か勘違いしてないか
822NAME IS NULL:2007/03/08(木) 12:28:03 ID:???
すみません。どうしても分からなかったため質問させてください。

cd kingaku
----------------------
1 1000
2 2000
3 1500
4 2200
5 1200
6 1000

上記のようなテーブルから
cdが奇数(1,3,5)の場合と偶数(2,4,6)の場合の
金額の合計をUNIONを使って出力結果を結合するのではなく
一つのSQL文で出力するSQL文を教えていただけないでしょうか。


期待する出力結果

 グループの名称 金額合計
-------------------------------
 奇数番号の合計    3700
 偶数番号の合計   5200

お手数をお掛けしますが
もしよろしければ教えていただけると助かります。
よろしくお願いします。
823NAME IS NULL:2007/03/08(木) 12:45:08 ID:cnXUTSfl
DBMSによる部分もあるが、元の値×余りを出す演算結果を01に変換
を偶数、奇数でやったSUMでいいんじゃねーの?

SELECT SUM(金額×DECODE(奇数?,1,0)) 奇数の和、 SUM(金額×DECODE(偶数?,1,0)) 偶数の和

なんちゃってSQLだが感じをとってもらえれば。
824NAME IS NULL:2007/03/08(木) 15:07:29 ID:???
SELECT sum(kingaku) FROM テーブル GROUP BY cd % 2;

とかじゃだめかね
825NAME IS NULL:2007/03/08(木) 16:52:37 ID:???
SELECT CASE WHEN cd % 2 = 1 THEN '奇数番号の合計' ELSE '偶数番号の合計' END AS グループの名称, sum(kingaku) AS 金額合計 FROM テーブル GROUP BY グループの名称;

これでそのまま出た。
826822:2007/03/08(木) 17:50:55 ID:???
返信送れて申し訳ありません。
>>823
>>824
>>825
教えていただきありがとうございます。
やってみますね。
827NAME IS NULL:2007/03/10(土) 09:44:44 ID:RH4stIbl
id value
-------
1 100
1 200
1 150
4 220
5 150
5 400
7 100
7 300
7 500
7 150

こういうテーブルがあったとき、それぞれのidについてvalueの大きい順に上位2件ずつ取得するSQL文を教えてください。

期待する結果:
id value
-------
1 200
1 150
4 220
5 400
5 150
7 500
7 300

RDBMSはMySQLの4.1か5.0です。
828NAME IS NULL:2007/03/10(土) 11:04:29 ID:???
>>827
「最大値」と「最大値を除いた残りの最大値」をUNION。
又は、
各idごとの順位番号をつけてWHERE句で順位<=2。
ってのしか思い浮かばず、
いくらなんでも無駄すぎっぽいので、素直にLimitクエリを使って、
SELECT * FROM t AS T1 WHERE value IN (SELECT value FROM t WHERE T1.id=id ORDER BY value DESC Limit 2);
実用的速度を得られるかどうかは不明だが。
829NAME IS NULL:2007/03/10(土) 11:19:39 ID:RH4stIbl
>>828
ありがとう。
ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
だそうです。うーむ(MySQL 5.0.32)

> 各idごとの順位番号をつけてWHERE句で順位<=2。

こっちの方、教えてくれませんか。
830NAME IS NULL:2007/03/10(土) 12:11:56 ID:???
>>829
ありゃ、サブクエリ内でLimit使えないのか。
SELECT * FROM
(SELECT (SELECT count(*) FROM t WHERE id=T1.id AND value>T1.value)AS num,* FROM t AS T1)AS T2
WHERE num < 2;
MySQLで動くかな? もうちょっと略せそうな気もするが...
831NAME IS NULL:2007/03/10(土) 12:55:26 ID:RH4stIbl
>>830
だめみたい...

mysql> SELECT * FROM (SELECT (SELECT count(*) FROM t WHERE id = T1.id AND value > T1.value) AS num, * FROM t AS T1) AS T2 WHERE num < 2;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM t AS T1) AS T2 WHERE num < 2' at line 1
832NAME IS NULL:2007/03/10(土) 13:09:08 ID:???
>>831
ダメだったか、役立たずでスマソ。
SELECT リストにサブクエリが使えないならダメなんだろうけど、
ひょっとして*を T1.* とか id,valueとかに置き換えてもダメなんかな?

あと、SELECTリストに相関サブクエリを置くんじゃなくて、
JOINしてGROUP BYしてカウントをとる方法もありだと思うが、
つか、そっちの方が場合に因っては速いかもしれないが、
今の俺にはSQLが思いうかばねぇ。

だいたい俺って相関サブクエリ厨なんだよな('A`)
このスレにはエキゾチック結合をうまく使う人もいるから
そんな人の出現を待った方がいいな。
833NAME IS NULL:2007/03/10(土) 13:17:45 ID:RH4stIbl
>>832
お、いけた。
... AS num, *がまずかったみたい。
... AS num, idと明示してやったら通りました。thx!
834833:2007/03/10(土) 13:18:35 ID:RH4stIbl
>>833
訂正
... AS num, id, valueにしたらOKだった。
835NAME IS NULL:2007/03/10(土) 13:23:07 ID:???
おっ、うまくいったのか、ヨカタ。
俺は密かにリベンジしてたw。
SELECT t2.id,t2.value,count(t2.value) FROM t AS T1 JOIN t AS T2 ON T1.id=T2.id AND T1.value>=T2.value
GROUP BY t2.id,t2.value HAVING count(t2.value)<=2 ;
なんかすげ〜グダグダ...
836NAME IS NULL:2007/03/10(土) 19:23:08 ID:???
すみません。質問です。

ユーザーテーブル(users)にユニークなuser_id
商品テーブル(products)にユニークなproduct_id
そして投票テーブル(votes)は
vote_id,user_id,product_id
となっている。

やりたいのは、
商品の一覧取得時に投票数も一緒に取得。

SELECT ? as vote_num from products, votes where products.product_id = votes.vote_id

こんな感じなのですが、vote_numに投票数を入れるにはどうすれば良いでしょうか?
宜しくお願いいたします。

使用DBはmysql 3.23
837836:2007/03/10(土) 21:13:11 ID:???
追記します

その後、いろいろ試して

SELECT *, count(vote_id)
FROM products, votes
WHERE products.product_id = votes.product_id
GROUP BY products.product_id

でそれっぽいのは出来ましたが、
投票が一つもないproductが

WHERE products.product_id = votes.product_id

ではじかれてしまいます。

これを、投票がひとつもない商品に対して、
count(vote_id) = 0 となるようなSQL文を探しています。

宜しくお願いいたします。
838NAME IS NULL:2007/03/10(土) 22:09:34 ID:???
>>837
そいつをもうひとつの商品テーブルと外部結合するか、
投票が一つもない商品の検索結果とunionとればおk
839836:2007/03/10(土) 22:27:48 ID:???
>>838

ありがとうございます

>そいつをもうひとつの商品テーブルと外部結合するか
これはよく意味がわかりません。
「もうひとつの商品テーブルと」とはどういうことでしょうか?

>投票が一つもない商品の検索結果とunionとればおk
これもごめんなさい。
投票が一つもない商品の検索結果を出す式もわからないんです。

試しに下記のようにしてみましたが、見当はずれの結果でした。

SELECT *, count(vote_id)
FROM products, votes
WHERE products.product_id != votes.product_id
GROUP BY products.product_id

すみません、宜しくお願いします。
840836:2007/03/11(日) 00:57:40 ID:???

度々、すみません。
解決しました。

>838
ありがとうございます。
外部結合でいろいろ検索して下記の文が完成しました

select products.*, count(vote_id) as cnt
from products
left join votes on products.product_id = votes.product_id
group by products.product_id
841NAME IS NULL:2007/03/11(日) 22:59:57 ID:???
dropやdeleteではなくテーブルを削除?するのがあるらしいのですが名称を忘れました
トランスケットだったかトライケットだったような
全然違うような・・・
842NAME IS NULL:2007/03/11(日) 23:04:50 ID:???
truncate
トランケイト
843NAME IS NULL:2007/03/11(日) 23:25:20 ID:???
>>842
こんな的を射ないレスで回答がもらえるとは・・・
本当にありがとうございます。
844NAME IS NULL:2007/03/13(火) 07:07:51 ID:LlT/FMMQ
ちょっとつまずいたので教えて下さい。データベースはmysql4.0.27を使ってます。
2つのテーブル「member_table」「team_table」があるとします。
フィールドは全てNOT NULLです。

member_table
---------------------------------------
team_id | member_id | member_name |
---------------------------------------
 1    |   1     |   一郎     |
---------------------------------------
 2    |   2     |   二郎     |
---------------------------------------
 3    |   3     |   三郎     |
---------------------------------------
 4    |   4     |   四郎     |
---------------------------------------

team_table
------------------------
team_id | team_name  |
------------------------
 1    | レッズ     |
------------------------
 2    | ブルズ    |
-----------------------
 3    | パープルズ |
-----------------------

これを外部結合させます。
SELECT * FROM member_table LEFT JOIN team_table USING (team_id)

とすると、当然team_idの4はデータに無い為、四郎の外部結合されたteam_idとteam_nameはNULLになります。
ここで私がやりたい事は、
結合されたテーブルからteam_idとteam_nameがNULLのメンバー、
つまりチームに所属設定されていないメンバー(この例では四郎)を抽出する事です。

SELECT * FROM member_table LEFT JOIN team_table USING (team_id) WHERE team_table.team_id=NULL
とか
SELECT * FROM member_table LEFT JOIN team_table USING (team_id) WHERE team_table.team_name=NULL
とやってみたのですが、抽出されませんでした。
とのようにしたら良いのでしょうか?
ご存じの方いらっしゃいましたら、宜しくお願い致します。
845NAME IS NULL:2007/03/13(火) 07:54:50 ID:???
>>844
WHERE team_table.team_id IS NULLでど?
846844:2007/03/13(火) 08:10:14 ID:???
>>845
出来ました!!ありがとうございます!
そうか、NULLの場合は「=」ではなく「IS」を使うんですね。
初歩的なことで申し訳ありません。
朝早くからありがとうございました。
あなたにとって今日一日が素晴らしい一日でありますように・・・。
847NAME IS NULL:2007/03/13(火) 11:26:38 ID:???
そーゆ上っ面だけの覚え方してると別の場所でハマることになる
「三値論理」でぐぐれ
848NAME IS NULL:2007/03/13(火) 15:05:13 ID:???
create table tbl1(
col1 INT NOT NULL AUTO_INCREMENT DEFAULT 0,
col2 DECIMAL(13,0) NOT NULL DEFAULT 0,
PRIMARY KEY (col1)
) TYPE=MyISAM;

create table tbl2(
col1 INT NOT NULL AUTO_INCREMENT DEFAULT 0,
col2 DECIMAL(13,0) NOT NULL DEFAULT 0,
PRIMARY KEY (col1)
) TYPE=MyISAM;

上記のtbl2.col2を丸々tbl1.col2へ移して、tbl1.col1は1から連番を振りたいのですが
どうすればいいんでしょうか・・・
MySQL4.0.2で副問い合わせが使えません
849NAME IS NULL:2007/03/13(火) 23:14:15 ID:???
create table tbl1(
col1 INTEGER NOT NULL AUTO_INCREMENT,
col2 DECIMAL(13,0) NOT NULL DEFAULT 0,
PRIMARY KEY (col1)
) TYPE=MyISAM;

create table tbl2(
col1 INTEGER NOT NULL AUTO_INCREMENT,
col2 DECIMAL(13,0) NOT NULL DEFAULT 0,
PRIMARY KEY (col1)
) TYPE=MyISAM;

INSERT INTO tbl2 VALUES(10,7777777);
INSERT INTO tbl2 VALUES(16,9999999);
INSERT INTO tbl2 VALUES(32,1111111);
INSERT INTO tbl2 VALUES(null,8888888);

INSERT INTO tbl1(col2) SELECT col2 FROM tbl2;

SELECT * FROM tbl1;
SELECT * FROM tbl2;
850NAME IS NULL:2007/03/14(水) 16:23:43 ID:eQEhHzf6
drop table tbl1;
drop table tbl2;

851NAME IS NULL:2007/03/14(水) 21:48:34 ID:WWlj4a+E
テーブルA
date,id,name

テーブルB
date,id,value

テーブルC
date,id,value


テーブルA、テーブルB、テーブルCと三つあるテーブルを、
Aのdate列以前で最新の日付のレコードをBとCからそれぞれ取ってきて、
AにマージするSQLを書いたのですが、
サブクエリが遅すぎます。なんとか速くする方法はないでしょうか?


<書いたSQL>
select a.*, b.value, c.value
from a, b, c
where a.id = b.id
and a.id = c.id
and b.date = (select max(date) from b where id = a.id and date <= a.date)
and c.date = (select max(date) from c where id = a.id and date <= a.date)


A、B、Cはそれぞれ50万レコード位あり、上記だと10分くらいかかります。
当然全部のテーブルにIndexを張っています。
マジで困っているので、よろしくお願いします。
DB2 9.1
852NAME IS NULL:2007/03/14(水) 21:53:12 ID:WWlj4a+E
立て続けですみません。
select a/b from c
で、
b が 0またはnullなら a/b をnullにする方法で簡単な書き方はありませんか?
現在下記のように書いているのですが、割り算がたくさんあるとぐちゃぐちゃになってしまいます。

select case b when 0 then null else a/b end from c

よろしくお願いします。
DB2 9.1
853NAME IS NULL:2007/03/14(水) 22:58:09 ID:???
>>851
index張ってるって、まさか、(date,id)じゃないだろうな。
854NAME IS NULL:2007/03/14(水) 23:22:04 ID:22UGj69h
共有ロックとマルチバージョニングでIsolationがSerializableの場合に
まったく同一の内容aを以下でInsertした場合、
どの時点で主キー制約になりますか?

Tran A

Insert a

Tran B

insert a

Tran A Commit

Tran B Commit

両方ともTran A Commitが成功して、
Tran B Commitで失敗でいいんでしょうか?
855NAME IS NULL:2007/03/15(木) 00:16:58 ID:E/8sp7ah
>>853
それはPrimaryKeyです。
あと、date、id列単独でIndex張ってます。
856NAME IS NULL:2007/03/15(木) 00:21:01 ID:???
>>854
Tran A 
Insert a 

Tran B 
insert a (ここでA-aが未確定のため待機)

Tran A Commit (ここでB-aがキー重複でエラー)

857NAME IS NULL:2007/03/15(木) 00:28:42 ID:ZdngYRrc
>>856

Tran A はCommitに失敗するんですか?
Tran A 成功 
TranB 失敗

もしくは
Tran B 成功
Tran A 失敗

みたいなどちらかは成功させる方法はないんでしょうか
858NAME IS NULL:2007/03/15(木) 00:30:37 ID:???
>>857
失敗はしない。Aのコミットが成功するタイミングで、待機してたBのInsert aが失敗する。
859NAME IS NULL:2007/03/15(木) 00:48:32 ID:???
>>855
idあたりのdateが少なめならあんまり変わらないかもしれんが、索引はid単独よりid, dateがベター。
この問い合わせに限ればdate単独のキーは意味がない。
もしテーブルの構成を変えられるのなら
テーブルAにBとCの最新のレコードのキーを保持するようにして置くのが一番。
860NAME IS NULL:2007/03/15(木) 22:51:42 ID:???
SQL初心者でよくわからん。
初歩的ですまんす。
↓ってどうやるんでしょう。


ID | NAME |
-------------
あ | アイウエオ |
あ | カキクケコ |
あ | サシスセソ |
い | アイウエオ |
い | ナニヌネノ |
う | アイウエオ |
う | サシスセソ |

ここで、NAME列に「アイウエオ」「サシスセソ」の両方を持っている行を「IDの括り」で取り出したい。


求める結果

ID | NAME |
-------------
あ | アイウエオ |
あ | カキクケコ |
あ | サシスセソ |
う | アイウエオ |
う | サシスセソ |
861NAME IS NULL:2007/03/15(木) 23:16:58 ID:???
>>860
SELECT * FROM Table WHERE id IN (SELECT id FROM Table WHERE name='アイウエオ' OR name='サシステソ' GROUP BY id HAVING count(id)=2);
※但し、UNIQUE(id,name) である場合に限る。
862NAME IS NULL:2007/03/15(木) 23:23:31 ID:???
>>860
exceptが使えるなら
select * from テーブル a where ID in (
select ID from テーブル where NAME = "アイウエオ"
except
select ID from テーブル where NAME = "サシスセソ"
)
863NAME IS NULL:2007/03/15(木) 23:38:59 ID:???
>>861,>>862

できた、ありがとう!
864NAME IS NULL:2007/03/15(木) 23:43:37 ID:8J8WaYZq
MySQL,Postgresqlどちらでもよいのですが,
実テーブルのカラムの順番って変更できないのでしょうか?

id, data1, data2, comment

というテーブルにdata3を追加したくなったときに

id, data1, data2, comment, data3

となってしまうと管理しにくいのですが,これの回避方法みたいなのは
あるのでしょうか?ビューを使うとかでしょうか?
865NAME IS NULL:2007/03/15(木) 23:55:11 ID:???
>>864
なんでカラムの順番を変更する必要があるのか解らんが。
select id,data1,data2,data3,commentとSQL書けば済む話だし。

気に入らないんだったらテーブル作り直すしかないと思うが。
866NAME IS NULL:2007/03/16(金) 00:08:35 ID:???
>>862
いまさらだけど、EXCEPTじゃなくてINTERSECTだよな。積集合だから
867じゅん:2007/03/17(土) 02:28:11 ID:???
ネットを開きお気に入りを開くとフォルダがあるのですが、隠しファイルにしてしまい消えてしまいました。どうしたら復活してくれますか?
868NAME IS NULL:2007/03/17(土) 04:27:05 ID:???
春だなぁ
869NAME IS NULL:2007/03/18(日) 12:21:03 ID:GFbo8JDw
select 隠しファイル from お気に入り where こないだ隠しファイルにしたヤツ
870NAME IS NULL:2007/03/18(日) 14:26:19 ID:???
>>869
式がありません。
871NAME IS NULL:2007/03/18(日) 18:40:31 ID:ZkFahWCW
phpPgAdminを入れてみようと思い、各種インストール、設定を行いました。
が、ブラウザからアクセスしてみると

>データベースをサポートするように PHP のコンパイル・インストールがされていません。
>configure の --with-pgsql オプションを用いて PHP を再コンパイルする必要があります。

というエラーメッセージが出ています。
おそらく…そのまんまなのだと思いますが、
「configure の --with-pgsql オプションを用いて PHP を再コンパイルする」というのは、
具体的にはどこで何をどうすればいいのでしょうか。
872NAME IS NULL:2007/03/18(日) 19:22:12 ID:???
>>871
SQL関係ないがな。

「PHP PostgreSQL コンパイル」とかでググって見れwww
873NAME IS NULL:2007/03/18(日) 20:15:14 ID:???
コンパイルで検索しても、きっと>>871の問題解決にはならないだろうな。
Windows版でphp.iniの設定だけだろう。まぁスレ違いどころか板違い。
874NAME IS NULL:2007/03/18(日) 21:35:14 ID:ZkFahWCW
やはりスレ違いでしたか。すんません。

>>872
エラーメッセージでは「PHPをコンパイルせよ」となってるんですが
Postgreに問題があるんですか。
あと、再コンパイルってのは要するにもう一度 yum installとかするんでしょうか。

>>873
だいぶググってはいるんですが…。ちなみにどこの板に行けばいいでしょか?
875871:2007/03/18(日) 21:38:19 ID:???
リロードしてみたら動いてました!
…色々やろうとはしましたが、アパッチ再起動くらいしか身に覚えが
ないのですが…!
876NAME IS NULL:2007/03/18(日) 21:39:24 ID:m1qacMfw
MYSQLで掲示板の書き込みレスを更新参照したいんですが、
2ちゃんみたいなタイプの掲示板だとすると
1スレにつき1つのテーブルにしたほういいんでしょうか?
それとも他の形式にしたほうがいいんでしょうか?
877NAME IS NULL:2007/03/18(日) 22:41:48 ID:36ARxA6B
下のような販売テーブルと単価テーブルがあった場合に、
購入日と価格適用日を比べて、ほしい結果を得るには
どうやるんでしょうか?
販売テーブルに単価テーブルを外部結合させて
購入日が適用日を下回る行を削除まではできたのですが、その後がさっぱりです。

DBはSQLServer2005です。
購入日と価格適用日の型はintです。
よろしくお願いします。


販売テーブル
商品コード | 購入日
----------+-----------
  101   | 20051229
  101   | 20051230
  101   | 20051231
  201   | 20051231

単価テーブル
商品コード | 価格適用日 | 単価
----------+------------+--------
  101   |        0 | 100
  101   |   20051230 | 200

欲しい結果
商品コード | 購入日  | 単価
----------+----------+-------
  101   | 20051229 | 100
  101   | 20051230 | 200
  101   | 20051231 | 200
  201   | 20051231 | NULL



878NAME IS NULL:2007/03/18(日) 23:15:15 ID:???
>>876
1行目の意味がイマイチわからないが、2行目以下だけの問いとして応えると、
まぁ規模次第なんだが、それでも1スレ1テーブルはないと思う。
大雑把に書くと、スレテーブル,レステーブルの2テーブルだけ、
板はどこかに一覧がいるが、DBのテーブルとしてまでは要らんかなぁ。
ただ、各スレのレス数取得
SELECT thread,count(response) WHERE board= 'xxx' FROM table GROUP BY thread;
見たいなSQLがしょっちゅう走らせると問題になりそうなので、
書き込み(INSERT)時にトリガを仕掛けるとかが必要になってくるでしょうね。
細かいところはスレ違いか? 正規化スレの方がよさそ。

>>877
SELECT T1.*,
(SELECT 単価 FROM 単価テーブル WHERE 価格適用日=(SELECT max(価格適用日) FROM 単価テーブル WHERE 商品コード=T1.商品コード AND 価格適用日<=T1.購入日))
FROM 販売テーブル AS T1;

MSSQLで動くかどうかは知らん。
879NAME IS NULL:2007/03/18(日) 23:23:58 ID:???
>>877
可能なら、価格適用日はFROM TOで持っておけば楽になるぞ。

単価テーブル 
商品コード | 価格適用日FROM | 価格適用日TO | 単価 
880NAME IS NULL:2007/03/19(月) 00:44:36 ID:???
>>877
select a.商品コード,a.購入日,a.単価
from (
select h.商品コード,購入日,単価,価格適用日
from 販売テーブル h,単価テーブル t
where h.商品コード=t.商品コード
) a,(
select h.商品コード,購入日,max(価格適用日) 価格適用日
from 販売テーブル h,単価テーブル t
where h.商品コード=t.商品コード and 価格適用日<=購入日
group by h.商品コード,購入日
) b
where a.商品コード=b.商品コード and a.価格適用日=b.価格適用日
881NAME IS NULL:2007/03/19(月) 12:54:33 ID:A0j4KWTn
>>871

yumが使えるんなら,

yum install php-pgsql

これでおkじゃないか?
まあすれ違いなのでこれ以上はアドバイスできんが,
コンパイルしなおす必要はない。windows版ならphp.iniの
pgsqlの関係のコメントをはずすだけだしfedoraなら上記で。
882NAME IS NULL:2007/03/19(月) 17:36:05 ID:???
>>875
何とか言えー!
883NAME IS NULL:2007/03/21(水) 14:31:42 ID:???
何とか
884NAME IS NULL:2007/03/22(木) 02:46:36 ID:pjljHPoK
Windows XP SP2でDB2 V9のExpress-Cバージョンを入れようとすると、
CDをインサートした瞬間に問題が発生したため、db2lp.exe を終了します。
ご不便をおかけして申し訳ありません。
AppName: db2lp.exe AppVer: 9.1.0.356 ModName: ntdll.dll
ModVer: 5.1.2600.2180 Offset: 00001010

というメッセージが表示されて、落ちてしまう。2台のコンピューターで試したけど、
同じ現象が起こる。2台ともに共通しているのはXP SP2,カスペルスキー、
オフィス2003がはいているくらい。後は秀丸とかフリーのソフトが入っている。
なのに過去に一度もインストールしたことがないのに、このようなメッセージが
でるかわかりません。このようなメッセージが出て解決された人はいますか?
885NAME IS NULL:2007/03/22(木) 19:18:20 ID:???
>>884
専用スレがあるからそっちで聞いてみるといい。過疎気味だけど

IBM DB2 総合スレ2
http://pc11.2ch.net/test/read.cgi/db/1166153254/
886NAME IS NULL:2007/03/22(木) 22:44:47 ID:???
>>885 ありがとうございます、DB2のスレで聞いてみます。
887NAME IS NULL:2007/03/22(木) 23:16:12 ID:RBDAGc0R
hogehogeというテーブルにnameフィールドがあり、
「テスト」というデータが数件入っているのですが、

name
テスト
テスト
テスト

SELECT * FROM hogehoge
で取得し、見てみると、
「テスト」がひとつしか格納されていません
全て取得するにはどうすれば良いのでしょうか?
888NAME IS NULL:2007/03/22(木) 23:37:14 ID:RBDAGc0R
すみません、PHPの問題で解決しました
889NAME IS NULL:2007/03/23(金) 00:38:57 ID:RS+1p0xB
教えて下さい。
>>12の変形です。
店ごとに、値段の安い上位2アイテムを
抽出する方法を教えて下さい。
TOP2だと店無視で2アイテムしかでません。

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


(取得したい結果↓)

SHOP | ITEM | PRICE |
---------------------------
A | 1 | 10
A | 2 | 30
B | 7 | 5
B | 8 | 15
C | 9 | 10
C | 11 | 800

店ごとの上位100ランキング表作成しろとか
いわれて手がでないです・・・
890NAME IS NULL:2007/03/23(金) 02:05:19 ID:???
>>889
rankが使える処理系なら

select shop, item, price from
 (select *, rank() over (partition by shop order by price) as rank from テーブル) a
 where rank <= 2 order by shop, rank
891NAME IS NULL:2007/03/23(金) 05:42:56 ID:???
892NAME IS NULL:2007/03/23(金) 13:56:47 ID:F44imCFj
Firebird1.5で下記のtableA,tableBを結合して出力サンプルのような結果を得たいのですが
通常のSQLだけで処理できますでしょうか。
要するにB_DATEの一番小さい行と、tableAを左外部結合するような感じなのですが、うまくいきません。

tableA
A_ID  A_NAME
 0    SS200
 1    SK300
 2    KM620
 3    TS120

tableB
A_ID  B_DATE   B_NAME
 1   07/02/12  ROLER-1
 1   07/03/11  MOTOR-2
 1   07/01/10  ROLER-2
 3   06/12/28  SPACER-1
 3   07/01/21  ROLER-2

出力サンプル
A_ID  A_NAME  B_DATE   B_NAME
 0    SS200
 1    SK300  07/01/10   ROLER-2
 2    KM620
 3    TS120  06/12/28   SPACER-1
893NAME IS NULL:2007/03/23(金) 22:25:10 ID:???
>>889

SELECT A.SHOP,A.ITEM,A.PRICE
FROM TBL A
WHERE EXISTS
(
SELECT 1
FROM TBL B
WHERE B.SHOP = A.SHOP
AND B.PRICE <= A.PRICE
HAVING COUNT(B.SHOP) <= 2
)
ORDER BY A.SHOP,A.ITEM
894NAME IS NULL:2007/03/23(金) 23:33:15 ID:8VoitTUi
しょうもない質問ですみません。
Webアプリに興味があり、Apache,MySQL,PHPを軸に学習しようと思うのですが、
ノートブック(WinXPpro、メモリ1G)を学習、開発環境専用に使用するのは妥当でしょうか?

開発環境の主流はLinuxOSなんでしょうか?
もしWinで不都合な点があれば教えていただきたいです。
895NAME IS NULL:2007/03/24(土) 00:01:42 ID:???
この辺の方がいいかも。

△▲ WebProg 初心者の質問 Part15 ▼▽
http://pc11.2ch.net/test/read.cgi/php/1169725490/
896NAME IS NULL:2007/03/24(土) 00:08:01 ID:???
>>894
スレ違いつーか、板違いなんだが。
まぁ、何を持って妥当性を問うのかワカランが、別にWindowsでも問題ないよ。
実運用はLinux系OSが多いので、そちらの知識もあった方がいいとは思うけど。
Webアプリに限らず、ノートで開発している人は多と思うし、俺もそうだった(SXGA+だが)。
メモリ1GありゃVMwareを動かす手もある。Xは起動せずにSSH経由などで操作すりゃ
テスト環境としては十分な速度だし。
897NAME IS NULL:2007/03/24(土) 00:40:41 ID:???
>>892
Firebird1.5でjoin〜onが使えるか実は知らないが標準SQLで書くなら

select A_ID,A_NAME,B_DATE,B_NAME
from tableA a left outer join (
select c.A_ID,c.B_DATE,c.B_NAME
from tableB c join (
select A_ID,min(B_DATE) B_DATE
from tableB
group by A_ID
) d
on c.A_ID=d.A_ID and c.B_DATE=d.B_DATE
) b
on a.A_ID=b.A_ID
order by a.A_ID;
898894:2007/03/24(土) 00:50:58 ID:???
>>895
ご誘導ありがとうございます。今後参考にさせていただきますね。

>>896
板違いすみません。もっと調べるべきでした。。

Winノートでも大丈夫なんですね。
Winに慣れてしまってるんでしばらくWinでやってみようかと思います。
板違いにも関わらず親切な対応ありがとうございました。
899NAME IS NULL:2007/03/24(土) 01:34:40 ID:???
>>892
>>897に先越されちゃってるけどやってみた。

SELECT a.A_ID, a.A_NAME, b.B_DATE, b.B_NAME
FROM tableA AS a
LEFT OUTER JOIN (
SELECT A_ID, B_DATE, B_NAME
FROM tableB AS c
WHERE B_DATE = (
SELECT MIN( B_DATE )
FROM tableB
WHERE c.A_ID = A_ID
GROUP BY A_ID )
) AS b ON a.A_ID = b.A_ID
900892:2007/03/24(土) 11:50:26 ID:???
>>897
>>899
ありがとうございます。残念ながらFB1.5ではテーブル名の部分に
サブクエリを使えません。2.0なら大丈夫なようです。
901NAME IS NULL:2007/03/24(土) 12:24:08 ID:???
こんなTABLEがあります。

TABLEレイアウト
名前 varchar2(100)
日付 number(8)
時間帯 number(2) <-- 0から23までの時間帯が入っている。
売上数 number

データとしては
名前 日付 時間帯 売上数
-------- -------- ---------- ------------
山田 20070310 0 100
山田 20070310 1 100
山田 20070310 3 100
・・・
高橋 20070310 0 200
高橋 20070310 2 300
・・・
という風に入っているのですが、レコードが存在しない時間帯があります。
このレコードが存在しない時間帯を売上数0としてダミー的に表示させる
SQLは書けないでしょうか。

名前 日付 時間帯 売上数
-------- --------- ---------- ------------
山田 20070310 0 100
山田 20070310 1 100
山田 20070310 2 0 <-- ダミー
山田 20070310 3 100
・・・
高橋 20070310 0 200
高橋 20070310 1 0 <-- ダミー
高橋 20070310 2 300
・・・
902NAME IS NULL:2007/03/24(土) 12:34:56 ID:???
>>901
日付 number(8) 
時間帯 number(2)
からなるテーブルが別に必要。それにあらかじめ日付時間帯を入力しておく。
903NAME IS NULL:2007/03/24(土) 13:10:48 ID:???
演算子についての質問ですが、
「!=」と「<>」の違いは明確にありますか?
どの点が違うというのがありましたら、教えて下さい。
904NAME IS NULL:2007/03/24(土) 13:19:19 ID:???
>>903
意味は同じだが、ANSI SQL的には <> が正しい。
!= はCやその系統の言語で使われているので、一部の処理系のSQLでも使えたりする。
905901:2007/03/24(土) 13:19:39 ID:???
>> 902
そのテーブルを用意して、どのようなSQLを書けばいいでしょうか。
名前があるので単純な外部結合ではうまくいかないような。。。
906NAME IS NULL:2007/03/24(土) 13:21:51 ID:???
>>904
>意味は同じだが、ANSI SQL的には <> が正しい。

おお、そういうことなんですか。
単発のくだらない質問にお答えありがとうございます。
907NAME IS NULL:2007/03/25(日) 00:47:55 ID:???
>>901
Oracleだったら…

select c.名前,c.日付,c.時間帯,nvl(d.売上数,0) 売上数
from (
select a.名前 名前,a.日付 日付,b.時間帯
from (
select distinct 名前,日付
from TABLE
) a,(
select rownum-1 時間帯
from all_objects
where rownum<=24
) b
) c,TABLE d
where c.名前=d.名前(+) and c.日付=d.日付(+) and c.時間帯=d.時間帯(+)
order by c.名前,c.日付,c.時間帯;
908889:2007/03/25(日) 01:02:42 ID:???
>>890
>>891
>>893
ありがとうございます。
やっと動くようになりました。
909NAME IS NULL:2007/03/25(日) 03:10:49 ID:???
selectで表を取得するとき、
列とその値しか取得することができませんが、
そのとき、表のタイトルを付けたいのですが、
そういうことはできますか?
例えば、次のような機能はありますか?

(ここらへんに表題を付けることができればいいのですが。。)
カラム名
--------
1000
910NAME IS NULL:2007/03/25(日) 03:14:07 ID:???
>>909ですが、
任意の表題でもいいし、テーブル名でもいいので、
表のタイトルとして表示させたいのです。
911901:2007/03/25(日) 16:33:33 ID:???
>> 907
ありがとうございます。明日試してみます!
912NAME IS NULL:2007/03/25(日) 16:56:35 ID:+mvq7EfM
PHP+MySQLで制作しています。

下記[1]のような数字のデータがありますが、
重複する数字をカウントして、
distinctで[2]のような形にするselect文を教えてください。

[1]
num 
------------------
| 1 | ・・・
| 2 | ・・・
| 3 | ・・・
| 3 | ・・・
| 4 | ・・・
| 5 | ・・・
| 5 | ・・・
| 5 | ・・・
| 6 | ・・・
| 7 | ・・・
| 7 | ・・・
------------------

[2]
num cnt
-----------
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 1 |
| 5 | 3 |
| 6 | 1 |
| 7 | 2 |
----------


select count(distinct num) as cnt 
こんな感じで行き詰ってしまいました。
913NAME IS NULL:2007/03/25(日) 17:03:06 ID:???
>>912
MySQL は知らんけど、普通に Group By でいけるでしょ

select num, count(num)
from table
group by num
914NAME IS NULL:2007/03/26(月) 19:01:28 ID:AMmRJ556
SQL文でSELECTを使ってデ−タを表示しています。
nvarchar型のデータ(管理コード)をORDER BYで値順で表示しているのですが

1000
11000
200
25000

左から数値を見ているため上記の様な表示になります。

200
1000
11000
25000

上記の様に右から値順で表示してほしいのですがどうすればよいでしょうか?
915NAME IS NULL:2007/03/26(月) 19:04:56 ID:???
>>914
管理コードを整数に替えるか、管理コード登録時に
00200
01000
11000
25000
のように桁数をあわせばいいんじゃね?
それか整数にキャストするか。
916912:2007/03/26(月) 22:00:07 ID:Narz+pYj
>>913
ご返事遅くなりましたが、出来ました。
ありがとうございます。
917NAME IS NULL:2007/03/27(火) 11:52:50 ID:Tn/pQeKS
教えてください。

DAY1の最新日付のQTYを1件だけ取得したいのですが、
もし、DAY1の最新日付がNULLだった場合は、
そのQTYを取得したい。

CODE QTY DAY1
0001 1   2007/03/06
0002 2   2007/03/05
0003 3   2007/03/04
0004 4   2007/03/03
0005 5   2007/03/02
0006 6   2007/03/01
0007 7   NULL

欲しい結果:
1

CODE QTY DAY1
0007 7   NULL

欲しい結果:
7

失敗例:
SELECT QTY FROM TABLE
WHERE DAY1 IS NULL OR DAY1=(SELECT MAX(DAY1) FROM TABLE);
出力結果:
1
7
918NAME IS NULL:2007/03/27(火) 12:06:18 ID:???
SELECT QTY FROM TABLE
WHERE DAY1=(SELECT MAX(DAY1) FROM TABLE)
OR (DAY1 IS NULL AND NOT EXISTS (SELECT MAX(DAY1) FROM TABLE))
919NAME IS NULL:2007/03/27(火) 12:06:46 ID:???
>>917
ORDER BY
LIMIT 0,1
920NAME IS NULL:2007/03/27(火) 12:08:22 ID:???
あ。集計関数で NOT EXISTS は無理か・・・

SELECT QTY FROM TABLE
WHERE DAY1=(SELECT MAX(DAY1) FROM TABLE)
OR (DAY1 IS NULL AND (SELECT MAX(DAY1) FROM TABLE) IS NULL)
921NAME IS NULL:2007/03/27(火) 12:28:11 ID:???
>>920
ありがとうございます!
それで正常動作しました。
同一集計関数を2回呼ぶとは考え付きませんでした。
922NAME IS NULL:2007/03/28(水) 00:43:25 ID:???
nullを'1900/01/01'とかに置き換えてorder by して top 1 取った方がパフォーマンス良さそう
923NAME IS NULL:2007/03/28(水) 01:11:32 ID:???
>>917
Oracleなら…
SELECT QTY FROM TABLE WHERE DAY1=(
SELECT MAX(NVL(DAY1,TO_DATE('9999/12/31','YYYYMMDD')) FROM TABLE
)
924NAME IS NULL:2007/03/28(水) 01:31:00 ID:???
>>923
DAY1 が NULL のとき、それで出る?
925NAME IS NULL:2007/03/28(水) 02:34:41 ID:???
>>924
おっとっと、左辺もNVLするの忘れてた。スマソ。
SELECT QTY FROM TABLE WHERE NVL(DAY1,TO_DATE('9999/12/31','YYYYMMDD')=(
SELECT MAX(NVL(DAY1,TO_DATE('9999/12/31','YYYYMMDD')) FROM TABLE
)
926NAME IS NULL:2007/03/28(水) 10:55:16 ID:zXzG4Wvl
質問です

以下のようなテーブルAAAがあります

ID(int) | No(int) | Name(string)

データとしては
1,1なまえ
1,2,は
1,3AAA
1,4,です
2,1,あいうえお

このようなデータの時
出力される内容は

ID | Name
1,なまえはAAAです
2,あいうえお

このように出力したいのです。
そこで
SELECT ID,Name FROM AAA
GROUP BY ID
までは思いついたのですが、Nameが文字列の為数値のときに使うSumが使えません。
文字列を結合する事は出来るのでしょうか?

ちなみにDBはPostGres7.4を使用しています。
927NAME IS NULL:2007/03/28(水) 11:01:29 ID:???
連結関数作るとか
928NAME IS NULL:2007/03/28(水) 13:08:59 ID:???
>>927
むぅ・・・・
やっぱ一撃必殺で取得は無理ですか
929917:2007/03/28(水) 16:23:28 ID:???
>>925
Oracle8なのでそのコードで試して見ましたが、
NULLがヒットしません。

> MAX(NVL(DAY1,TO_DATE('9999/12/31','YYYYMMDD')))
この部分が気になるのですが、
MAX関数内にNULLの判定を入れても
もともとNULLは集計対象外では?
930NAME IS NULL:2007/03/28(水) 16:30:35 ID:???
>>929
NVL
931917:2007/03/28(水) 17:17:15 ID:???
ああ、すいません
しっかり返ってきました
932NAME IS NULL:2007/03/28(水) 20:33:58 ID:???
つかそれだとnullが最大とみなされちゃうじゃん。
>>917
CODE QTY DAY1
0001 1   2007/03/06
0002 2   2007/03/05
0003 3   2007/03/04
0004 4   2007/03/03
0005 5   2007/03/02
0006 6   2007/03/01
0007 7   NULL
の例だと7が返ってくると思うけど
933NAME IS NULL:2007/03/29(木) 04:00:16 ID:???
>>917に対する疑問

最初の例で最新がDAY1が2007/03/06となる理由は?
NULLを一番優先順位が低いものとするということなのか?

またDAY1はNULLも含めて一意なのか?
一意でない場合はどのような条件で1行に絞るのか?

など良くわからない点があるな…
934NAME IS NULL:2007/03/29(木) 04:30:29 ID:???
>926
PostGreは知らんが、
Noの最大値がわかるなら、MAXとCASEを使って取れるじゃね。
↓Oracleでの例
SELECT ID,
MAX(CASE WHEN No = 1 THEN Name ELSE NULL END) ||
MAX(CASE WHEN No = 2 THEN Name ELSE NULL END) ||
MAX(CASE WHEN No = 3 THEN Name ELSE NULL END) ||
MAX(CASE WHEN No = 4 THEN Name ELSE NULL END) AS Name
FROM AAA
GROUP BY ID
ORDER BY ID
935NAME IS NULL:2007/03/29(木) 07:48:25 ID:9BGmCr7g
SQLとDBがなぜ今これほど持て囃されているか。。
世界諸国家の策謀が懸かっているのをご存知か?
我々がネットに流した全ての情報。。名前、全てのネットに流した書き込み。。が
限られた人たちの手に握られようとしている。

いま、意図的に流行らされ、そのジャンルの中に天才的な人材が生まれ始めたとき、
初めてSQLに意味が出てくるのだ。。。ある種の人たちに限れば。

これから、コンピュータの更なる発展によって
全ての情報の99%以上がネットワークに流される時代が来る時、
全ての人の生きてから死ぬまでの情報が管理されたDBによって、
たった数百人の現人神たちを楽しませるために生まれたのだ。
936NAME IS NULL:2007/03/29(木) 11:41:37 ID:???
SQL Server2005を利用しております。

DBが何らかの理由により、select文等を実行出来ないもしくは実行に十数秒時間が
掛かったらアラートとして指定のメールアドレスに通知を行いたいと思います。
何かいい方法とかツールはありますでしょうか?

937NAME IS NULL:2007/03/29(木) 14:12:52 ID:???
>>936
Microsoft SQL Server 総合スレ 5
ttp://pc11.2ch.net/test/read.cgi/db/1175091880/

このスレも誘導目的の関連スレとか、FAQも含めたテンプレがあった方がいいかな?
938NAME IS NULL:2007/03/30(金) 14:31:24 ID:OlbCK0te
オラクルってテーブル名の修飾にAS句を使えないの?
939NAME IS NULL:2007/03/30(金) 14:55:15 ID:???
>>938
使えるよ
940NAME IS NULL:2007/03/30(金) 15:09:23 ID:OlbCK0te
>>939
SELECT A.商品ID, B.数量
FROM 商品マスタ AS A
INNER JOIN 売上明細 AS B
ON A.商品ID = B.商品ID
;

こう書くとエラーで、ASを抜くと通ります。
初心者なのでつまらない勘違いをしていそうですが、分からないです。
誰か教えてください。
941939:2007/03/30(金) 16:51:16 ID:???
>>940
すまん、Oracle8iで流してみたら
AS句は使えないみたいだ。

というか、INNER JOINも使えなかったが。
942NAME IS NULL:2007/03/30(金) 17:18:53 ID:???
>>941
お手数かけてすみません。
ありがとうございました。
INNER JOINは10g(express)だと使えるようです。
943NAME IS NULL:2007/03/30(金) 18:30:08 ID:???
>>942
9iではASで指定できるよ。
944NAME IS NULL:2007/03/30(金) 19:41:15 ID:???
グダグダでワロタ
945NAME IS NULL:2007/03/30(金) 21:00:31 ID:???
9iもテーブル名にASは使えない
(使えるのはカラム名)
946NAME IS NULL:2007/03/30(金) 22:18:08 ID:AwhCfeDt
MySQLで、最後から5件のデータを取得とかどうやるとできますか?
947NAME IS NULL:2007/03/30(金) 22:20:04 ID:???
>>946
降順に並べて先頭から5件
948NAME IS NULL:2007/03/30(金) 23:00:08 ID:AwhCfeDt
>>947
なるほど。ありがとうございます。
しかしそのやり方だとデータを表示するときも降順になってしまうので
できれば昇順で最新の5件を取得したいです。
よろしくお願いいたします。
949NAME IS NULL:2007/03/30(金) 23:16:16 ID:???
他のデータ削除するか新しいテーブルにinsertするかすれば?
950NAME IS NULL:2007/03/30(金) 23:37:24 ID:???
俺は同じ様な事で教えてもらったものを使ってる。 株価テーブル(銘柄コード・出来高年月日がキー)で
直近100日分のデータを昇順で出すものだけど(MySQL 4.1)

select * from ( select * from kabuka
where mcode=xxxx order by wk_date desc limit 100 ) as x
order by wk_date asc
951NAME IS NULL:2007/03/31(土) 01:47:39 ID:???
>>950
直近100日分 + 最も古いデータ1件を抽出するクエリが知りたい。
952NAME IS NULL:2007/03/31(土) 01:52:18 ID:???
>>951
union all
953NAME IS NULL:2007/03/31(土) 02:28:10 ID:???
ありがトン!
954NAME IS NULL:2007/03/31(土) 15:55:33 ID:3cRYEFr6
MySQLの質問です

SELECT する際、特定のフィールド以外を取得するにはどうすればいいのでしょうか?

フィールド名 user_id, name, dob, join_date
で、join_date以外をセレクトしたいのです…

SELECT * FROM user_table
SELECT * (WITHOUT join_date) FROM user_table (←腰が抜けるほど、自分勝手に書きました…)
みたいなことって出来ないのでしょうか?
955NAME IS NULL:2007/03/31(土) 18:14:23 ID:???
できない。
あきらめろ。
956NAME IS NULL:2007/03/31(土) 18:31:09 ID:3cRYEFr6
>955
やっぱりそうか。。。ありがとうございました。勉強になりました
957NAME IS NULL:2007/03/31(土) 20:09:10 ID:???
join_date以外を全部書けばええやん
SELECT user_id, name, dob FROM user_table
958NAME IS NULL:2007/04/01(日) 02:27:45 ID:???
INSERT INTO old SELECT * FROM new
これだとテーブル名newのデータをoldに入れることができるのですが
テーブル名newのフィールド名code以外を入れるにはどうしたらいいでしょうか?
959NAME IS NULL:2007/04/01(日) 02:50:15 ID:???
>>958
RDBMSに因ってはカラムの型と順序があってればカラム名は無視するものがある。
oldテーブルのカラム順にあわせてSELECTすれば済む。
INSERT INTO old SELECT column1,column2 FROM new;
カラム名も同じでないとダメなら、
INSERT INTO old SELECT column1 AS oldname1,column2 AS oldname2 FROM new;

全て丁寧に書き上げれば、
INSERT INTO old(oldname1,oldname2) SELECT column1 AS oldname1,column2 AS oldname2 FROM new;
960958:2007/04/01(日) 04:47:34 ID:???
>>959
できました。
ありがとうございます。
961NAME IS NULL:2007/04/03(火) 12:31:42 ID:SKiNbGpd
番号や日時などのカウントしてるカラムがない状態で
単純に入力されたレコード順を desc したいのですが、
何か方法はありますか?
962NAME IS NULL:2007/04/03(火) 12:40:41 ID:???
>>961
テーブル設計が間違ってるから
とりあえず順序を保証する列を追加汁。
963NAME IS NULL:2007/04/03(火) 19:09:42 ID:???
sql server 2000で、大量のメモリを積んでも
order by がオンメモリで実行されないのは仕方ないのでしょうか。

oracleはsort sizeを指定できたのですが同様のオプションはないのでしょうか。
964NAME IS NULL:2007/04/03(火) 20:26:48 ID:???
>>963
スレ違い。
Microsoft SQL Server 総合スレ 5
http://pc11.2ch.net/test/read.cgi/db/1175091880/l50
965NAME IS NULL:2007/04/05(木) 16:27:07 ID:???
sql*plusでcreate tableでデータ型をdateで定義したとき、
日付と時刻を例えば2007/01/01 14:22:50のように具体的に入力したい場合は
どうすればいいのですか?
966NAME IS NULL:2007/04/05(木) 18:04:40 ID:???
>>965
TO_DATE()
967NAME IS NULL:2007/04/07(土) 00:18:27 ID:???
ACCESS2007のSQLで質問です

コード 年月    数値
A    2006/01 19
B    2006/01 18
C    2006/01 17
A    2006/02 21
B    2006/02 22
C    2006/02 23
A    2006/03 39
B    2006/03 38
C    2006/03 37

(1)月毎に数値の上位2つを抜き出す
A    2006/01 19
B    2006/01 18
B    2006/02 22
C    2006/02 23
A    2006/03 39
B    2006/03 38

(2) (1)の結果とコードは同一、年月は1月前で結合して 
最終的にこんなのがほしいです
A    2006/02 21
B    2006/02 22
B    2006/03 38
C    2006/03 37

SELECT TOP と副問い合わせを使えばできそうな気はするのですが
私には荷が重いようで
(1)だけでもどなたか教えてください
968NAME IS NULL:2007/04/07(土) 01:09:36 ID:???
>>967
ひょっとして>>889と同じ宿題じゃねw
>>889に対する回答を読めばわかると思う。
969NAME IS NULL:2007/04/10(火) 15:25:07 ID:sD7FH5rm
質問ですが、特定のフィールドの中のデータに右側にスペースがあるためそれを削除して更新したいのですが
update テーブル1 set field1 = select rtrim([field1]) from テーブル1;
みたいに幾つか試してもダメです。本見たりググッたりしているのですが、わからないのです。
どうしたら削除して更新できるようなSQL文が組めるのでしょうか?
970NAME IS NULL:2007/04/10(火) 15:29:31 ID:???
>>969
update テーブル1 set field1 = rtrim([field1]) 
971NAME IS NULL:2007/04/10(火) 15:44:39 ID:sD7FH5rm
>>970
感謝です、なりました
972NAME IS NULL:2007/04/10(火) 15:50:17 ID:???
あっこっちがあったのか
別スレとマルチになっちゃいますがむこう一日放置されたんで…

すんません
mysql5の質問です

userテーブル id(int) name(varchar)
sendテーブル from_id(id) to_id(int)
があるとき
from_idとto_idのそれぞれのnameを取得したいのですが
うまくいきません

select from_id, to_id, (from_idの)name, (to_idの)name
from user, send where send.from_id=user.id and send.to_id=user.id
イメージ的には↑こんな感じなんですが……

たとえば
select from_id, to_id, t1.name, t2.name
from user, send where send.from_id=user.id as t1
and send.to_id=user.id as t2

みたいな方法ってあるんでしょうか?
お願いします
973NAME IS NULL:2007/04/10(火) 15:59:34 ID:???
select f.name, t.name from send
join user f on send.from_id = f.id
join user t on send.to_id = t.id

移動はかまわないが誘導はしておいてくれ。
974NAME IS NULL:2007/04/10(火) 17:26:01 ID:???
>973
ありがとうございます!助かります
そのヒントでがんばってみます

>移動はかまわないが誘導はしておいてくれ。
ここのurl書いときました
975NAME IS NULL:2007/04/10(火) 19:30:34 ID:???
>>967
 968氏のヒントを読んで作ってみた。ACCESS2003で確認

SELECT TT.[コード], TT.[年月], TT.[数値]
FROM table3 AS TT,
(
SELECT T3.[コード],DateAdd("m",1,T3.[年月]) AS [年月]
FROM table3 AS T3
WHERE [数値] IN (
SELECT TOP 2 [数値]
FROM table3
WHERE T3.[年月]=[年月]
ORDER BY [数値] DESC
)
) AS TS
WHERE TT.[年月]=TS.[年月] AND TT.[コード]=TS.[コード]
ORDER BY TT.[年月], TT.[コード], TT.[数値] DESC
;
976NAME IS NULL:2007/04/11(水) 23:04:33 ID:???
MYSQLでデータベースを勉強始めたんですがテーブルの作成で
いきなり詰まりました。

CREATE TABLE DIARY(
DIARY_ID AUTO_INCREMENT RIMARY KEY,
UPDATE_DATE DATE,
TITLE VARCHAR(64),
ARTICLE TEXT
);

という感じですが、エラー1064シンタックスエラーとでました。
どこがまちがってますか?
977976:2007/04/11(水) 23:06:23 ID:OcHXQf/Q
× DIARY_ID AUTO_INCREMENT RIMARY KEY,
○ DIARY_ID AUTO_INCREMENT PRIMARY KEY,

データベースにはちゃんと打ち込んでました。
978NAME IS NULL:2007/04/11(水) 23:41:06 ID:???
MYSQL『DIARY_IDの型ワカンネ。死ぬ。』
979NAME IS NULL:2007/04/12(木) 13:43:31 ID:EDoxXkrN
>>976
>>978さんを翻訳すると

DIARY_ID INT AUTO_INCREMENT RIMARY KEY,


980NAME IS NULL:2007/04/12(木) 15:05:56 ID:Sbd1R0wY
こんにちは。よろしくお願いいたします。
例えば以下のように、二つの同じ構造を持つテーブルがあったとして、
一方の行を優先的に採用して、これに無いキーの行が他方にあった場合に、
他方の行を採用して、結果セットを返すことを、joinのような操作でできないものか
と思っています。具体的には、

create table t1 (
key int,
name text
);
create table t2 (
key int,
name text
);

insert into table1 values(1,'t1_1');
insert into table1 values(3,'t1_3');

insert into table2 values(2,'t2_1');
insert into table2 values(3,'t2_3');

としたテーブルから

1, "t1_1"
2, "t2_1"
3, "t1_3"
のような結果セットを得たいと思うのですが、join周辺で考えるのは、おかど違いでしょうか。。
981NAME IS NULL:2007/04/12(木) 15:07:29 ID:???
↑insertの部分、

insert into t1 values(1,'t1_1');
insert into t1 values(3,'t1_3');

insert into t2 values(2,'t2_1');
insert into t2 values(3,'t2_3');

でした。。度々すみません。
982980:2007/04/12(木) 15:20:08 ID:???
joinよりは、むしろ、このへんのようですね。。
ttp://www.techscore.com/tech/sql/08_01.html
なんとか頑張ってみたいと思います。お騒がせしました。。
983NAME IS NULL:2007/04/12(木) 17:58:38 ID:+M1Tpzg5
今実行できる環境がないので教えていただきたいのですが、
tableA
ColA ColB ColC
---- ---- ----
1 2 4
2 1 5
3 2 6

上記のテーブルの場合に、
ColB、ColCの合計と、select * した結果を取得したいんですが、

ColA ColB ColC
---- ---- ----
null 5 15
1 2 4
2 1 5
3 2 6

この場合のSQLは
select ColA, sum(ColB) as ColB, sum(ColC) as ColC
from tableA
grouping sets((ConA),())
でいいんですか?
984sage:2007/04/13(金) 03:44:20 ID:PJKJA3tC
select ColA, sum(ColB) as ColB, sum(ColC) as ColC
from tableA
group by grouping sets((ColA),());

または

select ColA, sum(ColB) as ColB, sum(ColC) as ColC
from tableA
group by rollup(ColA);
985NAME IS NULL:2007/04/13(金) 16:34:05 ID:RNYTl6WI
ACCESS2000を使ってます。
在庫テーブルに商品名カラムと定価カラムと納入日カラムがあります。
まず納入日で昇順をかけて古い納入日から定価を足していって
合計が50000円を超える直前までのレコードを引っ張ってくるSQL文って
どう書けばいいかわかりません。
お願いします。
986983:2007/04/13(金) 17:36:57 ID:???
>>984
ありがとうございます。
助かりました。
987NAME IS NULL:2007/04/13(金) 17:47:18 ID:???
>>985
5000円を超えるまで足すとか、そんな制御って標準のSQL一発だけで出来るんか?
AccessだったらVBAを使う方向で考えた方がいいんじゃない
988NAME IS NULL:2007/04/13(金) 22:39:32 ID:???
>>985
こんなのはダメ?

select * from 在庫 as 在庫0
where (select sum(定価) from 在庫 as 在庫1 where 在庫1.納入日<=在庫0.納入日) <= 50000
order by 納入日;
989NAME IS NULL:2007/04/14(土) 19:12:19 ID:vEBJlPWj
すいません質問です。
Oracle Plusを使っています。


購入日    顧客名 支払金    
1101 山田  1000
1104     田中 2000
1107     山田 500
1120     鈴木 1000
1027     鈴木 500
1010     山田 1000
1005     山田 1000

というようなデータがあったとして

顧客名   10月   11月
山田   2000 1500
田中   0  2000
鈴木  500 1000

という風に月毎の合計金額を出したいのですがどうしたら良いでしょうか?


990989:2007/04/14(土) 19:17:12 ID:vEBJlPWj
購入日    顧客名  支払金    
1101      山田  1000
1104     田中  2000
1107     山田   500
1120     鈴木  1000
1027     鈴木  500
1010     山田  1000
1005     山田  1000

顧客名   10gatu 11gatu
山田      2000   1500
田中      0    2000
鈴木      500   1000

ずれてしまいました・・・
訂正します。
月毎の支払金の合計金額を出したいのです。
991NAME IS NULL:2007/04/14(土) 19:22:01 ID:???
もうそろそろ次スレお願いします m(__)m
992989:2007/04/14(土) 19:26:48 ID:vEBJlPWj
それと書き忘れましたが
表には

1224 山田 2000
0930 田中 1000
のデータもあり、WHERE句でそれを限定したと考えてください。

ちなみに

SELECT 顧客名,
NVL(SUM(支払金),0) 10gatu,
NVL(SUM(支払金),0) 11gatu
FROM T_HARAI
WHERE 購入日 LIKE '10%'
OR 購入日 LIKE '11%'
GROUP BY 顧客名;

では二ヶ月の支払金の合計金額が出るだけです。
なんとか1回のSELECTで出したいのです。支払金を11gatuと10gatuの列に振り分ける良い関数か何かがないでしょうか?
長々と失礼しましたがよろしくお願いします。
993989:2007/04/14(土) 19:28:22 ID:vEBJlPWj
ごめんなさいもう一つ訂正でFROM句には'表'が入ります。
994NAME IS NULL:2007/04/14(土) 19:52:50 ID:???
別々に集計したSQLを結合すれば良いのでは?
それぞれの列名を別名にして、顧客名で結合する。
995NAME IS NULL:2007/04/14(土) 20:35:48 ID:???
>>989
 こんな感じでどうでしょうか?

SELECT 顧客名,SUM(M10) "10月",SUM(M11) "11月"
FROM (
SELECT 顧客名
,DECODE(SUBSTR(購入日,1,2),10,SUM(支払金),0) M10
,DECODE(SUBSTR(購入日,1,2),11,SUM(支払金),0) M11
FROM T_HARAI
GROUP BY 顧客名,SUBSTR(購入日,1,2)
)
GROUP BY 顧客名
996NAME IS NULL:2007/04/14(土) 20:39:54 ID:???
>>922
ここ数年postgresqlしか触っとらんのでSQL方言になっとるかもしれんが、
SELECT
顧客名
,SUM(CASE WHEN 購入日 LIKE '10%' THEN 支払金 ELSE NULL END) AS 10gatu,
,SUM(CASE WHEN 購入日 LIKE '11%' THEN 支払金 ELSE NULL END) AS 11gatu,
・・・
こんなんでは駄目か?
997NAME IS NULL:2007/04/14(土) 20:56:05 ID:NMo+/zfb
998989:2007/04/14(土) 21:00:11 ID:vEBJlPWj
>>994
>>995
ありがとうございます。
ですが結合は使わない方法を探しているのです。
>>996
申し訳ありません。私の場合ですとそれでは駄目だと思います。
999NAME IS NULL:2007/04/14(土) 21:21:57 ID:???
とりあえず次スレ。
【帰ってきた】SQL質疑応答スレ 4問目
http://pc11.2ch.net/test/read.cgi/db/1176553195/l50
1000NAME IS NULL:2007/04/14(土) 21:25:49 ID:???
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。