1 :
デフォルトの名無しさん :
02/08/07 02:10
おちかり
6 :
デフォルトの名無しさん :02/08/07 10:35
おつかれー。 質問スレは別にあった方がいいと思う。
7 :
デフォルトの名無しさん :02/08/10 23:22
質問です。 SQLの集計関数でGROUP BY した時にグループ毎の小計を出したいのです。 MSSQLサーバなら COMPUTEを始めとしていろいろ出来ますが 汎用的なステートメントはあるのでしょうか? 特にDB2で実現したいと思っています。 アドバイスよろしくお願いします。
>7 select grp_name, sum(column_name) from table_name group by grp_name とかじゃなくて?
9 :
デフォルトの名無しさん :02/08/11 00:53
>>8 レスありがとうございます。
説明が足りなくて申し訳ありません。
ただ、私が期待している結果は集計行だけではなく、
例えば
prefect でグループ化をし
prefect name salary
-----------------------
tokyo aa 120
tokyo bb 60
tokyo cc 130
tokyo 310 ←ここに小計をいれたい
tiba dd 30
tiba ee 110
tiba 11 30
tiba 170←ここに小計をいれたい
....
という感じにしたいのです。
引き続きアドバイスよろしくお願いします。
>>9 そんなことできるDBがあるのね。しらんかった。
個人的には集計関数使うよりはデータだけ引っ張ってきて
プログラムの方で集計するほうが好みなんだけど。
アクセス数によるけど、DB側の処理は軽いほうがいいと思う。
DB2でもROLLUPとかCUBE使えるようですね。ありがとうございました。
13 :
デフォルトの名無しさん :02/08/14 02:05
1999年1月のデータを取得したい場合、WHEREはどのように記述するのですか? DATE ? '1999-01'
>>13 使ってるRDBMSによる。
DATE < '1999-02-01' and DATE >= '1999-01-01'
でRDBMSによっては動くかもしれない。またDATEから組み込み関数を
使って年と月を取り出して比較したりいろいろ方法はあるが、組み込み
関数を使うとインデックスが効かなくなる場合もあるので注意。
>>14 ありがとSUN
やっぱり日付こみで指定しないと駄目か
>14 >関数を使うとインデックスが効かなくなる場合もあるので注意。 そーそーこの間これでパフォーマンスがぼろぼろだったです。 SQL厨ですが、とりあえず逝って来ます。
すいません。教えてください。 九月の頭から業務でSQLを使用することになりました。 全くと言っていいほど知識がありません。。。 SQLはどのくらい難しいのでしょうか?
19 :
デフォルトの名無しさん :02/08/16 19:30
>>18 べつにいいじゃん。そんなことより
激しくすれ違い
20 :
デフォルトの名無しさん :02/08/16 21:56
SQL Server7.0/2000 を使用しています。 こういうことはできますか? テーブル A ID Name1 ---------- 1 a 2 b 3 c テーブル B ID Name2 ---------- 2 x 3 y 4 z このとき、以下のように結合したいのです。 ID Name1 Name2 ------------------ 1 a <NULL> 2 b x 3 c y 4 <NULL> z ちなみに select * from A full join B on A.ID=B.ID としたら、 ID Name1 ID Name2 ---------------------------- 1 a <NULL> <NULL> 2 b 2 x 3 c 3 y <NULL> <NULL> 4 z となってしまうのですが、ID を1列にまとめたいのです。 何かよい方法はありますか?
SQL Server7.0/2000はやったことない環境なので実際に試せないけど、 select NVL(A.ID, B.ID), Name1, Name2 from A full join B on A.ID = B.ID でできないかな? NVL()があるかどうかわからないので一応関数の仕様。 引数1がNULLだったら引数2の値を返す関数。
>>21 俺は20じゃ無いがあんたは紙だとおもふ
select coalesce(tab1.ID,tab2.ID) id,name1,name2
from tab1 full outer join tab2 on tab1.ID = tab2.ID
order by id
で、できますた。
SQL Server2000で確認済み
NVLって事はオラクルだとおもうけど、それって
9iじゃないと出来ないよね。8i以前はどうしていたんだろう・・・・
>>22 select ID, max(name1), max(name2)
from (
select ID, name1, null name2 from A
union all
select ID, null name1, name2 from B
)
group by ID
full outer joinの実行計画ってどうなるんだろ?
>>21 >>22 ありがとう!
なるほど、今 SQL Server2000 の BooksOnline 見てたら
ISNULL 関数というのもありますね。
うれしい、どうも!
>>24 標準はcoalesceだから特に理由がなければそっちを使っとけ
26 :
デフォルトの名無しさん :02/08/17 21:05
select (CASE の複雑な式) AS Code1, Left(Code1, 2) as Code2 from table1 しかしこれはエラーです。(Left 関数の「Code1」の箇所で) Code2 として Code1 の左二桁をとりたいのだが、 どうすればよいのか?? なんども (CASE の複雑な式) を書かないとだめでしょうか。 (SQL Server2000 使用です)
27 :
デフォルトの名無しさん :02/08/17 21:06
28 :
デフォルトの名無しさん :02/08/17 21:47
初心者質問なのですがSQLでJOINを使ってファイルを繋げば繋ぐほど処理速度はヤパーリ遅くなりますか?WHERE条件は引っ掛かるのが多い条件を先に書いた方が早いのでしょか?
>>26 本当に何度も書く、かつ汎用的ならユーザー定義関数を使うと吉。
31 :
デフォルトの名無しさん :02/08/18 10:32
>>28 その通りです
あと、From句のテーブルを書く順番も結構、速度が変わってくるので
取得データ・テーブル構成等を考えて指定してみてください
32 :
デフォルトの名無しさん :02/08/18 12:31
SQLやORACLEを学ぶのに皆様どうやっていますか。 またいい教材があったら教えてください。
33 :
別スレに誤爆していました(涙 :02/08/18 15:04
Oracle使うときにはObjectBrowserっていう便利なソフトがありますが SQLServerは使えませんでした。 SQLServer用の同様の便利なソフトってどんなのがあるのでしょうか?
34 :
デフォルトの名無しさん :02/08/18 15:08
>>33 標準のGUIツール(エンタープライズマネジャ、クエリーアナライザ)では
ダメですか?
仕事の便宜を考えたら、DB設計書 ←→ T-SQL
変換のスクリプトとかは作っておくと便利だと思います。
たぶん、ベンダー製品にもそうした機能のアプリはありそうです。
DBマガジンあたりを読んでみてはどうでしょうか。
35 :
デフォルトの名無しさん :02/08/19 17:59
Win32::ODBCでSqlメソッドでにてSQL文を実行したあとにフェッチしても 値を得られないのですが(SQLクエリを直接実行してみるとうまくいきます) Dumpしてみると Dumping Data for connection: 2 と出ます。考えられる原因を教えてください。
>22 漏れはSQL厨だよー。 8i以前はDECODE(data, compression1, result1, [compression2, result2, ..., compressionN, resultN], default)ってのがあるよ。 dataがcompression1ならresult1を、 compression2ならresult2を、 compressionNならresultNを、 それ以外はdefaultを返す。 >22を書き換えると select decode(tab1.ID, NULL, tab2.ID, tab1.ID) id,name1,name2 になる。 DECODEが長くなるならストアドファンクションにしたほうが吉。
>>36 =21
そんだけ知っててSQL鯖専門かいな
俺はどっちかといえば、Ora専門のつもりだったんだが・・・・
とはいっても、DBA関係から入ってOraで開発やりてーって、
上司に交渉中の身なんだがな。
>>23 のもちょっと考えたあとに納得できて
ふぅーんと思っていたが、
>>36 のはより直感的で
漏れのような超甘にはピッタリだつだよ
ということで、俺の中であんたは髪決定!!!
あぁ、入社5年目開発未経験なバカでも
Oraで開発やらせてくれる会社ないかなぁ。。。
38 :
デフォルトの名無しさん :02/08/20 13:22
Table A shopid shopname 001東京 002茨城 003埼玉 Table B No shopid1 shopid2 shopid3 1 001 002 0003 2 001 0002 3 001 0002 出力 No shopid1 shopname shopid2 shopname shopid3 shopname 1 001 東京 002 茨城 003 埼玉 2 - - 001 東京 002 茨城 3 001 東京 - - 002 茨城 TableAとTableBから、 こんな表を出力したいのですがうまくいきません。 どうすればよいでしょうか?
現在どんなふうにやっていて、何がどううまくいかないのかくらい書けやゴルァ
40 :
デフォルトの名無しさん :02/08/20 20:52
用事があったもので亀レスすまそ。 ちなみにこんな感じで考えますた。 select b.shopid1,a.shopname,b.shopid2,a.shopname,b.shopid3,a.shopname from b left outer join a on b.shopid1=a.shopid or b.shopid2=a.shopid or b.shopid3=a.shopid 結果はこうなりますた。 No shopid1 shopname shopid2 shopname shopid3 shopname 1 001 東京 002 東京 003 東京 1 001 茨城 002 茨城 003 茨城 1 001 埼玉 002 埼玉 003 埼玉 2 - 東京 001 東京 002 東京 2 - 茨城 001 茨城 002 茨城 うーん。1回では無理?
>37=22 ありがとん。 SQL鯖専門ではなくて、Sybaseもやったことあるです。 でも今はOraで開発。 >38 試してないけど多分これで。 select No, shopid1, DECODE(shopid1, NULL, '--', A.shopname), shopid2, DECODE(shopid2, NULL, '--', B.shopname), shopid3, DECODE(shopid3, NULL, '--', C.shopname) from Table_B, Table_A A, Table_A B, Table_A C where shopid1 = A.shopid and shopid2 = B.shopid and shopid3 = C.shopid
>>38 外部結合まではいいが、
あとはエイリアスを使うべし。
SELECT B.No,
B.shopid1,A1.shopname,
B.shopid2,A2.shopname,
B.shopid3,A3.shopname
FROM ( (B LEFT OUTER JOIN A as A1 ON B.shopid1 = A1.shopid)
LEFT OUTER JOIN A as A2 ON B.shopid2 = A2.shopid )
LEFT OUTER JOIN A as A3 ON B.shopid3 = A3.shopid
SQL92形式は結合評価順序を指定できても
ちょっと面倒だ。
43 :
デフォルトの名無しさん :02/08/20 23:55
Data Between ○ And ● Data >= ○ And Data <= ● パフォーマンスがいいのはどっちだ?
47 :
デフォルトの名無しさん :02/08/21 14:14
>>44 Data >= ○ And Data <= ●
以上・以下の比較を入れると遅くなります
例えば
Data >= 2 And Data <= 5 の場合、
Data > 3 And Data < 6 としたほうが速いです
ちなみにdatetime型です。
>>46 わざわざBETWEENなんてものが用意されてる以上、
その処理も最適化されている可能性が高いだろうという推論
実測値を計ったわけじゃないので違ったらスマソ
>>47 スマソ。
仕事しながらだとタイミングが合わん。
Data Between ○ And ●
Data > ○-1 And Data < ●+1
だとパフォーマンスがいいのはどっちなんでしょ?同等!?
>>52 理由もくそも、まず計ってみたのかよ!?
大体DBなに使ってるかも書いてないし情報不足すぎ。
>>50 >>53 さんのいうようにDBに何を使っているのかがわからないんですが、
Oracleなら Set Timing on(off) とかで実行時間が測れたような気がするが・・・・
>>53 すまんすまん。
DBは SQL Server だ。
時間計ってみた。
declare @a datetime
set @a = GetDate()
select *
from ◎
where ○ > '2000/03/31' And ○ < '2003/04/01'
print DateDiff(millisecond, GetDate(), @a)
set @a = GetDate()
select *
from ◎
where ○ Between '2000/04/01' And '2003/03/31'
print DateDiff(millisecond, GetDate(), @a)
こんな感じで。
Between の方が速いらしい。
上司に理由を聞かれるけど分からんのじゃ〜
×SQL Server ○SQL Server2000 おいどんもう駄目ば〜い。
おいおい、時間で早さを競うなよ。 SQLサバなら、クエリアナライザで実行プランを表示シル! オラクルなら、EXPLAIN PLANとかトレース&TOPROF。 SET TIMING ONだと、画面に表示をしている時間も含まれちゃうよ。 しかも、(INDEXが使用されているという前提だとして)あとから実行した方が バッファ上のデータを引っ張ってくるからそっちの方が時間的に 早くなる可能性が大。
>>57 うむ、俺も後から実行したほうはキャッシングのおかげで速くなってる
だけだと思う。少なくとも2回は実行しないとわからんね。
誤 TOPROF 正 TKPROF でもう一つ気になったことをついでに。 今時のオプティマイザなら、それくらい等価に処理してくれるような気がするが・・・
60 :
ペーパープラチナ :02/08/22 23:54
>>59 パッチあてないと入ってないのね。TKPROF。
自宅で試して、「え?間違った?」とか一人焦った。
61 :
デフォルトの名無しさん :02/08/23 13:25
初心者の私をお助けください。 こんな表があって TABLE A CD1 CD2 DATE1 DATE2 1 a 20020101 20020202 1 a 20020101 20020831 2 a 20020101 20020531 3 a 20020101 20020930 3 b null null CD1とCD2をグループ化して今日の日付にマッチする データをカウントして出したいんですけど悩んでおります。 1 a 1 2 a 0 3 a 1 3 b 0 以下、考えたのはダメでした 1. select cd1,cd2,count(*) from A where current date between date1 and date2 group by cd1,cd2 2. select cd1,cd2, (select count (*) from wr3_tenji_t where current date1 and date2 ) from A group by cd1,cd2
>>44 色んな事以前にINDEXはどうなってるん?
DATE1とDATE2がなんなのかよくわからないけど、current_date(間が スペースなのは間違いですよね?)がDATE1とDATE2の間にあるという 条件なら、 select cd1,cd2,count(*) from A where date1 <= current_date and date2 >= current_date group by cd1,cd2 でいいのでは?
>>63 ありがとうございます。
しかし、それでは1.のSQLと同じなので
検索結果は0件になってしまいます。
DB2を使ってるのですが、"current date"で
現在の日時を持ってきますです。
自己レスです。解決しました。 select b.cd1,b.cd2, case when c.cnt is null then 0 else c.cnt end from (select cd1,cd2 from a group by cd1,cd2) as b left outer join (select cd1,cd2,count(*) as cnt from a where current date between date1 and date2) as b on a.cd1=b.cd1 and a.cd2=b.cd2 で逝きました。 皆さまありがとうございました。
>>57 実行プランを表示してみた。
でも見方がわかんないっす!
「見積もりコスト」を見ればいいんすか?
実行プランで「引数」をよく見てみると・・・ □ Between ○ And ● が □ >= ○ And □ <=● に置き換わってる! むぅ。 Between と >= <= は同等ってことか?
だったら解釈に時間がかからない分 下のほうが早いのかもね
>>67 もともと論理的に同等なのはわかってますよね? 問題は物理的にどうか、という
ことだったので予想通りですよね。in句がorに展開されるのと同様、Syntax
Sugarみたいなものなんでしょうね。
>>68 解釈にかかる時間はほとんど考えなくていいでしょう。
>>66 今回の場合は、クエリテキスト部分で十分だろう。
自分が
>>67 で書いているように、内部ではbetweenと>= <=が等価に
実行されていることがわかるので、早さはほとんど変わらないということになる。
完全にイコールとは俺の知識では言い切れないが。。。。。
で、ちょっと補足。
クエリアナライザの実行プランは実行したSQL文が
サーバー内部でどのように処理されているかがわかる。
INDEXが使用されているのか、テーブルのフルスキャンなのか、
どのインデックスが使用されているのかなど・・・
また、それぞれの作業がSQL文の結果を返すまでの
全作業量に対してどの程度の割合を占めているのかがわかる。
なので、パフォーマンスを上げたいSQL文があった場合に
どの部分にコストがかかっているかがわかるのでそれを
どうにか解消してあげればSQL文のパフォーマンスがあがることになる。
そのほかにもset statistics io onコマンドが有効だと思う。
これは、実行されたSQL文においてメモリからと
ディスクからの読み込み量(ブロック数)がわかる。
なので、色々な条件でSQL文を書いてみた場合、
それぞれ違ったindexを使用していて、どれが最適か判断に迷う場合は
これで読み込みブロック数が少ない物がパフォーマンスが良いと判断できる。
ここら辺のことは、ブックスオンライン(BOL)の
データベースのパフォーマンスの最適化 − クエリのチューニング(←SQL2000の場合)
あたりを読むともっと詳しいことがわかるだろう。
#長文スマソ
ORACLEのSQLで、文字列が数値なのか判定する方法がありますか? IS NUMBERみたいなのです。
>>71 文字列操作でやりくりしかなさげだ。
translate(str, ' 0123456789', ' ') is null
とかなんとか。符号とか、小数点とか面倒だなぁ。
73 :
デフォルトの名無しさん :02/08/24 23:22
いろいろ調べてみたのですが、なかなか答えにたどり着かなくてここで質問させてください。 SQL文はどれぐらい長い文字まで使えるのでしょうか? 環境 MSSQLServer2000
ネタはいらん
ミドルウェアによっても違いまふ
>>72 SELECT code FROM TEST WHERE translate(ltrim(rtrim(code)), ' 0123456789', ' ') is null;
こんな感じです。
79 :
デフォルトの名無しさん :02/08/25 03:39
ある属性(TYPとしましょう)の値によってソート条件を切り替えることは可能ですか? TYP=1の時はカラムA、カラムB、カラムC TYP=2の時はカラムA、カラムB、カラムD とか。 やり方ご教授ください
>>79 order by a, b, decode(typ, 1, c, 2, d, null)
>80 ありがとうございます、助かりました。
82 :
デフォルトの名無しさん :02/08/26 16:52
SQL Server2000 on Windows2000でのSQLの質問です。 例えば ・名前(varchar,50) ・日付A(varchar,5) ・日数A(int) こんな感じのテーブルがあるとします。データは 太郎,08/29,3 次郎,08/25,2 三郎,08/26,0 花子,08/28,3 四郎,08/27,1 こんな感じです。 日数Aってのは、日付Aの何日前にひっかかるようにする?ってな感じの項目です。 例えば今日、抽出処理を行うとすると、太郎と三郎と四郎がHITしたいんです。 で、本日引っかかる人は誰?VIEWみたいなのを作りたいんですけど どういう風にSQLを書けば良いか必死で考えてるんですけど、わかんなくて... もしわかられる方おられましたら教えてください。 P.S. 日付Aをyyyy/mm/ddの日付型に出来ないの?とか日数Aは日数じゃなくて日付にすれば? とかは仕様上出来ないんです..
日付Aのn日前を求めてそれを今日の日付とマッチングすればお終い。 n=日数A 日付関数をリファレンスで調べれば後は自力で逝けると思う。
SQLサバがわからんので考え方だけ 1.日付をオラクルでいうところのTO_DATE見たいな、文字列→日付型関数を使って変換する 2.日付型に変換した物から、日数分だけ引いた日付が今日(or基準日)と同じデータを求める select * from table where (TO_DATE(日付A) - 日数A) = 今日(or基準日) #パフォーマンスは無視 #文字列の日付Aを日付型に変換するのは、月またぎなどを考慮するため #上記SQL文はORACLEでも実行できません(w
申し訳ありません。ご教授お願いします。 あるselectの結果をそのまま参照元(From)として 使うことはできるのでしょうか? イメージ的には select f1,sum(f2) from (select f1,sum(f2) from tableX group by xx) group by f1 のような感じなのですが・・・ そもそも、可能なのかどうかもわかっておりません。 申し訳ありませんが、よろしくお願いします。
86 :
12M初心者 :02/08/27 17:50
>>85 できますよ。
サブクエリとか副問い合わせとか言われるやつですね。
ちなみに、上記のSQLだと
select A.f1,A.c1 from (select f1,sum(f2) as c1 from tableX group by xx) as A
group by A.f1...
とカラムやテーブルの別名を使用する必要があるかもしれませんね。
外側のgroup by こんなんで大丈夫だっけ?
できました!! from (****) as A とすることを知りませんでした。 素早いご回答、感謝いたします!m(__)m
88 :
デフォルトの名無しさん :02/08/27 18:40
>>84 逆の考え方ならできた。
今日の日付に日数Aを足す(日付A = 今日(or基準日)+ 日数A)で。
mm/ddを日付型にconvertできんかったんで、苦肉の策。
select * from table where convert(varchar(5),DATEADD(day,日数A,getdate()),1) = 日付A
SQLserver6.5で確認、多分SQLserver2000でもいくと思う。
>88 逆の考え方は良い方法だと思うけど、保守するときは常に逆に考えないといけないから面倒かも。 そうそう。DATEADDにマイナスを指定できない?
>>89 AccessですらDateAddにマイナス指定できるんだから、出来ないわけ無いと思うけど…。
テストできる環境あるんなら試してみたら?
>>88 万が一dateaddにマイナスの引数使えなかったら
datediffというのがあるみたいよ。
日付A - 今日(or基準日) = 日数A
な条件でいけそうな感じ。
というか、
> mm/ddを日付型にconvertできんかったんで、苦肉の策。
という文からすると、やっぱり月またぎとかでやばいことになるんじゃないの?
しらべてないけど、日付型に変換できなかったということは
文字列かなんかとして扱ってるんでしょ?
>90 スマソ。環境ないのでテストできません。 今はOracle業務。 dateaddにマイナスが指定できるのでは? と思ったのは、 SQLの日付関数って大概はマイナス指定できるからです。
みなさんありがとうです。 言われるとおり、[日付A]は文字列で持ってるので Date型にコンバートやDateAddが使えないため 88さんの方法の今日の日付の方に[日数A]を足して それと[日付A]を同じ形にして(mm/dd)比較する感じで 上手く行きました。
>>89-91 辺りに補足。
82さんは解決されたみたいだけど、一応。
ちなみにDATEADDは、マイナス行けます、今試しました。
日付Aが日付型なら、DATEADDでもDATEDIFFでも自由自在だったんですが。
っつか、to_dateみたいに、わりと何でも日付型に変換してくれる便利な関数は、
実は他のDBには無いっすな、ORACLEとSQLSererとUDBしか見てないけど。
>94 OracleはTO_DATEありまっせ。
むしろSQL Serverにはconvertはあってもto_dateはないから Oracleの話かと思ってたけど違うの?
97 :
SQL初心者 :02/09/01 11:43
#他のスレでも投稿しました。迷惑かけてすみません。 どなたか教えて下さい。 Pro*CでWhereの検索条件で直接、文字列と比較するのではなくて プログラム内の変数と比較したい場合はどうするのでしょうか? *date = "20020901"; の場合、where DATE = date でOKなんでしょうか? (DATEはデータベースの項目でCHARで定義) あと、データベースで時刻(time)がCHARで宣言されていても time > 113030 というように比較できるのでしょうか? * time -> HHMMSS 113030->11時30分30秒 SQL初めてでここら辺に疑問を感じました。
>>97 両方ともDATE型に変換して比較
where to_date(DATE,'YYYYMMDD')) = to_date( :date, 'YYYYMMDD' )
文字列のまま比較してもOKだけど、日付に関係ない値が入ってないことが
前提条件。
始めてだったらOTN(Oracle Tecnology Network)行って
マニュアル取ってくるのが吉。
99 :
SQL初心者 :02/09/01 12:29
> 98 さん 早速のレス感謝です。 dateの前に:がついていますが、これが変数を指すのでしょうか?
>>99 そうだよ。
Cの変数をSQLの中で使うときには:(コロン)をつける。
>99 「バインド変数」でマニュアル漁るが吉。
全然関係ないが Oracleではバインド変数って言うんだな 知らんかった
103 :
SQL初心者 :02/09/01 15:35
>100,101 さん どうもありがとうございました。
>>101 Pro*Cじゃホスト変数って言うと思ったが…。
>104 OCIをダイレクトに叩く場合に使うのがバインド変数で、 埋め込みSQLとかSQL文で使うのをホスト変数と呼ぶらしい。 でも埋め込みSQLはバインド関数経由で呼ばれて、 最終的にはバインド変数と結びつくみたいだし呼びかたはどっちでもいいみたい。 Oracle監修の本でも「ホスト変数(バインド変数)」となっていることも多いしね。 俺がいい加減なのか、Oracleがいい加減なのか・・・。
>>105 マニュアルに関しては、oraがいい加減なんじゃないのか?
前にOTNかどこかで読んだが、○○の機能に付いて調べてみると
この機能の詳細は、××マニュアルを読んでください。
と書いてあるのに、××マニュアルには
□□マニュアルを読んでください。という風にたらい回しにされて
結局欲しい情報にたどり着けなかったとかいう笑い話もあったぞ。
>>105 そういうことね。マニュアルでバインド変数を探したら確かにそういう書き方してる
部分を見つけたよ。どちらでも間違いじゃないっていわれればその通りなんだろうね。
昔の呼び方をそのまま引きずってる感じなんだろうな。
108 :
デフォルトの名無しさん :02/09/03 01:42
たまに「SQL99」みたいな表記をみかけるのですが、これは標準規格 なのでしょうか(ANSI Cみたいな)。そうだとして、こういう規格は どこか(Webなど)で読めるのでしょうか。書籍onlyでしょうか。 UNIX板で聞いたんですが鼬買いらしく返事をもらえませんでした。 ご存じの方がいらっしゃいましたら、教えてください。 よろしくお願いします。
109 :
デフォルトの名無しさん :02/09/03 21:13
すいません、SQL教えてください(TT) 下記のようなSQLを発行したらエラーになってしまいます。 SQLServer2000で、 insert into tableA( A, B, C )values( 'Y', 'X', (select max(hoge) from hogehoge group by hogekey) ) Valuesの中にSelectって書けないんでしょうか??(´ヘ`;)
( ゚д゚) ポカーン values句じゃなくて、select文でインサートしろ insert into tableA( A, B, C ) select 'Y','X',max(hoge) from hogehoge group by hogekey
111 :
109でございます。 :02/09/03 22:52
>>110 Σ(゚Д゚)あふっ!
し、しってたさ、、
ウソです。ありがとう!(>_<)
>>110 そういや、
そのSQL発行した後にmax(hoge) が知りたいときってどうすりゃいいんだ?
どんな値をINSERTしたっ!ってのはわからない?
トリガーとかじゃなくて、、、
>112 なんか意味あるの? insert前に普通にmax(hoge)を求めるselect文を発行すれば何の問題もないと思うけど。 もしinsert後にmax(hoge)が知りたいんだったらcommitかける前に select文発行すればそのトランザクション内でのmax(hoge)が取れるね。
>>112 insert後に select C from tableA where A='Y' and B='X' すれば?
それか
>>113 の言うようにトランザクションを宣言して2回 selectすれば?
115 :
デフォルトの名無しさん :02/09/06 05:10
Linux のDB2を使用しています。 以下のような出力結果を得たいのですがSQL文がわかりません。 select * from 見積 見積NO 氏名 1000 鈴木 2000 田中 3000 山田 select * from 見積詳細 見積NO 詳細No 商品コード 金額 1000 01 A 100 1000 02 A 100 1000 03 B 300 1000 04 C 500 2000 01 B 300 2000 02 C 500 3000 01 A 100 ↓SQL実行 出力 見積NO 氏名 合計金額 1000 鈴木 1000 2000 田中 800 3000 山田 100
116 :
115続き :02/09/06 05:11
自分で考えてみた文は↓です。 (SQL Assist使用) SELECT DB2."見積"."見積NO" AS "見積NO", DB2."見積"."氏名" AS "氏名", SUM(DB2."見積詳細"."金額") AS "合計金額" FROM DB2."見積詳細", DB2."見積" where DB2."見積詳細"."見積NO" = DB2."見積"."見積NO" GROUP BY DB2."見積詳細"."金額", DB2."見積"."見積NO", DB2."見積"."氏名" しかし、これだと↓になってしまい、商品コードごとの合計になっているようです。 見積Noごとの合計はどのようなSQL文にすればよいのでしょうか。。 見積NO 氏名 合計金額 1000 鈴木 200 1000 鈴木 300 1000 鈴木 500 2000 田中 300 2000 田中 500 3000 山田 100
>>115-116 group by句に「DB2."見積詳細"."金額", 」を含めたらマズイでねえの?
SELECT DB2."見積"."見積NO" AS "見積NO", MAX(DB2."見積"."氏名") AS "氏名", SUM(DB2."見積詳細"."金額") AS "合計金額" FROM DB2."見積詳細", DB2."見積" where DB2."見積詳細"."見積NO" = DB2."見積"."見積NO" GROUP BY DB2."見積"."見積NO" だべ
>>118 DB2."見積"."氏名"
も必要でした。。
これじゃダメかな? SELECT h.見積NO, h.氏名, m.合計金額 FROM DB2."見積" h, ( SELECT m.見積NO, SUM(m.金額) AS 合計金額 FROM DB2."見積詳細" m GROUP BY m.見積NO ) m WHERE h.見積NO = m.見積NO 詳細の粒度に合わせてから group by すると遅い気がするし 氏名をグループ化するなんてオレにとっては言語道断です
>>121 わざわざSQLを示していただきありがとうございます。
僕も氏名のグループ化はマズイと思います。。
たまたま↑の例では氏名にしてましたが
そこの部分は本当は顧客コードです。
なので、実際には特に問題ありませんでした。
ってそういう次元の問題じゃなかったらスイマセン。。。
追記。 しかも氏名のグループ化をはずすとエラーで出力が得られませんでした。
>123 その文脈では group by に氏名は必要だよ 氏名のグループ化って、そういう意味じゃなくてね 大方は 氏名 VARCHAR(50) とかになってるじゃない 当然 INDEXなんて付いてないと思うけど そういう列を group by 句に書くとソートするのに 時間がかかるの。もしくはリソースを消費するの group by 句にふさわしい列の属性は、INDEX が付いてて 整数とか短い文字列。区分とかコードになるのが普通でね
SELECT * FROM ( SELECT user.no,(user.no + '@' + isnull(domain.name,'nothing') as mailaddr FROM user,domain WHERE user.kbn *= domain.kbn and ) AS WK_TABLE WHERE mailaddr like '1%' ORDER BY user.no 例: userテーブル optionテーブル no,optionKbn kbn , name 1 , 001 001, aaa 2 , 002 002, bbb 3 , 002 003, ccc 4 , 000 この場合、まず、第一段階の副問い合わせの結果が 1,1@aaa 2,2@bbb 3,3@bbb 4,4@nothing となりまして、そこから mailaddrの頭に1が付くものだけを取ってくる。 つまり 1,1@aaa だけとなる。 ですが、 実際の結果は 1,1@aaa 2,2@nothing 3,3@nothing 4,4@nothing となってしまいます。 なんか、副問い合わせが内部で2回走っているような感じです。 なにかお気付きの点等ありましたら、よろしくお願いします。
>125 それSQL SERVER7 SP3でしょ?原因は外部結合だと思う 外部結合した*=の右側の列をwhere句に使うとおかしくなるよ たぶん where mailaddr like '%nothing' とすると全部 1,1@nothing 2,2@nothing 3,3@nothing 4,4@nothing にならない?オレもよくわからん。違う方法を見つけた方がいいみたいだ
>126 環境としては SQL Server7のSP6でした。 原因はやはり外部結合っぽいですね。 でも、これは仕様というよりバグっぽく思えるのですが・・ 最終的にはunionを使用して解決させました。 ありがとうございました。
128 :
デフォルトの名無しさん :02/09/06 23:02
あのぉ〜、 VBから、ADOX使ってのSQLなんですが、 Query = "select aaa,bbb,ccc,ddd from master group by aaa" ってしたいんですが、 「集計関数の一部として指定された式'bbb'を含んでいないクエリを実行しようとしました。」 ってエラーがでてしまいます。 Query = "select aaa,bbb,ccc,ddd from master group by aaa,bbb,ccc,ddd" こうすると、エラーは出ないんですが、処理速度を上げる為に、 bbb,ccc,dddはgroup化したくないんです。 かと、いって Query = "select aaa from master group by aaa" これじゃ困るんです。 ほんとアホすいません、教えてください。
( ゚д゚) ポカーン… Query = "select aaa,Max(bbb) bbb,Max(ccc) ccc,Max(ddd) ddd from master group by aaa"
>>129 >Query = "select aaa,Max(bbb) bbb,Max(ccc) ccc,Max(ddd) ddd from master group by aaa"
「集計関数の一部として指定された式'Max(bbb) bbb'を含んでいないクエリを実行しようとしました。」
ってなってしまいますけど。
あっそ。
>128 なあ、グループ化っていう事の意味をちゃんと考えてみてくれよ。 そうすれば、やりたい事に矛盾がある事や、エラーメッセージの意味がわかると思うよ。
>128 つーことは、カラムbbbはグルーピングしないとならないってだけじゃないの? 本当にグループ化する際に省略可能なカラムなの? データの中身も書いてないし、少ない情報でSQL書いてくれた>129に失礼だよ。
説明不足で申し訳ないです。 まだ、SQLを始めたばかりで、よく分ってないんですが、 Query = "select aaa,bbb,ccc,ddd from master" 出力の結果は、このように出力が欲しいんですが、 並び順だけは、aaaの項目でグループ化したいって事なんです。 bbb,ccc,dddの並び順は問わない、って事なんです。 Query = "select aaa,bbb,ccc,ddd from master group by aaa" それで、「group by aaa」だけを記述したんですが、 Query = "select aaa,bbb,ccc,ddd from master group by aaa,bbb,ccc,ddd" しか方法は無いんでしょうか。 ほんと、アホですいません。
135 :
デフォルトの名無しさん :02/09/07 00:24
何をしたいのか分からない・・・ 本当にグループ化をしたいの? もしかして並び替えをしたいだけじゃないの? group by じゃなくて、order byじゃないの?
並び順って...OrderByじゃなくて? ってか、SQL入門からやり直したほうが良いぞマジで。 せめてAccessのクエリデザイナを使うとかさ。
重ね重ね、申し訳ないです。 記述間違えてました。 Query = "select aaa,bbb,ccc,ddd from master group by aaa,bbb" group byの記述を「group by aaa,bbb」として考えてみてください。 結果的には、 aaa|bbb|ccc|ddd −−−+−−−+−−−+−−− 1| 1| 3| 18 1| 2| 9| 1 1| 3| 3| 61 2| 1| 13| 6 2| 2| 5| 9 2| 3| 1| 12 3| 1|110| 1 3| 2| 80| 0 3| 3| 13| 13 こんな感じの結果が欲しいんです。
まぁとりあえず Query = "select aaa,bbb,ccc,ddd from master order by aaa,bbb" で希望の結果が出るかどうか試してくれ
>128 group by句を用いたselect文で出力できるのは group by句で指定した列名とSQL集合関数 それ以外の列名を出力項目として列挙するとエラーになる きちんとSQLの文法を理解したうえで適切な使い方をしないと 後々、自分が困ることになるよ
>137 カラムaaaをグループ化するとカラムaaaで1の値を持つ行は1行しか出せない。 SQLの本は何を読んでる? >128の希望する結果表だけ見ると、 ここにいるみんなは「order byちゃうんかと小一時間問い詰めたい。」と思っているはず。
只今128は凹んでおります。 もとに戻るまでもうしばらくお待ち下さい。
皆さんレスありがとうございます。 検証遅れてすいません。 結果は、皆さんご指摘の通り、うまく行きました。 まったくもって、アホすいません。 勉強になりますた、ありがとうございます。 そこで、sqlしっかりと身に付けたいんですが、 オススメの書籍あったら、教えてくれませんでしょうか。
143 :
無料動画像 :02/09/07 22:03
144 :
デフォルトの名無しさん :02/09/07 22:46
SQLが遅くて困っています。たくさんの表を結合するとき、 結合条件はどんな順番で指定すれば効率がいいのでしょうか。 フィルタ条件とあわせた場合、どちらを上に書きますか。 EXPLAIN PLANで見てみると単に条件の順番を変えただけでは コストが変わらないみたいなのですが。DBは、Oracle8.1.7です。 よろしくお願いします。
145 :
デフォルトの名無しさん :02/09/07 23:00
3!
>144 表の大きさにも拠るのでなんとも。 順番は先にフィルタを通す必要があるかどうかでも変わるし・・・。 基本的に結果表を結合するまでに小さくなるようにしたほうがいいと思われ。
>146 ありがとうございます。 極端に大きさが違う表を結合するときと、同じくらいの 大きさの表を結合する場合は極端に数が減る結合を上に 書くほうがいいんですね。 その場合、大きい表の方を左辺と右辺のどちらにもって きても同じですか。 フィルタ条件は結合とあまり関係ない日付なんかの場合 ですが、これもすごく数が絞られる結合なら先に書く ってことでいいのでしょうか。
>>148 それ以前に、インデックスとかは大丈夫か ?
机上の空論だけで話を進めないで ちゃんと実行計画も見ような
インデックスが大丈夫かどうかというのはまだ 調べてません。一応全部の外部キーに設定されてますが、 NOTとかMAXとかをどうしても使うのでフルスキャン になってしまう部分もあります。 どこから手をつけるのが一番いいのでしょうか。 初歩的な質問ですみません。よろしくお願いします。
>>152 つうか、実行プランは調べたんでしょ。だったら、どこがネックになってるか
わかってるんじゃないの。そのネックをどうやって解消するべきか考えたら。
Oracleはあまり詳しくないんだけど、Oracle8ってルールベースとコストベース
両方できたっけ? コストベースになってるならAnalyzeはしてるよね?
それからOracleはデフォルトでfrom句に書くテーブルの順番って関係あるん
だっけ? 関係あるのなら絞り込みしたい順番にテーブルを書く必要があるで
しょう。
まずは理解できなくてもチューニングマニュアルを読むことから始めましょう。
>152 あと、パーティションテーブルだったらパーティションキーをちゃんと結合条件に入れないと全然だめぽ。 >153 コストベースでテーブルの評価順序を規定する場合はヒント文でなんとかできます。 select /*+ orderded */ 〜って感じで。 でもあくまでオプティマイザへのヒントなんで、オプティマイザが考えたコストが低い場合は却下されまふ。 と、これは>153ではなく>152へ言うべきだったな。スマソ。
ここさ、変な煽りとか、AAコピペする奴とか居なくていいね。
>>155 居ないんじゃなくて、無視されてるだけなんじゃないかな……
こっちは煽ってなくても無視されてるけど。
ちょっと別件が忙しくて件のクエリーを直す暇がなくなって きてしまいました。 今度パフォーマンスチューニングのマニュアルを読んで出直 してきます。もっとちゃんとした質問ができるようになったら またよろしくお願いします。ありがとうございました。
>156 あのね、この場合は完全に本屋へ足を運んだり(あるいは本屋の検索を使う) ググールで検索したほうが早いから敢えて誰も突っ込まないだけだよ。 今はSQL92が主流だからそれ関係で調べてみるといいかもね。
>158 せっかく放置してたのにぃ
ありがとうございます。
>>158 もちろん、反応を待つよりGoogleや2ch検索を使うほうが早いのでそちらを
試したあとで書いています。書いたあとも何度か別のキーワードを試しました。
Googleで検索した結果、大部分は「SQL9x準拠」という文字がひっかかっている
ようです。それらのほとんどはMySQLやPostgreSQLやDB2やOracleや……の
ドキュメントのコピーが検索されているものです。あとはWebチュートリアル
もありました(が、入手法は書いていない)。
要点はこの二つです:
- 購入するしかないのかどうか (「ない」ことを調べるのは難しい)
- 電子化されている資料があるのかどうか
>>159 宿題終わってないんですね?
161 :
デフォルトの名無しさん :02/09/10 11:09
primary keyとなっている列名を取得するSQL文を教えてください。 環境はWindows2000、SQL Plus9.0です。
162 :
デフォルトの名無しさん :02/09/10 13:00
>161 Oracle だったらuser_cons_columns,user_constraints から引き出せば。プライマリだったら user_constraints.CONSTRAINT_TYPE='P'で。
164 :
デフォルトの名無しさん :02/09/10 17:45
シツモンヌ オラクル8.1.7からサイベースDBを参照することは出来ますか?
>>164 サイベースDBってなんだよ、旧SQL Serverのことか?
>>164 7,8年くらい前は結構メーカの異なるDBへの接続製品が話題になってたけど、
最近は全然聞かないなあ。あんまり需要がなかったのかな。
Googleで「Oracle Sybase 異機種 接続」で検索したらいくつか出てきたぞ。
>>165 おそらくSybase ASEのことでしょ。
そんなことやるなんてわざわざ災いの種バラまいてるようなもんだ
169 :
デフォルトの名無しさん :02/09/11 00:36
サイベースDBじゃ通じないのか。
うん。sybaseASEのことでございます。
ともあれ
>>167 氏thx
>>168 オラクル側にASE上のテーブルのビューを作りたいのさ。
>>169 Sybaseと聞いてASEだと思ったらASAだったりすることがあるからじゃ
ないかな。
>>160 どっかでまったく同じ質問見たような気がする
>>170 すばらしい。
そうか、「規格書」なんですね…… なんで気づかなかったのだろう。
さっそく読んでみます。ありがとうございます。
>>172 UNIX板のMySQL/PostgreSQLスレじゃないかと思います。
>>173 なんというか、まっ先にANSIのWEBサイト見に行こうと思わなかったのかなぁ?
電子文書化されているのか、はたまた有料なのか、それらの疑問は一発で
解決しただろうに・・・
最近はSQL92 & Core SQL99のリファレンス・ハンドブック(日本語で解説)が
\3,000程度で出版されているよん(題名忘れたけど・・・)
>>173 まぁ、そのなんだ、、、「マルチですよ」って宣言した時点で放置は決定していると思うが?
>>174 www.ansi.orgにいって検索してみましたが一件もみつかりませんでした。
>>175 「マルチ」とは?
> 「マルチ」とは? ネタか釣り決定放置 ↓ネタではないですよ
>>176 > www.ansi.orgにいって検索してみましたが一件もみつかりませんでした。
ネタだよな?
マジだと"私は上っ面しか見てません"と公言しているようなもんだよ
179 :
デフォルトの名無しさん :02/09/13 12:23
WIN98からSQL2000につながらないのはなんで?
>180 きっと電圧が足りないんだyo! >179 だから詳しく状況を(略
>>179 1)コンセントは刺さっていますか?
2)コンピュータの電源は入っていますか?
(正面のランプが緑色に点灯していますか?)
3)ディスプレイ(テレビのような画面のことです)は電源が入っていますか?
>180 違うよ。足りないのは、きっと愛だよ。
184 :
デフォルトの名無しさん :02/09/13 14:59
ネタレスでもつれたというのだろうか。
>>176 のショボイとしか言いようのないゴミを捨てといて釣りとはおめでたい
レス4個程度で
>>184 のように"かなり"という表現を使うあたり相当おめでたい
ハッピーハウスにでも逝ったら? ショボイ奴はとことんショボイな(藁
・・・って、ここはネタスレだったっけ?
前スレは良スレだったのに
>188 最近まではここもマターリしてたよ。
>>178 使いかたがまずいのでしょうか。
searchのリンクから検索ページにいって「SQL92」だと0件。
「SQL」だと求職っぽい内容のを含めて13件。そのうちに
目的の情報なし。
>>177 - まったく同じメッセージを複数のスレッド/板にまたがって貼っている宣伝業者と、
- 情報収集の進捗を書きつつ、より適切と思った板に移動して質問した人
を同じふうに「マルチ」と書いていた(ようだった)ので、どういう意味に
使っているのか確認しようとしたわけです。
>>187 ネタとか煽り(と他の人がいっている)メッセージがあるから
といって、自分が何でも書いていいという理由にはならないこと
ぐらい理解できないのかな?
>190 結局何? Webで読めるところを探してて、見つからなそうなら書籍を買うってこと? サーチに手間取ったりするなら買ったほうが明らかに安いし、 Web探してる時間を勉強に充てられるんだから効率いいよ。 これ以上は荒れるだけだからもうやめてほすぃ。
>>190 public/search.aspで検索したってことなのかな?
そこの断り書きをちゃんと読んでるのかね
規格を探すためのポインタが示されてなかったか?
ANSIじゃなくてもJISCを探すという手もあるのに。
少なくとも「閲覧」は無料でできる。
というか、
>>191 さんに同意。
>>190 とあるスレに投げかけた質問/問題が放置されたからといって
己の主観でマルチポストしていいという理由にはならないこと
ぐらい理解できないのかな?
宣伝、情報収集等その目的を問わず、マルチポスト(=複数投稿)という
行為には変わりはないゆえに同類として扱われる
# 板/スレ住人に適切なスレへの誘導をされた場合を除く
ドキュメント読む前に、空気を読む人間に成長したほうが、 実りある人生をおくれるとおもうよ。 本気で。
>>179 接続に使うプロトコルはWIN98にもあるか?
例えばSQL2000のサーバがTCP/IPでWIN98がNetbiosだけとか間違ってね−か?
197 :
デフォルトの名無しさん :02/09/16 11:35
t1 uid name 1 a 2 b 3 c t2 uid name 1 ab 3 cc 3 cc というデータがありまして、t2.uidにデータが存在するt1.*(この場合は uid1と3のみ)を取得したいと思うのですが、 select t1.* from t1,(select uid from t2 group by uid) as t2 where t1.uid=t2.uid; と現在考えているのですが、もっとスマートな方法をどなたかご教授頂けないでしょうか?
>197 スマートって何よ? 他に方法ないじゃん。 変えてもexists使うとかinを使うとかしかできないよ。 これくらいのクエリでスマートさを求めるより、 インデックスの張り方とかを考えたほうがいいとオモワレ
>>198 いえ、全く速度面とかに問題があるのではなくて、何かやりたいことに
ぴったしはまった結合があったように思えて夜に寝てしまいました。
select t1.* from t1 include join t2;
くらい短く書く方法が・・・あったような気がするだけな気がしてきました。
無いという答えが自分の中に明確に無かったので、
言って貰えて助かりました。ありがとうございました。
200! >199 なるほどね。コードに疑念を持つことは良いことだよ。 でも疑心暗鬼にならないようにほどほどでキリをつけるのも一考だね。
202 :
デフォルトの名無しさん :02/09/17 21:59
困ってます!困ってます!助けてください!! 文字列の引用符として’を使っている構文で文字列の中に’があった場合、どうやって記述すればよいのでしょう?? よろしくおながいします。
>201 ガイシュツ
>202 死ね
>>203 204
怖い人たちだなぁ...
>>202 DBエンジンによって違うよ。
'⇒''って変更してみたり、'⇒\'って変更してみたりしてみそ
206 :
デフォルトの名無しさん :02/09/18 19:10
ORACLEのPL/SQLで、SQLからUNIXのシェルを実行させたいのですが、 どうやればできるのでしょうか? やっぱり無理なのかな。
207 :
デフォルトの名無しさん :02/09/18 20:46
なんでそんなアホな仕様しか思いつけないのか
そーいえば、SQL*Plusのコンソールから シェルのコマンド叩ける方法があったような気がしたが なんだっけか? #なんか急に知りたくなった。。。。
>209 !
>>210 エクスクラメーションじゃ出来なかったぞな。
気になってマニュアルまで調べてしまったが
host ダタヨー
ちなみに、Win2kでOra817な環境ね。
SQL*PlusはGUIなヤシ
>>211 UNIXのsqlplusは!だね、今でも。
oracle9iでそうだった。
213 :
デフォルトの名無しさん :02/09/24 10:14
select price from pricetable where id = 12 って pricetableからidが12のpriceを取得する ということですよね?
>213 入門書嫁。 つか試した方が早い。
215 :
デフォルトの名無しさん :02/09/27 01:24
216 :
デフォルトの名無しさん :02/09/27 02:11
>197 なんでそんな回りくどい、アホなqueryしてんだ? group byなんてそんなんで使うか?普通。 >198 >199 無くねーよ。 select * from t1 where uid in (select distinct uid from t2) でええやん? >197 の仕様なら。
>>215 ORDER BY句からlocation引いて、「ORDER BY time DESC;」
でだめなの??
219 :
デフォルトの名無しさん :02/09/27 09:34
BETWEEN で、たとえば1000から最大値を指定する場合どうすればよいですか?
解決しました。
sqlserverでのoracleの select * from tab と desc を教えてください。
まずあなたの国の言葉を教えてください。 話はそれからです。
223 :
そもそも… :02/09/27 14:35
>> 219 1000以上"って条件じゃだめなのかな? '最大値'っていうのがクセモノだな・・・。 そいつはもしかして、値が指定されたらその値で、指定されなかったら 最大値でってことかな?。(ホスト言語からSQLを発行するような場合 渡河) であれば、状況によってSQL文を切り替えることも出来るはず。 BETWEENにこだわる理由は何かな?
224 :
そもそも… :02/09/27 14:38
>>223 解決してるジャン。あほでした。m(__)m
早く教えて!
>221 >225 初等教育受けなおしてきた方がいいんでない?(w
227 :
コンパイル成功!? :02/09/28 00:29
>221 のソースコードをコンパイルしてみました。 『Oracleにおいて、SQL文「select * from tab」を発行 すると得られる情報と同様の情報を、SQL Serverで 得るにはどういうSQL文、或いは、コマンドを発行す ればいいのでしょうか。 教えてください。』 しかし、私の実行環境(脳ミソ)ではコアを吐いてし まいました。 お粗末でした。 以上です。
同じ質問を SQL vs ora スレで見た気がする
てかFAQだよ。 ヒントはsp_・・・
230 :
デフォルトの名無しさん :02/09/28 01:03
抽出したレコード群1に対し、サブクエリを使って別のレコード群2を結合させ、1回のSQL発行で 必要な全てを抽出するのと、いったんレコード群1を抽出し、都度SQLでレコード群2を抽出する ようプログラムを書くのとどちらがパフォーマンスがよいですか? なほ、何件ヒットするかは不明です。数件かも知れないし数万かも
もっとお母さんみたいに言ってくれ
>>230 きちんと実行計画みたらわかるんじゃん?
で、どちらでもきちんと適切と思われるINDEXを使用しているならば
たぶん1発の方が多少なりともコストは低いと思われ。
SQLの書き方にもよるが、複数回SQL文を発行すると
オプティマイザでの解析処理が複数回走ってしまう可能性があるので。
あと、何らかの言語でループさせて複数回SQL文を発行するんだろうけど
その分のコストもある死ね。
>232 どうもです。 実行計画なるもにその情報があるわけですね。これはチト勉強が要りそうですね 「一発の方が多少なりともコストが低いと考えられる」ということですが大変参考になります。 ありがとうございます。 ちなみにアドバイス随時募集です(^^; ちょ〜亀レスでも良いです。よろ。
>217 ちゃんとレス嫁。 >198にて、『変えてもexists使うとか「in」を使うとかしかできないよ。』 と書かれてる。 大体、distinctを使う時点で厨房なのに、口調だけ偉そうなのは止してくれ。
group byだって高いやん?>234 mysql並のsql文でやれることでもないやん。 で、君ならどんなquery書くの?
>235 漏れはt1がユニークインデックスと前提にして考えて、 select * from t1 where uid in (select uid from t2 group by uid) と書くと思う。 ハッキリ言って、t1とt2のテーブルの規模が解らないからあくまでひとつの回答でしかないけど。 それにデータ量によってはオプティマイザによって、>197と同じ式に展開されて サブクエリ側の結果表を先に作ってネステッドループさせるようになると思うし。 で、distinctとgroup byは結果表の作り方が異なるじはずだが、 少なくとも1000万件くらいのデータで実測して言ってるよね? コストが少々高くてもアクセスバイト数やインデックスの使われ方によってはベラボーに速いはずだけど。
237 :
デフォルトの名無しさん :02/09/28 23:30
取得結果のたとえば3行目〜7行目だけ限定するようなことはできるのでしょうか。 select * from hoge where rownum>2 and rownum<8 のような意味合いなのですが、rownumをこういうふうには使えなかったので…
>>235-236 このケース、そもそもdistinctもgroup byも必要ないけど。
サブクエリを先に評価するようオプティマイザを誘導する場合でも
俺はそうは書かないな。
> distinctとgroup byは結果表の作り方が異なる
まじ?
>>237 select *
from (select hoge.*, rownum num from hoge)
where num between 3 and 7
>236 >少なくとも1000万件くらいの (*´Д`*)Pu... こんな厨房質問する奴がそんな案件携わったるわけないやん。 、と思いたい。 だいたいそんな大きいデータ量でネステッドループですか・・・ groupとuniqueでgroupの方が早いか? DBなに使ってんの?ボラ駐っぽいな・・・ つーか、データ量が多けりゃindex使えなんて、何当たり前のこと 嬉しそうに言ってんだ・・・ distinct(unique)を使う時点で厨房だそうですYO!皆さん。 扱うデータ、スキーマによるとか(また当たり前のこと 言い出さないでね。 >238 joinしてis not nullでもする気? 取り合えず、書いて見れ。
>>239 joinなら必要だけど、in(query)でしょ。exists(query)といっしょ。
そうそう。 #まぁ、query planが一緒かっつーと違うだろうけど。 で、!使わずに!考えてみたんだけど。 >238 == 240 ? の言ってる効率のいいqueryみてみたいんで、 取り合えず、書いてミレ。
>>241 a) select * from t1 where uid in (select distinct uid from t2);
b) select * from t1 where uid in (select uid from t2 group by uid);
c) select * from t1 where uid in (select uid from t2);
d) select * from t1 where exists (select * from t2 where t2.uid = t1.uid);
この4つの結果が同じってのはおけ?
んで、効率かぁ。
existsを使った場合は必ずメインクエリから評価されるけど、
inだとオプティマイザが評価順序を選択できる。
俺習慣だと、
t2.uidにインデックスが切ってないとか、
t1のレコード数 >> t2のレコード数とか、
t2がリモートデーターベースにあるとかで、
サブクエリから評価して欲しい場合にしかinは使わないな。
その場合は、
select * from t1 where uid in (select uid+0 from t2);
って書いてる。残りは全部exists使ってる。
a)、b)みたいに書いたほうが効率がいいケースてのは…ある?
>242 戻ってきたよ。 眠気眼なんですが、だいたい分かったポ。 >a) select * from t1 where uid in (select distinct uid from t2); >b) select * from t1 where uid in (select uid from t2 group by uid); >c) select * from t1 where uid in (select uid from t2); 上の2つはだいたいoptimizeされて一緒だろうけど、 #たぶん、データ量にもよるけど(;´ω`) a>b>cの順になると思うぽ。cは無駄な比較がでる。 データ量が小さければuniqueさせるコストも低いし、大きい場合は 比較時に有利。a>bは実測からもわかる。 dは、nested loopされるっぽいけど、 t1*t2の行数回、比較が行われるので処理対象のデータ量多い場合 向かないと思うな。小さい場合はd > c > a ではないかな、と。 dとaの損益分岐点はどの辺にあるのかはわかりませんが。
>>244 cをt1から評価する場合はd、t2から評価する場合はaに
暗黙に変換してるんでないかと漠然と思ってたんだけど、
よくわからんw
c→aの変換が行われないとすると、t2.uidのユニークさ加減
によってc > aだったりa > cだったりするんかな?
> dは、nested loopされるっぽいけど、
> t1*t2の行数回、比較が行われるので
existsは条件に合致したレコードが見つかった時点で評価終了
でなかったけ?
例えばサブクエリのwhere節を外して、
select count(*) from 100万件なテーブル
where exists (select * from 100万件なテーブル);
とやってもかなりのスピードで帰ってこない?
なもんで、サブクエリの参照にインデックスが使える場合は
問答無用でexists使う習慣がついてる。
なんにせよもつかれ。続きは明日以降。
238さん、ありがとう(>_<)
ageてしまった…スンマソン
>239 スマム。235がでかい口叩いたので釣られて基本事項を挙げてしまいますた。 元々の出題をしたほうは大きい案件に携わっているとは思ってないYO! DBはOra。 テーブルでかくても(t1を)ユニークインデックスでスキャンするよう持っていければ existsでサブクエリ側(t2)をインデックスレンジスキャンさせるよりは格段に速いっす。
249 :
デフォルトの名無しさん :02/09/30 10:31
selectしたtableBテーブルに日付を追加して、tableAにinsertしたいのですが どのように記述すれば良いでしょうか? お願いします insert into tableA select itemA,itemB,(ここにsysdateを入れたい) from tableB where id='1';
250 :
デフォルトの名無しさん :02/09/30 11:42
>>249 入れたいなら、入れろよ。
入れてエラーが出るなら、それを書け。
>>250 レスありがとうございます
記述のしかたがわからないんです・・・
insert into tableA select itemA,itemB,sysdate from tableB where id='1';
と書くと、
ERROR 1054: Unknown column 'sysdate' in 'field list'
>>251 sysdateって、関数なのでは?
insert into tableA select itemA,itemB,sysdate() from tableB where id='1';
でどうでしょ?
あっ、DBはオラクル? もしそうなら、sysdate()はエラーになってしまいますね。 ごめんなさい。
>>253 resありがとうございます
DBはMySQLです
こんな感じかなと思ったんですけど、ど忘れしちゃいました・・・(w
insert into tableA select itemA,itemB,to_char(sysdate,'yyyymmdd') from tableB where id='1';
別の方法で日付入れよかな・・・
255 :
デフォルトの名無しさん :02/09/30 15:29
そりゃ SYSDATEなんて列ないんだから無理でしょ インサート テーブルA XX.A XX.B (セレクト A、B フロム B ウェアー ID=1) XX SYSDATE イメージはこんな感じになるのでは?
>>254 おまえは、sysdateの記述の仕方もわかってなかったのか?
sysdateの使い方は、マニュアルを読め。
インサートの項目に入れるには、それからだ。
>245 そうやねーoptimizerで吸収されとるわ。 existsのとこt1*t2はないっすね。aのが早い場合もあるんだろうけど、 indexあったらdっすね。一つ勉強になったよ。
259 :
デフォルトの名無しさん :02/10/03 01:22
あげ
260 :
デフォルトの名無しさん :02/10/03 03:17
●●●●●●●●「オセロさえ納期内に作れない=OO役立たず 」祭り●●●●●●● /| | |_____ΦΦΦΦΦΦΦΦΦΦΦ||ΦΦΦ | | | ̄ ̄ ̄ /| || | | | / /|TTTTTT TTTTTTTTTT||TTTTT | /\ | /|/|/|^^^^^^ |三三| ^^^^^^^^^^^||^^^^^^^ | / / |// / /| | / / |_|/|/|/|/| | / / |文|/ // / |/ /. _.| ̄|/|/|/ Λ_Λ /|\/ / / |/ / (___) /| / / /ヽ /〔 非OO 〕〕つ | | ̄| | |ヽ/l `/二二ヽ | | |/| |__|/ Λ_Λ / /(_) | |/| |/ ( ´∀`) (_) Λ_Λ | | |/ // / ^ ̄]゚ (` ) | |/ ゚/ ̄ ̄_ヽ ⊂〔〔 非OO 〕
261 :
デフォルトの名無しさん :02/10/03 10:34
貴重なお時間を削ると思いますが どなたか教えて下さい 請求残高に 得意先ID 残高 001 20000 002 30000 003 50000 売上明細に 伝票No 日付 得意先ID 行No 明細… 00001 140601 001 01 00001 140601 001 02 00002 140601 003 01 00002 140601 003 02 00003 140603 003 01 00003 140603 003 02 とある時、SQLで結果を 得意先ID 残高 伝票No 日付 行No 明細… 001 20000 00001 140601 01 001 20000 00001 140601 02 002 30000 003 50000 00002 140601 01 003 50000 00002 140601 02 003 50000 00003 140601 01 003 50000 00003 140601 02 としたいのですが、なかなかうまくいきません お手数とは思いますがどなたかご教授して下さいませんでしょうか?
select b.得意先ID, a.残高, b.伝票No, b.日付, b.行No, b.明細 from 請求残高 a,売上明細 b where a.得意先ID= b.得意先ID ODER BY a.得意先ID
263 :
デフォルトの名無しさん :02/10/03 15:41
MySQLを使用しています このSQL文を実行すると、nameに「a」が含まれるもの意外も表示されるのですが、なぜでしょうか? select * from testA WHERE name LIKE '%a%'; たとえば「Tシャツ」という名称もヒットしてしまいます・・・
シフトJISの2バイト目に「a」が含まれるからだと思ったが 違った
mySQLだろ?ShiftJISじゃなくてEUCじゃないの?
EUCだとそもそも2バイト目にはそんな紛らわしい文字は 出現し得ないからますます謎だな
>>263 おいらのとこではShift-JISで正常に動くよ。
MySQLバージョンいくつ?
何でクエリー発行しているの?
MySQL板へ逝くべし
269 :
デフォルトの名無しさん :02/10/03 19:58
レコードを追加する時にそのレコードのIDが テーブルに存在するか確認するにはどうしたら いいのでしょうか? 教えてください。
>269 exists
>261 select a.得意先ID, a.残高, b.伝票No, b.日付, b.行No, b.明細 from 請求残高 a, 売上明細 b where a.得意先ID= b.得意先ID(+) ODER BY a.得意先ID オラクルならこうかな。(未確認
272 :
ペーパープラチナ(9i対応 :02/10/04 01:07
>>271 さらにOracle9iなら、SQL99の書式で。(未確認)
select
得意先ID,
残高,
伝票No,
日付,
行No,
明細
from 売上明細
left outer join 請求残高 using(得意先ID)
order by 得意先ID;
273 :
ペーパープラチナ(9i対応 :02/10/04 01:20
>>272 ×
from 売上明細
left outer join 請求残高 using(得意先ID)
○
from 請求残高
left outer join 売上明細 using(得意先ID)
おっちょこちょいでスマソ。
>>267 mysql.のバージョン
mysql Ver 11.12 Distrib 3.23.33, for pc-linux-gnu (i686)
調べてみたんですが、解決方法がわかりませんでした・・・
解決するにはどうすれば良いのでしょうか?
よろしくお願いします
おはようございます >261です みなさんが教えて下さったおかげで解決しました >272さんのSQL99の書式には ものすごくおどろかされました。 返信が遅れましたこと、並びに貴重なお時間を割いてしまったこと 深くお詫び申し上げます。
初歩的な質問なんだが... DB の重複している行を削除するのはどうすりいいの ? (DBMS は、Postgres 7.2) VALUE ----- AAAA BBBB AAAA CCCC BBBB DDDD を VALUE ----- AAAA BBBB CCCC DDDD にしたいだけなんだが...。
クエリの結果から重複を無くしたいのなら select distinct 〜
リレーショナルデータベースというのは定義に厳密なら そもそも重複行というものは存在しないらしい
279 :
デフォルトの名無しさん :02/10/05 02:11
やったことないんで間違ってたらすまんが、 DELETE テーブル名 WHERE VALUE ='AAAA' AND ROWNUM =1 では無理か?
何と何が重複してるのかあらかじめ分かってないと無理だろ
DELETE テーブル名 WHERE VALUE = (select VALUE FROM テーブル名 GROUP BY VALUE HAVING COUNT(*) > 1) AND ROWNUM > 1; ではこれでどう? 何か結合使ったスマートなやり方ありそうな気がするんだけど、使いなれてないからパっと思いつかん。
書き込んだ直後にVALUE = じゃなく VALUE IN じゃないと複数行あったときにダメだと気づいた・・・。
>>277 > クエリの結果から重複を無くしたいのなら select distinct 〜
う〜〜〜ん、DB から除きたいんだよね...。
実は、今は
select distinct ... した奴で新しい DB 作る
元の DB を消す。
新しい DB を元の DB の名前にリネームする。
ってやってんだけど、どう見ても美しくないよね...。
>>278 > リレーショナルデータベースというのは定義に厳密なら
> そもそも重複行というものは存在しないらしい
まあ、それはそうなんだけど...。いろいろしがらみがあって...。
>>279 ROWNUM って Postgres で使える ? とりあえず、やってみます。
>>283 rowid擬似列が使えるなら
delete from tbl a
where
not exists (
select 1 from tbl b
where b.value = a.value
having min(b.rowid) = a.rowid
)
とかできるけど、やっぱ
> select distinct ... した奴で新しい DB 作る
> 元の DB を消す。
> 新しい DB を元の DB の名前にリネームする。
のがいいような。
285 :
デフォルトの名無しさん :02/10/05 08:02
>>276 Oracleだったら
delete from tbl a
where a.rowid > (
select min(b.rowid)
from tbl b
where b.value = a.value
)
でしょう.
たぶん速度的にも一番速いと思うのだが.
PostgreSQL だったら rowid を oid に変更すれば OK かな?
>>285 複数行ある行の最小の rowid/oid 以上のレコードが全部消えるよ。
287 :
デフォルトの名無しさん :02/10/06 01:26
外部結合で結合したレコードがNULLだった場合を判定するスマートな やり方or関数とかありますか? AとBで結合してBがNULLだったらDECODE(B.nanka, NULL, 1, 0) AS B_FLGとかやってますが。
288 :
デフォルトの名無しさん :02/10/06 01:26
あ、オラクル8くらい
>>287 > 外部結合で結合したレコードがNULLだった場合を判定するスマートな
> やり方or関数とかありますか?
つーか、NULL だったらどうしたいの ?
単にフィールドに NULL かどうかのフラグを入れたいだけなら...
> AとBで結合してBがNULLだったらDECODE(B.nanka, NULL, 1, 0) AS B_FLGとかやってますが。
で十分スマートだと思うけど。(Oracle8 はよく知らんから、もっといい関数があるかも知れんけどね。)
質問です。 select a as b where b='hoge'; ↑のように、ASで付けた名前をWHEREに使用できないのでしょうか?
すいません、fromが抜けてました。 正しくは select a as b from c where b='hoge'; ↑のように、ASで付けた名前をWHEREに使用できないのでしょうか? です。
>>291 入れたいなら、入れろよ。
入れてエラーが出るなら、それを書け。
293 :
デフォルトの名無しさん :02/10/07 09:16
>>291 やりたいならやれよ。
やってエラーが出るなら、それを書け。
294 :
デフォルトの名無しさん :02/10/07 09:19
無理
297 :
デフォルトの名無しさん :02/10/07 15:41
おれが 言いたいのは、エラーが出たときに、そのエラーが 何を言ってるのか知れということだ。 つーか 291が 何をやりたいのか さっぱりわからん(w asなんかで 名前つけるってのが、わかんねぇ。 なんで 名前つけないと あかんのや。 つーか 別名のつけ方ってのが あるだろ。 フィールドに対して、別名がつけられるかどうかは 知らんが。
298 :
デフォルトの名無しさん :02/10/07 15:45
>297 はい?
300 :
デフォルトの名無しさん :02/10/07 16:21
あんなり言うなよ 可哀想だろ (w
あんなりだってダサ
303 :
デフォルトの名無しさん :02/10/07 16:58
>>297 > つーか 291が 何をやりたいのか さっぱりわからん(w
マジで
>>297 は
>>291 の質問の真意をわかってねえんだろうな
笑ってる場合じゃねえと思うぞ
304 :
デフォルトの名無しさん :02/10/07 17:07
誰もわかっていないから 答えられない罠 けなすのは 人一倍得意だけどな(w
305 :
ペーパープラチナ(9i対応 :02/10/07 17:32
>>291 うん、できないです(^^;
でも
select b from ( select a as b from c)
where b='hoge';
ってやった場合は出来ますけど
こんな事を言ってるんじゃないですよね・・・。たぶん。
306 :
ペーパープラチナ(9i対応 :02/10/07 17:37
>>303 に激しく同意。
なんでSQLくらい教えるのに
>>297 みたいに
がなりたてるのか、さっぱり解らない。
内部プロセスの順番で、最終的にselect句である
結果セットのフィールドに別名を割り当てているから
じゃないかな。
似た話で、order by句に対象計算カラムの別名ではなく
select句と同じ計算カラム(sumとか)をもう一度書か
なくてはいけないというのもある。
>>305 の例もまずfrom句の中間ビューが作成され、
カラムにはbという名前で割り当てられるから
bという別名でアクセスしなければいけないのだろう。
つかRDBMSによって違うよね。
Oracleなら
>>305 みたいにインラインビュー使う。
9i以降ならwithでそれっぽいことができるのかな?
Accessは少なくともselect節、もしかすると全域で別名の後方参照ができる。
MSSQLは知らない。もとい、他は知らない。
>>307 Oracleはorder byには別名使えてgroup byには使えなかったりする。
いまいち納得いかないんだよなー。
309 :
デフォルトの名無しさん :02/10/08 10:55
>>308 納得いかなくない。
order by は結果セットに対してgroup byはテーブルに対してかかるのだから
その動きは直感的です。
>>308 が言ってる事は
>>290 の質問と同じだよ。テーブルに対してかかるものを
別名つけられなくても、別に困らないし、逆に別名が有効になれば混乱する。
310 :
デフォルトの名無しさん :02/10/08 12:05
>>309 >納得いかなくないことない。
それは、RDBMSの実装上の都合。
>>310 実装上の都合じゃないでしょ。後方参照の実装なんて簡単だし。
思想の違いでしょ。
俺はT-SQLの方がいやだ。
312 :
デフォルトの名無しさん :02/10/08 18:33
>>311 はぁ?
order by,group byの書き方知ってるの?
(°Д°)<書いてません。打ち込んでるだけです。(プ お前は何か?タブレット使ってSQL書き込んでのか?あ?
>>309 んでも結果セットに無い列もorder byで使えるじゃん。
それに比べてgroup byは不便だなぁ、と思ってしまうのです。
言わんとするところは解ったけど。
group byにコピペするかインラインビューを一段増やすかで
不毛に悩むのがだるい。
PocketPCの手書き入力でSQL書いてますが、何か? いやネタじゃなくて(泣
317 :
デフォルトの名無しさん :02/10/09 00:27
withってどうやって使うか、誰かキーワードだけでも教えてくんないかな googleで検索しようとしても「withは一般的な〜」とか言われて検索できんのよ
318 :
ペーパープラチナ(9i対応 :02/10/09 00:44
>>317 こんな感じです。WITH句を使うと、中間ビューを事前に定義できます。
WITH
tbl_alias AS
(
SELECT col1,col2 FROM tbl_a
WHERE col1='hoge'
)
SELECT col1,col2 FROM tbl_alias;
SQLの書式を調べるなら、Oracleよりマニュアルをダウンロードした方が
てっとり早いと思いますよ。
320 :
デフォルトの名無しさん :02/10/09 20:29
oracleなんだけど、既に行が存在するviewで列の追加ってどうしたらいいの?
alter view
322 :
デフォルトの名無しさん :02/10/10 09:35
>>320 viewってのは、テーブルを結合して 見せてるだけのものなのだ。
だから、viewに追加するのではなく、元のテーブルに追加するのだ。
>>322 元のテーブルにはあるけど今までviewとして見せていなかったものを
新たに見せたいって話じゃないの?
すでに
>>321 で答えが出てるけど。
>>321 サンクスコ
>>322 323が説明してくれた通り。わかりづらい聞き方でスマソ
ところでまた質問なんだけど、SELECT文とか使うときに全フィールドの
中身を取り出す場合には select * from テーブル名、という風に
「*」が使えるよね?だけどROWNUMとか使う場合だと
select 全部のフィールド名カンマ区切り,ROWNUM as id from テーブル名
とかやらないと出来ない気がするんだけど、
select *,ROWNUM as id from テーブル名
みたいなノリで出来ないの?いちいち全フィールド名書くのがメンドイ。
>>324 select テーブル名.*,ROWNUM as id from テーブル名
>>325 うおおお朝っぱらからありがとう!
大変助かりまする
質問です。 ・入力必須項目なし ・検索項目は3つ ・AND条件で絞込み 以上の条件を満たす検索画面で作られるSelect文を CやJavaのプログラムで効率よく書くにはどうしたら良いでしょうか? select * from TABLE where ColumnA = 'a' and ColumnB = 'b' and ColumnC = 'c'; 普通に書くと一番長い場合こうなりますが、 検索条件の入力がない場合など、色々組み合わせを考えて select文の文字列を力ずくで作るのはなんだか格好悪いですし、 検索条件が増えたときなど保守性にも欠ける気がします。 なにか王道などあればよいのですが・・・
>>327 > 検索条件の入力がない場合など、色々組み合わせを考えて
> select文の文字列を力ずくで作るのはなんだか格好悪いですし、
そんなに組み合わせあるか ? 要は...
[ when Condition1 = 'Value1' [ and Condition2 = 'Value2' [and ...]]] って言う文字列作るだけだろ ?
一番最初だけ例外的に 'when ' がつくだけで、後は 'and ' と条件式を付加していけば良いだけ。3個だろうが 1,000個だろうが一緒だよ。
> なにか王道などあればよいのですが・・・
そんなもん無いから、地道に考えろ。
>>328 回答有難うございます。
ちょっと質問の仕方が大げさ過ぎたかも知れないです。
>>328 のように私も処理していますが、
もっといい方法がないかと思いまして・・・
他人のソースを見て、「なるほどね、そういうのもありか」と
感心するケースがまだ多いです。
>地道に考えろ。
これが王道でした。もっと勉強して洗練させていきたいです。
>>327 プログラム側で条件変化するクエリ文字列を作成する方法だよね?
漏れはこんな感じでやることが多い。
query = "Select * From table Where (0=0) "
+ (Aが指定されてる)?" And ColumnA = " + A:""
+ (Bが指定されてる)?" And ColumnB = " + B:""
+ ...
ポイントはベースとなる部分に Where (0=0) など必ず真になる式を書いておく。
すると以降の条件文字列を同じように結合していくことができる。
(最初の条件だったら Where それ以降だったら And という判断をしなくて良い)
プログラム側の指定によってセレクトする列が変わるときは…
まぁ、いろいろとテクニックがあるのですよ。
331 :
デフォルトの名無しさん :02/10/14 15:49
SQLの初心者です。 質問です! Commit(更新確定)というのは、DB内のあるテーブルだけを指定して行う ことは可能でしょうか? もし可能なら、やり方を教えていただけませんか? それとも、DB全体に対してしかできないのでしょうか?
>>331 コミットって、テーブルとかDBとかに対してではなくて、
トランザクションに対して行われるものでは?
考え方からして、間違っていませんか?
sqlの初心者です。 一番新しい日付だけを取得したいのですが どう書けばいいのか教えていただけないでしょうか?
>>333 select max(日付) from テーブル group by 日付;
違うだろが
あ すいません
接続するのはMYSQLです。・・・
>
>>334 さん
ありがとうございますm( )m
トライしてみます。
いや… だから…
>>333 のは間違っているのだよ。
すまん。間違ってるのは
>>334 の SQL な。
339 :
デフォルトの名無しさん :02/10/15 14:14
F1グループのなかでF2が最大のものを選ぶ TABLE: ID F1 F2 ---------------- 1 1 1 2 1 2 3 2 1 SELECT F1, MAX(F2) AS M FROM TABLE GROUP BY F1 とすると F1 M --------- 1 2 2 1 これを SELECT * FROM ----- ID F1 F2 ---------------- 2 1 2 3 2 1 と求めたいのです。 SQLの書き方を教えてください
340 :
デフォルトの名無しさん :02/10/15 14:26
SELECT ID,F1, MAX(F2) AS M FROM TABLE GROUP BY F1 か?
341 :
デフォルトの名無しさん :02/10/15 14:39
>>340 ありがと
漏れもそれやったんだけど、
IDがGROUP BYに入ってないからだめだと言われて・・・
342 :
デフォルトの名無しさん :02/10/15 14:59
>>339 SELECT
MIN(ID),
TABLE.F1,
TABLE.F2
FROM
TABLE,
(SELECT F1, MAX(F2) F2 FROM TABLE GROUP BY F1) MAX_TABLE
WHERE
TABLE.F1 = MAX_TABLE.F1 AND
TABLE.F2 = MAX_TABLE.F2
GROUP BY
TABLE.F1,TABLE,F2;
by oracle
未確認、たぶんいけるとおもうけど
>>336 すまん、group by 日付 は不要だ。(何で、こんなもんつけちゃったんだろ...。)
単純に、select max(日付) from テーブル; で OK だ。
345 :
ペーパープラチナ(9i対応 :02/10/15 19:27
F1列の値に対して、F2列の値が重複してもいいなら こんな感じですね。(※テスト環境 Oracle9i) 意図と反してたらゴメンなさい。 DROP TABLE t_test; CREATE TABLE t_test ( id varchar2(10) PRIMARY KEY, f1 varchar2(10), f2 varchar2(10) ); INSERT INTO t_test VALUES('01','1','1'); INSERT INTO t_test VALUES('02','1','2'); INSERT INTO t_test VALUES('03','1','3'); INSERT INTO t_test VALUES('04','2','1'); INSERT INTO t_test VALUES('05','2','2'); INSERT INTO t_test VALUES('06','3','1'); INSERT INTO t_test VALUES('07','3','0'); INSERT INTO t_test VALUES('08','3','5'); INSERT INTO t_test VALUES('09','3','5'); INSERT INTO t_test VALUES('10','3','0'); COMMIT; SELECT id, f1, f2 FROM t_test WHERE (f1,f2) IN (SELECT f1, MAX(f2) FROM t_test GROUP BY f1);
>>342 神様
直接やってみたらエラーがでたけど342を鬼のように見ていたら
突然
SELECT * FROM TBL_SIMPLE
WHERE F2 = (SELECT MAX(S.F2) FROM TBL_SIMPLE S WHERE S.F1 = TBL_SIMPLE.F1)
を思いついた。ありがとう。
347 :
デフォルトの名無しさん :02/10/15 20:21
>>342 ああ、SQLの書き方でそんなのはじめてみた。
真似させてもらう。SAGE。
349 :
デフォルトの名無しさん :02/10/15 23:13
>>347 ORACLEしか知らないけど、変じゃないよ。
レコード数増えると2次曲線的に重くなりそうだけど。
>>339 >>345 のテーブルを借用するならば・・・
select * from t_test
where (F1,F2) IN (select F1, MAX(F2) from t_test group by F1);
ID F1 F2
---------- ---------- ----------
03 1 3
05 2 2
08 3 5
09 3 5
これが一番簡単なんではないのか?
汎用性があるのかはしらんが・・・
(Ora R8.1.7で確認)
すまん、思いっきり結果がずれたな・・・ 行途中の半角スペースも消されるんだっけか。 見ればわかるとは思うが。 ID F1 F2 ---------- ---------- ---------- 03 1 3 05 2 2 08 3 5 09 3 5
>>350 それだ!
うん、シンプル。
みんなありがとう。
お陰で家に帰れたヨ。
>>352 家に帰れて良かったなー。
この次、俺が困ったら必ず助けるように。
最近は、TeraTermと秀丸のマクロで
苦しめられたよ。
#もっと、DBの仕事がしてー!!!!
はじめてtablespaceから作ってみたんですが、 unlimited tablespaceの権限をつけてあげないとテーブル自体が 表領域に作れないんですね。(もちろんテーブルスペース作る権限は持ってますよ) いつもDMLしか触らせてもらえないから知らなかったです。
>>354 寝る前に、答えておく。
QUOTAを調べるが良し!!
356 :
デフォルトの名無しさん :02/10/16 09:22
なんでも権限だしなぁ。 そのうえUNIXときたら 頑固だしね。
357 :
デフォルトの名無しさん :02/10/16 09:36
>>356 ロールつけてやるだけじゃまったく足りないよね。
connectのロールなんかくだらないものしか入っとらん。
結局grantかよ。。。。
358 :
デフォルトの名無しさん :02/10/16 17:49
age
359 :
デフォルトの名無しさん :02/10/16 17:50
revoke connect,age from
>>1 ;
DROP USER デフォルトの名無しさん;
362 :
デフォルトの名無しさん :02/10/16 22:18
最強SQLハケーン SELECT 'GIKO' どうよ
364 :
デフォルトの名無しさん :02/10/17 13:06
drop user SQL ◆Wij7wZFpXs ;
365 :
デフォルトの名無しさん :02/10/17 13:13
ここって香具師ばかりだな こんなとこにいる漏れも香具師か・・・・
>>365 >ここって香具師ばかりだな
>こんなとこにいる漏れも香具師か・・・・
はぁ?
>>366 「かぐし」って厨房のことだろーが
それくらいも知らねーのか(藁
+ 激しく脱線 + _l\ /⌒/ l ( ヽ ヽ_/ノ ⊂(__∪ー∪
香具師 = かぐし = 厨房 新生2ちゃんねる語の誕生です。
さて,
>>367 の投稿ですが,一体どこに晒したらいいと思う?
香具師 = 香貝死 = マン臭で死亡した奴
375 :
デフォルトの名無しさん :02/10/17 14:49
>>372 違うだろ〜〜〜
ヤツ→ヤシ→香具師
となっただけ。
っつーか、ダウソ板の流れだろうな、コリは。
>>375 俺につっこむなよw
元はぁ方面の言葉だね。
377 :
デフォルトの名無しさん :02/10/17 15:31
378 :
デフォルトの名無しさん :02/10/17 15:42
367ってスゲー
>>370 のはじけっぷりが気持ちいい。
「プ おまえもカグシだな」
「プ おまえもカグシだな」
381 :
デフォルトの名無しさん :02/10/17 16:28
>>370 って頭いいね。
俺なんかずーっとヤシって読むのかと思ってた。
>>381 >ずーっとヤシって読むのかと思ってた
うそつけこのカグシ野郎。
2chで初めて知ったんだろ。
383 :
デフォルトの名無しさん :02/10/17 16:48
>>382 つーか 2chでしか 盛んに使われてない・・・。
おれも、ここ見てなかったら、そんな言葉は シラネぇ。
384 :
デフォルトの名無しさん :02/10/17 16:53
>>383 知ってる方が変。
常用漢字じゃない罠。
385 :
デフォルトの名無しさん :02/10/17 16:54
なんで「ヤシ」って2文字で変換してるのに、3文字で変換されるの?
387 :
デフォルトの名無しさん :02/10/17 17:01
388 :
デフォルトの名無しさん :02/10/17 17:22
ここで もう一度
>>365 を見て 笑ってみよう!
名スレの予感...
390 :
デフォルトの名無しさん :02/10/17 18:25
香具師=厨房 やったー!
391 :
デフォルトの名無しさん :02/10/17 18:26
こんな地味なスレを見つづけてきた甲斐がありました。
ありがとう
>>365
「香具師」のどこが「ヤ」でどこが「シ」なんだ? 「香」が「ヤ」で「具師」が「シ」? 「香具」が「ヤ」で「師」が「シ」?
>>392 そんなことに疑問をもつな。このカグシ野郎!
カグシ ワショーイ!
ただいま「カグシ ワショーイ祭り」開催中です。
396 :
デフォルトの名無しさん :02/10/17 19:15
いまどき カグシなんて 言葉で 流行らん。 今、ここでは ブームに なりつつあるけど(w
397 :
デフォルトの名無しさん :02/10/17 19:17
良スレだったのに香具師に荒らされて終わるのか・・・
399 :
デフォルトの名無しさん :02/10/17 21:27
ここ香具師ばかりだな
select レス番号 from このスレ where デフォルトの名無しさん=香具師;
>>400 レス番号
--------------------
365
1行が選択されました。
かグシ はネタだろう。普通重箱読みはしないもの。 コウグシと間違ったなら判るけど・・・まあコウグシも正しい読み方だが
スマン 重箱読みじゃなくて 湯桶読みだな・・・・ 恥ずかしい
+ 激しく香具師 + X ∠ ̄\∩ |/゚U゚|丿 〜(`二⊃ ( ヽ/ ノ>ノ UU
406 :
デフォルトの名無しさん :02/10/17 22:51
>>402 >まあコウグシも正しい読み方だが
コウグシなんていう読み方ないぞ。
あったらオレが「カグシ」だが(ワラ
逆に「かぐし」をATOK15で変換すると
ヤシの誤読と出た(フラ
まぁ、おもろいのは香具師=厨房の使い方
なんだがな。だからどうみてもネタじゃ
ないだろう。
さては402=404=365か
365素直に出てこい、折れたちは待ってるゾイ
>>406 > コウグシなんていう読み方ないぞ。
「こうぐし」は、一応正しい読み方だよ。
と言うことで、
insert into 2ch (レス番, 読み) values(402, 'カグシ');
しとくね。
409 :
デフォルトの名無しさん :02/10/17 23:13
コウグシという読みあったんだ。 漏れがホントにカグシだった。。。
410 :
デフォルトの名無しさん :02/10/17 23:23
マターリカグシマツリカイサイチュウ
411 :
デフォルトの名無しさん :02/10/17 23:33
とにかくだ、香具師=厨房にしようぜ 読み方はカグシで 各板で使って広めよう。最初はここと同じ反応でバカにされる だろうがな。徐々に馴染んでくるだろう。 そして、我々は新2ch用語の誕生に立ち会うのだ。
>>411 や、オーバーライドは無理だろ。
カグシ = 厨房ならまだ可能性があるかもしれないけど。
413 :
デフォルトの名無しさん :02/10/18 09:12
香具師=厨房 だと 思っているボケがいるのは ここのスレですか?
oracleってどうアンインストールすればいいんだよ! Univarsal Installer使ってもゴミ残りすぎ。 レジスト消しても再インストしようとしたら前のSID名とか残ってるしよ! Windows入れるよりたちが悪いな。
416 :
デフォルトの名無しさん :02/10/18 10:03
417 :
デフォルトの名無しさん :02/10/18 10:08
>>414 レジストリのサービスの箇所でSIDのキー
を本当に消したか?
このカグシ野郎。
>>414 レジストリの中を検索して
削除するのは、もはや暗黙の了解となってるのだよ。
このカグシ野郎が!
419 :
デフォルトの名無しさん :02/10/18 10:18
>>414 スレ違いだ。だからカグシって呼ばれちゃうんだよ。
>>413 違います。香具師=厨房 だと 思っているカグシがいるスレです。
わかったかこのカグシ野郎
421 :
デフォルトの名無しさん :02/10/18 12:42
カグシ キタ-----------------------!
422 :
デフォルトの名無しさん :02/10/18 17:10
カグシ━━━━(゚∀゚)━━━━!!!!!!
423 :
デフォルトの名無しさん :02/10/18 17:11
ある意味、365は神。 疫病とか、貧乏とか、そっち系の。
424 :
デフォルトの名無しさん :02/10/18 17:29
\ │ / / ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ─( ゚ ∀ ゚ )< カグシカグシ! \_/ \_________ / │ \ ∩ ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< かぐしかぐしかぐし! かぐし〜〜〜! >( ゚∀゚ )/ | / \__________ ________/ | 〈 | | / /\_」 / /\」  ̄ / /
425 :
デフォルトの名無しさん :02/10/18 18:02
貧乏神だったのかぁ〜〜〜 神様にお願いするときは、神様を指定しないとダメなのね(w 貧乏神に 幸せにしてくださいと 願ってもかなえてくれるわけないよなぁ(w つーか、神は 複数いねぇけどよ(w
426 :
デフォルトの名無しさん :02/10/19 11:17
>>425 何言ってるのか不明。
独り言なのか?
かぐしage
427 :
デフォルトの名無しさん :02/10/19 13:56
>>425 もカグシ━━━━(゚∀゚)━━━━!!!!!!
429 :
デフォルトの名無しさん :02/10/19 16:27
ガイドライソ板からきますた ヴァカがいるスレはここですか?
はい、ここです。
431 :
デフォルトの名無しさん :02/10/19 16:49
>>430 ヴァカではなく、カグシがいるスレです。
432 :
デフォルトの名無しさん :02/10/20 14:14
A|B -+- 1|a 2|(null) 3|c というテーブル1と A|C -+- 1|d 2|e 3|f というテーブル2があって、AとBを得たいのですが、Bが(null)だった場合テーブル2のCからAが同じレコードのCを取ってきて、 それをフェッチでだらだら処理したいのです。 selectにifnullとかいうのを使うととって来れそうなのですが、別テーブルにあるレコードの参照が分かりません。 select A,ifnull(B,C) from 1,2; とかやったらAのフィールドが被ってるじゃねえかよ、ゴルァと怒られてしまいました。 多分、AやB,Cをどのテーブルからという指定ができればいいと思うんですが、どうやったらいいですか? 下らない質問をするカグシと思わずに、どうぞご教授下さい。
select A,ifnull(1.B,2.C) from 1 left join 2 on 1.A=2.A で解決しました。いや、解決かどうかは分かりませんが、欲しいデータは取れました。 これであってますか?
433=432です。
>>432 Access は ifnull() 使えないみたいなので、動くかどうかは試してないけど...
select テーブル1.A,ifnull(テーブル1.B, テーブル2.C) AS B from テーブル1 left join テーブル2 on テーブル1.A = テーブル2.A;
あ、レスどうもです。AS Bってのを使うと、ifnull〜がBで参照できるんですよね、多分。それで逝ってみます。
437 :
デフォルトの名無しさん :02/10/20 15:10
ifnullてことはPostgre? なんとなく外部結合にしなくてもいいような気がするけど 2.Cのとこでコケるか。あってるんじゃないでしょうか 曖昧なカグシですまん
438 :
デフォルトの名無しさん :02/10/20 15:10
>>432 よ、カグシな俺が教えてやろう。
select '1' A, 'a' B from dual table_a
union all
select '2' A, 'e' B from dual table_a
union all
select '3' A, 'c' B from dual table_a;
で万事解決だ。よろこべ
>>432 よ。
>>437 MySQLです。DBS書かないダメなカグシでしたね。
>>438 すみません。今週末から始めたばっかりなので、理解できません。
441 :
デフォルトの名無しさん :02/10/21 05:19
が、ガイドライソ板から来ますた。 カグシさんはどこですか?
カグシの楽園へようこそ!!
響きが「グワシ」に似てるな・・・
select カグシ from 2ch
select カグシ from 2ch where スレッド='SQL教えて〜!!<2>'
445件のカグシが選択されました
447 :
デフォルトの名無しさん :02/10/22 15:35
このスレは カグシ教えて〜!! の スレに なりました(w
448 :
デフォルトの名無しさん :02/10/22 15:36
delete from 2ch where kakikomi like '%ガクシ%' ; commit;
2000/10/21 2000/10/22 2000/10/23 2001/10/21 2001/10/22 2001/10/23 2002/10/21 2002/10/22 2002/10/23 ↑こういうデータ(Date型)の中から 2000、2001、2002って抽出したいんですけど どうやればいいのでしょうか?
>>449 SELECT LEFT(Data, 4) from kagushi;
>>450 ありがとうございます。
上手くいきませんでした。
やりたいことは、何年のデータがあるのかを知りたいのです。
2000、2001,2002の3っつがわかればいいのですが。
>>451 SELECT DISTINCT YEAR(myDateColumn)
FROM MYTABLE
ORDER BY YEAR(myDateColumn)
おまえの環境はわからんが、だいたいの実装に年だけを取得する関数があるはずだ。
453 :
デフォルトの名無しさん :02/10/22 18:03
SELECT LEFT(Data, 4) from kagushi; ここの Dataってのは、 2000/10/21 2000/10/22 2000/10/23 2001/10/21 2001/10/22 2001/10/23 2002/10/21 2002/10/22 2002/10/23 が 入った 項目名のことだぜ。 ま、 重複しているのを なくすってならば、GROUP BY だっけかな、 を つけたせば OK だ ちょんまげ〜
update 'SQL教えて〜!!<2>' set 名前='カグシ' where レス in (450,453)
SQL>select * from "SQL教えて〜!!<2>" 2>where "名前" = 'カグシ'; レス 名前 ---- ------ 438 カグシ 450 カグシ 453 カグシ 3 件が選択されました SQL>
457 :
デフォルトの名無しさん :02/10/23 01:04
create view 厨房 as 香具師 うんぬん
INSERT INTO SQL教えて〜!!<2> (レス番, 話題) VALUES (458, 'カグシネタはそろそろ終わりませんか') ;
459 :
デフォルトの名無しさん :02/10/23 10:52
>>458 select '
>>365 なのか?こういうのが続きまくるのが2ちゃんなのだ。'
INTO 458
(T-SQL風)
香具師 ↓ 椰子 ↓ 椰子からナデラ ↓ 洗剤 ↓ 台所 ↓ 厨房 ∴香具師≡厨房
∴風が吹く=桶屋が儲かる
categoryid categoryseq categoryname categorytitle parentcategoryid --------------------------------------------------------------------------------- 1 1 top トップページ 2 300 haiku 俳句 1 3 308 backnumber バックナンバー 2 4 304 merumaga メールマガジン 2 5 306 etc いろいろ 2 6 419 tanka 短歌 1 7 456 def かきくけこ 7 8 478 pqr さしすせそ 7 9 489 stu たちつてと 7 というテーブルがあり、 categoryname が「haiku」と一致するレコードと、 parentcategoryid が「上記レコードのcategoryid」と一致するレコード を集めて、それを、categoryseq でソートしたいのですが、 (つまり、上記例では、2、4、3、5のレコードが抽出されるようにしたいのですが) SQL文がわかりません。 $SQL ="SELECT * FROM CATEGORYMASTER foo WHERE CATEGORYNAME = "haiku" UNION ". "SELECT * FROM CATEGORYMASTER bar WHERE bar.PARENTCATEGORYID=foo.CATEGORYID ORDER BY CATEGORYSEQ"; とやってみたものの、1件もひっかからず。 どうすればいいのでしょうか?
select t2.* from CATEGORYMASTER as t1 left join CATEGORYMASTER as t2 on t1.CATEGORYID=t2.PARENTCATEGORYID where t1.CATEGORYNAME='haiku' order by t1.CATEGORYSEQ;
464 :
デフォルトの名無しさん :02/10/24 01:00
SELECT * FROM CATEGORYMASTER WHERE CATEGORYNAME = "haiku" UNION SELECT * FROM CATEGORYMASTER WHERE PARENTCATEGORYID IN (SELECT CATEGORYID FROM CATEGORYMASTER WHERE CATEGORYNAME = "haiku") order by categoryseq DBMSによって、テーブル名に修飾付けたり、このままじゃORDER BYできないかも しれないけど、大体こんな感じ。
最後は order by t2.GATEGORYSEQ の間違い
467 :
デフォルトの名無しさん :02/10/24 05:13
>>462 その条件だと 1と6のみの ような気がするのだが。
468 :
教えてください〜 :02/10/24 17:23
access97使ってるのですが 文字列内の改行の入ってる文を、入れたいのですが、どおしたらいいのか わかりません。 "AAABBB"をAとBとの間に改行を入れたいのです。 "AAA BBB" Accessのクエリーだとできるのですが・・・ クエリーをSQLで表示させると サンプル=テーブル名 文字列=フィールド名 UPDATE サンプル SET サンプル.文字列 = "AAA BBB"; SQLで書き方があったら教えてください。
>>468 Accessだよね?
char(int n)
だか
chr(int n)
だか忘れたけど、そんなんなかったけか?
470 :
教えてください〜 :02/10/25 11:52
char(int n)ってどんな感じで使うのですか?
471 :
デフォルトの名無しさん :02/10/25 12:19
>>470 Chr(13) & Chr(10)
Chr(13)はキャリッジリターン
Chr(10)はラインフィード
472 :
教えてください〜 :02/10/26 01:53
AAA & Chr(13) & Chr(10) & BBB ッて感じでいいんでしょうか? とにかく、試してみます。 ありがとうございます。
473 :
カグシのみなさん教えてください〜 :02/10/27 09:42
SQL始めたばかりの初心者ですが宜しくお願い致します。 SELECTで空白の列を出力させたいのですが、方法が判りません。 select 列名1,列名2,空白の列,列名3 from テーブル1 列名1 列名2 空白の列 列名3 ----- ---- -------- ------ カグシ ヤシ コウグシ と出力させたいのです。 テーブル1には,空白の列は無いです。列は作成することが出来ません。。。 dualやなんかを使うのかなぁ?などと考えたのですが、 判りませんでした。 ご教授宜しくお願いします。
474 :
カグシのみなさん教えてください〜 :02/10/27 09:46
そっか半角スペースがきえるんだたyo 列名1 列名2 空白の列 列名3 ----- ---- -------- ------ カグシ ヤシ コウグシ と出力させたいの間違いです。 よるしく
select 列名1,列名2,'',列名3 from テーブル1
476 :
カグシのみなさん教えてください〜 :02/10/27 10:03
ウェーン 475サン アリガトン コンナニカンタンダタノカヨ、、、、デキタヨママン 475サン アリガトン コレデイエニカエレルヨン 475サン アリガトン
477 :
デフォルトの名無しさん :02/10/27 17:36
ネタダネ
>>477 ビミョ〜〜〜。全くの初心者なら、マジでもおかしくはない。
結構参考書とかに載ってなかったりするし。
難しく考えすぎて・・・って奴じゃねえの。ハマってる時ってだいたいそれだったりするんだよな。
はまる以前の問題のような気もしないが... 基礎の本から読んだ方がいいと思う
481 :
Gunball :02/10/31 10:48
すいません、質問です。 たとえばUNIXで造ったC言語の年間売上データをSQLを使ってDBに落として そのデータをSQL使って月毎の集計を出す。というのはどのようにすれば 良いのでしょうか?
>>481 >C言語の年間売上データ
コンパイラでも作ってるんですか?
483 :
Gunball :02/10/31 10:58
すいません。UNIXでC言語を使って造った年間売上データです。
484 :
Gunball :02/10/31 11:12
481です。全部自動でやってくれるPGということです。 手動ならできるんだけど。
>>484 全自動のプログラマを想像してちょっとワラタ。
>>481 とりあえず、元データを何で作ったかは関係ない。
テキストデータなら適当なローダで入れたら
適当なスクリプトと自動起動で全自動にもなるだろ。
> そのデータをSQL使って月毎の集計を出す。
SQLは固有名詞じゃないよ。
>484 手動でやってる事をプログラムにさせればいい、としか言えないぞ。
何を質問したいか全然ワカランが たぶん、少なくてもカラムにい「月と売上額」あるべ そしたらグループと集計関数でいくとおもわれ SQLの基本中の基本だから 基礎の本から読んだ方がいいと思われ
つーか、DB 使うほどのもんか?
DB使うほどのもんとはとても思えない案件ってわりとあるよ とりあえず金を巻き上げるのにいい口実だから使ってるんだろ
491 :
デフォルトの名無しさん :02/11/01 03:37
ある日付けから、さかのぼって10日分のレコードが ほしいときはどうやったらいいでしょうか? テーブルの内容は日曜日とか土曜日とか祝日とかが 飛び飛びであいています。 多分datetimeに降順をしていして何かをするんだと思うんですが その先が調べられなかったんでよろしくおねがいします。
>>490 いや、それに応じた適切なデータ構造を考えたり、それをどう保存、読込みすれば
いいか判らないからというのが真実。
>491 ある日付〜ある日付-10日の条件で抽出すりゃ一発じゃん。
494 :
デフォルトの名無しさん :02/11/01 13:07
空のテーブルから、カラム名を取り出すには、どうしたらいいですか?
>493 レスどうもです。 質問をちょっと間違えました。 10日分でなく10件分のレコードがほしいんです。 休みがあるから-10日だと数件少ない状態でとれるのでこまってます。
質問です。 oracleでSQL文を発行してtableやviewの構成を取得することは できるのでしょうか?
desc
select文で発行してレコードセットに取得したいのです
>>492 で、それに人件費掛けるくらいならDBのパッケージと
一山いくらのDB技術者を買ったほうが安上がり…と。
500!
501 :
デフォルトの名無しさん :02/11/02 03:11
>>498 v$columnsとかいう感じのディクショナリがあるんじゃね?
DICT表でも検索かけろや
>>495 データベースにもよるが
ORACLEなら select * from テーブル where rownum <= 10 order by 日付 desc
SQL鯖なら select top 10 * from テーブル order by 日付 desc
こんな感じかな(未確認)
>>481 その年間売上データに対応するスキーマ作って、データパースして、INSERTする。
カレンダー用のテーブルを作ってJOINするとか、月を取り出す関数使うとかして、
GROUP BYでまとめて、SELECT集計関数使って終わり。
ていうかこんなこと聞くな。氏ね。
>502 ありがとうございます。できますた。
>>498 {ALL|USER|DBA}_TAB_COLUMNS
内容はリファレンスマニュアル嫁
506 :
デフォルトの名無しさん :02/11/03 22:35
table1 id name table2 id date_from 期間はじめ date_to 期間終わり というテーブルで、 任意の日付がtable2の期間に引っかかる場合のtable1.name を求めるにはどうしたらよいですか? table1のidについてtable2で複数の期間が設定されています。
>>506 ふつうに考えれば
select table1.name
from table1, table2
where table1.id = table2.id
and table2.date_from >= 任意の日付
and table2.date_to <= 任意の日付
じゃないのか?
この定義だけ見ていると
テーブルを分けてる意味がワカランが
508 :
デフォルトの名無しさん :02/11/04 00:47
>>507 レスありがとうございます。
テーブルの構成はたとえば
table1
id name
a mona
b giko
table2
id from to
a 2002-1-1 2002-1-3
a 2003-1-1 2003-2-2
b 2002-10-1 2002-11-1
のようになっています。
509 :
デフォルトの名無しさん :02/11/04 00:50
>>507 うまくできました。ありがとうございます。
ますます不思議 table1 id name date_from date_to で良いやん 難しく考えすぎやで
数値の合計とか平均とか出したい場合、CGIで計算して表示するのとsqlで計算して表示するのどちらがいいのでしょ?
>>511 永続化する必要の無いデータなら、CGIで計算しよう。
>>511 SQLで1発で検索して、プログラムでは表示するだけにする方が
すっきり簡単
CGIって何の言語でしょ?Perlかな?
一度の表示件数にも、よってしまいますが
1レコードずつ計算させるのは非効率です
用はしたい事によるけれど
514 :
デフォルトの名無しさん :02/11/04 20:39
とっても遅いかもしれんが
>>510 そんなこと無いんじゃないかな
idがdate_fromとdate_toに従属しているから
table2は
date_from
date_to
id
として、date_fromとdate_toが主キーでしょうね
>502 ORACLEの方はこうじゃないとダメじゃなかった? select * from (select * from テーブル order by 日付 desc) where rownum <= 10
516 :
デフォルトの名無しさん :02/11/05 10:16
>>512 >>513 レスどうもです。
永続化しないデータならCGIでの計算でおーけー。
ただ表示件数やらによってはsqlでやってしまったほうが効率的、ということですね。
臨機応変にと。
言語はPerlでございます。
518 :
デフォルトの名無しさん :02/11/05 16:33
>>517 >>512 は嘘です。
表示件数には関係ないです。
合計とか平均ならどんな場合に置いてもSQLで計算した方がいいです。
俺気づいたんだけど、家でOracle入れても何の価値無いな。w 9だから勝手にDB立ち上がってメモり131MBも喰ってるし。。。。 table作ろうにも何のtable作ろうか小一時間迷った結果、MXで落としたエロゲリストしか思いつかなかった。 もちろんtableひとつでリレーションも糞もない。excelで十分まかなえる。w お前ら家でOracleどう使ってる?
Oracleを使う事自体が目的なのか・・・
521 :
デフォルトの名無しさん :02/11/06 16:48
すいません。。。 参考書に 「データベースの作成にはMySQLが起動した状態で コマンドプロンプトから次のようにします。」 cd c:\mysql\bin mysqladmin create examdb とあるのですが、CREATE DATEBASE failed; error: とかで先に進めないんです。。誰かこんな糞厨に手をさしのべて頂けないでしょうか。。
522 :
DB歴2日 :02/11/06 17:36
deleteコマンドで複数のレコードを削除できないでしょうか? DELETE FROM tbl_name WHERE 3>0; みたいな範囲指定じゃなく、0と3を削除 みたいな。
delete from tbl_name where col1 in (0, 3);
>524 正規化以前に>516は>514に同調している時点であふぉ。 >510 >506の「table1のidについてtable2で複数の期間が設定されています。」を 読み逃しただけだよね。 でなければやっぱりあふぉ。 >514 基本的に日時を主キーにするな。
>>516 あんたがアフォ?
>>514 が言っていることは、第3正規形の要件にある
「主キー以外の項目に従属する項目は分離する」にあたる。
第3正規形すらもできない香具師が多い限り
>>516 の様な
レスも見続けることになるだろう。
>>525 > 基本的に日時を主キーにするな。
なんで?
>>527 主キーとは識別子なり。
つまり主キーでもってデータを識別する。
日付で何を識別するの?
逆に「なるほど」と思えるような日時を主キーにしたモデルを見てみたい。
たまにはあるだろうけどね。(オレは思いつかん)
でも
>>514 の「date_fromとdate_toが主キー」は明らかに間違い。
理由はいっぱいある。
例えばidの値が違うデータ(table1の別々のデータ)に対して
date_fromとdate_toの組み合わせがまったく同じ
ということがありうる。これだけでシステムは止まる。
>>528 主キーが識別子だという主張は初めて聞いた(笑)
> つまり主キーでもってデータを識別する。
んなことに固執するから糞なDB設計が無くならないのだが
まぁ、それはいいとして
> 逆に「なるほど」と思えるような日時を主キーにしたモデルを見てみたい。
>>514 がまさしくそうでしょ
「開始日」「終了日」の対象がIDだと言える。
> 例えばidの値が違うデータ(table1の別々のデータ)に対して
> date_fromとdate_toの組み合わせがまったく同じ
> ということがありうる。これだけでシステムは止まる。
そりゃシステム要件に依るでしょ。date_fromとdate_toでユニークに
なるべきならOKでしょ。
>>506 >>508 を読む限り、要件は限定出来ない。
ユニークにならないなら、全部をキーにするかもしくはキー無しにすればよい。
つか、自分で墓穴掘ってるの気づかないかなぁ。
> 理由はいっぱいある。
一つだし。
ほかにわ?(笑)
言いたいことは、上でほとんど言って貰ってるわ あとで考えたら、この程度の項目数のDBってないよな(w もっと多くの項目があり、抜粋したもだったらって納得したよ 自分が言いたかったのは 正規化って言う意味ではなく テーブルを読むっていうか...アプローチって言うか 考え方ね! >507の範囲指定が無ければ(JOINしただけなら) >510の形式になるじゃん
>529 少なくともAccessでは主キー=一意制約=識別子だよ。
>>531 主キーが識別子じゃないとは言ってないよ。
1.日時を主キーにするな
2.なんで?
3.主キーとは識別子なり。
4.そんな主張は初めて聞いた(笑)
という事です。
533 :
デフォルトの名無しさん :02/11/08 12:09
うーん、日付を主キーにしたほうが良い要件もあるかもしれん・・・
とは思うけど、少なくとも
>>525 の方が妥当では??
>>507 の事例も、他に記述されてない要件があるかもしれないってひねくれる
事は出来るけど、普通に見たらに見たら主キーに設定するのはidが妥当で、
日付を主キーってのはちょっとおかしいし。
っつか日付を主キーはやっぱ変だよ、date型が主キーだと苦労しそうだし。
かといってchar型に日付のデータ入れた形だと今度は日付データの扱いが
面倒そうだし。
534 :
デフォルトの名無しさん :02/11/08 12:57
履歴管理は日付じゃないと困ると思うが
>「なるほど」と思えるような日時を主キーにしたモデルを見てみたい。 円相場やTOPIXのように 日時に対する数値を記録するテーブル。
当初の質問自体はもう解決したのでこのスレは見ていませんでしたが、
議論がすすんでいますね。
>>506 のケースは、もう少し詳しく書くと
<table1>
table1のid NOT NULL UNIQUE
name
addressなどなど...
<table2>
table2のid (key) NOT NULL UNIQUE
table1のid NOT NULL
date_from 期間はじめ
date_to 期間終わり
というテーブルです。例示の際にちょっと省きすぎたかもしれません。
少なくともこの場合は日付を主キーにはできないっすね。違う人が同じ期間
という場合もありますから。
ケースによっては日付をキーにします。その場合はdate型が主キーでも苦労しないです。
537 :
デフォルトの名無しさん :02/11/08 16:10
>>533 >っつか日付を主キーはやっぱ変だよ、date型が主キーだと苦労しそうだし。
変じゃない。「苦労しそうだし」って思いこみ。
例えばどんな苦労するの?
別に苦労なんてない、文字型も日付型も扱いは全く一緒。
そんな思いこみや根拠のない迷信がDB設計のじゃまになる
538 :
デフォルトの名無しさん :02/11/08 17:43
最近MySQLの勉強を始めたのですが、そのままでは日本語検索が出来ないという話を聞きました。なんとか対応させる方法はないのでしょうか? よろしくお願いします。
539 :
デフォルトの名無しさん :02/11/08 17:54
>>538 「話を聞いた」だけ?
「そのままでは日本語が使えない」ことを確認してみた?
>>535 なるほど。
オレが言いたいのは*何*でもってデータを識別するかということ。
>>537 頼むから生年月日で社員を識別すんなよ。(ちと煽り)
基本的に値が変わるかもしれないものを主キーにしてはいけない。
データの日付が変わったとき、普通はUPDATEをかける。
しかし日付が主キーならDELETE→INSERTをかける必要がある。
このデータに従属するテーブルがある場合、それらのデータも
DELETE→INSERTを行う必要がある。
>>533 日付でデータを識別しなければいけないときは日付が主キーになりうる。
(完全否定しているわけじゃないよ。)
date型かchar型というのは関係ない。
「苦労しそう」とか「面倒そう」というのも関係ない。
せっかくフォローしてくれたのにごめんな。
>>536 なるほど。
要件によっては<table2>の主キーが複合キーになったり
<table1>と<table2>の間に関係テーブルが必要だったり
するかもしれませんが、一応納得です。
(この辺は536さんのみぞ知るですから)
>例示の際にちょっと省きすぎたかもしれません。
省いていなかったら
>>507 で全て終わってましたね。(わら
しったか厨房大暴れ(w
543 :
デフォルトの名無しさん :02/11/08 20:01
みなさん正規化が大好きなんですね。
544 :
デフォルトの名無しさん :02/11/08 20:05
正規化するのが 当然なだけ。 つーか常識だろ(w
わざと正規化しないこともあるけどね。 第3正規化までして、また戻るとか。
547 :
デフォルトの名無しさん :02/11/08 20:52
どうせパフォーマンス向上とかの理由だろ 俺からすれば、ハードウェアに金かけろって感じだが
>546 正規形としては正しいが、顧客の要件を満たせないとき。
>>547 ハードにかけても限界があるよ!
DB定義とSQL文の書き方で
数倍のパフォーマンスが変わる
件数が増えれば、顕著にあらわれる
まぁ一度、膨大な件数のデータを扱ってみたら
正規化だけが正しいと思えなくなるから
なぜ構文エラーになるのかわかりません。どこがよくないのでようか SELECT name1, adress1 FORM Table1
>>550 ネタだよな?
一応・・・
○FROM
×FORM
>551 こいつも原因だよきっと? 一応・・・ ○ address1 × adress1
そうですね。 先輩には、パフォーマンスよりも論理的整合性。メンテナンスのしやすさが大切だ と教わっています。 それにまあ、超高負荷な案件なんて、受注したことないですから。 上の方で「正規化しない」と書いたのは、ちょっといきがってみただけです。
>>192 LFはセル内の改行コードだから当然そうなる。コードの詳細がわからないけど、
cells(1,1).Value = "aaa"
cells(2,1).Value = "bbb"
となるようにコーディングできない? でなきゃ、
S = "aaa" & vbCr & vbLF & "bbb"
でやってみたら?(試してないけど)
すいません、誤爆しました。
556 :
デフォルトの名無しさん :02/11/09 09:31
SQL Server7.0/2000 です。 クロス集計について。 Name Day NUM ------ --------- ----- A 1001 2 A 1009 1 A 1001 1 B 1001 4 A 1001 12 B 1003 6 C 1005 22 B 1003 16 このようなデータがあり、(続く)
557 :
デフォルトの名無しさん :02/11/09 09:31
(続き)、クロス集計を select Name, sum(case WHEN Day=1001 then NUM END) as Day1001, sum(case WHEN Day=1002 then NUM END) as Day1002, ・・・ sum(case WHEN Day=1009 then NUM END) as Day1009 from table1 group by Name order by Name のようにしています。 実は、Name が数百種類、Day も重複なしで100日分位になるのですが、 その場合やはり、 sum(case WHEN Day=1001 then NUM END) as Day1001, の行を100個書くしかないのでしょうか。 あるいは、他にクロス集計の方法はありますか?
効率の悪いクロス集計を組むより、一時テーブルを使ったほうが ずっと早いと思うが・・ 悩む時間も無駄だと思うが・・・
>>558 例えば一時テーブルはどういう作り方にしたらよいですか?
ちなみに結果として欲しいのは集計の1部とかではなく、
クロス集計の表(CSV)なんです。
クロス集計って何?
俺だったらSQLでやらないなー
562 :
デフォルトの名無しさん :02/11/09 13:45
>>559 一時テーブルは、create table ##table1
横展開するには100個かくしない無いと思われ
って言うか、一時テーブル作成してもね
>>562 あ、やはり100個書きますか、そうですよね。
ありがとうございます。
564 :
デフォルトの名無しさん :02/11/12 14:00
create procedure GetNowDate returns(NowDate date) as begin SELECT MAX(CURRENT_TIMESTAMP) FROM Table Into :NowDate; suspend; end InterBaseで現在の時間を返すストアドなんだけど ERROR: DATE data type is now called TIMESTAMP みたいなErrorが・・・ なぜ?
非常に初歩的な質問なのですが、複数条件検索の記述はどうすればいいのですか?
>>564 InterBaseは知らないので間違ってるかもしれないっすけど
Intoの記述する場所違うくねぇ?
>>565 基礎編の本を読みましょう
たぶん知らないことが、たくさん書いてありますよ
SQLをはじめてまなぶとしたら、どのSQLをまなぶのが一番でしょうか? なお、当方びんぼーなため、Oracleとかの有料なのは、買えません。。。
569 :
デフォルトの名無しさん :02/11/15 12:18
すいません、質問です。 SQL Server 2000 において データ変換サービスを使ってDBの内容をcsvファイルに書き出すことができますが その際、スケジュール設定で実行のタイミングを時間で設定することはできるのですが、 DBが変更、追加されたタイミングでcsvファイルに書き出すように設定できないでしょうか?
解決しました。 お騒がせさまでした。
>>568 どのSQLが...って事なら、
それぞれ方言みたいのがあるものの
どれが一番良いってのないっす
覚えて仕事にするって観点から考えると
ORACLEは、いろいろなOSや開発言語で
使えるため、一番柔軟だと思うっす
SQL鯖&MSDEは、やはりWinとVisual製品に
なってしまいがちです
悪くはないが...以下自粛
PostgreSQLやMySQLは、
フリー=安い=開発費削減=短期間
って事で、以外と厳しいかも
なにか覚えてからの方が良いと思うっす
まるほど、ありがとうございます。 皆さんの意見をさんこうに、ひとおおり、 Oracle体験版も含めて、かいつまんでみたいと思います、
WindowsNt上でSQL Server7.0を利用しているのですが、 誤ってローカルのアドミニストレーターの権限を全て 外していまい、DBに対して何もできなくなってしまいました。 こういった場合、どのようにすればアドミニストレータに権限を復活 できるのでしょうか? 既に作成済みであったユーザには特殊な権限は付加してなかったので ログインユーザを変えてもダメでした。 リモート操作するソフトがあるようなのですが、 そのソフトでSAというアカウントでログインし、アドミンを復活するという 手もあるようですが、どのソフトを使えばよいのかわかりません。 また、その他に簡単にアドミンに権限を復活させる方法がありましたら、 ご教授お願いします。
やったー java上でJDBC接続してACCESSのデータをオラクルのPL/SQL みたいに表示できるクラス作ったぜ! ACCESSなのにdescも可能。 でも見せてやらない。
>>575 descか、昔やりたかったんだけど、なんかできなかったような。。
JDBC2.0でスキーマ定義を取り出すのってどうやってやるの?
レコードがあるかどうかは rs.EOFがtrueかfalseかでわかるんですけど、 ある名前のテーブルがあるかどうかを確かめる命令はあるでしょうか? VBでもなんでもいいですのでお願いします。
>577 っつーかDBは何だよw
>577 しすてむてーぶるからせれくとしる
Access+VB6です。 システムテーブルについてはよく知りません。
Exist("TABLENAME") というような関数があると仮定して、 その名前のテーブルが存在すればTrueが帰ってくるとたすかります。
select * from TABLENAME を実行してエラーが返ってきたらそういう名前のテーブルは無いと判断する という裏技も考えました。
システムテーブルを使う方法は想像もつきません。
DAOならTabledefsをブン回せ。 つーかこんなFAQ、探せば幾らでも出てくるだろうに。
>>575 そりゃ、すごいクラスを
作ったな!!
>>576 DatabaseMetaData
インターフェースを使うだけだ。
アフォでもできる。
なるほろ
別の質問ですけど、 ADOを使ったアプリケーションをユーザに配布すると、 ユーザがわざわざコントロールパネルのODBCの設定をしなければなりません。 このODBCの設定を自動でおこなうプログラムの作成は可能でしょうか?
>587 可能だが、その前に「接続文字列」を調べれ。 つぅか、君の会社ではいつもそんな糞な配布の仕方してるのか?
相手の会社にわざわざいってサーバをいじるということをやってます。 接続文字列しらべてみます。
>>577 せっかくだから、OLE DB プロバイダというのも検索してみな。
ADO 使うんだったら ODBC はポイしなさい。
精進します。
592 :
デフォルトの名無しさん :02/11/20 05:43
DBはポスグレでの質問です。 TABLE_AのFIELD1 --------------- (・∀・) (・∀・)ホー (・∀・)カエレ TABLE_BのFIELD2 --------------- AAA(・∀・)AAA AAA(・∀・)AAA AAA(・∀・)AAA AAA(・∀・)ホーAAA AAA(・∀・)カエレAAA これで結果が ------------------------ (・∀・) 3レコード (・∀・)ホー 1レコード (・∀・)カエレ 1レコード って結果を得るには、どうSQLを書けば良いのでしょうか。
593 :
デフォルトの名無しさん :02/11/20 07:22
Aを取り除いて、GROUP BYして、COUNTしろ
594 :
デフォルトの名無しさん :02/11/20 10:51
ORACLEなんですけど、 テーブル作成するときに 重複ありのキー設定をしたいんだけど クリエイト文の後ろに PRIMARY KEY(項目A) をつけたせばいいだけなんでしょうか?
595 :
やっぱり最高 :02/11/20 12:07
467 名前:コスモス 投稿日:02/11/20 11:46 理由その2: SQLが嫌いです。(というかSQLの存在意義って?) SQLというのはRDBを扱うための専用言語のようなものですよね。 さらに埋め込みSQLというものまであります。 埋め込みSQLはCやVBなどのプログラム中にSQL文を直接書けて、しかも変数 にselectの結果を代入したりできるという、話だけ聞くと非常に便利そうな機能に 見えます。 機能というよりメタ言語ですね。(笑) その埋め込みSQLですが、はっきり言って設計した人の神経を見たいです。 そもそもSQL自体まるでナンセンスな言語だと思っていましたが、埋め込みSQL はさらに輪をかけて。。。 ちょっと凝ったことをしようと思うとすぐ壁にぶち当たります。 誰が考えたか知りませんが、「お願いです。今後2度とプログラミング言語を設計 しないでください。世のため人のために。」(大笑)
>>595 面白いのみつけてきたね。
SQLみたいなリレーションのシステムがないとDBからデータ選ぶ時
大変だと思うんだがなぁ・・・・・・・・・・・
一枚一枚独立した表じゃ、昔の紙ベースでファイリングしたデータと全くかわらん。
埋め込みだって値が変わったら自動にSQL文発行してくれて便利だと思うんだけどなぁ
他人事だからどうでもいいけど。
>>595 なんだかんだ言って世の中こういう人の方がおおいからな。
未だに年間の顧客データとかを紙に書いて棚いっぱいに入れてあるところがたくさんだ。
世の中そんなもんだ。
直接SQL書かなきゃいいだけの話なのになぁ。
599 :
デフォルトの名無しさん :02/11/20 13:19
神経なんか顕微鏡を使って見ても、みんな同じだよ(w
>>595 コピペにマジレスするのもなんだが、自分が理解できない、使いこなせない
ものを否定する香具師って、貧しい心の持ち主だね。
(ある意味、日本人的か)
# むかし、ピカソをダメ呼ばわりしたバカ教師がいたとか・・・。
>>600 でもそんなバカ教師でも、ピカソが分からないのに
分かったふりしてるヤシよりは正直な分だけマシという罠。
602 :
デフォルトの名無しさん :02/11/20 14:30
>595のコピペって、「何と比べて」SQLがダメって言ってるんでしょうか? 私の場合、スタート時点からデータベース≒SQLっていう状況なのでよくわかんないのですが。
http://pc.2ch.net/test/read.cgi/bsoft/966240993/より 472 名前:コスモス 投稿日:02/11/20 12:01
まとめ:
Oracle以外データベース製品はたくさんあります。
にもかかわらずなぜみんなOracleなのか?
Informix、DB2などなど。あ、SQL Serverは論外ですよ。(笑)
なぜこれらの製品はそんなにシェアがないのか?
最近思うのは、もしかしたらこれらの製品はOracleよりももっとひどいのかも
しれないと。。。(涙)
データベース業界ではOracleが一番使いやすく性能も出る製品なのだと思い
ます。
データベース業界はまだまだ未成熟な業界だと思います。
これを読んで、「そんなことないよ。Oracleっていいデータベースだよ」と思った
あなたは、Oracleに洗脳されているだけではないでしょうか。
ピカソだって素描画を見れば、すごさは素直に理解できるはず。
いちいち特殊文字をエスケープさせるとこ以外はSQLはべんりだっちゅーに
>>603 凄い世界の住人ですね。
こういう人はストアドを書くどころかDOSコマンドすらもいじれないでしょうな。
607 :
デフォルトの名無しさんデフォルトの名無しさん :02/11/20 20:36
下記のようなテーブルがあったとします。 テーブル1 ID|機種名 1 2ch 2 ふたば テーブル2 ID|枝番|台数|種類ID 1 1 10 2 1 2 20 3 2 1 10 2 2 2 30 4 2 3 40 1 このとき、 ID|機種名|台数1|種類ID1|台数2|種類ID2|台数3|種類ID3 1 2ch 10 2 20 3 0 0 2 ふたば 10 2 30 4 40 1 というようにテーブルを結合してデータを一度で取り出せるSQL文はどう書けばいいのでしょうか?
書き忘れましたが、DBはOracle 8.1.6i OSはWindowsです。
609 :
デフォルトの名無しさん :02/11/20 20:56
>>607 SELECT
T1.ID,
T1.機種名,
T2-1.台数 AS 台数1,
T2-1.機種ID AS 機種ID1,
T2-2.台数 AS 台数2,
T2-2.機種ID AS 機種ID2,
T2-3.台数 AS 台数3,
T2-3.機種ID AS 機種ID3
FROM
テーブル1 AS T1,
(SELECT ID,台数,種類ID テーブル2 WHERE 枝番 = 1) AS T2-1,
(SELECT ID,台数,種類ID テーブル2 WHERE 枝番 = 2) AS T2-2,
(SELECT ID,台数,種類ID テーブル2 WHERE 枝番 = 3) AS T2-3
WHERE
T1.ID = T2-1.ID (+)
AND T1.ID = T2-2.ID (+)
AND T1.ID = T2-3.ID (+)
for ORACLE 未検証
たぶん行くと思うけど。
ちなみに環境ぐらい書こうね
>>609 神!ありがとうございました!!明日会社で試してみます。
ところで、初歩的なことかもしれませんが(+)はどういう意味でしょうか?
へそって、繋がりがあるってことですか? 「(+) SQL」や「SQL へそ」でググッても情報が見つからない。。。
613 :
デフォルトの名無しさん :02/11/20 21:42
SQLとはちょっと違うと思いますが質問させてください。 VB+oo4oでDBアプリを開発していますが、SQL文を発行する関数では、 読み込みでも書き込みでも必ず下記の処理を行っています。 書き込みはともかく、読み込みでトランザクションの開始・終了、 コミットは意味ないですよね? トランザクション開始 OraDynasetの作成 〜処理 Close Dynaset Commit トランザクション終了
>>614 ありました!へそ。勉強してきます。Thx!
内容と全然関係ないけど、
>>607 を読むと、等幅フォントでPREタグ付きなら読みやすいのに、と思う。
(2ちゃんねるは、投稿文書にタグが使えないのがちょっと不便)
617 :
デフォルトの名無しさん :02/11/20 23:31
テーブルにインデックスが存在するのかどうかを知るにはどうするのでしょうか?
>>611 へ?そ うなんだ?! (チト苦しい)
>>614 外部結合と臍と何の関係が・・・?
(とトボケてみるテスト)
>617 しすてむてーぶるからせれくとしる
現状SQL:SELECT ID FROM TABLE_A WHERE ID IN (SELECT ID FROM TABLE_B WHER NAME = 'HOGE') OR ID = '99999999'; このSQLを最大速度で結果を取得できるよう変更したいのですが、どのようにすればよいでしょうか? 環境はSQLSERVERです。
622 :
デフォルトの名無しさん :02/11/21 16:52
から揚げ
>>621 普通に考えたら別の方法も、これしか無いべ
SELECT a.ID FROM TABLE_A a, TABLE_B b
WHERE (a.ID = b.ID AND b.NAME = 'HOGE')
OR a.ID = ''99999999'
当然インデックスは張ってるよだろうし
実行計画(測定プラン)をして見るとよろし
>>623 ありがとうございます。それもやってみます。
現在の最高速は
SELECT ID FROM TABLE_A WHERE ID IN (SELECT '99999999' UNION SELECT ID FROM TABLE_B WHER NAME = 'HOGE');
です。
しかし、データの件数などによって変わるものなんですね。
>>624 このパターンは、INの中の件数が増えれば増えるほど
遅くなると思うなぁ?
JOINする方が、キャッシュが効けば早くなりそうな?
(あくまでも予想)
>>625 一応INの中の件数は1,2件の予定です。
627 :
デフォルトの名無しさん :02/11/22 23:58
PL/SQLの初心者なんですがよい参考書を 教えていただけないでしょうか? お願いします
なんか香具師が多いな・・・
630 :
デフォルトの名無しさん :02/11/23 18:12
全テーブルの全カラムを対象に文字列を検索したいんですが どんなSQLになりますか?
631 :
デフォルトの名無しさん :02/11/23 18:20
>>630 のように、実行環境も使用DBMS製品名も書かず、質問内容も具体的でないのに
的確なコメントが付くと思ってるDQNの脳細胞はどんな構造なのか調べたいのですが、
どんなSQLになりますか?
環境は下記の通りです。
CPU : Panchium 20 60GHz
OS : Windos Z SP-12
メモリ : 32GB
DBMS : Micr○s○ft DQN Server 2002 SP10
>>632 DROP DQN;
Commit;
-- DQNは逝ってよし。(-_-;
SELECT文はなんでカラム(SELECT)から書くのか? テーブル(FROM)から書くのが論理的で、 認識しやすいと思うのだが...
635 :
デフォルトの名無しさん :02/11/23 20:57
>>634 > SELECT文はなんでカラム(SELECT)から書くのか?
> テーブル(FROM)から書くのが論理的で、
> 認識しやすいと思うのだが...
先頭の字句だけで「選択」、「更新」、「追加」、「削除」の種別が
判別できるので、人間にも構文解析機にも優しい作りだと思うが。
確かに日本人からみたら、テーブルから書いた方が
分かりやすいかもしれん。
頭では、どのテーブルのどのカラムかって考えるよなぁ。
コードを見るときFROMのテーブルから見るときもある。
英語が元だから
テーブルにあるリンゴじゃなく
apples on the table
といっしょだろ。
まぁ、そういうものの見方はずっと
持ち続けてくれ。
>>636 はあまり理由になってないな。
>>637 >確かに日本人からみたら
また私は外国人ですと言いたげな妙な日本人が現れた。
639 :
デフォルトの名無しさん :02/11/23 21:25
おぃおぃ、
>>638 >>637 の文面からどこから
そんな解釈ができるんだ?
>確かに日本人からみたらって
確かに(オレ等)日本人からみたら
ってことだろ。
きちんとよぬ!
あとそういうものの見方とはっていうのは
常に些細なことでも疑問を持ちながら
いけということだ。
この業界は知ったかが多すぎるからな。
あー漏れも、そう思ったことある。 特にエイリアス切った時なんか、 FROM句から書くこともある。 やっぱ日本人だからかなぁ。
即レスども!
そうだよな、漏れ以外にそう思っている
香具師がいて良かったよ。
>>643 禿胴!!
638=640=642
だろ。ちゃちいれられた
だけで、ワンパタ-ソな返し、
見苦しいな。
>>637 確かに日本人からみたら、テーブルから書いた方が(私は日本人を超越したプログラマだからそうでもないがまぁお前らパンピーには)分かりやすいかもしれん。
それが4GLってもんだよ。
この件に関しては日本人も外国人も関係ないだろ・・・
日本人じゃなくても、テーブルから
書いた方が分かりやすいんじゃないか?
>>643 の言うとおり、テーブルのエイリアス
が先にきて、後で宣言するなんて読みにくいし
書きにくい。
ベタだがSELECT FROMじゃなく
SELECT TABLE *** COLUMNS ***
の方が直感的な気がする。
こればっかりは、しょうがないし
ここでほざいていても仕方がないことだが。
SQLは単一のテーブルからselectするだけじゃないから
>>649 はちょっと無理がありそうな
気分的には今のままでいいんだが、特に根拠はないな
>>650 いや、現在の構文をひっくり返しただけ。
SELECT
TABLES emp e,sales s
COLUMNS s.code ,e.name
WHERE s.id = e.id
SQL92の書き方でもTABLESにいれればいい。
>>1-650 データ操作言語を記述することなく、脳内の思考通りに動作する、"デムパ Driven Database"が
実現できたら便利だと思うんだが、どうよ。
FROM句以降が共通でコピるって観点からは 現状の構文は扱いやすいのだが?
654 :
デフォルトの名無しさん :02/11/24 03:02
以下のテーブルがあるとします。 ID|項目1|項目2|項目3 001 0 0 0 001 1 0 0 002 0 0 0 002 0 0 0 003 0 0 1 oracle8iにて以下の条件で抽出するにはどのようなSQLでしょうか? ・項目がすべて0のIDを抽出する。 ・ID=001は、項目1が'1'のレコードもあるので抽出しない。 ・ID=002は、1レコードだけ(重複せずに)抽出する。 以上、なにかしらヒントでもいいんでよろしくお願いします。。
>>654 ・項目がすべて0のIDを抽出する。
・ID=001は、項目1が'1'のレコードもあるので抽出しない。
create view 〜 where (item1 = 0) and (item2 = 0) and (item3 = 0) and (NOT ID = '001')
・ID=002は、1レコードだけ(重複せずに)抽出する。
view に対して DISTINCT
“そもそもが糞な SQL に対する不満”は置いとこうや。
SELECT ID FROM テーブル WHERE MAX(項目1)=0 AND <中略> GROUP BY ID
>>1-657 SQLを満足に使いこなせないヴァカどもが傷を舐め合うスレはここですか?
>>658 まぁ、全然理解出来なかった君よりは幾分ましだと思うぞ。
>>659 ウワーン、煽りに煽りで返された (泣)
逆ギレしてもいいでちゅか?
>>661 > つまり、「DISTINCT 使うのはクソ」ということでよろしいか?
んなこたぁ、誰も言ってねえぞ、ゴルァ!
盛り上がってるところに厨Qすみません。
>>657 のようにhavingでなくwhere句で書くのは普通のことなんでしょうか?
ちょっと遅いが... >642の続きだったから >643の「エイリアス」を「エイリアン」と 読んでしまった俺を許してくれ。
>663 集計前のデータに対する条件付けはWHERE句 集計後のデータに対する条件付けはHAVING句 だから>657はHAVING句が正解
>>665 ご教示ありがとうございます。
スレが止まってドキドキしました。
667 :
デフォルトの名無しさん :02/11/24 23:04
TABLE<権限> ユーザーID 機能名 権限レベル TABLE<ユーザー> ユーザーID グループID TABLE<権限グループ> グループID 機能名 権限レベル こういう3つのテーブルがあって、 <権限グループ>が更新されたら、<権限>も更新するというトリガーを作りたいんだが、 おまいら誰か教えてください。削除と挿入はできたんだが...
UPDATEすりゃいいじゃん
>25 一番お気楽に使い始めることが出来るのはVBAじゃないかと思う。
誤爆スマソ
671 :
デフォルトの名無しさん :02/11/25 11:28
SQL鯖にはオラクルのSQL*Plusみたいなコンソールは無いのでしょうか? 作ったSQLを試しに流してみたいときなんかに使いたいのですが・・・。 ちなみにSQL鯖は6.5でつ。(藁
一定時間で別PCのDBへバックアップ取りたいのだが… どうすればいいんだ 使用環境 (PC2台に同じテーブル構成の)MySQLとperl perlの方は、kore.plです(爆死
>>672 それってSQL鯖のCD-ROMに入っているですよね?
開発環境がWin2000WSなんですが、問題なくインスコできるでしょうか?
>674 クライアントツールって位だから、できまふ。
>>675 さっき、6.5のCD-ROM取ってきて入れようとしたんですが、Win2KじゃSetup実行できないよ〜んって
言われますた。(ショボーン
6.5の場合、SQLのコンソールはISQL/Wですよね?
しかたないので、VS6DevのCD-ROMを見てるですが、同じようなのは見つけられませんですた。
VS6Dev付属のBackOffice2000のCDもセトウプ起動したらいきなり全部インスコしようとしてくるし・・・。
必要なのはSQLのコンソールとエンタープライズマネージャーぐらいなんだが・・・。
クライアントツールはどこにはいっとんじゃ?
CDがいっぱいありすぎてさっぱり判らんぞ。ゴルァ>MS
677 :
デフォルトの名無しさん :02/11/25 15:10
ほんのりとスレ違いっぽいのですが、たすけてください。 DOSから「SQLPLUS SCOTT/TIGER@TNSN @FILE=D:\TEST.SQL」 とやると、コネクトしてファイルからSQLを実行しますが、 「SQLを実行して終了」という起動オプションみたいなものはありますか? 一応、実行されるファイルに「EXIT」コマンドを入れておくと ファイルを実行後に終了するのですが、 実行したSQLが正常に終わったかどうかが判定できません。 そもそもSQLPLUS.EXE自体の復帰値?は「0」しかないのですかね。
また400ですか?
>>671 Microsoft Query は?Office2000が入っていれば入ってると思う。
Office直下の MSQRY32.EXE
win2k+SQLサーバでやったことは無いけど、
win2k+Symfoでも動いたからダイジョブそうな気がする。
ただ、難解なSQLとかはダメだったりした記憶が。
>>679 レスありがと。
> Office直下の MSQRY32.EXE
たしかにこれ動くんだけど、これってAccessのコンポーネントで動いてない?
変なクエリウィンドウや接続にDSN聞いてくる辺り、もろそれっぽいんですが・・・。
できればISQLみたいにSQL鯖とネイティブ(と言えばいいのかな?)な接続をする方がいいんですけど。
あったあった。 BackOffの2枚目CDにSQL鯖があって、その中のセトウp起動したら見覚えのある ダイアログが出たYO。 あ〜、コンソールの用意だけで半日潰しちまった。(鬱
>>671 osqlとかisqlとかがSQL鯖のフォルダにあるよ
コマンドラインから使う
683 :
デフォルトの名無しさん :02/11/26 19:05
初歩的な質問かとは思いますが教えてください。 テーブルA,テーブルBがあり、 BはAのバックアップとして存在します。 AをupdateするたびにBへ同じ内容をinsertしています。 BはAのカラム+insertされた日付もキーに持っています。 BのデータをAに戻すSQLを教えていただけないでしょうか。 一度にではなく、1件指定で戻したいのです。 よろしくお願いします。
BのデータでAのデータをUPDATEすりゃええだけやん・・・
(´-`).。oO(戻す方法も分からないのに良くバックアップなんて言えるよな・・・)
>>683 結合キーでJOINして
指定したい1件を条件式に入れて
ほか全ての項目をセットすりゃいいだけじゃん!
あと質問するときはデータベースの書けちゅーに
方言があって違うときがあるから
>683 insert into A select 列名 from b where 入れたい条件 でいいんじゃないの
>>687 duplicate records on key error...
>>688 普通ばくあぷから戻すときってデータは空じゃないの?
キーがかぶるならexistでかぶるもの省けばいいだろ
Now I can't type Japanese charactor.
I don't know
>>683 's environmet.
But READ this thoroughly.
>>683 wants rollback by 1 record.
TABLE A is not empty.
I can't understand your saying...
'He shuold escape duplicate error by exist word.'
It's no meant with this way.
As writing
>>686 if using MSSQL
upate A
set A.col1 = b.col1,
....
from A,B
where A.KEY=B.KEY AND
B.KEY= 'VALUE' AND
B.UPDATE_DATE = 'YYYY/MM/DD'
If using Oracle,Oracle can't use FROM in UPDATE.
So you only have way of deviding this SQL to
SELECT ... INTO ... FROM B
WHERE B.KEY= 'VALUE' AND
B.UPDATE_DATE = 'YYYY/MM/DD'
and
UPDATE A ... .
...same above WHERE words.
in a program code.
>>690 tyu-ka, ro-maji de uteba iinnja?
>>691 ninnja ha nannninnja?
693 :
デフォルトの名無しさん :02/11/28 23:48
class | test | name --------------- A | 30 | mona A | 40 | sii B | 50 | giko B | 30 | dqn というテーブルがあるとして、 classの中でtestを降順で順位付けして class | test | rank ----- A | 30 | 2 A | 40 | 1 B | 50 | 1 B | 30 | 2 みたいな結果を出し、最終的に、classでrankが2の monaとdqnを取り出したいわけですが、こういうの可能ですか? ちなみにpostgresでoracleのような分析functionはなしです。
ちなみにrankなしで、 gourp byと、limit 1 offset 1(2番目を取り出す) を用いてできないかなーと考えているのですが、、、
>>693 ちなみに同点の場合はどうする?
同順をつけるとかは無理っすよ
あまり深く考えない第一印象では
PG側でループしながらやるかな
>695 同点は特別に今回は考えなくてもよい状況なんす。 PG側でループしながらというのは?どういうことですか?
わぁぁーん(;´д⊂) 無理っすか?
>>693 SELECT *
FROM ( SELECT B.CLASS, B.NAME, B.TEST
, ( SELECT COUNT(TEST) + 1
FROM テーブル A
WHERE A.TEST > B.TEST
AND A.CLASS = B.CLASS ) AS "LANK"
FROM テーブル B
) RESULT
WHERE RESULT.LANK = 2
ちなみに、oracleだとこんな感じでもできる(もっといい方法があるような気も)
postgresうんぬんはよくわからん。スマソ
ただ、データ多いとかえってこないかも。
おお! そんなoracleの分析rank() orverとか使ってるわけでも ないので、postgresでもできるかも。 これからちょっち実データ作ってトレースしてみます。
> AND A.CLASS = B.CLASS ) AS "LANK" うっ・・ LANK
create table test2( "class" text, "test" int4, "name" text ); insert into test2 values('A',30,'mona'); insert into test2 values('A',40,'sii'); insert into test2 values('B',50,'giko'); insert into test2 values('B',30,'dqn'); SELECT * FROM (SELECT B.class, B.name, B.test, (SELECT COUNT(test) + 1 FROM test2 A WHERE A.test > B.test AND A.class = B.class ) AS "rank" FROM test2 B ) res WHERE res.rank = 2
おおおーーーーーーーーーすげぇ。ほんとだ... sql for smartiesでrankができるってのは見たことあったけど、 rank() orver(partition by A order by A) 相当もできるのかー ちなみに、 insert into test2 values('A',40,'hiroyuki'); 入れても、 SELECT * FROM (SELECT B.class, B.name, B.test, (SELECT count(distinct(test)) + 1 FROM test2 A WHERE A.test >= B.test AND A.class = B.class ) AS "rank" FROM test2 B ) res WHERE res.rank = 2 こうすればできる〜〜〜ヽ( ・∀・)ノ
こんなシンプルにできたとは、、、 698さん頭いいっすね。THX!!!
せっかくなので、整形してはっときまふ。 SELECT * FROM (SELECT B.class, B.name, B.test, (SELECT count(distinct(test)) + 1 FROM test2 A WHERE A.test >= B.test AND A.class = B.class ) AS "rank" FROM test2 B ) res WHERE res.rank = 2
あれ、、、(;´ω`) SELECT * FROM (SELECT B.class, B.name, B.test, (SELECT count(distinct(test)) + 1 FROM test2 A WHERE A.test >= B.test AND A.class = B.class ) AS "rank" FROM test2 B ) res WHERE res.rank = 2
データに、カブりがなきゃdistinctはいらなくて、698さんのでいけまふ。
>692 今頃、藁田YO!! ところで、 >795のやつなんすけど、 >693のテーブルがsqlで取り出したリレーションだと してどうsql書けばよいんでしょうか?
なんとなく、、、こんな感じかとやってるんですが。 SELECT * FROM test2 as Q WHERE Q.name in (SELECT res.name FROM (SELECT B.class, B.name, B.test, (SELECT count(test) + 1 FROM test2 A WHERE A.name = Q.name AND A.test > B.test AND A.class = B.class ) AS "rank" FROM test2 B WHERE B.name = Q.name ) res WHERE res.rank = 2 )
補足すると、nameをprimary keyとして、 >693はテーブルtest2から取り出したリレーションでQとしています。
考えてたらあたまが痛くなった(笑 散歩逝ってきます...と思ってちょっと考えたら、導けた。 SELECT res.id FROM (SELECT _xn.id, (SELECT count(__xn.id) + 1 FROM xml_node __xn, xml_path __xp WHERE __xn.id = __xp.ref_node AND __xn.id = qqq.id AND __xn.document = _xn.document AND _int_to_numstr(_xp.d_order) > _int_to_numstr(__xp.d_order) ) AS "rank" FROM xml_node _xn, xml_path _xp WHERE _xn.id = _xp.ref_node AND _xn.id = qqq.id ) res WHERE res.rank = 2
間違えた。スレ汚してスマソ。 SELECT * FROM test2 as Q WHERE Q.name in (SELECT res.name FROM (SELECT B.class, B.name, B.test, (SELECT count(test) + 1 FROM test2 A WHERE A.test > B.test AND A.class = B.class ) AS "rank" FROM test2 B ) res WHERE res.rank = 2 and res.name = Q.name )
あれ、、、やっぱ駄目っすねー。 subqueryではできないか。。。(書きすぎでスマソ
713 :
デフォルトの名無しさん :02/12/02 15:06
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ってなんでしょう? シリアライズするのはなんとなくわかるんですけど どの時点からシリアライズされるのでしょう? この文が実行されるとすぐ?
714 :
デフォルトの名無しさん :02/12/02 21:16
716 :
デフォルトの名無しさん :02/12/03 13:59
すみません。質問させてください。 PL/SQLなのですが、あるテーブルのカーソルを作り、 その結果セットから任意のレコード(「n番目」というような)を 取り出したいのですが、これはループしてFETCHさせる以外に 方法はないでしょうか??
717 :
デフォルトの名無しさん :02/12/03 18:21
副問い合わせの問題なんですけど select 部品番号 from 部品 where 色='赤色'; と select 部品番号 from 部品 where 重さ=100; をそれぞれ単独で実行させた場合は両方ともちゃんと検索できるのですが、 A・・・ select 部門番号 from 供給 where 部品番号 = (select 部品番号 from 部品 where 色='赤色'); B・・・ select 部門番号 from 供給 where 部品番号 = (select 部品番号 from 部品 where 重さ=100); をそれぞれ実行するとAの方だけエラーになってしまうのですがなぜなんでしょう? だれか教えてください。
718 :
デフォルトの名無しさん :02/12/03 18:28
>>717 select 部品番号 from 部品 where 色='赤色'
でレコードは返ってくるの?
返ってこなきゃエラーになると思うんだけど。
>717 in
select 部品番号 from 部品 where 色='赤色'; の場合レコードは返ってきます。
副問い合わせの結果が複数個だったのでinをつかえばいいのですね。 719さんありがとう
吹く問い合わせの問題なんだからいいんでないの?
>>723 いや、単純に吹く問い合わせについての問題ならいいんだが、
>>717 がやりたいことに吹く問い合わせが本当に必要なのかとちょっと思ったんでね。
725 :
デフォルトの名無しさん :02/12/04 21:55
業者(業者番号、住所) 部品(部品番号、色) 供給(部門番号、部品番号、業者番号) というデータベースがあったとして、 東京の業者から赤色の部品が供給されている部門の番号を求めるという問題 なんですけど、 select 部門番号 from 供給 where 業者番号 in (select 業者番号 from 業者 where 住所='東京' and 業者番号 in (select 業者番号 from 供給 where 部品番号 in (select 部品番号 from 部品 where 色='赤色'))); このSQL文は間違っているんですか?
726 :
デフォルトの名無しさん :02/12/04 22:22
>>716 8i以降ならできるよ。
サブクエリにOrder by使ってRownum擬似列を利用しましょう。
select rownum , サブクエリの選択列
from (select XXX from TTT)
これをさらにサブクエリにして固定項目になったRownumをwhere句で使えばおっけー。
構文はヘルプ見てがんばり。
727 :
デフォルトの名無しさん :02/12/04 22:38
>>725 間違っちゃいないがまんまだな。アクセスが多すぎるぞ。
俺ならこうする。
select 部門番号
from 供給
where 業者番号 in (select 業者.業者番号
from 業者
where 業者.住所 = "東京")
and 部品番号 in (select 部品.部品番号
from 部品
where 部品.色 = "赤色")
>>725 Access2000 に作らせてみた...
SELECT 供給.部門番号
FROM (業者 INNER JOIN 供給 ON 業者.業者番号 = 供給.業者番号) INNER JOIN 部品 ON 供給.部品番号 = 部品.部品番号
WHERE ((([業者]![住所])='東京') AND (([部品]![色])='赤'));
まあ、データベースになれていないと「まず赤色の部品の番号を求めて、その部品番号を供給している業者を求めて...」と考えたくなる気持ちはよくわかる。
でもその場合でも、
select 部門番号 from 供給
where 部品番号 in (select 部品番号 from 部品 where 色 = '赤')
and 業者番号 in (select 業者番号 from 業者 where 住所 = '東京都');
ぐらいにしとけ。(動作未確認)
>>726 今度8i導入するんですけどまだ今は7です。
8iに移行してからになりますが、やってみます。
ホントにありがとうです。
730 :
デフォルトの名無しさん :02/12/09 00:20
SQLでOR検索ってできますか?
731 :
デフォルトの名無しさん :02/12/09 00:37
供給(部門番号、部品番号、業者番号) というデータベースから どの業者番号からも供給を受けていない部門番号をもとめるにはどうすればいいでしょうか?
not existsを使え
>730 出来ないほうがおかしいと思わない?
734 :
デフォルトの名無しさん :02/12/09 18:38
すみませんが質問です。 とあるテーブルが2つありまして、 A、シーケンス番号(SEQ)、登録日(MDATE) B、シーケンス番号(SEQ)、Aのシーケンス番号(A.SEQ)、登録者(MCD) といった感じになっております。 Aテーブルの情報の詳細をBに置いておくといった感じです。 Aテーブルのレコードと、AがBに参照されている件数をcountでとっていたのですが、 Bテーブルに重複されて入っているデーターも数えてしまって困っています。 重複データーを1件とし、countするにはどうすればいいでしょうか。 select distinct count(mcd) ではだめでした。
>>730 だから、どうしてそういうものの聞き方をする?
やってみたのか?
そんな質問に答えてもらったところで、次は「どうやるの?」って聞くのか?
まず自分でいろいろ検証してみて、それでだめなら具体的に聞け。
なんでテーブル定義もロクに書けないヤツがSQL触ってるんだ?
>>734 distinctした物をcountすれば良し
739 :
デフォルトの名無しさん :02/12/12 16:11
472 名前:コスモス 投稿日:02/11/20 12:01 まとめ: Oracle以外データベース製品はたくさんあります。 にもかかわらずなぜみんなOracleなのか? Informix、DB2などなど。あ、SQL Serverは論外ですよ。(笑) なぜこれらの製品はそんなにシェアがないのか? 最近思うのは、もしかしたらこれらの製品はOracleよりももっとひどいのかも しれないと。。。(涙) データベース業界ではOracleが一番使いやすく性能も出る製品なのだと思い ます。 データベース業界はまだまだ未成熟な業界だと思います。 これを読んで、「そんなことないよ。Oracleっていいデータベースだよ」と思った あなたは、Oracleに洗脳されているだけではないでしょうか。
>739 それもう飽きた
741 :
デフォルトの名無しさん :02/12/12 20:59
Oracleです。 テーブルA ID1 数値・Null不可 ID2 数値・Null不可 FLG 数値・Null可 ※ID1、ID2、FLGで一意です。 ここで、FLGがNullのデータが存在しないID1、ID2 のレコードを取得したいのですが どう書けばいいのでしょうか。 select a.* from a, (select id1,id2 from a where flg is null)b where a.id1=b.id1 and a.id2=b.id2 で取得できるレコード以外のレコード、て感じです。 よろしくお願いします。
>FLGがNullのデータが存在しないID1、ID2 のレコード よくわかんないけど、 SELECT * FROM A WHERE FLG IS NULL じゃなくて?
select * from A where FLG is not null; じゃだめなのか? >FLGがNullのデータが存在しないID1、ID2 FLGがnullでないレコードだよね。 もっと深い意味かな?
かぶった。
>>743 FLGがNULLのレコードじゃなくて?
>FLGがNullのデータが存在しないID1、ID2 のレコード
↓
FLGがNullの(すなわちFLG)データが存在しない(けど)ID1(と)、ID2(は存在している)レコード
と俺は解釈したが真相はいかに?
って
>>741 の「で取得できるレコード以外のレコード、て感じです。」を詠む限りNOT NULLっぽい。
>>741 > ここで、FLGがNullのデータが存在しないID1、ID2 のレコードを取得したいのですが
^
構文エラーです。
ちょっと余談だけど、Oracleって、 ID1 数値・Null不可 ID2 数値・Null不可 FLG 数値・Null可 ※ID1、ID2、FLGで一意です。 nullも一つのデータとしてのunique index(AK)で プライマリキーとして(外部制約の親テーブルとして) できてしまうから すごいというか、なんでもありというか...
748 :
741です :02/12/13 09:24
みなさんありがとうございます。 わかりにくくてすみません。 ID1 ID2 FLG 1 1 Null 1 1 1 1 1 2 1 2 1 ※ 1 2 2 ※ 1 3 Null 1 3 1 の場合に※のレコードを取得したいのです。
条件が見えん。
750 :
741です :02/12/13 10:37
>>748 で、
ID1=1、ID2=1 及び ID1=1、ID2=3 には FLGがNullのデータがありますが
ID1=1、ID2=2 にはFLGがNullのデータがありません。それを取得したいのです。
select * from A where ID1 not in (select ID1 from A where FLG is not NULL); 違うかな?
select ID1, ID2
SELECT * FROM A AS t1 WHERE not exists ( select * from A where FLG is null and ID1 = t1.ID1 and ID2 = t1.ID2 );
754 :
741です :02/12/13 11:47
>>753 できました!ありがとうございます!
他の方もありがとうございました!
このスレ「困った時に頼りになるスレ」No1です。私的に。
前スレで次スレ立ててと騒いでたのは私です。てなわけでぜひパート3も!
>>753 すげー、きれいだ。感動した。
漏れもそうだけど、
インラインビューをやたら使う
Ora厨は参考にするといいかも。
756 :
デフォルトの名無しさん :02/12/14 02:37
質問です。 商品データで、商品ごとにサイズや色のバリエーションがあるような場合、 どういうテープルを設計するんでしょうか? 現在は、商品.色 に Red,Blue などとして、プログラム側で分解処理して いるのですが、激しく間違っているような気がしてます。かといって、 テーブル商品色 商品ID | 色 2009 | Red 2009 | Blue 0323 | White みたいなテーブルを作るのも効率悪そうです。 とりあえずサイズや色によって、価格など他の要素は変化しないのですが、 どういうテーブルが最適なのでしょうか?
どっかで同じような質問見たな
>>756 何をしたいかによるよ。
色に関した処理をあまりしないなら、プログラム側でやってもいいと思う。
色についていろいろ処理する必要がある (何色が売れてるとか知りたいとかね) なら、色テーブルを持つのがいいんじゃないの ?
>>758 ありがとうございます。
とりあえず今回は現状のままでやってみることにします。
760 :
デフォルトの名無しさん :02/12/15 13:23
oracle8iのSQL文を教えて下さい。 TBL_A.日付には、VARCHAR2で'19950101'と入っています。('YYYYMMDD') TBL_B.日付には、VARCHAR2で'021215'と入っています。('YYMMDD') TBL_A.日付以降の行をTBL_Bから抽出したいのですが、馬鹿な私は。。。 SUBSTR(TBL_A.日付, 3, 6) <= TBL_B.日付 とやってしまいました。 という訳で、どなたかまっとうなコーディング方法を教えてください。 ちなみに10月から、いきなりシステム部門に転属させられた文学部卒です(藁&泣)
TO_DATEしてから比較
762 :
デフォルトの名無しさん :02/12/15 13:50
761さん、ありがとうございます。 TO_DATE(TBL_A.日付) <= TO_DATE(TBL_B.日付) で良いのでしょうか? この場合、95-01-01 <= 02-12-15 となると思うのですが、 大小関係は正しく判断されるのでしょうか?
まずはやってみれ。
764 :
デフォルトの名無しさん :02/12/15 14:05
明日が本番なもので。。。 今日中に解決しないといけないのです。試す環境が自宅にあればいいのですが。。。
何が本番なんだ?
766 :
デフォルトの名無しさん :02/12/15 14:11
担当システムの本番運用開始なのです。(T.T)
ハァ? 明日、リリースなのにこんなこと しとるのか? ネタ+女だろ。
769 :
デフォルトの名無しさん :02/12/15 14:29
762,764,766です。 どなたかマジレスお願いします。m(__)m 初心者にとっては本当に真面目な疑問なのです。日程も本当です。 朝速攻で対処しないといけないのです。
>>769 だったらすぐ会社 or 現地に行って試せよ、ヴォケ。
>>770 そんなにカッカするなよ、便秘か?
女の子だし、簡単だから
もっと遊びたいのだが。
鍵を持っていないから入れません。 こっちは遊びじゃないんです。 教えて下さい!
>>772 上司の携帯に電話して、鍵あけてもらえ。
774 :
デフォルトの名無しさん :02/12/15 14:50
携帯#知りません。
769さん、みんな実はわからないから答えられないんだよ(w 本屋にでも行った方が早いよ。まさか寒いから嫌とか言わんだろうが。
可愛そうだから、777引いたヤシが答えてやろう。
>>775 おまえ、769だろ。
to_dateくらい誰でも知っとるわ。
煽っても無駄だ。
っで、何歳? 最後は教えてやるから、 のってきてちょうだい。
779 :
デフォルトの名無しさん :02/12/15 15:33
おもしろすぎっ!
ちなみに772は質問者とは別人だね。何故かsageになってるもんな。
でもって、漏れはORACLEよくわからんから答えられんw
>>776 999が答えてやれww
また今覗いたが もう、こないのか769。 返事したら教えてやるぞ。 もう分かっちゃったのか?
781 :
デフォルトの名無しさん :02/12/15 16:03
769です。 25才です。本当に教えて下さい。お願いします。m(__)m
なんで、情死すななんかに 入っちゃったの?
「な」が多かった。
784 :
デフォルトの名無しさん :02/12/15 16:10
わかりません。いきなりの異動でしたので。。。 人事はPCが使える→じゃあシステム課へ といった感覚なのでしょう。。。 ホントに寝ててもプログラムが気になります。初心者なので何でもないような事でも 次々と疑問に思い始めると、キリがないのです。ホントに泣いてます。
もういいかな。教えてやるよ TO_DATE(TBL_A.日付,"YYYYMMDD") <= TO_DATE(TBL_B.日付,"YYMMDD") だよ。 他にも女の子いるの?合コンしよ。
786 :
オラクルマスター :02/12/15 16:16
>>785 TO_DATE(TBL_A.日付, 'YYYYMMDD') <= TO_DATE(TBL_B.日付, 'YYMMDD')
だろが!
おっ、シマータ
んで、どこ勤務なの?
789 :
デフォルトの名無しさん :02/12/15 16:20
ありがとうございます。フォーマットを指定すればいいのですね。 最後の疑問ですが、19950101 <= 021215 だと大小関係が逆にはならないのですか?
790 :
デフォルトの名無しさん :02/12/15 16:21
勤務地は都内です。
'021215'は0002/12/15ということなので上手く動きません。
792 :
オラクルマスター :02/12/15 16:23
>>789 日付型は文字型とは違うので比較の書式などありません。
すべて内部的な書式に従います。
789 大丈夫だよ、その為に日付変換してるんだろ。 それより、早くどこ勤務してるの? 都内なんだ。それなら、合コンしよ。 漏れら、別にオタクじゃないよ。
すまん。「早くどこ勤務してるの?」 は抜いてくれ。消し忘れた。
795 :
デフォルトの名無しさん :02/12/15 16:28
792さん、ありがとうございます。 つまり、桁数(特に年)が異なる場合でもTO_DATE関数使用後に比較すればよろしいのですね。 勉強になりました。ということは、791さんは誤りということですよね。
19950101 と 501215 はどっちが大きいのですか?
>>793 クリスマス近いからあせっていますね(w
Y2k(死語だな) のことを言っているようだが、 そんなデータがあるなら テーブル設計をYYYYMMDDにしない 方がおかしい。
799 :
オラクルマスター :02/12/15 16:36
>>795 比較が成功すれば、日付型という一定の形(固定長7バイト)になりますから
そのまま比較できます。
要はどのように変換するかが重要なのです。
'021215'の場合、2002/12/15と1902/12/15のどちらに変換するか間違えなければ
問題ありません。
800 :
オラクルマスター :02/12/15 16:41
↑ 「変換が成功すれば」だった・・・
8iなら大丈夫。
ちゃんと02→2002になる。
>>797 おう、必死だよ
802 :
デフォルトの名無しさん :02/12/15 16:44
793さん、オラクルマスターさん、本当にありがとうございました。
おい、それでおしまいかよ!
>>804 名前を間違えただけか?
合コンしたら教えてやる
にしとけばヨカータ...
しかし、女と分かると速攻で
スレが伸びるな。
CREATE TABLE SalesRegions ( name CHAR(10) NOT NULL, tot_sales DECIMAL(8,2) NOT NULL, region INTEGER NOT NULL ); INSERT INTO SalesRegions VALUES('Able', 100.000, 1); INSERT INTO SalesRegions VALUES('Baker', 900.00, 1); INSERT INTO SalesRegions VALUES('Brown', 900.00, 1); INSERT INTO SalesRegions VALUES('Carey', 700.00, 2); INSERT INTO SalesRegions VALUES('Delta', 600.00, 2); INSERT INTO SalesRegions VALUES('Eddy', 500.00, 2); INSERT INTO SalesRegions VALUES('Fred',900.00, 3); INSERT INTO SalesRegions VALUES('George', 700.00, 3); INSERT INTO SalesRegions VALUES('Herman', 600.00, 3); select * from salesregions; nametot_salesregion Able 100.001 Baker 900.001 Brown 900.001 Carey 700.002 Delta 600.002 Eddy 500.002 Fred 900.003 George 700.003 Herman 600.003
SELECT R1.name, R1.region, R1.tot_sales, count(*) FROM SalesRegions AS R1, SalesRegions AS R2 WHERE R2.tot_sales >= R1.tot_sales AND R1.region = R2.region GROUP BY R1.name, R1.region, R1.tot_sales -- HAVING COUNT(*) = 2 でランキングは出せますが、 From句が結構な処理のSubQueryな場合ってどのようにしたらよいのでしょう?
簡潔にした例ですが、、、 SELECT R1.name, R1.region, R1.tot_sales, count(*) FROM (select * from SalesRegions where region in (1,2)) AS R1, (select * from SalesRegions where region in (1,2)) AS R2 WHERE R2.tot_sales >= R1.tot_sales AND R1.region = R2.region GROUP BY R1.name, R1.region, R1.tot_sales こう同じsubquery二回発行するってのもアレですよね? optimizerに吸収されるのかもしれませんが。 何か上手くやれないもんでしょうか? where句は集約の条件部で変えられないですよねー
ちなみに、DBはPostgresでWith句とかは使えないっす。
>where句は集約の条件部で変えられないですよねー が引っかかるが、 FROM句を SalesRegions AS R1, SalesRegions AS R2 に戻して、 WEHRE句に and R1.region in (1,2) を追加じゃだめなのか? ランキングとは tot_salesのランキングでいいのか? ちょっと、ランキングの条件が見えん。 あと、このテーブルはnameでユニークなのか? from句内のクエリはサブクエリとは 言わず、インラインビューというはず。
>810 なるへそーインラインビューね。覚えますた。 実際はその、インラインビューがもっと複雑で、 where句に書くわけにもいかんのです。>808はイメージで。 nameはprimary keyと考えてよかとです。 条件はrigeonごとのtot_salesのランキングをしたいということです。 Oracleとかだと、こんな感じでしょうか? select ... rank() over (partision by rigeon order by tot_sales)
812 :
デフォルトの名無しさん :02/12/18 10:27
日付項目を持つレコードを月別にグループ化したいのですが どう書けばよいのでしょうか。おねがいします。 Accessです。
>>812 年/月だけの項目でグループ化する
Format([テーブル1]![フィールド1],"yyyy/mm")みたいの。
DateSerialで1日の日付を作っても可
>>812 select format(日付カラム,"yyyy/mm"),sum(数値カラム)
from table
group by format(日付カラム,"yyyy/mm")
816 :
デフォルトの名無しさん :02/12/18 18:53
JavaサーブレットからPL/SQLストアドを呼んで、 結果セットを取得してJavaサーブレットに返す場合 普通はどうやってますか? OUTパラメータにカーソル変数を指定したりできませんよね・・・ うーん、わからない・・・(;´д`)
817 :
デフォルトの名無しさん :02/12/18 21:38
Access2000です。 日ごとのアクセスカウンターを作っています。 よろしくお願いします。 日付時刻型のフィールドを年月日ごとにカウントするのは SELECT FORMAT(日付型のフィールド名,'YYYY/MM/DD'),COUNT(*) FROM テーブル名 GROUP BY FORMAT(日付型のフィールド名,'YYYY/MM/DD') で、できたのですが。 これではデータが入ってる日付以外はカウントすることができません。 データが入ってない日付の場合に 0という結果を返すSQL文を書くことができるのでしょうか? テーブルのデータ名 - 日付時刻型 - 2002/12/01 2002/12/01 2002/12/03 希望する結果 2002/12/01 2 2002/12/02 0 2002/12/03 1
>>817 書き間違いです。失礼しました。
テーブルのデータ名→テーブルのデータ
>>817 SQLの世界において、 存在しないデータからデータを
作ることは神でないと無理だ。
もう一つ、日付データのテーブルを作って
m1
a 日付型
a
2002/12/01
2002/12/02
2002/12/03
t1
a 日付
a
2002/12/01
2002/12/01
2002/12/03
2002/12/03
SELECT a,Count(*) AS cnt
FROM t1
GROUP BY a
ORDER BY a
UNION
SELECT a,0 as cnt
FROM m1
WHERE
NOT EXISTS
(SELECT * FROM t1 WHERE a = m1.a) ;
これが嫌なら、VBAでdateaddで1日ずつ
足して、それについてカウントしてくかだな。
SQLの世界ではなくDBの世界と 言った方がいいかな、まぁ、どっちでもいいけど
>>819 ありがとうございます。
やはり無理ですか。やっとすっきりしました。
日付用のテーブルを作るやり方は思いつきませんでした、このやり方はいいですね、
しかしASP側からSQLを実行するカウンターなので今回はASP側でdateaddして処理しようと思います。
では、また何かありましたらよろしくお願いします。
>>819 すげー、これも感動した。
もしかして
>>753 と同一人物?
このスレマターリしてるし、ホント役に立つ。
データベーススレとは大違いだ。
リレーショナルを忘れるな
<元テーブルAAA> A B C D 101 10 01 00 102 10 01 00 102 10 02 01 102 20 01 00 103 10 01 00 A 伝票番号 B 明細番号 C ID D 削除ID <出力結果> 101 10 01 00 102 20 01 00 103 10 01 00 ABが同一でDに対応したCのレコードをペア取り除いた結果を表示するSQL文を誰か 教えてください。おながいすます。非常に困ってます。
>>825 not exists文の回答レスが続くな。
>>822 そうだよ、同一人物、漏れだよ。
ちなみに合コン誘ったのに逃げられたのも漏れ。
>>802 まだ受け付けてるよ、
もし見ているのならレスしてくれよ。
ホントコピペにでてくるような
PCオタクじゃないからさ。
このスレみてる女の子、合コンしようぜ。
おながいすます。非常に困ってます(ワラ
っでSQLはこれ。
SELECT *
FROM AA AS t1
WHERE
not exists
(select * from AA
where A= t1.A and B = t1.B and C = t1.D )
and
not exists
(select * from AA
where A = t1.A and B = t1.B and D = t1.C)
>>826 うまくいきました。
これで帰れます。昼過ぎから悩んで業務終了後本屋でSQLの本買ってきたのですが
よくわかりませんでした。SQL文を見て、リファレンスと見比べて、ああこういうことだったのか
と今ちょっとわかったような気がします。とてもありがとうございますた。
828 :
デフォルトの名無しさん :02/12/21 15:02
>>816 オラクルは結果セットを戻り値として返せないから
検索系のSPは使えない。
829 :
デフォルトの名無しさん :02/12/22 02:08
以下のようなユーザーIDと金額を収めたテーブルが あります。ユーザーで名寄せして、そのユーザーに 対応する最も大きい金額をだけ抽出したいのです。 お助けください。DBは PostgreSQL 7.2 です。 user_id price 1001 20000 1002 21000 1003 20000 1001 25000 1002 19000 求めたい結果 1001 25000 1002 21000 1003 20000
830 :
デフォルトの名無しさん :02/12/22 04:44
>>829 SELECT user_id,MAX(price) FROM hogehoge GROUP BY user_id
831 :
デフォルトの名無しさん :02/12/22 13:33
SELECTで複数条件指定の仕方がわかりません。 AND検索の対象となるフィールドが「ID」「NAME」「CAR」の場合 IDを指定して検索したい時、NAMEやCARはWHEREに組み込まれないように したいのです。もちろん複数のフィールドを指定して検索する場合もあります。 MS-ACCESSであれば、簡単に出来るのですが、SQLだと?
>>831 > IDを指定して検索したい時、NAMEやCARはWHEREに組み込まれないように
> したいのです。
指定しなけりゃいいと思うけど ?
SELECT * FROM TableName WHERE ID = xxxx; じゃまずいのか ?
> MS-ACCESSであれば、簡単に出来るのですが、SQLだと?
Access に SQL ビューと言うものがあるのは知ってるか ?
833 :
デフォルトの名無しさん :02/12/22 14:08
>>832 どうもすみません。
ただし、NAMEやCARという項目でも検索したいのです。
指定しない場合は IFなどで条件分岐しなければいけませんよね。
例えばNAMEを空欄にした時は、、、
IF NAME Is Null
SELECT * FROM TableName WHERE ID = xxx And CAR = ****
でもこれをやっていったら、条件分岐だらけになってしまって。
AccessではWHERE内にLikeを使ってます。
例)WHERE TableName Like "*" & [検索文字] & "*"
これだと[検索文字]に何もいれなくても、Nullになりません。
SQLではどのようにするのでしょうか?
WHERE NAME Like "'%" & Replace(nz([検索文字],""),"'","''") & "%'"
>>833 その SQL を呼び出す言語がわからんけど...
> IF NAME Is Null
と書いてるから、VB 系だろうと想定すると...
Private Sub AddCondition(ByRef Condition As String, NewCondition As String)
If Condition <> "" Then
Condition = Condition & " AND"
End If
Condition = Condition & NewCondition
End Sub
Dim Condition As String
Condition = ""
If Not ID Is Null Then AddCondition Condition, "ID = '" & ID & "'"
If Not NAME Is Null Then AddCondition Condition, "NAME = '" & NAME & "'"
If Not CAR Is Null Then AddCondition Condition, "CAR = '" & CAR & "'"
として、"SELECT * FROM TableName WHERE " & Condition & ";" を実行すればいいと思う。
> 例)WHERE TableName Like "*" & [検索文字] & "*"
SQL も、Like 演算子持ってる奴が普通だから、これでいいなら同じようにすればいい。
(ただし、ワイルドカードが '*' とは限らないから、使う DBMS のマニュアルなどで確認すること。)
> これだと[検索文字]に何もいれなくても、Nullになりません。
でも、余分なものも拾うわけだが、それはいいんだよね。
836 :
デフォルトの名無しさん :02/12/22 14:37
>>834 ストアドプロシージャ上で記述しようとしたら、ダメでした。
'nz'は関数名として認識されません。 というエラーが出ました。
837 :
デフォルトの名無しさん :02/12/22 14:44
>>835 ありがとうございます。
ストアドで呼び出しています。実際の[検索文字]の部分は @パラメーター名 です。
Access mdb でやると、いとも簡単に出来る今回のケースが
SQL-adp でやると、全然上手くいかない。SQL文をもっと勉強しとけばよかった。
>>837 SQL-Server は使ったことないからわからん。
MS に聞くのが吉。
本当にストアドにする必要があるのか疑問に感じるけど。
840 :
デフォルトの名無しさん :02/12/22 16:10
SQLってなんですか?
842 :
デフォルトの名無しさん :02/12/22 17:55
やっぱりわからん…プロシージャ上で、条件に合わせてWHERE句が増減出来れば よいのだが。 だれか助けてください!
だから
>>838 の言ってること
調べたのか?
exec('SQL文')
で動的SQLがストアドで使用できる。
844 :
デフォルトの名無しさん :02/12/22 18:08
>>843 動的SQL
いろいろ調べましたが、難しい言い回しの記述ばかりで、全然理解できてません。
未だに調査中です。
845 :
デフォルトの名無しさん :02/12/22 18:11
>>843 ちなみにAccessプロジェクト上で作成可能なのでしょうか?
SQLサーバーは参照だけで、触ることが出来ないのですが。
>ストアドプロシージャ上で記述しようとしたら、ダメでした。 ↓↓↓ >SQLサーバーは参照だけで、触ることが出来ないのですが。 言っとること矛盾してないか?
847 :
デフォルトの名無しさん :02/12/22 19:00
>>846 いえ、Acceessプロジェクト上のストアドプロシージャを編集してるんです。
あくまでもクライアントサイドです。
>>830 ありがとうございます。
実は前述のテーブルには、ユニークなIDと日付の情報
(型はTimesamp)も入っていて、本当はそれも抜き出したい
のです。(先に言え、って感じですよね)
つまり、ユーザーで名寄せして、そのユーザーに対応する
最も大きい金額と、その金額の行のIDと日付を抽出したい。
どうかお知恵を。
id user_id price date
1 1001 20000 19:10:00.496575+09
2 1002 21000 19:20:00.496575+09
3 1003 20000 19:30:00.496575+09
4 1001 25000 19:40:00.496575+09
5 1002 19000 19:50:00.496575+09
求めたい結果
4 1001 25000 19:40:00.496575+09
2 1002 21000 19:20:00.496575+09
3 1003 20000 19:30:00.496575+09
(DBはPostgreSQL 7.2)
849 :
デフォルトの名無しさん :02/12/22 19:52
>>846 ストアドはSQL鯖上に組み込むから
サーバ上の話になるんだよ。
CREATE PROCEDURE @id,@car,@name
as
declare @sqlstr varchar(1000)
declare @sql_select varchar(500)
declare @sql_where varchar(500)
set str_select = "select * from table1 "
set @sql_where = ""
if @id is not null
begin
set @id = replace(@id,"'","''")
set @sql_where="where id = '" + @id + "'"
end
if @car is not null
begin
set @car = replace(@car,"'","''")
if @sql_where = ''
begin
@sql_where="where car = '" + @car + "'"
end
else
begin
@sql_where= @sql_where + " and car = '" + @car + "'"
end
end
・・・
set @sqlstr = @sql_select + @sql_where
exec(@sqlstr)
>>850 可変条件の検索プログラムで SQL文を組み立てるときに
最初の条件は where それ以降は and とか if文でひたすら
分岐させてるのって面倒じゃない?
もれは、こうやってベースとなる文に必ず真となる条件を
はじめから付けてしまっている。あとは全部 and でつなぐだけだね。
query = "Select * From table Where (1=1) ";
if(condition1 != null) SQL += " condition1 = " + condition1;
if(condition2 != null) SQL += " condition2 = " + condition2;
if(condition3 != null) SQL += " condition3 = " + condition3;
すまん。肝心の and が抜けてた。 query = "Select * From table Where (1=1) "; if(condition1 != null) SQL += " and condition1 = " + condition1; if(condition2 != null) SQL += " and condition2 = " + condition2; if(condition3 != null) SQL += " and condition3 = " + condition3;
おっ!それいいね。 サンクスコ。
>>851 ここでいう condition1 や condition2 とは何を意味するのでしょうか?
フィールド名?パラメータ名?
>>855 これ以上は自分でがんがりなさい。
ついでに
>>848 SELECT user_id,price,date
FROM table1 t1
where price = (select max(price) from table1 where user_id = t1.user_id)
order by user_id;
>>848 Postgre なら...
select distinct on (user_id) user_id, price, date from table_name order by price;
でいけるかと。
>>850 ありがとうございます。ちょっと感動しました。
こういうのは本だけ読んでても、やっぱ頭がよくないと
できないですね。
>>848 残念ながら以下のようなエラーが表示されました。
SELECT DISTINCT ON expressions must match initial ORDER BY expressions
>>858 多分、distinct on 使用は
エラーメッセージのように行を
特定させないといけないみたいだ。
order by user id, price desk
じゃないかな。
頭は関係ないよ。経験だよ
(知ってるか、知らないかだけ)。
860 :
デフォルトの名無しさん :02/12/22 22:51
たまたまプロシージャーの話が出てたけど、 WHEREのLike条件の時って SELECT * FROM TABLE FieldName Like @パラメータ って出来ますか? なんかワイルドカードで囲えないんですけど。
>>858 > 残念ながら以下のようなエラーが表示されました。
> SELECT DISTINCT ON expressions must match initial ORDER BY expressions
すまん、今手元に動作環境がないのでマニュアル頼りで書いてた。
DBMS の気持ちになってみれば、(ある種) 集約するんだからソートは必要なんだろうね。
(どうせ、distinct on で一行になるんだから、自動でやってくれてもいいと思うけど...。
あと、一言マニュアルにも書いて欲しいぞ。)
select distinct on (user_id) user_id, price, date from table_name order by user_id, price;
で、試してみて。
>>859 >>861 ありがとうございます。
select distinct on (user_id) user_id, price, date from table_name order by user_id, price;
これでOKでした。
どんどん経験を積んでいけるように努めます。
あっ・・・
>>848 で書いた最初の問いかけに抜けていたのですが、
結果は価格の高い順にソートさせたいのです。
>>859 >>861 で挙げられていた「order by user_id, price desc」だと
user_idでソートされてしまい、「order by price desc, user_id」だと
「SELECT DISTINCT ON expressions must match initial ORDER BY expressions」
とエラーが出て、DISTINCTで指定したカラムがORDER BYの最初に来ないと
ダメだぞ、と怒られてしまいます。
この場合は
>>856 のようなやり方しかないのでしょうかね。
864 :
デフォルトの名無しさん :02/12/23 00:24
>>860 SELECT * FROM TABLE FieldName Like '%' + @パラメータ + '%'
>>863 よく考えてみると、distinct on
の仕組みから無理だな。
priceのソート順を優先させると
意味の無いものになってしまう。
>>856 がいいよ。サブクエリ使える
DBMSで全て使用可能な構文だし。
ここはみんな親切ですね。2chじゃないみたいだ。
867 :
デフォルトの名無しさん :02/12/24 12:33
スレ(テーマ)違い気味だが、最近秀和システムから出版された 「SQL逆引き大全」、内容がひど過ぎ。 ざっと読んだだけで、 ・誤植(単純ミス、誤字、脱字等)が4箇所 ・明らかな誤り(著者の知識不足、確認漏れが原因)が10箇所以上 ・誤りではないが、SQLが最適でないものが、10箇所以上 ・誤りとまでは言えないが、解説の不備(Oracle9iでJoinがサポート されている点に言及されていない、等)が複数箇所 この分野の類書は数多いが、今まで見た中で一番ひどい内容。 内容をよく確かめずに購入してしまった俺も悪いが、ちょっと腹が立った ので、晒しage。
>>867 で、どうしろと?
(気持ちはわからないでもないが、ここで怒りをぶちまけられても・・・)
他にSQLスレ無いみたいだからまあ仕方ないのかな
マターリといい感じできてるから あまり無闇にageない方がいいかも。
>>867 吉牛のコピペで書いた方がおもしろかったのに。(w
872 :
デフォルトの名無しさん :02/12/24 19:33
質問です。 > desc test ID1 ID2 VALUE ---------- ---------- ------------------ 1 1 3 2 2 4 3 2 6 というテーブルがあり、このVALUEをnとすると、 ”2^n” という計算を施し、この値をVALUEに入れたい(updateさせたい)のですが、ORACLE8.1.7でどのようにやればいいのでしょうか?つまり、 ID1 ID2 VALUE ---------- ---------- ------------------ 1 1 8 2 2 16 3 2 64 というようにしたいのですが。。。
874 :
IGURO :02/12/25 03:01
ORACLE9iでのUPDATE文について質問させてください。 TAB_A TAB_B X Y L M --- --- 1 9 1 3 2 9 <やりたいこと> 'TAB_A.X'と'TAB_.L'を結合し'TAB_A.Y'列を'TAB_B.M'列の値で更新 'TAB_A.X'に結合する'TAB_.L'の値が存在しないときは'0'を設定 ((*) 'TAB_A.X','TAB_.L'列はプライマリー制約) @ UPDATE TABLE TAB_A TA SET TA.Y = ( SELECT NVL(TB.M,0) FROM TAB_B TB WHERE TA.X = TB.L(+)); A UPDATE TABLE TAB_A TA SET TA.X = ( SELECT TB.M FROM TAB_B TB WHERE TA.X = TB.L) WHERE TA.X IN (SELECT TB.L FROM TAB_B TB WHERE TA.X = TB.L); @のようなSQLを作成したのですが、'TAB_A.Y'のNOT NULL制約に 引っかかってしまいます。 AのSQLで結合可能な列は更新できたので どうやら外部結合ができていないようです。 どうすれば@のようなUPDATEが可能か教えてください。
875 :
IGURO :02/12/25 03:11
<TAB_A> X Y --- 1 9 2 9 <TAB_B> L M --- 1 3 すみませんTBL例が見づらかったので 再度書き込みさしてもらいました。 よろしくお願いします。
877 :
デフォルトの名無しさん :02/12/25 10:26
>>873 ありがとうございます。
ばっちりできました!
>>874-875 SQLServerでは
UPDATE TAB_A
SET Y =
(SELECT ISNULL(TB.M, 0)
FROM TAB_A TA2
LEFT OUTER JOIN TAB_B TB ON TA2.X = TB.L
WHERE TAB_A.X = TA2.X)
でうまくいった。
Olacleでは
UPDATE TABLE TAB_A TA
SET TA.Y = ( SELECT NVL(TB.M,0)
FROM TAB_B TB,TAB_A TA2
WHERE TA2.X = TB.L(+)
AND TA.X = TA2.X);
になるかどうかは知らん。
>>867 その本買ってしまった・・・
どこがどうおかしいのか教えていただけませんか。
スレ違いか・・・
>>879 > その本買ってしまった・・・
> どこがどうおかしいのか教えていただけませんか。
【優先度が高い?箇所のみ抜粋】
■ 012 2つのテーブルを関連付けて表示する (P29)
[Oracle]
SELECT P.PREFNAME, C.CITYNAME
FROM PREF P, CITY C
WHERE P.PREFID = C.PREFID
となっていますが、Oracle 9i では Join がサポートされていますので、SQL Server / Jet と
おなじ構文で問題ないはずです。
(前提条件として、バージョンが明記されていないのが問題だと思います)
019(3つのテーブルを関連付けて表示する)、020(2つのテーブルを関連付けたときに、片方の
テーブルに一致する値がなくても表示する)、021(2つのテーブルを関連付けたときに、最初に
記述したテーブルに一致する値がなくても表示する)も同様です。
■ 054 文字列の右側を特定の文字で埋めて表示する (P72)
[Jet]
「関数RPADもしくは、それにかわる構文は用意されていない」
となっていますが、文字列連結演算子 & 、Left$関数を使用すれば同等の処理が可能です。
055 (文字列の左側を特定の文字で埋めて表示する)についてもほぼ同様です。
(
>>881 に続く)
(
>>880 の続き)
■ 056 数値を四捨五入して表示する (P74)
[Jet]
「関数ROUNDもしくはそれにかわる構文は用意されていない」となっていますが、下記のように、Fix関数を使用して元の値に0.5を加えた値を切り捨てれば、
同等の処理が実現できます。
SELECT Fix(567.89 + 0.5) FROM dual
057についてもほぼ同様です。
■ 058 数値を切り捨てして表示する (P76)
[SQL Server]
「関数TRUNCもしくはそれにかわる構文は用意されていない」となっていますが、下記のように、FLOOR関数を使用すれば同等の処理が可能です。
SELECT FLOOR(567.89) FROM dual
(旧バージョンは確認していませんが、少なくともSQL Server 2000 ではFLOOR関数が
使用可能です)
[Jet]
「関数TRUNCもしくはそれにかわる構文は用意されていない」となっていますが、下記のように、Fix関数を使用すれば同等の処理が可能です。
SELECT Fix(567.89) FROM dual
059についてもほぼ同様です。
(
>>882 へ続く)
(
>>881 の続き)
■ 082 日付の曜日を表示する (P100)
[SQL Server]
「該当関数はサポートされていない」
となっていますが、下記のように、DATENAME関数を使用すれば同等の処理が可能です。
SELECT DATENAME(weekday, UPDATETIME) FROM CUSTOMER
(旧バージョンは確認していませんが、少なくともSQL Server 2000 ではDATENAME関数が
使用可能です)
■ 105 パターンマッチングにおいて条件に一致するレコードを表示する (P127)
「Jetでは記号「%」ではなく、「*」を使っていることに注意してください」
とあり、SQL記述例も「*」となっていますが、ミドルウェアにADOを使用する場合は、「%」を使用
します(ただし、CurrentDb().OpenRecordset メソッド、DoCmd.OpenQuery / RunSQL メソッドの
実行時は、常にDAOの構文解釈で実行されます)ので、解説が不足しています。
163(パターンマッチングにおいて条件に一致するデータのみに更新する)、
178(パターンマッチングにおいて条件に一致するデータを別の表に追加する)、
179(パターンマッチングにおいて条件に一致するデータで新しい表を作成する)についても、
ほぼ同様です。(163 の「データのみに更新」は「データのみを更新」の誤りでは?)
(
>>883 へ続く)
(
>>881 の続き)
■ 164 重複レコードを削除して重複をなくす (P192〜193)
[Jet] ワクの囲い方が不適切。(明らかに誤り)
■ 187 複数テーブルからあるテーブルにすべてを追加する (P218〜219)
「Jetの場合、INSERT INTO〜SELECT文とUNION集合演算子の組み合わせはサポートされていないため、
分けて実行する以外にできません」とありますが、これは誤りで、下記の構文を使用すれば、クエリA
を作成することなく、単独のSQL文で処理可能です。(Jet3.5、4.0で動作確認済み)
INSERT INTO CUSTOMER_OKI_HO
SELECT *
FROM
[SELECT * FROM CUSTOMER WHERE PREFID = '02'
UNION SELECT * FROM CUSTOMER_HOKKAIDO]. AS A
189(複数テーブルからあるテーブルに重複データも含めてすべてを追加する)、
190(複数テーブルからあるテーブルに重複データも含めて新しいテーブルを作成する)についても、
ほぼ同様です。
(
>>883 へ続く)
(
>>883 の続き)
■ 212 あるカラムにNOT NULL制約を付ける (P254)
[Jet]
構文エラーとなり保存も実行もできません。誤りではありませんか?
■ 216 あるテーブルに新しいカラムを追加する (P257)
[Jet]
「ALTER TABLE文はサポートされていない」とありますが、誤りです。(P258の記述と矛盾します。)
下記の構文で可能です。
ALTER TABLE CITY ADD COLUMN ADDRESS LONG NULL
(
>>885 へ続く)
(
>>884 の続き)
この他、解説が不足していると思われる箇所が複数。
Jet のSQLで記述が冗長、または最適ではない(不要なのにFormat関数を使用、DateSerial関数を
使用すべき局面でFormat関数を使用、など)な箇所が多数。
>>883 参照先のポインタ間違えますた。 m(_ _)m
886 :
デフォルトの名無しさん :02/12/25 18:50
SQL忘れたくないので、WindowsXP上で安くのっけることができるやつがあれば使いたいんだけど、なにかお勧めはありません か?ExcelVBAの勉強と一緒にできたらいいかな、と思って。VBAからいろいろクエリーかけたりしたいんです。おながいします。
887 :
デフォルトの名無しさん :02/12/25 19:01
>>886 SQLite + ODBC or MySQL + ODBC がいいよ。
888 :
デフォルトの名無しさん :02/12/25 19:24
>>887 ありがと。SybaseとSunのサーバーとか自分で持てないし。早速製品をウェブで探す。ODBCはもう入ってるからね。
889 :
デフォルトの名無しさん :02/12/25 19:38
>>887 今ちょっとMySQLサイト見てみたんだけど、WindowsXPにのっているODBCじゃダメなの?ここ、自分のODBCも出してるけど。
>>880 〜885
ありがとうございます!!めっちゃ嬉しいです。
早速本に書き込んでこれからの参考にさせていただきます。
なんていいスレッドだ・・・感謝
891 :
デフォルトの名無しさん :02/12/25 21:54
厨房質問ですいません。切羽詰ってます。 会社で俺はVBプログラマとして働いている。ところが、いきなり マイクロソフト・SQLについての小さな仕事が来た。 俺は「SQL???データベースの何かでしょ?」って感じなのだが その小さな仕事を今週中にしなくてはならない。困った・・・。 会社の人に今更聞けないし・・・。 とりあえず、SQLってのはデータベースの何チャラってのはわかった。 そこで質問。いまVBでアプリを作っていて、それは、画面で色々条件を入力したら その条件にあった唯一のExcelシートが立ち上がるようになっている。 ほいでSQLサーバーで「テーブル」って奴を見てみると、Excelシートと同じ内容の データが書き込まれていた。 この「テーブル」ってのはどういう役目をするんでしょ???教えてけろ。
ちなみに画面で入力して、それに対応するExcelシートってのは ちゃんと人が一つ一つ打ち込んで作成しております。
テーブルとはリレーショナルデータベースでデータを格納する倉庫みたいなものです。 倉庫の名前がテーブル名 倉庫の中の品物名がフィールド名 で保存する品物がデータって感じかな。 その倉庫の中身を検索して取り出す命令がSQL。 色々な条件をつけてデータを取り出すことができます。 補足・修正?があればどなたかよろしく。
>>893 有難うございます。
もし可能でしたら教えていただけると有難いのですが・・・。
上記で私が申しましたとおり、Excelシートと全く同じデータが
テーブルに書かれておりました。
この意味は・・・?一般的に当たり前の処理なのでしょうか???
厨房ですみません・・・。田舎在住で本屋にいっても本も何も無いんです・・・。
895 :
デフォルトの名無しさん :02/12/25 22:28
>>891 知ってる範囲で答えます。ぼくも今日XPに乗るSQLに関して世話になったので。
DBサーバー
DB
テーブル
という階層をイメージしてください。
テーブルには、行と列があり、ソートしたり、検索したりできます。
で、レコードというのがあり、その中にはフィールドがあります。
ですから、Excelの階層と対比しようと思えばできますね。
どう?イメージ描けましたか?
MSSQLの仕事するんだったら、ExcelVBAを使ってクエリー(データ抽出要求みたいなもの)
をかけることばっかりだと思うんですけど、SQLっていうスクリプト言語は知ってますか?
select * from XXX.BBBB.CCCC
where
record = "some match"
なんちゃらかんちゃら、です。ぼくも8ヶ月ぐらい全く走らせていないので、かなり忘れましたけど。
失礼、質問内容を間違って解釈してました。 データを入力するのに、アプリでデータベースに入力してエクセルでもまた同じ内容を入力する処理が無駄では? って質問ですか? エクセルのファイルをどういう形で使用されるのか分かりませんが まったく同じ内容を二度入力するのは一般的では無いですね。 また、質問を間違って解釈してる可能性あり・・・
>>896 ええと・・・VBのフォームで作った画面に条件を入力し、
間違いがなければそれに対応した唯一のExcelシートが立ち上がる、
というアプリなんです。
そのExcelシートはちゃんと人が作っているんですよ。
なのに、MS・SQLサーバのテーブルのなかにはExcelシートにあるデータが
ソックリそのまま書き込まれてるんです・・・。
・・・
これって・・・???
898 :
874-875 :02/12/25 23:12
レスありがとうございました。
>>876 別に業務で困ったということでなく
自分では@のSQLで問題ないと思っていたので
それが動かないのがどうも気になってしまったので
>>878 ありがとうございます。
いま家のoracle8iで試してみたら
教えていただいた方法で更新できました
(なぜ家のマシンにそんなものが入っているかは聞かないで)
これから。自分のSQLの問題点について考えてみます。
>>897 確認したいのだが、お前の見てるアプリというのはすでにあるものだよな?
ソースを読んだりできないの?
で、テーブルがなにかというと、Excelのシートの中のデータそのものだな。
アプリの仕様を書き込みから想像すると、
・人が作ったExcelをどこかにおいておく
・検索条件を入れてExcelシートを開くと、DBに中身が書き込まれる
とかじゃないかと。
何でそんなことをしてるんだとか疑問はあるが。
つーか、意味がわからんのなら恥ずかしくても回りに聞けよ。
>>897 本来エクセルシートとして管理しているものだが、
検索用途のためだけにすべての内容をDBに取り込んでいる
故に、897の言っているテーブルの目的は
1、画面入力された条件にマッチするレコードを検索する。
2、そのレコードには元のエクセルファイルのパスが含まれている。
3、エクセルファイルを開く
という事では?
はずしていたらゴメン。
SQLは殆どわからない初心者なのですが、何か良い本ありませんか?
>901 sql for smarties
>>901 本屋もないような僻地(離島?)に住んでいるのですね。
(ご不便なことで・・・)
>902 初心者向けとは言えないと思いますが…… いつかは手に取る本といった所か
905 :
デフォルトの名無しさん :02/12/26 09:17
OracleSQLエキスパートリファレンスbyASCII 高いけど実例が多くて重宝する。 まぁOracle向けといっても普通にSQLは学べます。
>>901 じゃ、おいらはSOFTBANKの「SQLハンドブック」を勧めるよ。
SQL-92, Oracle, SQLServer, Accessに対応してるよ。
ありがとうございます。
SQLハンドブックとOracleSQLエキスパートリファレンスを注文してみました。
>>903 すみません。中身見ても良い本か悪い本かの判断が出来なかったものですから。
908 :
デフォルトの名無しさん :02/12/26 16:02
oracleでシーケンスを使って、レコードが追加されたら自動的にコード番号を 振るようにしたいんですが、やり方がわかりません。 PostgreSQLだとCREATE TABLEの時に DEFAULT nextval('seq_code')とするとできたのですが、 oracleだと、 「ここにはプロシージャ、ファンクション、パッケージ、型は使用できません」 言われました。 プロシージャを作らないとできないのでしょうか?
>>908 シーケンスデータを参照し、
それを新規行の対象カラムにセットする
トリガーを作ってみれ。
>>908 デフォルトの指定はできないけど、Insert文のvalues句に
シーケンス名.nextval
って指定するだけだよ。それでもだめ?
色々有難うございます。 今日は職場からあるサイトでSQLをしこたま勉強しました。 そこで質問。 SQLサーバのテーブルに「ヨーロッパの人口」という名前のテーブルがあったとする。 横に「イギリス、フランス・・・・」とヨーロッパの国の名前がずらりと並んで いて(MS SQLで言えば、灰色のセル)、縦には0歳から106歳までの各年齢の人口が それぞれ総合・男女別に入力されているとする。 そのとき、たとえばVBのアプリでこのデータをExcelに呼び出そうとした場合、 このままだと全ての国の人口が呼び出されてしまうが、VBAを使わずにSQLとVBのみで フランスの人口のみを呼び出すことは可能でしょうか? 解りづらい説明ですがよろしくお願いします。
>911 select イギリス, フランス from ヨーロッパの人口 これでイギリスとフランスの0歳から106歳までの 各年齢の人口が取得できる。 にしてもなんちゅうテーブルレイアウトやまったく。
>>911 分かりづらいと言うより分からねえよ。分かりたくもない気分だけど。
少なくともソフトウェアで飯食ってんならデータ構造くらいキチンと
示せるようになってくれ。 2chと言えども、それだけで質問に対する
回答の質が変わってくるぜ?
>>912 ExcelのワークシートをDBにImportする為だけのテーブルなんじゃないの?
いや、そうであって欲しいと願うばかりだけどね。
そうでなかったら終わってる・・・
>>909 ,910
ありがとうございます。
トリガーってまだ作ったことないので、やってみます。
当面は
>>910 氏の方法でやります。
職場から書き込む小学生がいるのか
>当面は
>>910 氏の方法でやります。
トリガーやれよ・・・
919 :
デフォルトの名無しさん :02/12/27 21:28
Table A Table Bがあり どちらかのテーブルにデータがあればデータを取得したいのですが どのようにしたら良いのでしょうか? Left Join Right Join だと どちらかにあればになってしまいます
920 :
デフォルトの名無しさん :02/12/27 22:36
「どちらかのテーブルにデータがあれば」の部分が微妙です。
どちらかのテーブルにデータがあれば≠どちらかにあれば ?? 多分UNIONでできると思うんだけど、質問がよく分からない。
FULL [OUTER] JOIN
924 :
デフォルトの名無しさん :02/12/28 08:57
919です Full Joinで出来ました。 皆様 ありがとうございました。
Join (結合) に Insert(挿入) か。 SQLってエッチやね。(w
そう考えれば仕事も楽しいね
・・・。
928 :
デフォルトの名無しさん :02/12/29 12:42
929 :
デフォルトの名無しさん :02/12/29 13:03
930 :
デフォルトの名無しさん :02/12/30 12:52
「エスキューエル」なんですか? 「シーケル」なんですか?
>>930 はじめにIBMで設計されたモデルが SEQUEL (シークェル) だそうだ。
その影響からか SQL (エスキューエル) のことも シークェル と
呼ぶ人がいる。・・・が、通ぶってるように見えてカッコ悪いので
普通に エスキューエル と発音することをオススメする。
シークェルなどと発音するお馬鹿さんを見かけたら、
お前、IBM の SEQUEL 使ったことあるんか、と小一時間・・・
Structured English QuEry Language
>>931 欧米では、エスキューエルでは通じないらしいですね。(どこで読んだ話か忘れたけど)
まあ、国内でしか仕事をしない人の方が多いし、外国とやりとりが発生するにしても、会話ではなく、
文書でコミュニケートすることの方が多いだろうから、問題になることは少ないと思いますが。
934 :
デフォルトの名無しさん :02/12/31 01:33
こんばんは。SQLがよくわからないので質問させていただきます。 SELECT文でデータを抽出するとき「nedan」というカラムが 100でありかつ200であるものを選択する場合 SELECT * FROM データベース名 WHERE nedan = "100" and nedan = "200" とすると思うのですが SELECT * FROM データベース名 WHERE nedan = "100" and "200" のようにすることも可能でしょうか? または別の表記方法があるのでしょうか? わかりづらいかもしれませんがよろしくお願いします。
>>934 > こんばんは。SQLがよくわからないので質問させていただきます。
> SELECT文でデータを抽出するとき「nedan」というカラムが
> 100でありかつ200であるものを選択する場合
「かつ」と「または」の区別がついてないとおもわれ(w
まずは日本語の勉強をしましょう。
ちなみに解答例は
SELECT * FROM データベース名 WHERE nedan in ( '100', '200' )
とか
SELECT * FROM データベース名 WHERE nedan = '100' or nedan = '200'
ね♪(nedanが文字列型の場合)
オラクルしか知らんのだけど、"とかでくくるDBもあるんかなぁ?
教科書の例題を丸投げしてるっぽく感じるのは俺だけか?
どうでもいいが >SELECT * FROM データベース名 WHERE ... 個人的には「FROM テーブル名」の方がしっくりくるんだが。 なんかDBのインスタンス名指定してるみたい...。
>>935 DBじゃ無いって話は別にして
SQL文が使えるって事で「アクセス」
>>934 すでに
>>935 氏のコメントがついているが、
左辺 = '100' であり、かつ
左辺 = '200' でもある、ということは論理的にあり得ない。
>>935 Jetでは、シングルクォート、ダブルクォートのどちらも使えます。
(Jetではなく、ミドルウェアの機能かもしれないが・・・?)
自分のPCにアパッチとかPHPとかSQLとか入れたんですけど、サーバーにするにはどうしたらいいのですか?すいませんアフォです。
>>940 (1) 書籍で調べる。
(2) WEBで調べる。
(3) お金払って業者に依頼する。
のどれか。
(環境すら書いていない質問はDQN決定)
934です。みなさん回答ありがとうございました。 今自分はデータ検索プログラミングをしているのですがどうもうまくいかなくて。 適当な検索語を入れて検索した結果からさらに別の語を追加して検索したいのですが どうもうまいアルゴリズムがわかりません。 はじめに検索した結果をどこかに保持しておく必要があるんでしょうかねぇ。 もし手助けしていただけるのなら助言いただけないでしょうか? スレ違いだったらごめんなさい。
あ。名前間違ってますね。
>>942 質問内容が漠然とし過ぎていて、
(1) 使用している開発環境(OS、開発ツール)
(2) 具体的なプログラム内容(ソースコード)
(3) 原状の問題点(どこまでできていて、どこからうまくいかないのか)
が読み取れません。
失礼ながら、ANDとORの意味すら他人に尋ねなければ理解できないようですし、
プログラミングの適性がないように見受けられます。
>>942 単純にJOINか二重ループで出来そうな気もするが?
質問が漠然としているなぁ
サーチエンジンみたいに、ある語で検索して、その結果から更に絞り込みたいって事でそ。 んじゃヒントだけ。 その処理を、コンピュータを使わずにやる時どうするか考えれ。 ハッキリしたら、プログラムなりSQLなりでそれを実現する方法を考えれ。 あと、最低限>944の指摘されてる事は書け。
947 :
SQL92保存会 :03/01/03 21:56
みなさま、明けましておめでとうございます。 早速ですが、SQL Server で PostgreSQL の DISTINCT ON みたいなことを するにはどのような SQL 文を書けばいいのでしょう?よろしくお願いします。
948 :
ひよこ名無しさん :03/01/04 05:05
現在のインスタンス以外のインスタンスの表やビューからSELECTするにはどうしたらいいですか。 たとえばCRDBインスタンスのADAMSユーザからORCLのSCOTTユーザのテーブルEMPをSELECT * したいです。 DBはOracle8iです。
データベースリンク作るしかないだろう create database link unko connect to scott identified by tiger using '接続文字列(tnslsnr.oraで定義しれ)' select * from EMP@unko;
950 :
デフォルトの名無しさん :03/01/05 04:03
どなたか教えてください。 全レコードで、ある一つの項目が重複しているかどうか調べるSQL、 または、重複しているレコードを表示させるSQLってあるでしょうか。 もし重複していなかったら、そのテーブル定義を作り直して 主キーにしたいのです。 どなたかよろしくお願いします。
>または、重複しているレコードを表示させるSQLってあるでしょうか。 ある。 >もし重複していなかったら、そのテーブル定義を作り直して >主キーにしたいのです。 どんな状況だよ。それ。
タコが設計したテーブルの尻ぬぐいじゃん?
>>950 こんなかんじかな オラクルだけど
select
nvl(a, 'NULLだバカ野郎')
, count(nvl(a, 'NULLだバカ野郎'))
from unko
having count(nvl(a, 'NULLだバカ野郎')) > 1
group by a
▲group by a ○group by nvl(a, 'NULLだバカ野郎')
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
>565 もう買った。
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
次スレ厨。
やっぱあれかな、こないだの埼玉の脅迫事件が決定打なんだろうか?
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
963 :
デフォルトの名無しさん :03/01/09 18:41
FK のはり方について教えてください。 テーブル T01, T02 があり、 この2つはスキーマが似ていますが異なります。 ただしどちらも col1 を持っているとします。 このテーブル T01, T02 に、 col1 を外部キーとして 子供として共通のテーブル X をひもづけたいのです。 ALTER TABLE [dbo].[X] ADD CONSTRAINT [FK_X_T01] FOREIGN KEY ( [col1] ) REFERENCES [dbo].[T01] ( [col1] ), CONSTRAINT [FK_X_T02] FOREIGN KEY ( [col1] ) REFERENCES [dbo].[T02] ( [col1] ) (続く)
964 :
デフォルトの名無しさん :03/01/09 18:42
しかし、実際の使用では、 「T01 と X」または「T02 と X」のように どちらかの組でデータを入れるため FK 違反になってしまいます。 X を X01, X02 のように2つに分ければよいのですが、 X のようなテーブルがたくさんあり、 すべてを2つのテーブルに分けなくてはなりません。 何かよい方法はありますか? SQL Server2000 です。
>964 カラムを2つに分けたら? col1_1(T01を参照)とcol1_2(T02を参照) ともにNULL値可。
966 :
デフォルトの名無しさん :03/01/09 22:42
こんなテーブルがあったとする(名前はテーブルでいいや): Item Object Number ---- ------ ------ Baibu Onany 10 Baibu anaru 20 Baibu oral 30 Roter Onany 5 Roter anaru 13 このときSQL文で、「BaibuのNumberのみをSumしてBaibuの行の最後に 小計を表示させ、そのItem欄には"Baibu小計"と表示させる。Roterは表示させない」 ということは可能だろうか??? Rollupでも無理のような気がしたけども・・・。
>>713 キタ━━━━━━(゚∀゚)━━━━━━ !!
今から幼女誘拐してくる(;´Д`)ハァハァ
l、、_ _,/'} |ヽ''~ ̄ ̄ ̄~`ヾ /_,,,.. ..,,,_.`v_'`、 /: ━ ━ | ニ_} / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |:: ∈∋ ヽ | <わたしを好きなだけ殴って下さい。 //:: -=,=.ヮ. |ヽ、| \ /'../:: /∠.._ |、.ノ  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ /':::|:::  ̄ ̄ |./ !-'L|::. v' . ヾ:::.. / . , ゞ、、;;;,,_,,,..._;;;;;__,,..ノ、 'ー┐,,..、_ ノ l_,,,...、 _,,一`
969 :
デフォルトの名無しさん :03/01/10 08:07
NULL値を含むINT型のカラムで、数字の小さい順、または大きい順に 並べ替える際にNULL値の行が先頭に来てしまいます。NULL値の行を 最後にもってきたいのですが、何か方法はないでしょうか? そのNULL値を含むカラムとは、OUTER JOINの結合の際でできた カラムな為、NULL値を含んでいます。 使用DBは、PostgreSQL 7.2.3です。
にげっと
>>969 ORDER BY句に
COALESCE(対象INTカラム,INTの範囲(2^32か?)までの適当なでかい数値)
でどうだ?
数値が気持ち悪かったら COALESCE(対象INTカラム,MAX(対象INTカラム) + 1) でもいいと思うけど。
2
↑名前間違えた s/969/971 ダター
2
くっ、ぬかったわっ!
>>971 Thanks。
coalesce関数を初めて知ったよ。order by句で使っても
ダメだったけど、
select coalesce(対象INTカラム, 0) as number from xxx where xxx order by number
でいけたよ。
zakzakの見出し「ひろゆき、400万円払えるか?」 年収とかどのくらいなんだろう。そうとうケチだとは聞いてるけど。
10秒に1コピペって・・・本当に何がやりたいんだろう。
>966 SELECT CASE WHEN GROUPING(Item) = 0 AND GROUPING(Object) = 0 THEN Item WHEN GROUPING(Item) = 0 AND GROUPING(Object) = 1 THEN Item+'小計' WHEN GROUPING(Item) = 1 AND GROUPING(Object) = 1 THEN '中計' END AS Item, Object, SUM(Number) AS Number FROM TABLE1 WHERE Item = 'BAIBU' GROUP BY Item, Object WITH rollup HAVING Item <> '中計'
当方SQLServer
984 :
デフォルトの名無しさん :03/01/10 13:54
oracleの外部結合がうまくいきません 失敗する条件って何かありま
985 :
デフォルトの名無しさん :03/01/10 13:54
した?
もうね、あまりにも言い尽くされていまさらなんだけどね。 ど う う ま く い か な い の か ち ゃ ん と 書 け ハ ゲ
987 :
デフォルトの名無しさん :03/01/10 14:08
>>986 急いでました。すみません
a.no b.no
1 4
2 5
3 6
このような二つのテーブルを結合させてSQL実行すると
select a.no,b.no
from a,b
where
a.no = b.no(+)
a.no b.no
1 null
2 null
3 null
というように表示されてしまいますです
何故でしょう?
988 :
デフォルトの名無しさん :03/01/10 14:29
>>987 正しい結果だとしか言えないんだが・・・
989 :
デフォルトの名無しさん :03/01/10 14:35
>>988 実際にはこのように表示させたいのですが・・・
a.no
1
2
3
4
5
6
どのように書けばよいのでしょう?
色々やってみましたがダメでした・・・
おねがいしますm(_ _)m
すてられたのか?
>>989 select no from a
union all
select no from b
何も考えずにこれを使え。
そしてSQL使わないプロジェクトに移してもらえ。
992 :
デフォルトの名無しさん :03/01/10 16:14
>>991 union使わないとダメですか?
外部結合でいけると思ったのですが
久々に2げと
>992 UNIONと外部結合を1から勉強しやがれこのハゲ! それがいやなら素直に>991に従えこのハゲ!
っつーかそんな結合せなあかんようなDB構造の時点で終わってるなぁ。
ひろゆき君。 メルマガまってるよ。
スレタイ一部バケた。すまん。 関連スレはとりあえず、このスレのをまず貼っておくよ。 補完はその後で・・・
3E8
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。