1 :
名無しさん@お腹いっぱい。 :
03/06/30 20:46 ID:m1O8kdcm です。
2 :
名無しさん@お腹いっぱい。 :03/06/30 20:49 ID:vwwrk7GD
おっぱいがいっぱい
age
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
あぼーん
27 :
名無しさん@お腹いっぱい。 :03/07/14 15:52 ID:Cb391GNe
SQL99って流行ってる? Oracleなどほとんどの商用DBはSQL92どまりらしいけど。
28 :
山崎 渉 :03/07/15 11:19 ID:???
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
あぼーん
∧_∧ ∧_∧ ピュ.ー ( ・3・) ( ^^ ) <これからも僕たちを応援して下さいね(^^)。 =〔~∪ ̄ ̄ ̄∪ ̄ ̄〕 = ◎――――――◎ 山崎渉&ぼるじょあ
SQLスレの予感
32 :
山崎 渉 :03/08/15 22:17 ID:???
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
あぼーん
34 :
山崎 渉 :03/08/15 22:30 ID:???
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
あげてみる
あぼーん
あぼーん
38 :
名無しさん@お腹いっぱい。 :03/08/25 21:26 ID:OQMUnVn1
left joinとright joinではどちらが速いか教えてください。
駆動表を勉強しれ。 連結元の件数が多ければ、RIGHT JOIN 連結先の件数が多ければ、LEFT JOIN
41 :
名無しさん@お腹いっぱい。 :03/08/30 05:54 ID:R83zjMCW
??
43 :
名無しさん@お腹いっぱい。 :03/09/08 05:23 ID:mSUFriDx
update について質問なんですが no hinmei kisetu 1 りんご 夏 2 キャベツ 春 3 リカヴィネ 終 ってデータが入ってるとき りんごと夏をいっぺん みかん 冬などにupdate出返ることはできるんでしょうか? どの本を見ても、set hinmei='みかん' where no='1' みたいな書き方しか書いてません。 updateを2回書けば出来るとは思いますが、一回で出来る方法があったら教えてください
44 :
名無しさん@お腹いっぱい。 :03/09/08 05:38 ID:mSUFriDx
日本語が、おかしいので、書き直します。 update について質問なんですが no hinmei kisetu 1 りんご 夏 2 キャベツ 春 3 リカヴィネ 終 と、データが入ってる時 りんごと夏を一度に みかん,冬などにupdateすることは、可能でしょうか? update文一回で no hinmei kisetu 1 みかん 冬 2 キャベツ 春 3 リカヴィネ 終 としたいです。 どの本を見ても、set hinmei='みかん' where no='1' みたいな書きかたなので、 updateを2回書けば出来るとは思いますが、一回で出来る方法があったら教えてください
UPDATE てーぶる SET hinmei='みかん', kisetu='冬' WHERE no=1
INSERT チンポ TO マンコ
>>46 1行でエラーが発生しました。
ORA-00925: INTOキーワードがありません。
>>47 SQLServerならINTOを省略できるから間違いじゃない
49 :
NAME IS NULL :03/12/18 10:16 ID:mo4ixJvn
てーぶるkpーおしえて
50 :
NAME IS NULL :04/01/13 23:07 ID:ryPWdc91
MYSQL使ってます。 値の取得に困ってしまいました。 どなたか知恵を貸してください。 message_table message from_person_id to_person_id unti_table person_id unti_person_id to_person_idをキーにmessage_tableからmessageを取り出したいのですが、 unti_tableのperson_idとto_person_idを繋げてunti_person_idとfrom_person_idが一致しない人を取得したい場合と unti_person_idとfrom_person_idが一致する場合の2通りのSQLを作りたいと思ったのですが、複数データが入ると全件とってしまうのです。 副問い合わせができれば上手く行きそうなんですがなんか使えないみたいで・・・。 message_table message | from_person_id |to_person_id ----------------------------------------- hello 2 1 hi 3 1 yeah 4 1 unti_table person_id unti_person_id ------------------------------------------ 1 2 1 3 select mt.message from message_table mt, unti_table ut where mt.to_person_id = 1 and mt.to_person_id = ut.person_id and mt.from_person_id != ut.unti_person_id これだと全件取り出しちゃうみたいなんです。 無理ですか? 分かりづらい質問ですいません。
MySQLの3.xとか言う落ちじゃないよな?
52 :
NAME IS NULL :04/01/14 21:30 ID:ROKXiftA
その通りですが・・。 まずいですか?3.23.58
53 :
50 :04/01/15 01:26 ID:VcgRyZxp
しつこくてすいません。 mysqlの3.xだとどのような問題があるのでしょうか? もしかして4.xだと大丈夫なのですか?
4.1から副問い合わせが使える。
55 :
50 :04/01/17 01:01 ID:???
そうだったんですか。 う〜ん。使ってるレンタル鯖が3.2・・・。 ありがとうございました。
56 :
NAME IS NULL :04/01/20 02:26 ID:hoZb2qM0
すみません。質問です。(SQLサーバーを使用しています。) SELECT * FROM table ORDER BY itemA のitemAの順を、 3,2,1,0,4 のように4を最後に並ばせる方法ってないでしょうか? どうぞよろしくお願いします。
57 :
378 :04/01/20 04:43 ID:luLzxi/Z
SELECT *, case when itemA = 4 then 4 else 3 - itemA end as SortKey FROM table ORDER BY SortKey でどうでしょう?
58 :
NAME IS NULL :04/01/20 05:30 ID:I5YcFOky
>>378 さま
ありがとうございます。
SQL初心者なんで、教えていただいた構文を調べながら(初めて見る構文があるので)、
試してみます。本当に感謝デス。
59 :
NAME IS NULL :04/01/20 07:34 ID:ETLdlIOQ
60 :
NAME IS NULL :04/01/21 04:26 ID:zGXdiK63
TABLE1 (id 0,1,2,3,4) TABLE2 (id 0,2,4) という二つのテーブルを結合する時に「TABLE2に同じIDが無い」という条件で TABLE1のIDを取得出来ないでしょうか? OracleのSQLで教えて頂けると助かります。 教えて!エロい(略
61 :
NAME IS NULL :04/01/21 04:39 ID:zGXdiK63
すいません、追加です。現状はTABLE1の他のカラムも取得したいので EXCEPTを使って取得したレコードを 副問い合わせとして再度TABLE1と結合しております。 もうちょっとスマートに書けないでしょうか?
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2)
>>61 > EXCEPTを使って取得したレコードを
この意味がよくわからんのだが…
select * from TABLE1 t1
where not exists ( select 'x' from TABLE2 where ID = t1.ID)
64 :
NAME IS NULL :04/01/22 03:39 ID:WDrQMFPj
>>62 まるまる解決しました。あー今月来月分の仕事終了です。
何か一つお礼がしたいんですが、最近悩んでいる事とかありませんか?
>>63 select t1 except select 2して引き算したテーブルを作っていました。
not に続く処理が頭から完全に飛んでたのでもっかい覚え直しました。
ご指摘ありがとうございました。
Oracleだよね。exceptなんてキーワードあったっけ? minusじゃなくて?
67 :
NAME IS NULL :04/01/23 17:41 ID:TwaTmWW+
女の兄弟はいませんので、母でもいいでしょうか?
68 :
NAME IS NULL :04/01/24 01:01 ID:9DEbow83
外部結合ってどういう時に使うの? 単にテーブルをつなげるだけなら内部結合でも外部結合でもいいと思うんだけど・・・
実際に試せよ… 0.1秒で理解できる
>68 お前なぁ・・・ マソコとアナルじゃ全然違うって事くらいわかるだろ?
71 :
NAME IS NULL :04/01/25 21:09 ID:iduq6cK/
>>66 >>68 さんを差し上げます。外部結合でお悩みですので、是非実践を交えて
教えてあげてください。むしろ妹信奉者ですか?
結合した後の表にasをつけると、エラーがでるんですが、 結合後の表には使えないんでしょうか? ;; student(id: integer, sname: string) ;; enrolled(id: integer, classname: string) から、 select name from (stundet natural join enrolled) as A ← group by name having (3 <= (select count(classname) ... ここでエラーがでる。。
>>72 select name
from (select * from student natural join enrolled) A
group by ...
こうなら書けるけど。
うーん…
をいをい
75 :
:04/02/02 10:40 ID:???
DB2に登録されたパッケージを削除しようとおもい、 以下のコマンド delete from syscat.packages where pkgname ="XXX" and pkgschema = 'YYY' を実行したところ DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL ステートメントとして処理されました。 SQL 処理中に、そのコマンドが返されました。 SQL0607N "DELETE" はシステム・オブジェクト用に定義されていません。 SQLSTATE=42832 というエラーが発生してDELETEできませんでした。 このコマンドを成功させる為に DELETEをシステム・オブジェクト用に定義するには どのようにすればよいのでしょうか? それともそもそもコマンドが間違っているのでしょうか? データベース:DB2V8
76 :
:04/02/02 13:54 ID:???
自己解決しました。 drop package スキーマ.パッケージ コマンドが正解でした。
77 :
NAME IS NULL :04/02/02 16:21 ID:sPKbo93r
初心者質問です。宜しくお願いします。 COBOLからSQL使ってます。 delete文を発行してDBの削除をしてるのですが、、、 削除の際に、削除件数を取得することは出来ますか? deleteを発行する前に、selectCountするしかないのでしょうか?
SQL%ROWCOUNT
79 :
:04/02/03 13:41 ID:Vsq7rVXO
初歩的ですみません。 postgreSQLですが、 hoge INTEGER UNIQUE で定義したカラムに INSERT INTO で重複した値を入れたときにエラーが出るんですが、 「無い物だけINSERTして重複したものは捨てる」という 使い方をしたいのです。エラー回避の方法をご教授ください。
80 :
:04/02/03 17:19 ID:???
79でし。 エラーコード "Cannot insert a duplicate key into unique index" を strstr() で比較して一致したらプログラムが止まらないようにしてみました。 いいのかしら、こんなのでも。
良くないだろ・・・ キーが重複してないものだけINSERTすればいいんじゃない。
82 :
:04/02/05 11:23 ID:???
>81 重複してないチェックをどうやるとスマートに行くんでしょうか。 select user from tbl where user=a; で件数0を確認してから insert すると、とんでもなく遅いんですが。
select キー from tblで、キーだけ取得して配列かコレクションかなんかに入れといて、 insert投げる前にキーが被ってないか確認してから投げろ。 updateなら、insertするデータと同じキーをdeleteしてからinsertしろ。
INSERT元がテーブルなら、BにあってAに無い物だけAにINSERT。 WHERE句で指定できるだろ。
85 :
NAME IS NULL :04/02/15 13:31 ID:9pK84ZeX
すいません、joinをさっき知ったばかりなので勘違いしてる可能性大なのですが・・・ select Cust_kanji , bb_intro.login_id as login_id, intro_date, introduced_name,introduced_email from bb_intro inner join bb_k where bb_intro.login_id = bb_k.login_id and bb_intro.login_id = 0 order by intro_date を実行すると、 You have an error in your SQL syntax near 'where bb_intro.login_id = bb_k.login_id and bb_intro.login_id = 0 order by int' at line 3 と怒られてしまいます。 いったいどこが間違っているのでしょうか? どなたかおわかりの方、教えていただければ幸いです。 ちなみにMySQLです。
86 :
85 :04/02/15 14:46 ID:9pK84ZeX
MySQLではinner joinでなく「join」とやってみたら、うまくいきました。
10日もまえの質問でなんだけどさー、
>>79 って、単に
for( ... ) {
try {
stmt.executeUpdate("insert .... ");
} catch(SQLException e) {}
}
でいいと思うんだが。っていうか俺そうしてるし。
88 :
NAME IS NULL :04/02/16 06:21 ID:ae9l//XG
PostgreSQL詳しくないので何とも言えないけど、PL/SQLでいうEXCEPTION に相当するものがあると思うのだが
89 :
:04/02/16 16:00 ID:Na0QVemw
超カメレスすまん。 >84 insert into tbl_a (userid,hoge1,hoge2) select userid,hoge1,hoge2 from tbl_b where userid not in (select userid from tbl_a); とかやってみました。洒落にならんほど遅かったです。なんか間違ってます?
90 :
NAME IS NULL :04/02/16 20:02 ID:/mbbqIps
interval型の時間計算の結果で、列名が定まらず、?column?になりますよね。それを?column?にせず、列名をつけるにはどうしたらいいですか?教えて下さいお願いします。
as delta
SQLってASやらISやらONやら無駄な前置詞が多すぎる。 無くても一意な構文になんだろーがよっつーコマンドがすげー多いかと。 ピュアな英文に近づけようという努力だと思うけど余計なお世話かと。 つーか邪魔かと。
>>92 SQLServerはかなり省略できるところが多い
それに慣れると他で書くときに戸惑うが。
>>93 そーなんだ。自分Oracleオンリーロンリー
95 :
NAME IS NULL :04/02/23 15:08 ID:Ne2ZGl5J
$dnums{$i}++; $era = 0; @stuff2 = split /\x3C\x3E/, $_; $name = $stuff2[0]; $mail = $stuff2[1]; $date = substr($stuff2[2], 0, 14); $id = substr($stuff2[2], 15, 11); $msg = $stuff2[3]; $ext = $stuff2[4]; $sth_ins->execute($path,$dat,$dnums{$i},$untime,$name,$mail,$date,$id,$msg); これで$msgの内容が入ってないんだがどうすればいい? $msg部分はtext型
96 :
NAME IS NULL :04/02/23 15:41 ID:DcJjCQuL
97 :
NAME IS NULL :04/02/24 10:00 ID:I8JzCQL6
NOは数値フィールドで SELECT NO FROM HOGE のようなSQLでNOの出力を ( ) で囲んで出力したいのですが、どうしたらよいでしょうか? (5678) (7789) (6783) のようにしたいのですが。
文字列連結演算子を使うのは? PostgreSQLなら、|| だが、ほかは知らん
99 :
NAME IS NULL :04/02/24 17:59 ID:u8c4IGLn
T-SQLで A B 01 02 02 04 04 06 05 A・Bというテーブルから C 01 02 04 05 06 Cを作りたいときはどうすればいいんでしょうか。 どちらにもあるときはどちらか、片方しかないときは あるもの、どちらにもないときは出さない。という形です。 うまいJOINの使い方がわかりません。
101 :
NAME IS NULL :04/02/25 10:40 ID:nmQBoTK6
>>100 UNIONでいけました。
UNIONでいけるけど、遅くなってしまうようです・・・otz
ABを各INSERTして仮想テーブルに入れてGROUPBYでCを作ってたんですが、
実行速度が遅くてほかの手段を考えてたんです。
ありがとうございます。
>>98 連結演算子でいけました。
MS SQL でしたので、+でした。
ありがとうございました。
103 :
NAME IS NULL :04/02/26 02:00 ID:eh35xVEj
ビュー(仮想表)に対して更新系SQLを実行するのは有りですか?
104 :
NAME IS NULL :04/02/26 02:10 ID:pYxJcbTI
ある月の月末日を求めるにはどうすればいいのでしょう?
105 :
NAME IS NULL :04/02/26 17:13 ID:blydrWJ8
SQL文でスペースのみが帰ってくるSELECT文を作りたいのですが、 方法がわかりません。 SELECT A,B,スペース FROM TABLE1 といった感じにしたいのです。 ちなみにORACLE9iです。 SQLSERVERだと SELECT A,B,SPACE(20) FROM TABLE1 という風にできるみたいなのですが・・・。
>>105 SELECT A,B,''
FROM TABLE1
>>105 SELECT A,B,' '
FROM TABLE1
>>105 SELECT A,B,' '
FROM TABLE1
109 :
NAME IS NULL :04/02/27 00:27 ID:fCj3A/6A
>>104 そういう関数あるよ。Oracleだけど。
LAST_DAYだっけかな。
table1 | id1(pk) | max_sub_id | | 1 | 3 | | 2 | 2 | | 3 | 1 | table2 | id2(pk) | id1 | sub_id | sub_id_value | date | | 1 | 1 | 1 | abc | 2004/01/01 | | 2 | 1 | 2 | def | 2004/01/02 | | 3 | 1 | 3 | hij | 2004/01/03 | | 4 | 2 | 1 | klm | 2004/01/04 | | 5 | 2 | 2 | nop | 2004/01/05 | | 6 | 3 | 1 | qrs | 2004/01/06 | | 7 | 3 | 2 | tuv | 2004/01/07 | | 8 | 3 | 3 | wxy | 2004/01/08 | out | id1 | sub_id_value | date | | 1 | hij | 2004/01/01 | | 2 | nop | 2004/01/04 | | 3 | xxy | 2004/01/06 | えろい人教えて! table1とtable2からoutの結果を出したい table1.id1とtable2.id1が対応している table1.id1とtable1.max_sub_idの値からtable2.sub_idを出し、 table2.sub_id_valueを取得する dateの値は同一id1の中で最も古い日付とする (゚∞゚)まじわかんない
SQL書くの面倒なんで、ヒントだけ。 1.from句に3つ書く。(table1,table2のid1-sub_id-sub_id_value,table2のid1-min(date)) 2.上記3つをjoin で出来る気がする。 #RDBの名前とバージョン位は書いて。。。
outの3行目の「xxy」って何だよ。「qrs」の間違いじゃないのか?
113 :
NAME IS NULL :04/02/27 14:54 ID:qYf9aHRS
>>112 おっしゃる通りです。
間違えです。
ちなみにMySQL最新版です。
UPDATEで更新するとき foreach($list as $key => $value){ UPDATE table SET num = $value WHERE id = $key; } とループ処理の中にUPDATE文を入れても問題ないのでしょうか? それともこういうやり方は良くないのでしょうか?
>114 そのループがどの程度回るかにもよるな。 多くても数十回程度ならさほど問題ないと思うjが。 数万とか回る可能性があるなら別の方法を検討したほうが良い。
>>117 そうですか・・・
ループは多くても50回くらいです。
テーブルを行ごとに違う値で初期化しようと
思ったのですが、どうやら問題なさそうですね。
本当は一度に初期化できるような方法があればベストですが・・・
119 :
NAME IS NULL :04/02/28 17:02 ID:yUYsACos
120 :
NAME IS NULL :04/03/10 10:11 ID:Sgv/7OC0
質問です。 データの型がNumber型の項目を前方一致検索したいんですけど、 検索条件の値が数字でない文字列(zとかxとか)であった場合、 SQLの文法だけで対応できるものなのでしょうか。 結果としては「ヒットせず」で正常に終了させたいんですけど。 WHERE句の条件でなにか関数使わないとだめですかね。 使うとしたらどういうもんがいいんでしょう・・・。 へぼくてすいませんです。
>>120 RDBのバージョンぐらい書け
ORACLEでの方法だがTO_CHAR(NUMBER型の項目) LIKE '検索文字列%'
そもそもNumber型に文字列検索しても。。。
Number 型で前方一致って…… >121 の方法を使ったとしても、 '100%' とあったら、100 でも 1000 でも 10000 でもヒットしちまうわけだが、 それってどういう意味を持つ検索なんだ?
お偉いさんが無茶苦茶言ってるだけのような。
すみません、質問があるのですが。 例えばACCESSのプロシージャ内にnumberという動的変数があるとして、 sql文のwhereにその動的変数の値を抽出条件として設定し、かつ動的変数の インデックスの数だけsql文を繰り返し実行して、 Recordsetオブジェクトに格納したいのです。 number(0)=000001 number(1)=000002 だったら、SELECT〜WHERE number(0) FROM〜、SELECT〜WHERE number(1) FROM〜 とインデックスの数、この場合は2レコード作成されるといった感じです。 どうもsql文を繰り返し実行してRecordsetオブジェクトに格納する部分が 上手くいかないのです。どうかご教授お願い致します。
SELECT * FROM table_name WHERE key = number(0) OR key = number(1) OR … key = number(n)
>>126 解決しました!ただ
key = number(n) OR
をn回分、Forで回して付け足せばいいだけのことでしたorz
本当にありがとう御座います!
128 :
NAME IS NULL :04/04/05 13:19 ID:udoPtN7v
Oracle7で最頻値を求める方法が分かりません。 SELECT mode(hoge) FROM fuga などというふうにして、fuga表のhoge列最頻値が求められればいいのですが… 最悪、DISTINCT句でhoge列の取りうる値を全てリストアップし、それぞれ SELECT count(hoge) FROM fuga WHERE hoge = 'arege' などと数えようかと思ってますが…
>>128 Oracleは知らんので、とりあえず、1行目のhogeが最頻値
SELECT hoge,COUNT(*)AS cnt FROM fuga GROUP BY hoge ORDER BY cnt DESC;
質問させてください。 借りてるレンタル鯖でMySQLが使えるのですが、どうやってアクセスしたらいいのでしょうか? SSHもTelnetも使えないようなのです。 よろしくお願いします。
DBに関してはサポート対象外とのことでしたので・・・ よろしくお願いします。
そーいうのは事実上「使えない」というんじゃないか?
知識が無きゃ使うな。ってことだろう。
135 :
NAME IS NULL :04/04/06 02:16 ID:NYkMvrBL
質問です。 ACCESSでINSERT INTO文でデータを追加したいのですが エラーが出ました。これはだめなのですか? ↓ 表1(cnt, age, add) 表2(add, B) INSERT INTO 表1(cnt, age, add) _ VALUES( 1, 60, select 表2.add FROM 表2 WHERE 表2.B IS NULL)
>>135 Values()の中にSelectっていうのはちょっと…
こうやれば?
INSERT INTO 表1 ( cnt, age, add )
SELECT 1 AS cnt, 60 AS age, 表2.add
FROM 表2
WHERE 表2.B Is Null
137 :
NAME IS NULL :04/04/06 18:01 ID:c+YhLR8o
>>136 なるほど!ASをつかえば良いんですね。
ありがとうございます
秘技「わかったふり」
ACCESSのVB内でセットしたRecordsetオブジェクトのデータを参照して レポート作成するのってどうコーディングするべきなのでしょうか?
しまった、SQL全然関係ないし…逝ってきますorz
142 :
NAME IS NULL :04/04/12 15:30 ID:XPJNTJHE
SQLという範囲からはずれてると思いますが、 「複合キー」というのは、1つの行において、 複数のカラムを合わせたモノを1つのキーとして扱うという感じでしょうか?
144 :
NAME IS NULL :04/04/12 17:58 ID:XPJNTJHE
>>143 クスコ
んじゃ、
create table employees (
id BIGINT not null,
deptId CHAR(4),
name VARCHAR(255),
primary key (id)
)
こんなテーブル作って、
select name from employees where id=100 and deptId='0500'
こんなことするのは、複合キーselectと呼べるのでしょうか?
>>144 不正解
複合キーというのは、候補キーの一つ。
つうことで、正確に言うと
>>142 も半分正解か。
複合キーというのは、二つ以上のカラムを合わせてuniqueとなるキー。
>>144 の例だとidだけで行を特定できるので、and depId='0500'は全くの不要だし。
>
>>144 の例だとidだけで行を特定できる
そうか?
147 :
NAME IS NULL :04/04/12 23:16 ID:eYJS7Ezv
複合キーを使ったSELECTの模範例って、どんな感じ?
148 :
表領域の変更について :04/04/13 00:28 ID:I8fFeKV0
ALTERコマンドで、ユーザー毎に表領域の変更ができますが、 Table単位で、表領域の変更をしたく思います。 Tableを新規作成し、古いものを消去すれば良いのかもしれませんが、 より効率的な方法があると聞いてます。 どなたかご存知な方教えて頂けないでしょうか? よろしくお願いします!!
149 :
ちんぽ初心者 :04/04/13 09:32 ID:hzQSiapO
すんません。質問ッス。 こんなテーブル:TBL1があったとします。 名称 コード りんご 001 ゴリラ 010 ラッパ 002 パンダ 021 このテーブルから、「コード」の2桁目が'1'であるレコードの「名称」を取得したくて、、、 SELECT 名称 FROM TBL1 WHERE (SELECT SUBSTRING ( コード FROM 2 FOR 1) = 1) なんてSQLを書いてみたんですが、37000な感じです。 根本的に、SUBSTRINGの使い方を全然理解して無いよーな気がムラムラなんですが。。 どーすりゃいいのか、識者の方ご教授下さいませ。
>>149 SELECT 名称 FROM TBL1 WHERE SUBSTRING ( コード FROM 2 FOR 1) = '1';
135といい、とにかくSELECTするのが流行っているのか?
154 :
NAME IS NULL :04/04/14 00:58 ID:sNa3vHBT
tbl1 id INTEGER keyword_id INTEGER name VARCHAR(255) tbl2 keyword_id INTEGER keyword VARCHAR(255) のようなテーブルがあるとします。 tbl1.keyword_idからtbl2.keywordを取得しtbl1.nameに入れて更新したいのですが、 プログラム側でループ回して1つづつSELECT,UPDATEする以外に、 何か良い方法はないでしょうか?
>>154 tbl1.name = tbl2.keyword ってことなら、
UPDATE tbl1 SET name=tbl2.keyword FROM tbl2 WHERE tbl1.keyword_id=tbl2.keyword_id;
で、できる。
しっかし、こういうメンテみたいな事を、日常的に発生するのか?
メンテとか仕様変更程度なら、プログラム側でループさせてもいいような気もする。
156 :
NAME IS NULL :04/04/14 09:16 ID:goCOTvMk
>「複合キー」というのは、1つの行において、 >複数のカラムを合わせたモノを1つのキーとして扱うという感じでしょうか? これ以外の複合キーってあるんかな?
157 :
NAME IS NULL :04/04/15 14:44 ID:kKTGTXIq
MSAccessのSelect文で 1 2 3 : と出力されるような関数または技はありますか?
158 :
NAME IS NULL :04/04/15 17:01 ID:jvLa74JA
項目A 項目B 項目C 20050 200 50 20000 100 50 30000 100 00 このような感じのテーブルから、項目Aが項目B+項目Cの形になっている物を 取得したいのですが。 それと、日付型との比較の仕方も教えてもらえないでしょうか。
>>158 SELECT * FROM t1 WHERE 項目A = 項目B||項目C;
日付型との比較って?
160 :
NAME IS NULL :04/04/15 17:47 ID:jvLa74JA
>>159 できました。ありがとうございます。
あと、二つ目の質問の方は
項目D(日付/時刻型)
2004/04/01 12:00:00
2004/05/01 12:00:00
2004/04/15 12:00:00
このようなテーブルから、今日の日付よりも大きい物を取得したいのですが。
>>160 WHERE CAST(項目D AS DATE) > CURRENT_DATE;
162 :
NAME IS NULL :04/04/16 10:53 ID:dIVUU8kI
>>161 ありがとうございます。
あと、項目Dが1月以上前の日付になっているデータを取り出すやり方も教えて貰えないでしょうか。
163 :
NAME IS NULL :04/04/16 13:44 ID:J3JWWPjP
まずは自分で調べてみたら? 「こういう方法でここまで調べて、こんな状況まではたどり着いたけど、 ここから先はどうすればいいのか」 みたいな感じでさ。
>>162 たぶん日本語の勉強も必要だな。ヒントだけ。
WHERE CAST(項目D AS DATE) < CURRENT_DATE - 一ヶ月 ;
オラクルで ALL OUTER JOIN をやるにはどうしますか?
>>165 8i以前ってことか?
左外部結合するSQL
UNION
右外部結合するSQL
つーか、 FULL OUTER JOIN じゃないのか?
どれくらいのことができればSQL使えると人様に胸張って言えるかな?
169 :
NAME IS NULL :04/04/23 11:12 ID:BroRaDV4
select * from TABLE_NAME
DROP DATABASE
彼女にINSERTしてCOMMITできるようになってから。
>>171 INSERTしておいてROLLBACKする方がいいなw
漏れは、INSERTとROLLBACKを、DBがハングアップするまで ループ処理したいなw
BIJIN TRANSACTION
175 :
NAME IS NULL :04/04/25 02:15 ID:OEZtU36x
TAB_A------TAB_B------------------------- VALUE_A(PK)GROUP_ID(PK)VALUE_B(PK) ------------------------------------ 111 212 314 21 22 23 24 25 31 32 41 42 43 このようなデータがあるときに、TAB_Aと同じ組み合わせを持つグループを TAB_Bの中から探すにはどうすればいいでしょうか?この場合はGROUP_ID=4 が正解です。なお、TAB_Bの中でひとつのグループが持つレコード数はTAB_A の行数と等しいとは限りません(見ればわかると思いますが)。 Oracle 8iですが、副問い合わせをいくつか使ってそれらしいSQL文はできたの ですが、もっとスマートな方法はないもんかと思いまして。
176 :
NAME IS NULL :04/04/25 02:16 ID:OEZtU36x
ああ、ズレてる…
177 :
NAME IS NULL :04/04/25 02:22 ID:OEZtU36x
こんな感じです TAB_A VALUE_A(PK) ----------- 1 2 3 TAB_B GROUP_ID(PK) VALUE_B(PK) ------------ ----------- 1 1 1 2 1 4 2 1 2 2 2 3 2 4 2 5 3 1 3 2 4 1 4 2 4 3
>>175 がどんなSQLを思いついたのか知らんが、こんなんでました。
SELECT * FROM (SELECT group_id FROM tab_b GROUP BY group_id HAVING COUNT(group_id)=(SELECT COUNT(*) FROM tab_a))AS bar
WHERE NOT EXISTS ( SELECT * FROM tab_b WHERE NOT EXISTS(SELECT * FROM tab_a WHERE value_a=tab_b.value_b) AND group_id=bar.groupid);
tab_aと同じ行数を持つtab_b.group_idを求めて、tab_a.value_aにないvalue_bを持つ行を弾いた感じです。
179 :
NAME IS NULL :04/04/26 21:30 ID:9BxX3SKm
table aが下のようになっていまして、 id|value1 --+------ 1|aaaa 2|bbbb 3|cccc table bが以下のようになっているとします。 id|value2 --+------ 1|hhhh 1|iiii 2|jjjj 4|kkkk これを、 id|value1|value3 --+------+--------- 1|aaaa |hhhh iiii 2|bbbb |jjjj 3|cccc | のような形でtable bのvalue2をスペース区切りで文字列連結してSQL一文でやりたいのですが、 どなたか教えていただけないでしょうか。 DBはpostgresqlです。
180 :
NAME IS NULL :04/04/26 23:08 ID:hVx47epU
SQLServer2000で「SELECT * FROM ユーザー名 .テーブル名」というように、 テーブル名の前にユーザー名をつけないとSELECTできません。 テーブル名だけでSELECTできるようにするには、どのように設定したらよいでしょうか? Enterprise Managerとかで設定できそうな気がするのですが、わかりません。 どうぞよろしくお願いいたします
181 :
180 :04/04/26 23:36 ID:hVx47epU
自己解決しました
>>179 list()のような集約関数がないとむりぽ。
183 :
179 :04/04/27 00:00 ID:ZINPSHoZ
>>182 これ、むりぽなんですか?
よく使われそうな気がするんですけど。。
>>183 一般的にRDBでは動的にカラムを増やすようなことしない。
やるとすれば↓のような結果をもらってクライアント側で処理する
id|value1|value3
--+------+---------
1|aaaa |hhhh
1|aaaa |iiii
2|bbbb |jjjj
3|cccc |
バックアップしたデータを丸ごと、またDBのテーブルに毎日突っ込んでる俺はどうですか?
>>175 左右が逆かもしれないけど...
SELECT GROUP_ID
FROM TAB_A LEFT JOIN TAB_B ON VALUE_A = VALUE_B
GROUP BY GROUP_ID
HAVING COUNT(*) = (SELECT COUNT(*) FROM TAB_A)
AND COUNT(VALUE_A) = (SELECT COUNT(*) FROM TAB_A);
>>186 で、バックアップしたデータを突っ込んでいるテーブルのバックアップはどうするんだ?
190 :
NAME IS NULL :04/05/08 01:52 ID:PG+kCctR
すいません、教えてください。 まず、次の二つのテーブルがあるとします。 ・2chねらーテーブル ユーザID(PK) ・スレ立てテーブル ユーザID(PK) スレ立て日付 クソスレフラグ(デフォルト = '0') 2chが会員制という前提ですが、2chねらーテーブルには2ch会員全ユーザが、 スレ立てテーブルには、スレを立てたユーザIDとスレ立て日付が。 また、立てたスレがクソスレと認定されれば、クソスレフラグに'1'が入るものとします。 この2テーブルから、 優良2chねらーを抽出したいのです。 優良の定義とは・・・ ・クソスレを立てていない(クソスレフラグ = '0') ・そもそもスレを立てたことがない(スレ立てテーブルに該当IDなし) というものです。 これを、一回のSQLで実現させる方法はないでしょうか? よろしくお願いします。
一発では難しいなぁ。どうしても2つになってしまう。 update スレ立て set クソスレフラグ=0 where ユーザID='漏れ'; select ユーザID from 2chねら where ユーザID not in (select ユーザID from スレ立て where クソスレフラグ=1);
>>191 update文は関係ないだろ。あと、INよりEXISTSの方が高速。
SELECT ユーザID FROM 2chねらー
WHERE NOT EXISTS (SELECT * FROM スレ立て WHERE スレ立て.ユーザID=2chねらー.ユーザID AND クソスレフラグ=1);
「クソスレを立てたことがない」人を検索すればいいんだから、 SELECT * FROM 2chねらーテーブル WHERE ユーザID NOT IN (SELECT ユーザID FROM スレ立てテーブル WHERE クソスレフラグ<>'0')
195 :
190 :04/05/14 02:02 ID:OjLux1Gu
どうもありがとう。 皆さんの回答を参考に、なんとか問題解決出来ました。 普段は select なんちゃら from なんちゃら where なんちゃら order by なんちゃら この程度のSQLで実現できる、単純業務に従事する漏れ。 これじゃ、いつまでたってもスキルアップは望めませんな・・・ もっと勉強しないといかんなぁ。
196 :
NAME IS NULL :04/05/14 11:52 ID:S2RlCOwq
教えていただきたい事があります テーブル1 フィールド(ID,ID_NAME)pkey ID テーブル2 フィールド(ID,CD,CD_NAME)pkey CD テーブル3 フィールド(CD,NO,NO_NAME)pkey NO の3テーブルがあります。 テーブル1にIDが存在してテーブル2にID存在しないパターン テーブル2にCDが存在してテーブル3にCD存在しないパターン テーブル3にCDが存在してテーブル2にCD存在しないパターン のデータを選択するにはどうしたらよいのでしょうか? イメージとしては テーブル1 ------------------- ID | ID_NAME | ------------------- 1 うに1 2 うに2 テーブル2 -------------------------- ID | CD | CD_NAME | -------------------------- 1 1 かに1 1 2 かに2 3 3 かに3 テーブル3 -------------------------- CD | NO | NO_NAME | -------------------------- 1 1 むに1 3 2 むに2 4 3 むに3 実行結果 --------------------------------------------------------- ID | CD | NO | ID_NAME | CD_NAME | NO_NAME | --------------------------------------------------------- 1 2 うに1 かに2 3 3 かに3 むに2 3 むに3 2 うに2 としたいのですがどうしたらよいのでしょうか? お願いします、教えて下さい!
197 :
196 :04/05/14 11:59 ID:S2RlCOwq
済みません、イメージが変になってしまいました! わかり難くて申し訳ないですが、以下のような感じです。 テーブル1 ------------------- ID | ID_NAME | ------------------- 1, うに1 2, うに2 テーブル2 -------------------------- ID | CD | CD_NAME | -------------------------- 1, 1, かに1 1, 2, かに2 3, 3, かに3 テーブル3 -------------------------- CD | NO | NO_NAME | -------------------------- 1, 1, むに1 3, 2, むに2 4, 3, むに3 実行結果 --------------------------------------------------------- ID | CD | NO | ID_NAME | CD_NAME | NO_NAME | --------------------------------------------------------- 1, 2, '', うに1, かに2, '' '', 3, 3, '', かに3, むに2 '', '', 3, '', '', むに3 2, '', '', うに2 '', '' AAの偉大さを思い知らされました・・・
198 :
NAME IS NULL :04/05/14 12:57 ID:nNcVZ+ed
テーブル名:デジコ キャラ 萌え度 キタ回数 -------------------------- A 6 11 B 7 12 テーブル名:プチコ キャラ 作画枚数 -------------------------- A 100 キャラ 萌え度 キタ回数 作画枚数 A 6 11 100 B 7 12 0(NULLではない) をだすようなSQL文おしえてください。
>>196 >テーブル1にIDが存在してテーブル2にID存在しないパターン
SELECT * FROM テーブル1 WHERE NOT EXISTS (SELECT * FROM テーブル2 WHERE テーブル2.ID=テーブル1.ID);
>テーブル2にCDが存在してテーブル3にCD存在しないパターン
>テーブル3にCDが存在してテーブル2にCD存在しないパターン
上のSQLを参考にして考えれ。要領は同じ。
>>198 SELECT キャラ,萌え度,キタ回数,coalesce(作画枚数,0) from デジコ LEFT OUTER JOIN プチコ Using(キャラ);
201 :
NAME IS NULL :04/05/16 18:29 ID:e1RqkHtX
すいません。JOIN後のテーブルに任意の名前を付けたいときはどうしたら 良いですか? select a,b from (a left join b) as table3 ↑省略しすぎ(汗 としてもエラーになってしまうし困っています。 ちなみに.MDBです。 よろしくお願いします。
MySQLで特定の月情報を取得する場合、month(DATETIMEカラム) = 1等といったように記述出来ますが、Oralceの場合、特定月の条件はどのようにして記述すればいいのでしょうか?
>>202 Oracleにはdate_partって関数はないのか?
205 :
NAME IS NULL :04/05/17 19:20 ID:n2kYxM4x
JOIN後のテーブル名? に何か意味あるの?
207 :
NAME IS NULL :04/05/17 21:26 ID:n2kYxM4x
>>206 DB板はスレ違いかも知れないと今気づきましたが、
気づかないフリで説明します。
VB.netでは複数のテーブルをJOINするとtableという自動で仮名がつきます。
全く同じデータセットに同じテーブル名(table)をいれると
???としたエラーが炸裂するのでどうしてもJOIN後にテーブル名を
付けたいんです。こんなケースはDB単独では珍しいらしく手持ちの
SQL本には記載がなかったりする。
レスサンスコ。まだ会社(泣
>>202 TO_CHAR(DATEカラム, 'mm') = '1'みたいに文字列に変換すればいいのでは?
209 :
208 :04/05/17 23:01 ID:???
>>208 ごめん、
TO_CHAR(DATEカラム, 'mm') = '01'だね・・・。
select a, b from (SELECT a,b FROM a left join b) table3
211 :
NAME IS NULL :04/05/18 10:42 ID:FLZcxqMK
>>208 どうもありがとうございます。これで何とかなりそうです。
212 :
NAME IS NULL :04/05/18 11:48 ID:+5UV1MyO
うほっ
すいません、oracle9iで1つのカラムに入っているレコードを全て1行で取得したいのですが。 例えば、 id ---- 1 2 3 を 1,2,3 の様にSQLのみで1行で取得するにはどうすればいいでしょうか? よろしくお願いします。
>>214 マルチだが答えてやるこんちくしょう
ピボットテーブル
でぐぐれうんこ
あとSQL入門書(定番のSQLポケットリファレンスでいいぞ)買って来いヘタレ野郎
217 :
NAME IS NULL :04/05/20 14:00 ID:+X5a+mzG
テーブル名:アニオタ 視聴者 萌え1 萌え2 ---------------------------------- A ミドリ ヒナタ B アヤセ テマリ を↓の表にするビュー作成を教えてください・・。 視聴者 萌え A ミドリ A ヒナタ B アヤセ B テマリ
union
219 :
NAME IS NULL :04/05/20 20:52 ID:+w96lQEk
SQLServer2000でSPを作ってるのだが、Executeの中で文字列とINT型の変数 を繋げて新しい文字列を作るのってどうやるのですか? Execute(' DECLARE @i INT, @moji VARCHAR(20) SET @i = 0 WHILE @i < 10 BEGIN SET @moji = ''AAAA'' + @i + ''BBBB'' 〜 〜 SET @i = @i + 1 END SET @moji = ''AAAA'' + @i + ''BBBB''の部分で行き詰ってまつ。 誰かおせーて。
SELECT 視聴者, 萌え FROM ( SELECT 視聴者, 萌え1 萌え FROM アニオタ ) UNION ( SELECT 視聴者, 萌え2 萌え FROM アニオタ ) ORDER BY 視聴者;
222 :
NAME IS NULL :04/05/22 03:00 ID:3pK+cfvK
MS SQL 2000にて、レコードがインサートされたら、とか あるフィールドの値がhogeだったら、とかの条件で 外部exeを起動する方法ってあるのでしょうか? よろしくお願いします。
223 :
NAME IS NULL :04/05/22 03:38 ID:3pK+cfvK
sp_start_jobストアドを利用できるようです。
224 :
NAME IS NULL :04/05/23 18:32 ID:3VGGJqhw
すみませんが教えてください。 select文でfromとwhereはどちらが先に解釈され、 条件が絞り込まれるのでしょうか? またsql命令の優先順位や処理速度を調べる良い文献などはないでしょうか? おねがいします。
>>224 各句の意味を考えればだいたい判ると思うぞ。
つか、FROMとWHEREの優先順位すら判らないというのは、
重症だぞ。
実行プラン見るってのじゃダメなのかい?
227 :
224 :04/05/23 21:24 ID:MO/uZXID
>>225 重症ですか(鬱)
select*from
(a join (select*from b where b.b is null) on a.id = b.id) join
(select*from c where c.c is null) on a.No = c.No)
where (c.order = ?)
と実験したところfromよりwhereの方が、優先だったのですが納得いかずなのです。
また表b および表cが、
なぜ副問い合わせで違った表名を自動的に割り当てられるのか?
といったことが、初めて副問い合わせを理解(ちょぴと)したことで浮き上がった
次第です。
プログラム言語を高速化するよりsqlの最適化の方がよりよいと思われたので、
できれば良い文献をキボン
今もってる本は答えしか載ってないので物足りないのです。
よろしくお願いします。
あ、馬鹿の方ですか
230 :
224 :04/05/23 21:56 ID:MO/uZXID
>>229 実践だけだと馬鹿にされるよー
特定できなくってすまんね。で優先となってるポイwhereは
where (c.order = ?) の部分
from句部分よりwhere句部分が優先になることが、納得いかなかったのですが
やはりfrom句部分が優先のはずなのですね?(テーブルの条件を記述する以上
当然かもしれませんが)
文献は明日でも本屋に行って確認してみます。
ありがとう
>>230 (a join (select*from b where b.b is null) on a.id = b.id) join
(select*from c where c.c is null) on a.No = c.No)
の仮想テーブルを作ったうえでc.order =? の抽出をしているはずだが違うのか?
232 :
224 :04/05/23 22:48 ID:MO/uZXID
.
>>231 その解釈で正解だとわたしも思います。
テスト用の環境(Rowが2・3行)で無知な人間がたまたまテーブル設計をしたので
fromよりwhereが優先のように見えたのでしょうねきっと。
でも>>229さまのおかげでもっと深くまで理解できそうです。
レスさんくす
233 :
NAME IS NULL :04/05/24 11:25 ID:+HRlZqXP
すみません、教えてください。 以下の3テーブルがあります。 その3テーブルより実行結果にあるような形でデータの取得 をするには、どのようなSQL文を書けばよいのでしょうか? ちなみに3テーブル全てに関連付けられたデータが存在する もののみを取得します。 TB1 | ID | NAME1 | ------------------ 1 NM1-1 2 NM1-2 TB2 | ID | CD | NAME2 | ------------------------- 1 1 NM2-1 2 2 NM2-2 TB3 | CD | NO | NAME3 | ------------------------- 1 1 NM3-1 2 2 NM3-2 実行結果 | ID | NAME1 | CD | NAME2 | NO | NAME3 | ---------------------------------------------------- 1 NM1-1 1 NM2-1 1 NM3-1 2 NM1-2 2 NM2-2 2 NM3-2 色々頑張ってみたんですけど、どうしてもできません。 初歩的なSQLだと思うのですが、どうしても解りませんでした。 よろしくお願いします!
>>233 SELECT tb1.id,tb1.name1,tb2,cd,tb2.name2,tb3.no,tb3.name3
FROM tb1,tb2,tb3 WHERE tb1.id=tb2.id AND tb2.cd=tb3.cd;
235 :
233 :04/05/24 11:49 ID:+HRlZqXP
>>234 ありがとうございます。データ取得できました!
心苦しくももう一つお聞きしたいのですが、IDの値を指定して
データを取得したい場合は、副問合せというものを使用すれば
よいのでしょうか?
>>235 SELECT tb1.id,tb1.name1,tb2,cd,tb2.name2,tb3.no,tb3.name3
FROM tb1,tb2,tb3 WHERE tb1.id=1 AND tb1.id=tb2.id AND tb2.cd=tb3.cd;
237 :
233 :04/05/24 14:35 ID:+HRlZqXP
>>236 ありがとうございます。
データは取得できたのですが、先生から
「副問合せ使え!ゴルァ!」と言われてしまいました。
副問合せ全くわからないです。
ネットで調べても2テーブル使用例しか発見できず・・・。
色々試行錯誤してみましたが、変な風にデータが取れてきてしまいます。
本当に申し訳ないのですが、教えていただけないでしょうか?
いや、ほんと厚かましいと思っているんですが。
SELECT * FROM (SELECT tb1.id,tb1.name1,tb2,cd,tb2.name2,tb3.no,tb3.name3 FROM tb1,tb2,tb3 WHERE tb1.id=tb2.id AND tb2.cd=tb3.cd) tbl4 WHERE tbl4.id=1
>>237 副問い合わせ? ひょっとしたらSQL92のJOINを言いたいのかも。
SELECT * FROM (tb1 JOIN tb2 USING(id)) JOIN tb3 USING(cd) WHERE id=1;
ついでに、わざとサブクエリを使ってやるとか?
SELECT * FROM (SELECT * FROM tb1 JOIN tb2 USING(id))AS tb4 JOIN tb3 USING(cd) WHERE id=1;
240 :
233 :04/05/24 15:04 ID:+HRlZqXP
>>238 2chで初めて神に遭遇しました。
ありがとうございます!
このSQLを元に副問合せを勉強します。
SQL自体に挫折しかかっていたので、
色々な意味で本当に助かりました!
241 :
233 :04/05/24 15:08 ID:+HRlZqXP
>>239 なんでもデータ件数が多くなった場合に、効率よく
処理するために副問合せを使うとの事だったんです。
そういうやり方もあるんですか。
試してみます。
ありがとうございます!
>>241 ああ、効率を考えるなら、
SELECT * FROM (SELECT * FROM tb1 JOIN tb2 USING(id) WHERE id=1)AS tb4 JOIN tb3 USING(cd);
だな。
しかし効率は、 WHERE id=1 を最初に持ってきた
>>236 と同じ。
SQL*Loaderのことについて質問させてください。 固定長のデータを取り込む際に、文字列の後ろについた空白を削除して データをINSERTしたい場合は、 FIELD3 POSITION(16:23) CHAR "to_date(:FIELD3,'YYYYMMDD')"(これは日付ですが・・・) のようにTrimか何かをつかえばよろしいのでしょうか?
244 :
NAME IS NULL :04/05/26 16:08 ID:fy6id3aK
>>244 この図はLEFT(RIGHT) JOIN を使うって意味じゃないのか?
>>244 EmployeeProjectはプロジェクトに参加している社員名簿ってことだろ。
社員が増えた -> Employeeに追加
新規プロジェクト発足 -> Projectに追加
そのプロジェクトの人員決定 -> EmployeeProjectに追加
ただこれだけだが。プロジェクトだけ決まってもそれに参加する人員が決まってなければ
EmployeeProjectにデータはいれない(入れられない)だけ。
あとは、外部キーとか参照整合性制約で調べるよろし。
247 :
NAME IS NULL :04/05/26 19:13 ID:fy6id3aK
SQLの書き方の質問です。 日付 金額 ---------------------- 2004/01/01 10000 2004/01/03 8000 2004/01/05 7000 の様に日付が一部飛んでるテーブルを 日付 金額 ---------------------- 2004/01/01 10000 2004/01/02 0 ←空白でもよい 2004/01/03 8000 2004/01/04 0 ←空白でもよい 2004/01/05 7000 と日付を埋める形で抽出したいです。 何か良い方法はありませんか? 完全な日付だけが並んだ一時テーブルを作って 外部結合で何とかなるのかな?と考えているのですが 一向に進みません・・・ Excel VBAでADOを使って TXTファイルを読み込んでます。
SQLの書き方についての質問です。 日付 金額 ----------------------- 2004/01/01 10000 2004/01/03 5000 2004/01/05 8000 という、一部日付が抜けているテーブルが あります。 日付 金額 ----------------------- 2004/01/01 10000 2004/01/02 0 ←空白でも良い 2004/01/03 5000 2004/01/04 0 ←空白でも良い 2004/01/05 8000 という日付を埋める形で抽出したいのです なにか良い方法はありませんか? 日付のみ並んだ一時的なテーブルを作って 外部結合すればよいのかな?と思うのですが・・・ Excel VBAでADOを使ってTxtファイルを読み込んでいます。
日付と言ってもなぁ…
253 :
NAME IS NULL :04/05/31 11:48 ID:74MMxq7S
テーブル名:デジコ キャラ 萌え度 -------------------------- A 4 B 7 C 10 から 萌え度が5未満と5以上で あぼーん と キターに分けて キャラ イケてる -------------------------- A あぼーん B キター C キター というビューを作りたいのですが教えてください。
なんつーか、 最低でもDBとバージョン言ってくれなきゃダメじゃないか。
>>253 CREATE VIEW view1 AS SELECT キャラ,CASE WHEN 萌え度>=5 THEN 'キター' ELSE 'あぼーん' END AS イケてる FROM デジコ;
>>252 ありがとうございます。
SQLではなく、抽出後プログラム上での
細工で何とかせい、との事でしょうか?
定番の書き方でもあるんかいなと
思っていたのですが・・・
>>256 >日付のみ並んだ一時的なテーブルを作って
>外部結合すればよいのかな?と思うのですが・・・
しろよ
でNVL使えばおわりだろ
258 :
NAME IS NULL :04/06/02 04:50 ID:7Ib8/agG
MYSQL4.0.18バイナリwindows版を自PCに入れて使用しています。
質問なのですが
create table averagePriceData (
id MEDIUMINT(8) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT,
itemName VARCHAR(150),
price MEDIUMINT(10) UNSIGNED DEFAULT '0' NOT NULL,
amount MEDIUMINT(10) UNSIGNED DEFAULT '0' NOT NULL,
time TIMESTAMP,
PRIMARY KEY (id)
);
このようなテーブルを作って商品データを入れます。
id itemName price amount time
1 ニンジン 100 50 20040601
2 トマト 200 20 20040601
3 ニンジン 150 20 20040601
4 ニンジン 200 30 20040601
5 ピーマン 200 50 20040601
6 ニンジン 20000 20 20040601
これで各商品の平均価格(相場)みたいなものを出したいのですが
6 ニンジン 20000 20 20040601
のような場合を除外して計算したいため、標準偏差を利用した反復切断方の
ようなものを使いたいと思っているのですが私はSQL自体が始めてでして
複雑な式はどのようにして書けばいいのか苦戦しております。
下記を参考にしました。
http://216.239.53.104/search?q=cache:Yb0uGw5IRpEJ:www.kenkoigaku.or.jp/html/kensa/kensa3301.html+%E6%A8%99%E6%BA%96%E5%81%8F%E5%B7%AE%E3%80%802SD&hl=ja&lr=lang_ja 私のやりたいことは基準値範囲内の価格だけを対象とし、平均価格を算出したいのです。
select avg(price <= avg(price) + (stddev(price))*2 && price >= avg(price) - (stddev(price))*2) from averagepricedata where itemName in ('ミルク');
で必死でマニュアルと睨めっこしつつ考えたのがコレなんですが、当然うまくいきません。
ここを確認しろなどのアドバイスいただければ幸いです。
尚、今回はamount と time のデータは算出要素にはいれず、
id itemName priceだけで算出しようと思っています。
>>258 標準偏差を用いても、その例に挙げたテーブルのニンジンの場合だと、
結局20000円(?)のニンジンも除外できないと思うが。
中位数を求めてそれを中心とした基準値範囲(中位数の50%〜200%等)で抽出した行の平均値(avg)を
出すってのはどうだろうか。
例えのニンジンの場合だと全体行が偶数なので、150と200の中間数175が中位数で、
その50%(87.5)から200%(350)までに収まる行の平均値を出すといった感じ。
で、中位数を求めるSQLを書こうと思ったのだが、これはこれで面倒だな。
検索するなり書籍を漁るなりして調べてください。ちょっと考えたけどダメだった...orz
260 :
258 :04/06/02 09:52 ID:7Ib8/agG
うむむ、そうなのですか・・perlで同じことをしようとしたときに統計学の反復切断法が あるよと教えていただいて今までcgiで同じようなものを作って管理してたのですが 流石にデータ量が多くなってくるとキツイのでsqlへの移行をしようとしました。 やっぱり書籍読むのがいいですかね・・ 月の小遣いが3000円なもので、できれば最初のうちはネットだけで済ませたいと 思い、mysql総合スレのテンプレサイトを読み漁っていたのですがアホには むずかしいようです。 今から立ち読みしてきます。
261 :
NAME IS NULL :04/06/02 10:37 ID:7Xm0LIwh
ちょっとスレ違いな気もしますが、 既存の仕様書もないテーブル構造をリバース(という表現は不適切かもしれませんが)するときに、 テーブル間のリレーション関係が、一対多か多対一か多対多か、という判断をするには、 どのような見方をすればいいんでしょうか?
262 :
259 :04/06/02 10:43 ID:???
>>260 反復切断法ってのを理解していないが、
avg(price) + (stddev(price))*2 と avg(price) - (stddev(price))*2 を
挙がっていた例えで求めたら、 24962.6679254022 と -14737.6679254022 に
になったし。
で、中位数をSQLで求めると非常に複雑になっちゃったので、SQLで全てを済ましても
速度改善になるかどうか? そこで、where itemname='ニンジン order by price だけで
一旦全て抜き出してPerl側で中位数を求めて、再度
where itemname='ニンジン' and price>中位数*20% and price<中位数*200% なんてやる方が楽かも。
全アイテム一覧を出そうとすると面倒だけどな。
以下、中位数を求めようとして書きかけたSQL
SELECT (SELECT max(price) FROM averagepricedata AS T1 WHERE (SELECT count(*) FROM averagepricedata WHERE price<=T1.price)<midc),
( SELECT min(price) FROM averagepricedata AS T2 WHERE (SELECT count(*) FROM averagepricedata WHERE price>=T2.price)<midc)
FROM (SELECT count(*)/2+0.5 AS midc FROM averagepricedata) AS T0;
上位の最小値と下位の最大値を出したところ。これの平均を取れば中位数となる。
と、アイテム別の抽出はまだ行っていないので、このままだと全データの中位数にしかならん。
263 :
259 :04/06/02 13:58 ID:???
暇つぶし&腹ごなしでitemname別に中位数をだし、その中位数の20%から200%までに 収まっている値の平均値を一発で出すSQLを書いてみたが、なんじゃこりゃーって感じになったぞw PostgreSQLのEXPLAINでクエリープランを表示すると66行で実行コストもとんでもねぇ値。 まだ無駄が残っていそうな感じでじっくり見直せばもう少しマシになるかもしれんが、 とても実用範囲に収まりそうにねぇな。
MySQL 4.0.18を使用しているのですが、SQLの書き方についての質問です。 カテゴリー id parentId name 0001 NULL ルート1 0002 NULL ルート2 0003 0001 枝1 0004 0001 枝2 0005 0003 葉1 0006 0003 葉2 0007 0002 枝3 0008 0007 葉3 みたいに木構造を持っているカテゴリテーブルと エントリー id category postedOn 1 0001 2002-05-15 2 0002 2003-03-16 3 0003 2003-06-01 4 0005 2003-06-19 5 0008 2004-01-20 6 0005 2004-03-12 エントリー.category = カテゴリー.id なテーブルがあります。 ここで、「ルート1」以下に所属するエントリーを全て SELECTするにはどういうSQLを書けばいいんでしょうか? 自分ではプログラム側で1カテゴリごとに再帰しつつ取得する しか考えつきません。なおかつpostedOn順にソートしたいので、 プログラム側でやるとコストかかりまくりです。 なんとかSQL一発で取得する方法はありませんでしょうか?
SELECT エントリー.id,エントリーcategory,エントリー,postedOn FROM エントリー LEFT JOIN カテゴリー ON エントリー.category = カテゴリー.category WHERE カテゴリー.name = "ルート1" ORDER BY postedOn こんなんでいいのか…電波受信しきれないorz
266 :
258 :04/06/02 18:33 ID:???
>>259 遅レスすいません。PC関連書籍いっぱい置いてある店に行って立ち読みして
帰ってくるのは半日がかりなもので。
レスありがとうございます。
やっぱりmysqlから該当データを取り出してperl側で処理させる方がいいのかな。
今はローカルだけどネット越しに複数箇所からmysqlに問い合わせがあった場合
結果だけを返すのに比べて転送量が結構凄いことにならないかなぁと考えた為
mysql側で処理しようと思いました。
若しくは、ネット越しにcgiに問い合わせをかけてcgiの内部処理として
mysqlを呼び出してデータ取り出してcgiで処理して結果を返すってのも
ありですかねぇ。
これから中位数を求める計算式とsqlのコードに再度取り組んで見ます。
#データベースのプログラムっていうのかコードって言うのか、
#ほかの言語と違ってなんかとっつきにくいですねぇ。
267 :
264 :04/06/02 18:56 ID:???
>>265 済みません言葉がたりませんでした。各カテゴリーは親カテゴリ(parentId)
を持っていて、木構造になっているのです。
>>264 の例だと
ルート1
┗枝1
┗葉1
┗葉2
┗枝2
ルート2
┗枝3
┗葉3
になっているということです。
やりたいのは、任意のカテゴリ*以下*に所属する全てのエントリー
つまりカテゴリ0001(ルート1)なら
「0001(ルート1)、0003(枝1)、0005(葉1)、0006(葉2)」のいずれかを
categoryカラムに持つエントリーを全て取得したいということです。
階層が葉まででいいなら、カテゴリから A. ルート1自身 B. parentIDが A な物 C. parentIDが B な物 をUNIONで結んで、それとエントリーを結びつければ。
269 :
264 :04/06/02 20:28 ID:???
>264 Oracleなら正にその為に作られた様な階層問合せという構文があり ますが、他のRDBMSであまり聞かないので需要があまりないという 事でしょうねぇ。 データ構造自体が再帰的な構造になっているので何等かの形で再帰 的な処理を行なわざるを得ないでしょう。
271 :
259 :04/06/02 21:04 ID:???
>>266 中位数から平均値を求めるのでよければ、ご参考に。
中位数をもとめるSQL
SELECT distinct itemname,
(SELECT avg(tmv) FROM
(SELECT (SELECT max(price) FROM averagepricedata AS T1 WHERE (SELECT count(*) FROM averagepricedata WHERE price<=T1.price AND itemname=T5.itemname)<=T0.midc AND itemname=T5.itemname)AS tmv FROM
(SELECT count(*)::float/2+0.5 AS midc FROM averagepricedata WHERE itemname=T5.itemname) AS T0
UNION ALL
SELECT (SELECT min(price) FROM averagepricedata AS T2 WHERE (SELECT count(*) FROM averagepricedata WHERE price>=T2.price AND itemname=T5.itemname)<=T3.midc AND itemname=T5.itemname)AS tmv FROM
(SELECT count(*)::float/2+0.5 AS midc FROM averagepricedata WHERE itemname=T5.itemname) AS T3
) AS T4)AS middleval
FROM averagepricedata AS T5;
※count(*)::floatはcount(*)で出た値をfloat型にキャストしているPostgreSQLの記述。なぜかcount(*)/2だと整数型で返ってくる。
実際にはSELECT INTO等 でitemname,middlevalの中位数テーブルを作って
中位数を先に出しておく。
averagepricedataテーブルに更新が入ればトリガを使って中位数テーブルを更新
抽出時に双方のテーブルを結合すれば実用できそうかな。
>258 とりあえず最初のアイデアに戻って標準偏差の2倍以内だけのデー タを使うという事であれば select id, avr(price) from (select a.id id , a.price price from averagePriceData a, (select id, avr(price) - stddef(price) * 2 minval, avr(price) + stddef(price) * 2 maxval from averagePriceData and group by id) b where a.id = b.id and a.price between b.minval and b.maxval) group by price でいけるんじゃないかと思います。が動かしていないので自信はあ りません。 実際に使う場合はデータの分散具合を見て2という数字は調整する 必要があるでしょうし、場合によってはitemによって変える必要も 出てくるかもしれません。 今回の例の場合、ニンジンの 20000というのが他と極端に違う値な ので平均値や標準偏差もその影響を受けてしまいます。これくらい 分散しているのであれば対数を取ってから平均/標準偏差で例外デー タを弾くという方法も考えられます。 もしくは上位/下位の何パーセントかを最初から除いてしまうとい う方法もあります。例えばニンジンのデータ数が100あるとしたら priceの上位/下位10データを除いてしまうという事です。極端でな いデータも除かれてしまいますが、それはそれで平均値に与える影 響は少ないと考える事ができます。この場合も10という値は実デー タを見て調節する必要があるでしょう。 いずれにしろ、一発で平均値を出すSQLを書くよりは一旦例外デー タを除いたデータを抽出するビューを用意してそこからselectした 方が分りやすいと思います。 ところでamountの方は考慮にいれなくて良いのですか。例で言えば ニンジン20000のamountが1000とかの場合、量が多いのだから例外 とはしないのか、逆に量が極端に多いから例外とするのか。
273 :
272 :04/06/03 00:09 ID:???
外側のselectが無駄ですね select a.id, avr(a.price) from averagePriceData a, (select id, avr(price) - stddef(price) * 2 minval, avr(price) + stddef(price) * 2 maxval from averagePriceData and group by id) b where a.id = b.id and a.price between b.minval and b.maxval group by a.id これ位ならビューを作る事もないかも。「2」の様なマジックナンバーが多数 出て来るのならビューを作っておいてもいいかもしれませんが。
>>272 標準偏差を用いて外れ値を検出する場合はたしかに標準偏差自体が
外れ値の影響を受けてしまうのでうまくないが、四分位範囲を用いた
方法なら外れ値の影響を受けにくい。
275 :
272 :04/06/03 01:41 ID:???
>274 ただ、その手の順序に依存した処理というのはSQLでは扱いにくい んですよね 例によって動作は確認していませんが select itemname, avr(price) from (select a.itemname a.price, count(*) cnt from averagePriceData a, averagePriceData b where a.itemname = b.itemname and (select count(*) from averagePriceData c where a.itemname = c.itemname and a.price < c.price) > cnt / 4 and (select count(*) from averagePriceData c where a.itemname = d.itemname and a.price > d.price) > cnt / 4 group by a.itemname) group by itemname でいけると思います。 これだと25%の境界位置に同一priceのデータが複数あった場合、排 除するデータが25%より多くなってしまいますが、データ数が十分 に多ければ問題にはならないでしょう。
AテーブルのTimeカラムが'2004/06/08'より以前の レコードを1000件だけ削除したい場合、下記のような SQLで良いんでしょうか? うまく実行されていないような感じで・・・ delete from A where Time in( select top 1000 Time from A where Time <= '2004/06/08' よろしくお願いします。 )
>>276 [Time]に重複がある場合は、千件以上削除されるね。
279 :
276 :04/06/04 16:06 ID:???
>>278 declare cur cursor for
select
top 1000
Time
from A
where Time <= '2004/06/08'
などとカーソルcurを定義して、
delete
from A
where Time
in(
fetch forward all in cur
)
としてもダメなんですね。
サブクエリにはfetchは定義できず、悩み中。
奥が深いっすね・・
sql文について質問させて下さい。 任意のidが分かっている状態で、 そのidの前のidと次のidを得るsql文を作る事は可能でしょうか? 並び方はidの昇順、降順ではなく別のカラムでorder byされているものとします。 出来ればmysql3.23で動作するsql文を教えて下さい。 宜しくお願いします。
WHERE ID < 任意のID ORDER BY ID DESC で取った最初の1件。
>>280 SELECT * FROM table1 ORDER BY num;
id | num
--+----
C | 10
E | 20
D | 30
B | 40
A | 50
で、idにDを指定したら EDBを抽出するという意味かな?
つーか、サンプルテーブルと期待する結果ぐらい書けよ。
283 :
249 :04/06/06 17:02 ID:IlRX9Yvv
以前に>249で質問させていただいたものです。 2つのテーブルの結合はうまくいきました。 ありがとうございます。 同様に空白日付を埋めたいのですが、今回は4つのテーブルを 結合しなければうまくいきません。 LEFT OUTER JOINを入れ子にしたいのですが、このSQL文ではエラーが出ます。 SELECT CDATE(DM.日付) AS 販売日付,DM.曜日,SUM(MM.金額),GR.グループ名 FROM ((((Dummy.txt AS DM LEFT OUTER JOIN Menu.txt AS MM ON DM.日付=MM.日付) INNER JOIN Goods_Mstr.txt AS GM ON MM.コード = GM.商品コード) INNER JOIN Sect_Mstr.txt AS SM ON GM.部門 = SM.部門コード) INNER JOIN Group_Mstr.txt AS GR ON SM.グループ = GR.グループコード) WHERE GR.グループ名='ドリンク' AND MM.日付 Between '2004/01/01' AND '2004/01/31' Group By DM.日付,DM.曜日,GR.グループ名; FROM 句の「LEFT OUTER JOIN」をI「NNER JOIN」に差し替えるとエラーは出ないので、 スペルミスは無いと思います。 文法間違いかとおもうのですが、誰か煽ってやってください。 Excel VBAでADOを使ってTxtファイルを読み込んでいます。
自分の仕事が終わらないからって丸投げはよくないよ
286 :
249 :04/06/06 18:29 ID:IlRX9Yvv
ありがとうございます。 >284 そんなつもりじゃ無いです。 晒すネタは多い方が良いかと・・・ >284 >括弧要るのか? はずすとエラーしました。 文法的におかしく無ければ あきらめるしかないのか・・・ キチンとしたRDBじゃないとだめなのかなぁ
287 :
280 :04/06/07 09:11 ID:???
>>281 その方法だとIDの昇順、降順になってしまいます。
>>282 失礼しました。
おっしゃるとおりです。
idにDを指定したらEとBを得たいのですが、方法が分かりません。
>>287 SQLが長くなるので一旦VIEWをつくるけど。
CREATE VIEW view1 AS SELECT *,(SELECT count(*) FROM table1 WHERE num<=T1.num)AS cnt
FROM table1 AS T1;
SELECT id FROM view1
WHERE cnt <=(SELECT cnt FROM view1 WHERE id='D')+1
AND cnt >=(SELECT cnt FROM view1 WHERE id='D')-1;
結構コストが嵩むので、VIEWやサブクエリの代わりにトリガを使って、
cntを含めたテーブルにするべきなんだろうな。
289 :
NAME IS NULL :04/06/07 10:26 ID:lL5ZseT8
テーブル名:デジコ キャラ 4月 5月 6月 7月 -------------------------- A キタ キタ キタ キタ B コネー コネー キタ キタ C キタ コネー キタ キタ D コネー キタ コネー キタ E キタ コネー キタ キタ から EとDのキタをカウントしないで、各月のキタ数の合計を求める select文がほしいのです。 テーブル名:カウントキタ キタ数 4月 5月 6月 7月 -------------------------------- キタ数 2 1 3 3 この除いてカウントするってのがわからんくて・・。 キャラ!=D and キャラ!=Eで条件つければできますが、これだと除くキャラが 多いときSQL文が書きにくくて困ってます。何かよい方法ありませんでしょうか? DBバージョンはオラクル9i
>>289 WHERE キャラ NOT IN ('D','E',....);
FROM (select * from デジコ where キャラ not in ('A','B')) 頼むから正規化しろよ
292 :
280 :04/06/07 16:21 ID:???
>>288 ありがとうございます!
すごく複雑ですね。
mysql3.23ではVIEW、サブクエリ、トリガは使えないので
別の方法で乗り切るしかなさそうです。
ありがとうございました。
293 :
NAME IS NULL :04/06/07 18:08 ID:nSfxM7N+
どなたか教えてください。オラクル8i使用中 REDOログ がごみ箱に・・・・原因がわかりません。どなたか同じ現象を起こした方いらっしゃいませんか
>>293 > REDOログ がごみ箱に・・・・
なったんか?
ならんのか?
はいらんのか?
まさか....恋したのか?(w
逝っている事が判りません、誰か通訳出来る方いらっしゃいませんか?
(助けたくても助けられないじゃん!)
ガゴミ箱って何を入れる奴? やっぱガゴミ?
オラクル8iを使用してストアドプロシージャを作成。 INSERT文の中でSELECT文を使い、他のテーブルにあるデータを登録したいのですが、 SELECT文のCASEの部分でコンパイルエラーになってしまいます。 エラーの内容は「記号CASEが見つかりました。」という感じです。 INSERT文中のSELECTではCASEを使えないのでしょうか?
297 :
NAME IS NULL :04/06/08 02:13 ID:pFkODj97
Postgres7.4使ってます。 一本のSQLでサブクエリで検索した結果によって update内容を変えたりできるでしょうか? あるテーブルを検索して値がAならCにBならDにupdateするとか。
299 :
297 :04/06/08 13:28 ID:pFkODj97
>>299 普通、質問者が例えと希望する結果を出すもんだ。
>>297 の内容だとこんなんでいいんか?
UPDATE t1 SET colm1=(CASE t2.colm1 WHEN 'A' THEN 'C' WHEN 'B' THEN 'D' END) FROM t2 WHERE t1.colm2=t2.colm;
値の種類が増えたら面倒だとか、想定が違うとかだけ言うなよ。
てめーの脳内までしらんからな。
301 :
NAME IS NULL :04/06/08 17:15 ID:LsPNiv6w
質問が意味不明ですいませんでした。 REDOログがごみ箱に入ってしまってました。どうしてごみ箱に入っていたのかがわかりません。 なにかの以上で入るのでしょうか? どなたか同じ現象を起こした方いらっしゃいませんか。
>>301 削除{した|された}から入ってるんだろ?それも「ゴミ箱を使って削除」だから、
エクスプローラ経由で(手動で)削除したかなんかだろうな。
プログラムで kill していたりバッチで del してもゴミ箱には入らないからな。
システムログ見てログインしている奴さがして聞いてみるべし。
まさか「ログオンしっぱなしの鯖」なんちゅうんじゃないだろな?
303 :
296 :04/06/08 21:52 ID:???
誰か教えてください。 お願いします。
>>303 つか、ストアドと言っているが、8iまでは 'CASE' なんて
キーワードはPL/SQLには予約されていない。9iからだ。
それと、それがINSERT...SELECT構文で使えるかどうかはまた別。
>>296 何がしたいのかわからんが、
とりあえず勘でDECODEを使えと言ってみる。
307 :
296 :04/06/09 21:18 ID:???
説明が足りなかったようですみません。 INSERT INTO TABLE (CODE, NAME) VALUE( SELECT CODE, CASE WHEN CODE='a' THEN NAME1 WHEN CODE='b' THEN NAME2 ELSE ' ' END A, FROM TABLE2) 上のように、テーブルの内容を別のテーブルにインサートしたいのです。 そして、列の値によって、コピーする列を変えたいのです。 SQLPLUSで直接上のようなSQLを実行すると正常終了します。 しかし、プロシージャ上だと、CASEの部分でコンパイルエラーになってしまいます。 プロシージャではCASEは使えないのでしょうか?
308 :
296 :04/06/09 21:20 ID:???
>>306 DECODEを使うとCASEと同じような事ができるようですね。
この2つは違うのでしょうか?
8iってのが微妙 たしかCASE文が使えたのは、バージョン8.1.6から だったように記憶しておるです
PL/SQLってMySQL上でも使えるんでしょうか? 書くとエラーが出てしまいます。
>311 PL/SQL≒Oracle方言
蟻が塔ございました。
314 :
NAME IS NULL :04/06/14 15:26 ID:Ze/DrFad
初歩的な質問でもうしわけないですが テーブル名:計上先 ID 4月 5月 -------------------------- A 02 02 B 12 12 C 13 43 D 34 44 テーブル名:見積 ID 見積番号 -------------------------- A 99111 B 02323 という二つのテーブルがあって、 計上先にあって見積に存在しないIDを抜き出したいのですが、 どうすればいいのでしょうか? select ID from 見積,計上先 where 計上先.ID != 見積.ID ではうまくいきませんでした。 オラクル9iです
NOT IN
>>314 SELECT id FROM 計上先 WHERE NOT EXISTS (SELECT * FROM 見積 WHERE id=計上先.id);
#計上先テーブルが正規化されてないのが気になるが。まぁガンガレ。
すいません、このようなテーブルがあるときに、 flag1 | flag2 | flag3 ------+-------+------- 1 | 0 | 1 1 | 0 | 0 1 | 1 | 0 0 | 0 | 0 1 | 0 | 0 0 | 1 | 0 それぞれのカラムで値が 1 の物のCOUNTを取って flag1 | flag2 | flag3 ------+-------+------- 4 | 2 | 1 と出したいです。 この場合どのようなSQLを書けばよいのでしょうか? count() の中に select 文をそれぞれ入れたんですが うまくいきませんでした。 データベースはMySQL です。
>>317 カラムの型がワカランのだが、INTEGERなどの数値型で、1か0だけなら、
SELECT sum(flag1),sum(flag2),sum(flag3) FROM table;
でいけると思うが。ダメかな。
あと、SELECTリストにサブクエリがかけるのなら、 SELECT (SELECT COUNT(*) FROM table WHERE flag1=1),(SELECT COUNT(*) FROM table WHERE flag2=1),(SELECT COUNT(*) FROM table WHERE flag3=1); とするのが、汎用的な解か?
320 :
317 :04/06/14 19:01 ID:???
>>318 型はcharです。
intだとその方法がスマートですね。
>>319 ありがとうございますー
これでやってみます。
>>320 CHARでも自動変換されない?
どっちにしても
SELECT sum(flag1 = 1),...
とかで十分な気がする。
322 :
317 :04/06/14 20:41 ID:???
>>321 自動変換されましたー
ありがとうございます!
323 :
NAME IS NULL :04/06/15 17:48 ID:anO/9QVt
>>314 じゃないのですが似たような事してるので質問します。
>>316 で回答されている
SELECT id FROM 計上先 WHERE NOT EXISTS (SELECT * FROM 見積 WHERE id=計上先.id);
の*をidにした方が速くなったりしますか?
>>323 いまどきのRDBMならかわらんだろ。
行があるかどうかだけ確認していると思われ。
パーサのことを考えると下手にカラム名を書くより*の方が
楽なような気もする。
それよりか、安易に(NOT) INを使って次のようなSQLを
書かないことに気をつけたほうがよかね。
SELECT id FROM 計上先 WHERE id NOT IN (SELECT id FROM 見積);
>>326 単なるEmacs信者じゃん。
「何だか知らないけど使うな」とかそんなんあるし…
すいませんが質問させてください DB2で文字列の置換を行いたいのですが replace関数を使うと、 「十分なページ・サイズを持つシステム一時表スペースが存在しません。」 というエラーが出てしまいます このエラーはreplace関数を使ったときだけ出ます replace関数は使用しない方がいいのでしょうか? SQLはメチャ簡単にして以下の通りです select TBL_1.CD,TBL_1.NM_2 from (select CD,replace(NM,' ','') NM_2 from TB_ADR ) TBL_1 group by CD,NM_2 よろしくお願いします
329 :
NAME IS NULL :04/06/18 23:35 ID:ECpKGwAu
お聞きしたいのですが PL/SQLで、ストアドプロシジャ内で カーソル変数を宣言するとき、引数でとってきた値を WHERE句の検索条件にしていすることはできますか? CREATE PROCEDURE SS ( quote IN CHAR ) IS CURSOR cur(last CHAR) IS SELECT EMPNAME FROM EMP WHERE EMPNO = last; BEGIN SELECT quote INTO last FROM DUAL; OPEN cur(last); 〜 みたいな事をやりたいのです。
331 :
NAME IS NULL :04/06/19 01:05 ID:+pGZo/Sk
ありがとうございます。 やってみます。
検索してもログよんでも見当がつかないので質問させていただきます A [ID,名前など.....] B [ID,Comment] C [ID,Comment,Comment2] と3つのテーブルがあると仮定して SELECT * FROM A WHERE A.ID=B.ID or A.ID=C.ID と結合するときに、Bと結合したかCと結合したかのデータをレコードに含ませたいのですが 無理(不自然)なことなのでしょうか SELECT *,[結合したテーブルの名前を取得する関数] as TableName FROM A WHERE A.ID=B.ID or A.ID=C.ID みたいにできると最高なのですけれど。。 BとCに全行にTableNameを併記するしかないのかな お手数おかけしますが手が空いたときにでもご教授ください
>>333 FROMにBとCが入ってないぞ
SELECT *
FROM
A LEFT JOIN B ON A.ID=B.ID
LEFT JOIN C ON A.ID=C.ID
WHERE
B.ID IS NOT NULL or C.ID IS NOT NULL
B.ID と C.ID が NULL かどうかで判断できるから
あとはCASEで適当な文字列を返すようにすれば良いかと。
>>334 さん
ありがとうございますです
おかげでなんとか今日中に仕上げられそうです
336 :
NAME IS NULL :04/06/20 00:23 ID:1HFExj/5
SELECT id FROM 計上先 WHERE id NOT IN (SELECT id FROM 見積); SELECT id FROM 計上先 WHERE NOT EXISTS (SELECT * FROM 見積 WHERE id=計上先.id); 上記2つのSQLって結果が同じになるのですよね? 何故NOT INを使わない方がいいのでしょうか?
>>336 上は基本的にテーブル順スキャンする。
下は見積.idにインデックスが張られていればインデックススキャンする。
(NOT)IN(サブクエリ)の形式はほとんど(NOT)EXISTS(相関サブクエリ)に
置き換えられるので、EXISTSを使った方が速い。
idにインデックスが張られていた場合は早くなる、という事でしょうか? SELECT id FROM 計上先 WHERE NOT EXISTS (SELECT * FROM 見積 WHERE id=計上先.id); in句の場合はidを指定(?)していますが、EXISTSだとidを指定していませんよね。SELECT *だし。 なのになんでEXISTSでidが条件となっているように出来るんでしょうか? インデックス張っているからでしょうか?
339 :
NAME IS NULL :04/06/20 08:23 ID:I55AKty9
WindowsXP pro sp2にSQL7.0DesktopEditionをインストールしてるんですが インストールの初めでユーザーアカウントがログイン出来ずに失敗してしまいます。 WindowsXPのユーザーアカウント作成方法はWindows2000とかと異なるのでしょうか? WindowsXPにSQL7.0をインストールされた方、ご教授願います。 よろしくお願いします。
なんでXP proにSQL鯖なんだよ MSDEで十分だろ
>>338 インデックスが働いているのはサブクエリのWHERE句だ。
IN述語(句じゃねぇ)のサブクエリは計上先.idと同じ見積.idが見つかるまでテーブル全行を返す。
NOT INだったら、全行比較して全て外れて初めて真になる。これを 計上先.id 分繰り返すわけだ。
最近のRDBMはIN述語のサブクエリ結果をうまく保持して使いまわししているので、昔よりは
速度が改善されている。
EXISTS述語の相関サブクエリは、WHERE id=計上先.idが真の行だけ返す。
1行でも見つかれば、その時点で真。見つからなければ偽。これを同じく 計上先.id 分繰り返す。
つまりIN述語のサブクエリはテーブル全行。EXISTS述語は1行。
WHERE id NOT IN (SELECT id FROM 見積 WHERE id=計上先.id);
ってすれば... って言うなよ。計上先.idと見積.idを無駄に2回比較している。
これを一発で済ますのが、WHERE NOT EXISTS (SELECT * FROM 見積 WHERE id=計上先.id);だ。
IN述語には左辺があるが、EXISTS述語に左辺がなく、右辺の真偽のみ。
342 :
NAME IS NULL :04/06/20 09:46 ID:I55AKty9
>>342 最新版のMSDE2000Aは使わないの?
344 :
NAME IS NULL :04/06/20 17:22 ID:I55AKty9
>>343 もちろん持ってるし別で使ってます。
今回は7.0の環境が特別に必要なので。
>>341 WHEREよりINの方が早いと教わって、今の所、EXISTS述語というのを使ったことが(見たことも)なかったので、
良く分からなかったのですが、丁寧にありがとうございました。
>>345 おそらく、現在稼動中のSQL Server 7.0 相当の環境を開発機の
中に作ろうとしてるのでは無いかと。
しかし、MSDE7ってWindowsXPで動作保障されているのかなぁ。。
DEっていう
351 :
NAME IS NULL :04/06/22 11:03 ID:1HWKGmgT
bytea 型のデータに SQL で, insert into するにはどう書けばいいの?
SQLを教えてください。 テーブルA | テーブルB ――――――――――――――― ABC100 | ABC103 DEF100 | ABC104 ABC101 | ABC100 ABC102 | DEF100 ABC102 | ABC101 DEF102 | ABC102 ――――――――――――――― の様なテーブルから ABC100 ABC101 ABC102 ABC103 ABC104 の様なレコードを取得したいのですが SQL文がわかりません。 宜しくお願いします。
>>352 テーブルAとテーブルBって...?
別々のテーブルなのか? それともカラム名なのか?
抽出条件はABCから始まっている行なのか?
単発SQLより、DBの基礎をやり直した方がいいんじゃね。
>>353 テーブルA [CODE]| テーブルB [CODE]
―――――――――――――――
ABC100 | ABC103
DEF100 | ABC104
ABC101 | ABC100
ABC102 | DEF100
ABC102 | ABC101
DEF102 | ABC102
―――――――――――――――
すみません。
テーブルは別々です。
抽出条件が、[CODE]がABCから始まっている重複しない
レコードです。
お願いします。
>>354 SELECT code FROM tableA WHERE code LIKE 'ABC%' UNION SELECT code FROM tableB WHERE code LIKE 'ABC%';
>>355 できました。
ありがとうございました。
357 :
NAME IS NULL :04/06/23 15:59 ID:N2tC71tr
テーブル名:デジコ キャラ 萌え度 -------------------------- A 4 B 7 C 10 テーブル名:KITA キャラ イケてる -------------------------- B キター C キター D コネー から Sキャラ イケテル 萌え度 --------------------------------------------------- A 0(もしくはnull) 4 B キター 7 C キター 10 D コネー 0(もしくはnull) という結果を得たいのです。 leftjoinだけではできないので何か良いSQL文ありませんか? DBはOracl9iです。
>>357 FULL OUTER JOINは使えなかったっけ?
しかし、どうでもいいけどイタいテーブルだな…。
>>358 おまけに、このパターンは聞きっぱなし厨のようだ。
360 :
NAME IS NULL :04/06/24 10:30 ID:V3l4tOLh
実際には多くのテーブルをリレーションしているSQLなのですが 詳細サンプルを書くのは難しいので部分的に抜き出します。 で、後で何とか考えてくっつけてみます。 ORACLE8i テーブル名 TEST 項目 (キー、番号、日付、項目1、項目2) 「番号」が重複している場合「日付」が一番新しいレコードだけを抽出。 select * from TEST, (select 番号 a番号, MAX(日付) a日付 from TEST group by 番号) a where TEST.番号 = a.a番号 and TEST.日付 = a.a日付 これだと「番号」と「日付」の組み合わせで 重複しないと言う前提になっちゃってます。 条件付けをキー項目で出来れば簡単で確実なのですが。 GroupとMAXがそれを許してくれません。 もっと効率いい方法があればお願いします。
>>360 これでいいのかな?
select * from TEST as T1 where 日付=(select max(日付) from TEST group by 番号 having 番号=T1.番号);
362 :
361 :04/06/24 13:21 ID:???
あれ、ひょっとして結果は360とおんなじになっちゃう? 重複したときはどういう結果がほしいんかな?
レスありがとう御座います。
重複はありえないって事で良いかもしれません。
それと
>>361 が実行できないのですが
あ、asを消すと逝けました。どうもです。
>>361 を使っての続きなのですが
テーブルをサブクエリーに置き換えたいのですが凄く長いのです。
ここのテーブルをサブクエリーにしたい場合 こっち側も同じ様にサブクエリー
↓ を書くしかないのでしょうか
↓ ↓
select * from TEST as T1 where 日付=(select max(日付) from TEST group by 番号 having 番号=T1.番号);
修正が面倒になるし処理に無駄が出そうなのですがどうなのでしょう?
366 :
361 :04/06/24 19:58 ID:???
>>365 某MLで似たような質問が出てましたが、
単純に重複するサブクエリを簡略化するような回答は無いですね。(今のところ)
俺も知りたいところだ。
サブクエリが不変ならViewを使う手もある。処理そのものは変わらんけど。
んで、まぁ勝手な想像なんだけど、重複や繰り返しのサブクエリがある場合に、
その処理毎にそのサブクエリを処理するんじゃなくて、内部的に保持して
使いまわすことにより高速化を図るように各DBベンダーががんばってんじゃ
ないかなぁ。
実際PostgreSQLはサブクエリまわりで高速化されているし。
367 :
NAME IS NULL :04/06/25 01:44 ID:hn02u0GO
DB2で質問です。 mytable id1|id2|no|num ---+---+--+--- 1 |2 |3 |4 1 |2 |4 |1 2 |3 |2 |1 3 |1 |1 |5 というテーブルがあって 指定のid1,id2でnoとnumの最小値が出てくる id1|id2|no|num ---+---+--+--- 1 |2 |3 |1 1 |2 |4 |1 という風にしたいです。 MySQLだと SELECT id1,id2,no,MIN(num) from mytable WHERE id1='1' AND id2='2' GROUP BY id1,id2 でいけるんですが DB2だとGROUP BYでnoも指定しろ、と言われてしまいます。 どのように書けば良いでしょうか?
>>366 ありがとう御座います。
処理自体はうまく実行できてるのでこれで行きます。
どうもです。
はじめまして。 ASPとSQLサーバーを使ってるんですが、 ひとつのデータベーステーブルから値をひろって、それを別のデータテーブルに 代入したいのですが、変数を使う場合SQL文はどう表記すればいいのでしょうか? Set rs=conn.Execute("Select * from table1") で、これをテーブル2に conn.Execute("Insert table2 (Id,Name,Address,Tel) value (rs('ID')&rs('Name')&rs('Address')&rs('Tel')") これだとエラーになってしまうんです。 すいませんどなたか助けてください。
>>370 MySQLって使ったこと無いのだが、
>>367 のようなSQLが通るんか。
例えば、table1(id,num,txt)で
SELECT id,MIN(num),txt FROM table1 GROUP BY id;
がMySQLは実行できるってことだよな。
ちなみに、答えのヒントは直前の
>>360-366 にある。
>>369 SQLserverもけったいなSQLだなぁ。ASPもSQLserver知らないので、
どちらの変数なんかもワカランのだけど。
ついでに、標準的(なのか?)なSQLで一発で済ませられる。
INSERT INTO table2(Id,Name,Address,Tel) SELECT ID,Name,Address,Tel FROM table1;
369はSQL Serverがどうこうじゃなくて、完全にASPの使い方の問題と思われ。
>>372 やっぱそーか。ってか、そうだよなぁ。
ついつい、M$の特殊仕様と疑ってしまう。
374 :
NAME IS NULL :04/06/25 13:43 ID:PSV9Ft8u
Oracleで言う所のNvl関数はSQLServerにはありませんか? 某会議室で検索したのだけどログがサーバーエラー出て見れません・・・
isnull
ありがとうございます!
377 :
369 :04/06/25 13:55 ID:IMVNNnLT
>>371 ありがとうございます。でもじつは
今2つのデータテーブル(フィールドはどちらも前述のId、Name、Address、Tel)を1つにまとめたいと考えていて、
そこで問題なのがおたがいのIDが重複している可能性があるので、一度両方のデータセットを取得して、
IDの衝突がないことを確認してその時点でのクエリ(rs配列にあるValue)をInsertしていく・・
という方法を考えています。こういう場合は、他にもっといい方法があるのでしょうか?
本をいろいろ探してみても変数をSQL文に代入する例は殆どありません。でもこういうケースって多いと思うのですが・・?
みなさんはどう解決してるのですか?お願いいたします。
>>377 全てのフィールドが重複してれば片方のみってのなら、
INSERT INTO table2(Id,Name,Address,Tel)
SELECT ID,Name,Address,Tel FROM table1
UNION SELECT ID,Name,Address,Tel FROM table3;
#って、INSERTのSELECTでUNIONなんて使ったこと無いので未確認だが。
IDのみの重複でtable1を優先挿入なら、
INSERT INTO table2(Id,Name,Address,Tel)
SELECT ID,Name,Address,Tel FROM table1
UNION ALL SELECT ID,Name,Address,Tel FROM table3 WHERE NOT EXISTS (SELECT * FROM table1 WHERE ID=table3.ID);
かな。ともに未確認。
文字列型のフィールドに対し、部分比較をするにはどうしたら良いでしょうか? data_a ------------- aaaiii aaakk bbbcc aaacc のようなテーブルがあった場合に、フィールド「data_a」から、頭3桁が「aaa」の データを取りだすということなんですけど、良い方法はありますでしょうか? 宜しくお願いします。
>>380 SELECT data_a FROM field WHERE data_a LIKE aaa%;
もしくは
SELECT data_a FROM field WHERE data_a LIKE aaa*;
>>380 SELECT * FROM table WHERE data_a LIKE 'aaa%';
384 :
380 :04/06/25 16:09 ID:???
すみません。もう一つだけ聞かせて下さい。
>>380 のようなテーブルの中から、頭から3桁目だけを比較したいのですが、
良い方法があったら教えて下さい。
教えて君ですみません。
>>384 WHERE data_a LIKE '__a%';
>>385 ありがとうございます。
大変助かりました。
387 :
NAME IS NULL :04/07/01 16:59 ID:oNKFG8TB
SQL文の書き方を教えてください。Access2000でやろうとしています。 まず注文テーブルに下記のようなデータが入ってるとします。 pkeyは注文番号です。 注文番号 部品番号 個数 注文先CD 注文日 受付者CD 00000001 001001 01 A001 2004/03/21 U00012 00000002 001001 05 A002 2004/06/22 U00012 * 00000003 001001 02 A001 2004/05/01 U00014 00000004 001004 18 B001 2004/05/11 U00014 * 00000005 001004 01 A002 2004/03/16 U00014 00000006 001006 01 B003 2004/05/10 U00014 00000007 001006 09 A001 2004/05/15 U00015 00000008 001006 04 A002 2004/05/30 U00016 * 00000009 001009 10 A002 2004/05/11 U00016 00000010 001009 20 A001 2004/06/20 U00017 * 部品番号毎で注文日が一番新しいデータのみを抽出したい。 抽出対象となるデータは右に*が付いてるレコード。 (*は目印のためにつけたのでデータに含まれてるとかじゃないです) 結果は下記のようになる。 注文番号 部品番号 個数 注文先CD 注文日 受付者CD 00000002 001001 05 A002 2004/06/22 U00012 00000004 001004 18 B001 2004/05/11 U00014 00000008 001006 04 A002 2004/05/30 U00016 00000010 001009 20 A001 2004/06/20 U00017 こういう場合ってどうSQLを組めば良いんでしょうか? 部品番号でGroupして、そして注文日はMaxで でもその他の項目はどうやれば...みたいな感じで わかんなくなってきました... 実現可能でしょうか?
サブクエリを使って。
>>387 select * from table
where 部品番号 & 注文日 in (
SELECT 部品番号 & Max(注文日) AS 式1
FROM table
group by 部品番号
)
access2002で確認した。
390 :
NAME IS NULL :04/07/01 18:48 ID:cbRg6fOS
プロシジャの内容(定義)を見る方法を 教えてください。
>>390 MSSQLならsp_helptextを使うとか(あとは検索してね)
部品番号ごとの最新の注文日をとってくるだけでしょ?
様々な解がありそうですが?
>>388 さんのやり方以外でもUNION句とWHERE条件の絞込みで楽勝っぽい。
GROUP BYとMAXやTOPとDISTINCTでもいけそうだよ!!
393 :
NAME IS NULL :04/07/01 23:28 ID:ifmWvhvc
PostgreSQLで質問です。 (注文テーブル) 受注番号 受注日 商品番号 個数 顧客番号 00000001 2004/05/10 S01001 01 C000003 00000002 2004/05/12 S01002 05 C000002 00000003 2004/05/23 S01003 02 C000004 00000004 2004/05/30 S01003 03 C000003 00000005 2004/05/31 S01001 02 C000004 00000006 2004/06/01 S01004 01 C000002 00000007 2004/06/07 S01005 10 C000002 00000008 2004/06/14 S01002 05 C000004 00000009 2004/06/27 S01005 10 C000004 00000010 2004/07/01 S01001 03 C000003 (商品テーブル) 商品番号 販売価格 S01001 100 S01002 50 S01003 200 S01004 30 S01005 10 この2つのテーブルから、顧客番号と受注年月をキーとした 下記のような集計結果を得たいのですが、どう組めばいいかわかりません 顧客番号 受注年月 金額 C000002 2004/05 250 C000002 2004/06 130 C000003 2004/05 700 C000003 2004/07 300 C000004 2004/05 600 C000004 2004/06 350 どなたかよろしくご教示ねがいます
宿題丸投げスレだ… で、そうやって仕事を丸投げして お前は金をもらうわけだ
>>393 その程度のSQLが書けないようだとDBなんて弄るメリット無いだろ。
>>389 いつも思うんだが
この手の問題があると真っ先に ... in ( select max(...) from ... ) な
レスがつくんだが、これってどっかで流行ってんのか?
>>396 答えてる人が毎回おなじとか
>>393 SQLSERVER版の答えがこれ。PostgreSQLで動くかは知らんが、
動かなければ自分で直せ。
できないならSQLは向いてない。
select 注文.顧客番号, 注文.販売月, SUM(注文.個数*商品テーブル.販売価格) as 金額
from
(select 注文テーブル.顧客番号,ROUND(CONVERT ( varchar(20) , 注文テーブル.受注日, 112 )/100,0) as 販売月,商品番号,個数
from 注文テーブル where(month(注文テーブル.受注日) = 5)) as 注文 left outer join 商品テーブル on 注文.商品番号 = 商品テーブル.商品番号
group by 注文.顧客番号, 注文.販売月, 注文.顧客番号
union
select 注文.顧客番号, 注文.販売月, SUM(注文.個数*商品テーブル.販売価格) as 金額
from
(select 注文テーブル.顧客番号,ROUND(CONVERT ( varchar(20) , 注文テーブル.受注日, 112 )/100,0) as 販売月,商品番号,個数
from 注文テーブル where(month(注文テーブル.受注日) = 6)) as 注文 left outer join 商品テーブル on 注文.商品番号 = 商品テーブル.商品番号
group by 注文.顧客番号, 注文.販売月, 注文.顧客番号
union
select 注文.顧客番号, 注文.販売月, SUM(注文.個数*商品テーブル.販売価格) as 金額
from
(select 注文テーブル.顧客番号,ROUND(CONVERT ( varchar(20) , 注文テーブル.受注日, 112 )/100,0) as 販売月,商品番号,個数
from 注文テーブル where(month(注文テーブル.受注日) = 7)) as 注文 left outer join 商品テーブル on 注文.商品番号 = 商品テーブル.商品番号
group by 注文.顧客番号, 注文.販売月, 注文.顧客番号
398 :
NAME IS NULL :04/07/02 02:32 ID:lEFQy7mB
他スレで質問しましたが、スレ違いだったようなのでこちらで質問させて下さい。
【必要な機能】 ロボット検索技術を応用した、インターネット上の販売情報を検索することができるソフト。商品名やスペック等からリアルタイムな情報を検索することができる。その得た情報をMYSQLなどのDBに落とし込みたい。
【. 目 的 】 リアルタイムに価格比較できるPC比較サイトを作りたい
【. 使用OS 】 windowsXP
【. 条 件 】 10万以内なら払いたい
■試したけど条件を満たさなかったソフト
【. 名 称 】 まったく見つからず
■これだけはやりました
【
>>1-10 、FAQ集、上手な検索の仕方 を読んだ 】 はい
【 調べたサイトの名前 】 GOOGLE YAHOO など大手検索エンジン
【検索キーワードは? ..】 ロボット型検索技術 クロール ソフト
恐らくこのようなソフトはないと思います。。
この技術の最も単純なソフト。もしくは応用が聞くような単純ソフトがあれば・・・・などと不遜にも考えています。
ちなみに下記2サイトで私がやりたいような事を行っております。
http://www.bestgate.net/ http://yasune.dokoda.jp/ このような技術の雛形などご存知の方いましたらどうかご教授下さい。
文字列リテラルのサニタリーチェックって何?
date | class | count ----------+---------+------- 20040723 | 0 | 5 20040723 | 1 | 9 20040723 | 2 | 75 20040724 | 0 | 14 20040724 | 1 | 17 20040725 | 0 | 14 20040725 | 1 | 19 : などという表があるとき、下記のように並び替えるにはどうすればいいでしょうか? やはり、3つのSQLの表を求めて、JOINさせるしかないのでしょうか? date | class 0 | class 1 | class 2 ----------+---------+---------+--------- 20040723 | 5 | 9 | 5 20040724 | 14 | 17 | 0 :
んだ。
>>399 sanitary belt 生理帯.
sanitary engineer 衛生技師; 配管工; 〔米〕 〔婉曲〕 ごみ清掃[収集]員.
sanitary engineering 衛生工事[工学].
sanitary landfill 地下埋め込み式ごみ処理(法・場).
sanitary napkin 〔米〕,
sanitary towel 〔英〕 生理用ナプキン.
sanitary ware [集合的に] 衛生陶器 《便器・浴槽など》
生理だな。
405 :
oraora :04/07/05 01:32 ID:RTzQYzWC
@先発 select for upate A後発 select for update nowait だとAはエラーが返されるけど、 Aでロックをかけようとしたとき、 既にロックをかけている@をエラーにする オプションってないの?
初心者でございます。 table a id sex etc 1 1 小学校の同級生 2 2 高校の同級生 3 1 中学の先生 4 3 同僚 5 1 上司 table b sex kanji 1 男 2 女 3 おかま aから性別で集計をしたいのですが select sex,count(id) from a group by sex bを使って 男 3 女 1 おかま 1 と出力するにはどうしたらいいのでしょうか。 よろしくおねがいします。
>>406 SELECT kanji,c FROM (SELECT sex,count(sex)AS c FROM a GROUP BY sex)AS a2,b WHERE a2.sex=b.sex;
試してみます。 ありがとうございました。
index,num ---------- 1,100 2,200 3,1000 . . というようなテーブルから単純にselectで抽出した不特定の行数を数えるのはsqlで 可能ですか?それとも外部処理ですか? ふと疑問に思い質問します。 当方趣味でsqliteを使い気象観測データのようなものをデータベースで利用中。
>>409 select count(*) from table;
ということじゃないのか?
テストデータを示すなら、セットで期待する結果も書いたほうがいいでつよ。 行数カウントならCOUNTでいけるのでわ。
>410,411ありがとうございました。count()で可能でしたか。勉強になりますた。 SQLの結果をperlで受けて配列の要素数を数えれば事足りましたが、もしや SQLで処理ができるかもしれない、と思い考え中でした!
413 :
NAME IS NULL :04/07/06 18:44 ID:10rxnk3A
お願いします 値が1,2,3と入ってる列を 1,3,2という順番に並び替えしたいんですが どうやればいいでしょうか? 1,2,3とか3,2,1ならOrderByでいけるんですが〜
414 :
413 :04/07/06 18:48 ID:10rxnk3A
ちょっと記述が少なすぎましたすいません NO 受注日 商品番号 個数 顧客番号 1 2004/05/10 S01001 01 C000003 2 2004/05/12 S01002 05 C000002 3 2004/05/23 S01003 02 C000004 こんな感じの表をSELECTでNO1,3,2の順で選択したいんですけど いい方法を教えてください! 初心者ですんまそん
>>414 なぜ1,3,2の順位へ並び替えたいのか判らんのけど、
個数順ならORDER BY 個数
それでもなく単純にってなら基本的には無理。
ただし、汎用性を考えずにNoが1,2,3だけ1,3,2の順にというのなら、
SELECT 1,* FROM table WHERE no=1 UNION SELECT 2,* FROM table WHERE no=3 UNION SELECT 3,* FROM table WHERE no=2 ORDER BY 1;
417 :
413 :04/07/06 22:34 ID:10rxnk3A
無理なのかーw そうなのよ、ただ単純になのよー システムの都合上、意味はない順番になってしまったらしくて Replace関数とか使ってもむりっぽいよねー 何かいい手ないかなー
>>417 そーゆー時こそ、PG側でなんとかすんだろーがー
>>417 そもそも、ORDER BY 句をつけない限り、抽出される順番は保障されていないはず。
基本的には見つけた順なので、内部の通し番号(rowidとかoid)順になるのだろうけど、
これとて、DBによってはUPDATEなどで変わるものと変わらないものがあるし、
DBメンテやアナライズでかわるものもある。
420 :
NAME IS NULL :04/07/06 23:34 ID:IE76CeZ6
お願いします 列A 列B 1 2001 null 2 2002 null 3 null 2003 4 2004 null というようなテーブルからSELECT文で 1、2、3、4とソートして取り出せないでしょうか 基本的に order by 列A なんだけど 列A が null なら 列B を見るってイメージなんですが
>>420 SELECT * FROM table ORDER BY COALESCE(列A,列B);
ありがとうございます 汎用関数であっさりできるんですね 調べ方が足りなかったようです 精進します
coalesceが使えなければnvl。 where句に関数はイヤだけどね
>>413 並べ方に規則性が無いのなら
規則を作ってやる必要がある。
列を追加して、並べ替え専用の列でも作ったら?
設計を見直した方がいいような気もするけど。。。
425 :
NAME IS NULL :04/07/08 03:30 ID:t5U4zZXH
ab
428 :
NAME IS NULL :04/07/10 23:36 ID:+YSVeqKQ
教えてください。 テーブルAに列a,b,cがあって、a,bが重複してる行を 削除したいんですけど、SQLではどしたらよいのでしょうか。
列a = 列b
430 :
NAME IS NULL :04/07/11 00:25 ID:V6myGrYp
すみません。質問がダメダメでした。 テーブルA aa bb cc aa bb dd aa yy zz のとき、 aa bb cc xx yy zz にしたいんですけど。DB2です。
431 :
NAME IS NULL :04/07/11 00:27 ID:V6myGrYp
訂正です。 すみません。質問がダメダメでした。 テーブルA aa bb cc aa bb dd aa yy zz のとき、 aa bb cc aa yy zz にしたいんですけど。DB2です。
>>431 aa bb cc が残って、
aa bb dd を残さない理由は?
ORDER BY 句も使わずに単純に先に出てきた方を残すのか?
どっちゃにしろ面倒だが。
433 :
NAME IS NULL :04/07/11 01:42 ID:p5TFt5ON
単純に先に出てきた方を残します。 面倒ですか〜。
434 :
NAME IS NULL :04/07/11 01:58 ID:yVwQ3n9P
N速に書き込めません。 何とかして下さい。
>>433 ORDER BY句をつけない限り出てくる順序が常に一定であるという保証は無いので、
そういわれると、特定しないと同じなんだが。
とりあえず擬似列(? OracleならROWID、PostgreSQLならOID、DB2はしらん)順に出てくるとして、
その一番小さい値の行を残すということでやると。
DELETE FROM table WHERE (a,b,oid) =
(SELECT t1.a,t1.b,oid FROM
(SELECT a,b,min(oid)as d FROM table GROUP BY a,b HAVING count(*)>1)as t1,
(SELECT a,b,oid FROM table)as t2
WHERE t1.a=t2.a AND t1.b = t2.b AND t1.d != t2.oid);
PostgreSQL用だが、こんなんでましたw
行を特定する擬似列があるのと、行値コンストラクタが出来ないと無理だな。
436 :
名無しさん@そうだ選挙に行こう :04/07/11 12:27 ID:zk9WAf2Q
ありがとうございます。 できそうな感じです。明日やってみますです。
437 :
NAME IS NULL :04/07/15 09:35 ID:i+QgLaVI
Oracle8i使用。 例 SELECT 項目1, 項目2, 項目3 FROM T1 union all SELECT 項目1, 項目2, 項目3 FROM T1 where 項目2 = 3 上と下の「項目1」の値で同じものがある場合、 下側の「項目2」の値を上側の「項目2」と 同じ値にするにはどうすれば良いでしょうか?
>>437 例えが悪いのか、その条件だと項目1がuniqueであるべきなので
必然的に、項目1が同じ場合は項目2も同じはずなんだが。
439 :
NAME IS NULL :04/07/15 10:22 ID:/sT/J1jd
no val pro 1 10 1 2 20 1 3 30 2 4 40 2 と、あったときに、proが重複する値は1つしかとらないには no val pro 1 10 1 3 30 2 こんな風に取得するにはSQLでどう表現すればいいのでしょうか?
とりあえずこのスレでgroup byを検索しろ
441 :
437 :04/07/15 11:25 ID:???
>>438 例をなるべく簡素にしようと思ったんですが例が悪かったかもしれません
「項目1」はユニークじゃ無いんですが別の列と組み合わせると
ユニークって事になってます。
実際にはunionの上下とも検索条件は日付で下の方は上の1ヵ月後です。
で、上下の検索結果を結合したいんです。
日付違いで同じ「項目1」があれば下の「項目2」を上の「項目2」に変換したいんです。
>>441 いまいちワカラン。とりあえず盲目的に書くが、
同じテーブルをUnion結合するのも混乱の元なので、
SELECT 項目1, 項目2, 項目3 FROM T1 where 項目2 = 3 を V1 とView定義しておく。
SELECT 項目1, 項目2, 項目3 FROM T1
union all
SELECT V1項目1, CASE WHEN V1.項目1=T1.項目1 THEN T1.項目2 ELSE V1.項目2 END, 項目3 FROM V1,T1 WHERE V1.項目1 = T1.項目1
となるとおもう。下のWHERE句とCASEの条件が同じなのでこのままだと全然意味が無いのだが、
複合キーでuniqueというのなら、WHERE句は(V1.項目1,V1.項目x) = (T1.項目1,V1.項目x) というように、
複合キーで結合するよろし。
443 :
NAME IS NULL :04/07/15 13:57 ID:/sT/J1jd
445 :
おっくん :04/07/15 14:13 ID:43wxXaSZ
主キーについて教えてください もきゅ
446 :
437 :04/07/15 14:16 ID:???
>>442 ありがとう御座います。参考にして今からやってみます。
"01","01","茨城","水戸" "01","02","茨城","つくば" ・・・(略) "12","01","東京","足立区" "12","02","東京","荒川区" ↑みたいなデータがあったときに、 "01","99" ↑キーの二つ目の'99'はデータベースに存在しない という検索キーから "茨城","" ↑ブランク、またはnull を一回のselectで取得するSQL教えてください。 もちろん、二回select発行するより早い奴で。
キチガイは寝てな
>>448 そういう腐れテーブルを設計するなら、
"01","99","茨城",""
って行も足しとけ。
>>452 正規化されていないテーブルを出しといて、
>もちろん、二回select発行するより早い奴で。
と聞くのは、厚かましい。
2回発行するのが許されるのならそーしとけ。
"01","99" を2つのカラムにして、データテーブルと INNER JOIN 後に DISTINCT
select二回発行より速いって縛りがなければ何とでもなるけどな。 サブクエリ使っていいなら。
>>448 あんたが悪いわけじゃないみたいだからさ
>>456 いや、「もちろん、二回select発行するより早い奴で。」という
ど厚かましい要求がガンだと思う。
>>457 わかるわかる。
でもな、そんなにカリカリしてたら
ハゲ板の世話になる事になるよ。
DB(MySQL)を使ってスケジュール情報を管理したいと思います。 ここでいうスケジュールとは 「内容(文字列)」、「開始日時(日時型)」、「終了日時(日時型)」 が1セットになったもので、これをレコードとして登録します。 こういった情報を登録しておいて ・レコードを追加する際にダブルブッキングのチェック ・今の時間に一致するスケジュール情報の検索 ・今から指定時間以内に開始日時になるスケジュール情報の検索 をSQL文で簡単に取得するにはどうすればよいでしょうか? DBに慣れていないもので、全レコードを取り出してチェックするしか 方法が思い浮かびません・・・。
>>459 ダブルブッキングチェックはOVERLAPS述語をつかうけど、
MySQLで使えるのかな? それ以前に、CHECK制約で無理ぽ?
Ruleかトリガ、もしくは先にチェックしてからINSERTかな。
下の2行はBETWEEN述語を用いれば簡単に出来る。
461 :
459 :04/07/19 00:21 ID:???
>>461 WHERE 開始時間 BETWEEN now() AND now()+interval'指定時間';
463 :
459 :04/07/19 00:31 ID:???
>>462 マーベラス!!
やっぱりいくら優秀なDBシステムでも、賢い人が使わないと
パフォーマンスを引き出すことはできませんね。精進します!
464 :
NAME IS NULL :04/07/20 11:43 ID:HSDmAkSt
以下のデータがあるとします。 日付,数,円 2004-06-01,1,500 2004-06-10,2,500 2004-07-05,2,100 2004-08-03,1,200 2004-08-05,2,100 2004-08-06,1,100 ここから月毎で以下の様に合計を出したいと考えています。 どのようなSQL文を組めばいいのでしょうか? 日付(月),数,円 2004-06,3,1000 2004-07,2,100 2004-08,4,400
すんません。ちょっと質問なんですがPostgreSQLで。 文字列の場合、 ・char ・varchar ・text の違いがわかりません(><) 誰か教えてください。特に、charとtextの違い。 やっぱり、textの方がメモリを食うんですか?
466 :
464 :04/07/20 12:20 ID:???
自己レスです。 EXTRACT(YEAR_MONTH FROM DATE) で年月のgroup byが出来ましたので解決しました。
乙
470 :
459 :04/07/20 15:47 ID:???
>>470 思考を停止しちゃったか?
WHERE (new_start_date BETWEEN 開始日時 AND 終了日時)
OR (new_end_date BETWEEEN 開始日時 AND 終了日時)
OR (new_start_date < 開始日時 AND new_end_date > 終了日時);
こんなもんだろ。
当然new_start_date < new_end_date が成り立っていなけりゃならんが。
>>468 マジレスありがとうございます(><)
感動です。やっと、このスレで成仏できます。(><)
今、
>>468 のマニュアルを読んでみました。
textは文字列の長さに制限がありません。
だから、すごいメモリ食うんじゃないかな?と思ったんです。
登録する予定ものが文字数が不確定なので、
多めにvarcharでとったの方がいいのかな?とか思っていたんですが・・・。
あるサイトで「PostgreSQLではtextが一番早いで!」って書いてあったから、
varchar使うか、text使うか迷っていたんです(><)
でも、
>>468 さんのおかげでtextを使うことにしました。
これで、成仏できます。
ありがとう
>>468 さん (><)
集計キーが違う集計クエリーをUNIONで結びつけるのに
いい方法ないでしょうか。
ダミーで項目を揃えても、2つのクエリーをそれぞれSELECT文で
もう一括りしてからUNIONでくっつけようとしてもダメでした。
>>464 SELECT SUBSTR(日付,1,7),SUM(数),SUM(円) GROUP BY SUBSTR(日付,1,7)
PostgreSQLです。
>>473 普通にできそうな事のように思えるのだが、
例えのテーブルと希望する結果を挙げてみれ
select a, b, c, from unko union select null, nulll, null from dual とかってできるだろ?
476 :
473 :04/07/22 00:20 ID:???
レスthanks. こんな感じです。 テーブルA 伝票番号、コードA、コードB、数量 0001、A01、B01、10 0002、A01、B01、20 0003、A02、B02、30 0004、A02、B02、40 コードA、コードBで集計 テーブルB 伝票番号、コードA、数量 0001、A01、50 0002、A01、60 コードAで集計 テーブルBにはコードBがないのでダミーでB03とする。 結果 コードA、コードB、合計数量 A01、B01、30 A01、B02、70 A01、B03、110
477 :
473 :04/07/22 00:24 ID:???
>>476 結果の2行目は
A02,B02,70
の間違いではないのか?
SELECT コードA,コードB,SUM(数量)
FROM (SELECT コードA,コードB,数量 FROM テーブルB UNION SELECT コードA,'B03',数量 FROM テーブルB)AS foo
GROUP BY コードA,コードB;
479 :
473 :04/07/22 00:50 ID:???
>>478 オー、集計する前にUNIONしちゃうわけですね。サンクス、試してみます。
values( CAST('" + sData + "' AS TIMESTAMP),・・・・) これで、String型のデータ(YYYY-MM-DD HH:MM:SSの形式で入ってる)を TIMESTAMPに変更しようとしたら、エラーが出たのですが、どこがおかしい のでしょうか?
もしかしてSQLServerだとしたら timestamp 型の値は日付データではありません。 中身は単なる一意キーです。
>>481 SQLServerのTIMESTAMPはユニークになるけど、
レコードの内容を更新するとTIMESTAMPも変わってしまうから
キーには出来ないよ。
「その時点での」テーブル内一意ってことです。 ごめんなさい。
質問です。 オラクルのTO_CHAR句をSQLserverで代替するのはどうやればいいのですか? 手持ちの本や、ネットで調べたのですがのってなくて・・・ やりたいことは、100000とあるデータにカンマをつけるだけです。
>>484 一発では出来ないので
CASTでCHARかVARCHARにしてから
WHILEループを書くしかないんじゃないかな
487 :
NAME IS NULL :04/07/26 14:45 ID:J5YziJL0
初歩的な質問なのですが、よろしければ教えてください。 区分,取引先コード,金額 01,001,1000 01,002,1000 02,001,800 02,002,500 というようなテーブル A が、あって 区分01は売上、02は仕入です。 Aのテーブルを用いて 取引先コード,売上,仕入 001,1000,800 002,1000,500 と結果が出るようなSQLを作りたいのですが、カラム自体にWHERE文を持たせるような事ができるのでしょうか? 例えば(これでは実行できないのですが) SELECT 取引先コード, 金額 AS 売上 WHERE 区分 = '01', 金額 AS 仕入 WHERE 区分 = '02' FROM A ちなみにSQLServerです。
>>487 それは無理。CASE文と混同していそうですが、こちらで
SELECT code,
(SELECT sum(金額) FROM a WHERE 取引先コード=s1.取引先コード and 区分='01') AS 売上,
(SELECT sum(金額) FROM a WHERE 取引先コード=s1.取引先コード and 区分='02') AS 仕入
FROM a as s1 GROUP BY 取引先コード;
どぉですか。
>>488 ゴメソ 1行目を訂正
×SELECT code
○SELECT 取引先コード
490 :
487 :04/07/26 15:15 ID:J5YziJL0
>>488 おー 有難うございます。
自分で四苦八苦した結果 下記のようなきたないSQLで出来るには出来ましたが、
488さんのSQLが素晴らしくきれいで、そちらを採用させて頂きます。
ありがとうございました。
その汚いSQL
SELECT
S1.取引先コード,
S1.売上,
S2.仕入
FROM
(SELECT
A.取引先コード,
SUM(A.金額) AS 売上
FROM
A
WHERE
区分 = '01'
GROUP BY
A.取引先コード) AS S1
INNER JOIN
(SELECT
A.取引先コード,
SUM(A.金額) AS 仕入
FROM
A
WHERE
区分 = '03'
GROUP BY
A.取引先コード) AS S2
ON
S1.取引先コード = S2.取引先コード
GROUP BY
S1.取引先コード
ありがとうございましたm(_ _)m
491 :
487 :04/07/26 15:16 ID:J5YziJL0
あぁインデントつけて見やすくしたつもりが すべて消えてる・・・ 見づらくてすみません。
492 :
NAME IS NULL :04/07/26 17:02 ID:KcwHZUve
二つのテーブルからのCOUNT()を合計するにはどーするんでしょうか。
足せ
494 :
459 :04/07/26 22:57 ID:???
以前、スケジュール管理に関して質問したものです。 ダブルブッキングのチェックはできるようになりましたが、複数のユーザーから ほぼ同時に予約処理が行われた場合、タイミング次第でダブルブッキングして しまうようなレコードが追加されてしまうことはありませんか? MySQLはマルチスレッドだと本に書かれていましたが、排他処理を行うことは できるのでしょうか?
496 :
NAME IS NULL :04/07/27 09:05 ID:MnORfm0Z
493>そりゃそーですが、文がわからん。 おしえて。
497 :
NAME IS NULL :04/07/30 09:09 ID:Gc8sLY6c
SQLでデータの長さなんか取れたりしますかね。 サイズ未指定で作成したBLOBカラムなんかの実データのサイズが知りたいんですが。 分からないんであれば、サイズを保持するカラム足してテーブルコンバートしなきゃならなくなっちゃうYO! (Firebird1.5でつ)
>>497 Firebirdはしらんが、length(BLOBカラム) じゃダメなんか?
select length(カラム名) だと駄目みたい。
おしえてください。 カーソル同士をJOINってできますか?
?JOINされたものをカーソルにするんでないの?
502 :
NAME IS NULL :04/08/03 17:19 ID:wblkt8Jn
Oracle での テーブル定義の変更 をするSQL ALTER TABLE Table_A MODIFY Field_A char(10) を SQLServer用に 書くとしたらどのような命令をすればいいのでしょうか? 上記はORACLE専用だったみたいで・・・
表TBL1から表TBL2にデータを追加します 正しいSQL文を、(A)〜(E)の中からすべて選んで下さい -------------------------------------------------------------------------------- (A). INSERT INTO TBL2 (COL1,COL2) AS SELECT COL1,COL2 FROM TBL1; (B). INSERT INTO TBL2 (COL1,COL2) = SELECT COL1,COL2 FROM TBL1; (C). INSERT INTO TBL2 (COL1,COL2) SELECT COL1,COL2 FROM TBL1; (D). INSERT INTO TBL2 (COL1,COL2) SELECT (COL1,COL2) FROM TBL1; (E). INSERT INTO TBL2 (COL1,COL2) (SELECT COL1,COL2 FROM TBL1); 正解はC E ですが、 Cはわかります。 でもそれ以外はなぜエラーなんでしょう?
504 :
503 :04/08/03 17:30 ID:???
DとEの違いがわからない・・・・・
DとEの違い ()の位置 Dの(COL1,COL2) だとSELECTの書式エラー。 (COL1),(COL2)と表記すると動くはず。
506 :
503 :04/08/04 07:31 ID:???
テーブル名:ユーザーリスト +-------+--------------------+ |user_id| INT AUTO_INCREMENT | +-------+--------------------+ | name | CHAR(20) | +-------+--------------------+ 上記のようなテーブルがあります。 user_idを指定せずにINSERTした場合、自動的に 値が割り振られますが、Perlなどから利用する場合、 レコードに実際に割り当てられたuser_idの値を 取り出すにはどうすればよいでしょうか?
MySQL : LAST_INSERT_ID SQL Server : IDENT_CURRENTなど
509 :
507 :04/08/04 17:34 ID:???
マルチスレッド動作でも問題なくINSERTしたレコードの値が取り出せますか? どうやって実装されているのか分からないので、ちょっと心配なのですが。
>502 ALTER TABLE Table_A ALTER COLUMN Field_A char(10) だが、6.5 以降でないと使えないとか、いろいろ制約あるぞ。
どっちも接続ごとに管理されているから、複数スレッドで同じ接続を 共用するような造りにしていなければ大丈夫。
ORACLEの関数 ROUNDについて、 日付を四捨五入する使い方があるみたいですけど、 これの法則が、あいまいにしかわかりません。 4日なら切り捨て?5日以上なら繰り上げ? いろいろ調べたのですけど・・・・ 混乱するばかり・・
513 :
512 :04/08/06 11:04 ID:???
現在2002年11月26日午後3時15分です。 次のSQL文を実行した時に、戻される値を、(A)〜(E)の中から選んで下さい。 SQL> SELECT ROUND(SYSDATE,'MON') FROM DUAL; ↑これの答えが
MySQL使ってます。 BEETWEEN句を使って、TIMESTAMP型のカラムが now() より n時間以内 の レコードを取り出そうとしていますがうまくいきません。 TIMESTAMP型とnow()の戻り値の型は比較できないのでしょうか?
>>514 BEETWEEN???
BETWEENは a BETWEEN x AND y の場合 x<y じゃないとダメなのかも。
a BETWEEN now() - interval'1 hour' AND now();
でどぉっすか?
516 :
514 :04/08/06 12:55 ID:???
intervalを使えば正しく比較できるようです。 「SELECT date from access_log」の結果は「20040805174512」でしたが、 「SELECT date - interval 0 hour from access_log;」とやると 「2004-08-05 17:45:12」となりました。
517 :
514 :04/08/06 13:54 ID:???
かなり初心者ネタかもしれませんが質問です。 レコードの抽出範囲を「本日」「前日」「今月」「先月」「今年」「去年」 というふうに区切りたいのですが、どうすればよいですか? 前日のレコードを抽出するのに mysql> SELECT * from access_log where year(date) = year(now()) and month(date) = month(now()) and day(date) = day(now) - 1; とやったのですが、1日に実行すると、0日と 比較してしまい、うまくいきませんでした。
>>517 day(now()-interval 1day)
かな? MySQLは使ってなくて書式に間違いがあるかもしれんが。
>513 SQL リファレンスに各書式での丸め条件載ってるが…… 例題だと12が返ってくるんじゃなかったかな?
520 :
512 :04/08/06 16:14 ID:???
>>513 すみません、オラクルのSQL リファレンスって売ってるんですか?
初歩的なことですみません。
オラクルマスター問題集と、黒本しかてもとにありません。
Oracle Technology Network の Web Site
ttp://otn.oracle.co.jp/ にいってみそ。
んで ID 交付してもらってログインすりゃ、全マニュアル PDF で落とし放題だ。
つーか問題集にそれくらい書いてないんか……
あー念のため。 OTN Standard とか OTN Professional の有償サービスにはいくなよ(藁 ページ上部の「お客様情報」ってとこから無料で新規ID登録できっから。
一度のSELECTで、小計1(SUM(なんたら))、小計2(SUM(かんたら))、総計(小計1+小計2)を 取得したいのですが、なるべくならサブクエリを切りたくありません。 プログラム中で色々とSQLの編集を行うので、複雑にしたくないのです。 小計1・2のエイリアスを参照できないか、と試してみたものの、 一度のSELECTでは無理なようでした。 良い方法はないでしょうか? 環境はOracle9.2です。
524 :
NAME IS NULL :04/08/10 22:08 ID:AX2MPVIQ
すいません。質問なので一度ageます。
ビューにしろ
526 :
NAME IS NULL :04/08/12 14:52 ID:SCIrm9Kg
id | no | data 1 | 1 | ああああ 1 | 2 | いいい 1 | 4 | ううう 1 | 9 | 5555 というデータを id | no | data 1 | 1 | ああああ 1 | 2 | いいい 1 | 3 | ううう 1 | 4 | 5555 と言った感じで連番にするにはどうしたらいいでしょうか?
>>526 SELECT id,(SELECT COUNT(*) FROM table AS T2 WHERE T1.no>=T2.no),data FROM table AS T1;
助けてください。 id | created ------------------+------------ AA | 2004-08-04 00:10:00 ○ AA | 2004-08-04 00:20:00 BB | 2004-08-04 00:10:00 ○ BB | 2004-08-05 00:30:00 CC | 2004-08-05 00:40:00 CC | 2004-08-05 00:10:00 ○ みたいなテーブルなんですが、各ID毎の一番古いcreatedの一覧を取得する方法がわかりません。(○印部分) 教えてください。
select id,min(created) from hoge group by id;
530 :
528 :04/08/12 17:15 ID:9vICwHsM
肝心なことを書き忘れた。Postgresを使っています。 DISTINCTとか使ってみたけど、IDを重複せずに出力したけど、 それを元にIDごとの order by created limit 1 をしたいけどできない・・
531 :
528 :04/08/12 17:18 ID:9vICwHsM
できました!ありがとう。
Oracle9で不思議な現象が起きています。 SELECT * FROM xxx LEFT OUTER JOIN yyy ほげ on ({条件式} AND (ほげ.zz_CODE in ('1','2'))); だとORA-01446エラーが出て、 SELECT * FROM xxx LEFT OUTER JOIN ((SELECT * FROM yyy ほげ1 WHERE ほげ1.zz_CODE='1') UNION ALL (SELECT * FROM yyy ほげ2 WHERE ほげ2.zz_CODE='2')) ほげ on {条件式}; だと正しく動作するのですが、なぜでしょう?
533 :
NAME IS NULL :04/08/13 14:08 ID:3JyVgucq
下のようなテーブルから ID | DATE | NUM 1 | 2004-08-01 | 1 2 | 2004-08-03 | 4 のようにデータを取得する方法はあるのでしょうか? DATE | NUM 2004-08-01 | 1 2004-08-02 | 0 2004-08-03 | 4
534 :
NAME IS NULL :04/08/13 20:24 ID:E/G7H9dM
t3 gr| name -+------ 1 | A 1 | B 1 | C 2 | D 2 | C 3 | X t4 name ------ A C 組み合わせの問題なのですが、t4の全ての要素(ここではAとC)を 持つグループ(t3.gr)は1。この1を得たいのです。複数あれば複数。Postgresです。 SELECT DISTINCT gp FROM t3 WHERE name IN (SELECT name FROM t4); で取りあえずA, Cを含むグループを得て、それぞれのグループに1回ずつ select count(*) from t4 where name not in (select name from t3 where gp = 1); (逆に、t3にあってt4に無いレコードの数) と問い合わせ、これが0の時、gpが求めるものだというところまで分かりました。 すっきり1回のSQLで求めたいです。よろしくお願いします。カミサマ。
↑ああっ、すみません gpじゃなくて全てgrです。
SELECT t3.gr FROM t3 INNER JOIN t4 on t3.name=t4.name GROUP BY t3.gr HAVING COUNT(t3.gr)=(SELECT COUNT(*) from t4) Accessだとこんなんで行けるけど
537 :
534 :04/08/13 22:01 ID:???
>>536 ありがとう!助かりました。Postgresでもいけました。
本当になるほど、ですね。半紙に筆で書いて飾っておきます。
無理だと思ってました。もっと精進してここで回答者に
なれるようにがんばります。
質問なのですが、ACCESSであるフィールドに関して重複しているレコードを 1行と見なし、総件数をカウントするSQLを組みたいのです。 例えば、あるフィールドの値が100、100、200、300という4件のレコードの場合、 総件数は3件としたい訳です。 select count(*) from ( select distinct field_A from table_A ) count SQL Serverでは上記でいけたのですが、ACCESSではFROM句の 構文エラーとなってしまいうまくいきません。 どなたかご教授お願い致します。
出来るが?
>>538 SELECT count(DISTINCT field_A) FROM table_A;
こんなテーブルがあるのですが、 id | name | page | created ------------------------------------- 1 | 田中 | 1,html | 2004-08-10 10:00:00+09 2 | 田中 | 2,html | 2004-08-10 10:10:00+09 3 | 田中 | 4,html | 2004-08-10 10:20:00+09 4 | 加藤 | 0,html | 2004-08-10 10:00:00+09 5 | 加藤 | 2,html | 2004-08-10 10:15:00+09 6 | 加藤 | 3,html | 2004-08-10 10:20:00+09 7 | 村上 | 1,html | 2004-08-10 10:00:00+09 8 | 村上 | 2,html | 2004-08-10 10:10:00+09 9 | 村上 | 3,html | 2004-08-10 10:30:00+09 pageの2.htmlの一つ前の時間にあたるpageと名前を取得するのは可能でしょうか? ここだと、id1、id4、id7になります。
542 :
538 :04/08/17 10:38 ID:???
解決しました。どうもありがとうございました。
543 :
541 :04/08/17 10:46 ID:???
今は分からないので、 select id,name,created from test where page = '2,html'; SELECT * from test where name = (上で取得したname) and created < 上で取得したcreated order by created desc limit 1; でループを回してます。
>>541 pageの文字数が全て同じで、書式が一桁の数字+',html'で統一されているのであれば、
SELECT * FROM text WHERE page < '2,html';
でいいんじゃね。
select test.* from test inner join ( select test.name,max(test.created) as created from test inner join ( select name,created from test where page='2,html') as A on test.name=A.name where test.created < A.created group by test.name) as B on test.name=A.name and test.created=B.created
546 :
541 :04/08/17 13:22 ID:???
ご回答ありがとうございます。 544さん 残念ながら文字数は決まってないので時間で見るしかないんですよー。 545さん ご回答ありがとうございます。 でも、試してみたのですがエラーになりました。 ERROR: Relation "a" does not exist 肝心なことを言い忘れたのですが、DBはPostgresです。
547 :
545 :04/08/17 13:53 ID:???
>>546 最後の行が間違っていた。
どう違っているくらいは藻前が見つけてくれ。
エラーメッセージにヒントがあるし。
548 :
544 :04/08/17 14:03 ID:???
あああ、漏れはアフォか。完全に質問の意図を理解してなかった。 逝ってきまつ。
549 :
541 :04/08/17 14:35 ID:???
できました!ありがとう! 545さんありがとう。 僕もここで答えられるようなスキルになりたいので544さんのお気持ちは全然うれしいです。
550 :
541 :04/08/17 17:57 ID:???
質問です。 SQLをもう少し勉強したいのですが、なかなか良い書籍が見つからずに困っています。 何か良い書籍などございましたら教えてください。 オススメの書籍とかありますか?
code | name | address 001 | 山田 | 東京 002 | 鈴木 | 千葉 003 | 斉藤 | 埼玉 こんなテーブルがあり、code=003の斉藤さんのレコードを 主キーのcodeだけ000にして、nameとaddressを同じテーブルに コピーするためには、どんなSQL文を書けばいいでしょうか?
insert into Table(code, name, address) select '000', name, address from Table where code = '003'
554 :
NAME IS NULL :04/08/19 21:52 ID:cL69zpwQ
SELECT * FROM TBL WHERE ... FOR UPDATE NOWAIT としたときに、参考書では、 セレクトした行が誰かによってロックされていたときに、制御が すぐもどされます、と記述があります。 で、この場合、SELECTで取れてくるべきデータは当然取れてくれるんですよね?
555 :
NAME IS NULL :04/08/19 21:53 ID:cL69zpwQ
ワーイ IDが69だー。
556 :
NAME IS NULL :04/08/19 23:45 ID:XDjDY+ON
>>550 先輩に聞くなんちゃらっていう本。
常々気にしていた「結合と副問い合わせの違い」っていうのがオビに
載ってたの見て買っちゃった。当たり前の記述も多いけど、かゆいと
ころに手が届くQ&A多い。おすすめ。
557 :
NAME IS NULL :04/08/22 02:41 ID:ClvP/KPv
一発で取れた時の感動はいいよな〜 SQL最高!!
無理に一発で取らないで分割したほうが速いってこともあるがな。
すいません、質問です。 本みて作ったSQLなんですが、 SELECT * FROM テーブル WHERE 列名1 ='14' AND 列名2 = '320' ORDER BY 列名3 DESC UNION SELECT * FROM テーブル WHERE 列名1 ='14' AND 列名2 <> '320' ORDER BY 列名3 上のようなSQLでエラーがでました。 ようは、一方は列名3で降順、一方は列名3で昇順にソートされた結果を 上下にくっつけた結果がほしいのですが、何か方法はないでしょうか?
>>559 ORDER BY句はSELECT文の一部ではなくてCURSOR定義の一部なんで無理です。
そもそもUNION句は重複削除の為、その時点でソートするし。
んで、以下のSQLでお望みの結果が出ると思うが、それは結果的にであって、
順序を保障している訳ではない。
SELECT * FROM (SELECT * FROM テーブル WHERE 列名1 ='14' AND 列名2 = '320' ORDER BY 列名3 DESC)
UNION ALL
SELECT * FROM (SELECT * FROM テーブル WHERE 列名1 ='14' AND 列名2 <> '320' ORDER BY 列名3);
列名3が数値型なら、 select * from テーブル where 列名1='14' order by case 列名2 when '320' then -列名3 else 列名3 end
>>560 サンクスコ
結局別々にやっちゃいました。
今後、このスレでの質問・問い合わせは SQL でお願いします。
SELECT 'いやです' as ANSWER
delete このスレ where レス番 = 563
oracleですが table1 aaa date でテーブルを作り、 select * from table1 where aaa between 20040801 and 20040831 で問い合わせてもオケですかね?
568 :
566 :04/08/26 10:24 ID:???
>>567 う、ソレはムズイ…('A`)
え〜と、どう書けばいいかな…
INSERT INTO SQL質疑応答スレ
segmentation fault Number:570 at SQL質疑応答スレ core dumped.
select '
>>566 Oracle は知りませんが・・・。通るとしても実装依存なので、
暇なら '2004-08-01' と編集したほうがいいんじゃないかと思います。
'
select ' あ、失敗してしまいました。。引用符の中の引用符をエスケープし忘れました。 '
>>571 なるほど
アリガトンゴザイマスタ
SQL+からは
>>566 でselect文実行できて
プログラム側からだとエラーになっていたので、悩んでました
アリガトンゴザイマスタ
574 :
573 :04/08/27 11:04 ID:???
576 :
NAME IS NULL :04/08/30 00:54 ID:AKKr2SCF
抽出条件で、たとえば相手が5つの数字であることが分かり切っている場合 Like '###8#' みたいな 書き方って出来ませんでしたっけ。 Accessではたしか出来たはずなんですけど、DelphiからAccessMDBだとダメみたいで。 何か書き方が違うのかな
>>576 like で任意の一文字にマッチする記号は _ アンスコじゃね?
578 :
576 :04/08/30 01:09 ID:???
579 :
NAME IS NULL :04/08/30 05:51 ID:muvL5Gtl
SQLの検索で質問なのですが テーブルAの得意先コードから得意先マスタテーブルの得意先名を得るんですが、 テーブルAの得意先コードがNULLだった場合は、 テーブルBの得意先コードから得意先マスタテーブルの得意先名を得る こういう場合ってどういう風に書けばいいのか教えて下さい
>>579 なんか肝心なところが抜けてないか?
テーブルAとBの関係がワカラン。
何をもってテーブルAやBの得意先コードを抽出しているのか?
581 :
580 :04/08/30 06:52 ID:???
ひょっとしてこんなんでいいのか? SELECT * FROM (SELECT 得意先コード FROM テーブルA UNION SELECT 得意先コード FROM テーブルB) AS S1 JOIN 得意先マスター USING (得意先コード);
SQL学習中のものですが、ORDER BY をいつもなぜか SORT BY と書き間違えてしまいます。何か良い薬はありませんか?
死ねば
バカにつけるクスリなぞ無く、そしてバカは氏んでも治らな(ry
>>582 のねらいが、俺にはさっぱり読めないわけだが
587 :
NAME IS NULL :04/09/05 12:05 ID:yqxWT8Tv
テーブルA,B,C があり、 テーブルCが大きいテーブル(仮に100万件とします) でA,Bが小さいテーブル(こちらは10件とします)だとします。 SELECT A.hohg, B.hoge, C.hoge FROM A, B, C WHERE A.id = B.id AND A.id = C.id と、 WHERE B.id = A.id AND C.id = A.id と WHERE A.id = B.id AND B.id = C.id の結果、速度はどちらが速いのですか? 因みに、idに索引が張っているとします。
タイム計ってみればいいのでは?
結合の順番を明示的に指定したい場合はJOIN句を使うと良いと思うよ。
591 :
587 :04/09/05 17:07 ID:???
>588-590 レスどうもです。 確かに、タイム計れば結果がわかりますね。失礼しました。 で、何故こんな事を聞くかというと、 いろんなサイトや文献を見ると、 やれ、大きいテーブルはFROM句の前がいいとか後がいいとか、 Where句は上から順に絞り込むとか、位置は関係ないとか、 極論すればオプティマイザが賢いかアホか、等... どれが正解なのかわからなかったものですから。 あと、明示的したい場合はJOINでするようにします。 ところで、JOINではなく、例題のようにWhere句で等結合を させた場合、A、B、Cの交差表はどの時点で作られるのですか? A,B,Cの交差表を作ってからWhereの絞込みを行うのか、 先にWhereの絞込みで各テーブルの仮想結果セットが作られてから 結合するのですか? これはRDBMSによって違う? 教えて君で申し訳ないです。
DBMSによっても違うだろうし、コストベースオプティマイザなら その日の気分によっても違う。 気になるなら実際にアクセスプランを見てみれば良い。 それから、joinで結合順序が固定されるというのも、一部のDBMS 特有の動作だったりする。普遍的なルールじゃない。
>>591 いまどきのRDBMSならオプチマイザが判断してくれるので、
>>587 程度の例ならどれも同じ。
結合に用いるカラム(今回の例だとid)がユニークであるのかどうなど
統計情報によって結合順が変わってくる。
C.idがユニークなら、AかBのテーブルを読んでからC.idをインデックス
スキャンした方が速い。
逆にC.idの重複が多い場合は先にCを読んでA,Bを入れ子ループするか、
A,Bを先に結合した表とCをそれぞれソートしてからマージ結合するに
なると思う。
どのような順序で結合するかはRDBMSやマシンスペック(メモリ量など)
によっても変わってくると思う。
>>587 あまりきれいなやり方ではないが、
A,B,Cのテーブルを結合するときに、
A.id=B.id
,B.id=C.id
,A.id=C.id
のように、結合条件を全て指定してやると
その中で一番効率のよい結合条件で結合してくれる。
595 :
NAME IS NULL :04/09/06 11:47 ID:pQ7r/3Xe
テーブルが3つあります。 仮に ---------------------------------- desc tbl_a; aid number(10,0) aname varchar2(20) ---------------------------------- desc tbl_b; bid number(10,0) baid number(10,0) ←tbl_a.a_idを参照 bname varchar2(20) ---------------------------------- desc tbl_c; cid number(10,0) cbid number(10,0) ←tbl_b.b_idを参照 cname varchar2(20) ---------------------------------- としましょう。 tbl_bのうち、以下の条件に該当する行を消したいのです。 1.ある特定のtbl_a.aidを参照している 2.自分自身のtbl_b.bidを参照しているtbl_cが1件もない 秒殺できるSQLはありますか? ターゲットは オラコー9.2 おりゃー9.2 うおりゃ9.2 Oracle 9.2.0.1.0 よろしく
>>595 SELECT * FROM tbl_b WHERE EXISTS (SELECT * FROM tbl_a WHERE aid=tbl_b.baid)
AND NOT EXISTS (SELECT * FROM cbid=tbl_b.bid);
かな?
条件1の意味がワカラン。tbl_a.aidに範囲があるなら
SELECT * FROM tbl_b WHERE EXISTS (SELECT * FROM tbl_a WHERE aid=tbl_b.baid AND ?ある特定の条件?)
AND NOT EXISTS (SELECT * FROM cbid=tbl_b.bid);
ところで、オラクラーってこんなやつばっかか?
597 :
596 :04/09/06 12:46 ID:???
うげ、それぞれ2行目のSQLが間違っていた。 AND NOT EXISTS (SELECT * FROM tbl_c WHERE cbid=tbl_b.bid);
598 :
NAME IS NULL :04/09/07 01:36 ID:XZ/CGetQ
カラム名に( )は使えませんか? 使いかたを知っている方お願いしますm<_ _)m
CREATE TABLE test([(w] text) 試したら出来たけど、Accessって恐ろしいな
600 :
NAME IS NULL :04/09/07 11:45 ID:WU8jHQSW
テーブルからテーブルにコピーする時、エラーの起きるものを無視してコピーするにはどうしたら良いですか? 例えばこんな感じで数値に変換できないレコードを無視したい。 insert into gaiku select to_number(gaikuno,'99990') from gaiku_tmp; もっと複雑な物なので、除外するのが面倒なんです。
低レベルな質問でごめんなさい 何かどっかで読んだようなきいたような話なんですけど WHERE (条件A OR 条件B) AND (条件C OR 条件D) みたいな場合、カッコでくくったことによる優先順位って、ちゃんとつけてくれるんですか。 それともカッコなんか無視されて WHERE 条件A OR (条件B AND 条件C) OR 条件D みたいな解釈をされちゃう可能性があるんですか。 ちらっと実験してみたところ、カッコによる優先順位はちゃんとつけてくれるように見えるんですけど。 心配なので確認したいなと。
無視されたら括弧付けてる意味無いだろ。 そうは思わないか?
603 :
601 :04/09/07 17:27 ID:???
そりゃ思います思います。 ただ、 (条件A AND 条件C) OR (条件A AND 条件D) OR (条件B AND 条件C) OR (条件B OR 条件D) とか、何かすべての組み合わせで書いてるの見たことがある気がするようなしないような。 まあ、2 X 2 ぐらいだったら全部の組み合わせで書いてもいいんですけど。 3 X 3 とかになったらもうやってられないなと思いまして。 いや、大丈夫ならいいんです。 お騒がせしてごめんなさい
604 :
598 :04/09/07 18:16 ID:cJghFX6x
全角文字の()を使うことでできました。。。
605 :
NAME IS NULL :04/09/07 18:17 ID:JHskel+H
TABLEAのID=1のレコードを、同テーブルにID=2で追加したいのですが、 Insert into TABLEA Select * From TABLEA Where ID=1 では値が重複してしまいます。 ただ、ID以外の項目が変動しても修正しなくて良いよう、 Select 2 AS ID, ... From TABLEA とはしたくありません。 この場合、方法はあるのでしょうか? よろしくお願いします。
>603 それを確認するために、ちゃんと単体テストをやってスキーリしなされ。 つーか普通するだろ?
>>605 どうしてもと言われればテンポラリテーブル作るかも。
608 :
NAME IS NULL :04/09/07 20:35 ID:gSoaBm+0
経験が豊富な方に質問ですが、 カラム名に日本語を使用するのは邪道でしょうか? カラム名に日本語を使用するメリット、デメリットを教えて下さい。 お願いしますm(_ _)m
>>608 ・プログラムやSQLを書く時にいちいちIMEを操作するのはウザイ。
・全角、半角を間違えたり、"へ"や"ぺ"を平仮名と片仮名間違えたり
すると泣ける。
610 :
NAME IS NULL :04/09/07 21:20 ID:MD7CjKHk
SQLドシロウトです。 結合の方法なのですが、どれが一番効率がいいでしょうか? select * from table1 as a , table2 as b where a.key = b.key select * from table1 as a cross join table2 as b where a.key = b.key select * from table1 a left join from table2 b on a.key = b.key またパフォーマンスに大きな違いがあるのでしょうか?
611 :
605 :04/09/07 21:38 ID:JHskel+H
>>607 SQL1本では・・・できないものでしょうか(汗
なにせ項目が多いものでテンポラリ作ってInsertするとメモリが・・・
すみません
できない
>>605 RULEを定義すれば出来るんじゃないか。
>>610 効率以前にそんなSQLあんのか?どんなRDBMS?
>608 基本的に列名には名詞や固有名詞を使う頻度が多くなるから 漢字のみで構成される機会がおおいですよね。 で、漢字の場合はある程度の略称で記述してあっても わかりやすいです。ヘタな英単語で表記するなら、漢字か、 ローマ字読みで。 別にNAME如きにNAMAEまでするのはどうかと思いますが、 出資法上限利率とか利息制限法上限利率とか 完済時戻し利息とかを 無理やり英単語にされると混乱するので。それならいっそ、 "A"とか"B"とかにして、定義付けしてもらった方がよっぽどマシ。 まぁ、メリットデメリットあるでしょうから、好みに合う方を 使えばよろしいのでは?
>614 まぁまぁ、そうカッカなさらずに。 文法間違いは脳内オプティマイザで処理してあげましょうや。 >610 1番と2番は結果は同じですが、 3番目は違います(外部結合。あと文法に誤りがありますよ) まず、そこは理解していますか? で、1番と2番のパフォーマンスの違いですが、そもそも 2番の省略形が1番です(どちらも交差結合を経て等結合) RDBMSによっては、両者を明確に違うものとして考えて処理する やつがおるかも知れませんが、まぁ、一緒でしょう。 なので、パフォーマンスは一緒のはずです。 気になるなら使用しているRDBMSの実行計画を確認してください。
617 :
616 :04/09/08 02:29 ID:???
>610 616に書き込んだ後で気づきましたが ひょっとしてLeft JoinではなくInner Joinを書きたかったの?
>605 insert into TABLEA ( ID, ... ) select 2, ... from TABLEA where ID=1 じゃあ駄目って理由がよくわからん。 ... の部分がとっても多くて面倒ってこと? 常に ID に下駄を履かせてよく、かつ履かせた下駄に重複する ID はもともと存在しない、なら、 insert into TABLEA select ID+1, ... from TABLEA とかでいけそうだが。
>>616 > で、1番と2番のパフォーマンスの違いですが、そもそも
> 2番の省略形が1番です(どちらも交差結合を経て等結合)
文法的にはそうだけど、実際には交差結合を行わずに等結合でしょ。
3番目がINNER JOINの書き間違いなら3つとも実行効率は同じで、
違うとしたらパーサに掛かる時間ぐらいなものかな。
測定しても誤差程度でしか差は無いだろうけど。
SQLの書き方によって効率(速度)が変わる例も確かにあるが、
相関サブクエリでループしているときとかで、単純な結合なら
オプチマイザが結合順序とその結合方法を判断してくれますよ。
620 :
608 :04/09/09 19:44 ID:nx8af/Rc
621 :
NAME IS NULL :04/09/10 00:55 ID:ULGRyzE5
SQLServer2000でトランザクション処理をしています。 そのトランザクション処理の中にはInsert文やUpdate文が数十個書いてあります。 BEGIN TRANSACTIONでトランザクション処理を開始しているのですが、 同時に数十人がアクセスしたときにデッドロックがおこってしまいます。 BEGIN TRANSACTIONをしていたら、一人の人がその中に入ると、 他の人は待ち状態にならないのでしょうか?
621です。 待ち状態があまりにも長いとデッドロックになったりするものなんですか?
>>623 待ち時間が長すぎて、SQLサーバがデッドロックと間違えたということはありえるんですかね?
625 :
NAME IS NULL :04/09/10 20:05:34 ID:B+rMfOQH
ストアドの変数として、配列を定義したいのですが 可能でしょうか? 例)VB Redim str(0 TO 100) As String ↓ ??
それぐらい検索しろや!
検索したけど見つかりません。
マニュアルを見よう
DBの種類ぐらい書けや
> BEGIN TRANSACTIONをしていたら、一人の人がその中に入ると、 > 他の人は待ち状態にならないのでしょうか? なりません。待たせても構わない(並列度が低くても良い)のであれば、begin transaction の直後に、 そのトランザクション内で使用するすべてのテーブルに排他ロックをかければいいです。 select top 0 '' from TABLE_A (XLOCK), TABLE_B (XLOCK), TABLE_C (XLOCK) ... このようにすれば、他の人は待ち状態になりデッドロックは発生しません。
631 :
NAME IS NULL :04/09/12 01:37:17 ID:Nc5WKefO
>>630 トランザクションの意味ないんじゃ・・・。テーブルをトランザクション中にさわられたら。
一つにストアドで20個ほどのテーブルを更新する時ってみんなどうしてるんですか?
全てのテーブルにロックをかけてるの?かけないとデッドロックなんてすぐに起こるんじゃ?
>>631 なんかトランザクションの意味を勘違いしていないか?
トランザクションの目的は排他ではなく原子性だよ?
実際には並列度が極端に落ちるのを嫌って、適切なロック粒度・ロック順というのを考えるんだけど。
> そのトランザクション処理の中にはInsert文やUpdate文が数十個書いてあります。
これだけの情報じゃどうしようもないな。SERIALIZABLE分離レベルで完全排他しとけば
とりあえずデッドロックは起こらない、としか言いようがない。
>>632 なるほど。トランザクション処理は何人かで重なると待ちが入るとばかり思ってました。
だから、デッドロックなど起こるわけ無いのにと悩んでいました。
今、1つのストアドで数十個、中で同じテーブルを何度もInsertかけたり
してややこしいのでロック順とか考えるのは大変そうです。
一度、SERIALIZABLEでロックして試してみます。
SQL serverで select SUM(price),name from customer group by name とし、その結果を順位付けしてやりたいのです。 サブクエリでは集計関数が使えず、RANKもROW_NUMBERも つかえないので困っています。よろしくお願いします。
>>635 SQL Serverは使ったこと無いけど、サブクエリで集計関数が使えないってのは本当か?
なんかの間違いじゃないのか?
637 :
635 :04/09/12 19:21:03 ID:???
>>636 うーん間違いですかね。環境が手元にないのでエラーメッセージがうろ覚えなんですが、
'サブクエリ内ではHAVINGなどの句を使えません'みたいなエラーが出たんです。
ちなみに集計関数が使えたらどうされますか。
>>637 SELECT
(SELECT count(*) FROM (SELECT SUM(price)AS total,name FROM customer GROUP BY name) WHERE total>=T1.total),
name,total FROM (SELECT SUM(price)AS total,name FROM customer GROUP BY name) AS T1;
こんな感じかな。不等号の向きは昇順なのか降順なのかわからんので、反対かもしれんが。
確認してないので間違ってたらスマソ。
すみません。質問です。 MDBって複数項目を問い合わせデータでUpdateすることってできないんですか? -- ex. update hoge1Mst set (Koumoku1, Koumoku2) = (select Koumoku1, Koumoku2 from hoge2Mst) where Koumoku3 = '001'; --
>>634 なんじゃこりゃ? 最悪な連載だなあ。
「SERIALIZABLEトランザクション分離レベルは一番分離レベルが高いトランザクションタイプで、
ほかの同じオブジェクトを利用するトランザクションが並行して実行されるのを防止します。」
なんて平然と間違ったこと書いてるな。こういうので、
>>621 みたいに勘違いする被害者が出るわけか。
ロック互換性の表も BooksOnline の間違いがそのまま載っているし…。
642 :
635 :04/09/13 08:41:36 ID:???
>>600 もう解決済みかもしれんけど、LIKE演算子で値が0〜9だけで構成されてる奴を拾ってINSERTするとか。
かなり重くなりそうだが。
644 :
NAME IS NULL :04/09/14 20:22:48 ID:Ilhknr43
Oracle9iでUPDATE文を10個連続で実行するpl/sqlプログラムを作りました。 UPDATE対象のテーブルを未作成で、エラーとなるように実行したとき、 SQL*PLUSにエラーメッセージが20行程度出力されたあと、 改行が無限に出力され、操作できなくなります。 (ほっておくとずっと改行されます) 同じUPDATE文を、ただのSQLスクリプトとして作成した場合は、それぞれ エラーメッセージが正しく返ってくるのですが。 エラーメッセージのバッファかなにかがあふれているのでしょうか? 対処法をご存じの方いらっしゃらないでしょうか。
MySQL使ってます。 +----------------+-------+---------+ |レコード通し番号| id | INT | +----------------+-------+---------+ | ユーザー識別子 | uid |CHAR(24) | +----------------+-------+---------+ | 内容 |message|CHAR(100)| +----------------+-------+---------+ として、「uid = 'testuser'」かつ「id」が最大値のレコード1件の messageを書き換えたいと思います。 UPDATE msglog SET message = 'none' WHERE uid = 'testuser' ORDER BY id DESC LIMIT 1; とやったのですが、文法エラーになりました。
あらー
647 :
NAME IS NULL :04/09/22 16:50:53 ID:puHGPQqJ
SYBASE Adaptive Server on Solarisを使っています。 Select文で出力するRowの数を指定するにはどうしたらいいのでしょうか? 超初心者質問ですいません。
>>645 updateしたいレコードのID値を一度Selectで取ってきてから
updateするときにそのIDを指定する。
MySQLがサブクエリ使用可能なバージョンならサブクエリで書いてもいい
>645 その構文使えるの、MySQL 4.0 以降じゃなかったっけ。 MySQL のバージョンは?
650 :
NAME IS NULL :04/09/23 13:50:26 ID:xu7mwazl
javaプログラムでJDBCによるデータベースへのアクセスでデータベースの 中の数値ってプログラム上の変数に設定とか参照とかするにはどうすれば いいのでしょうか。 a=データベースの値 みたいプルグラムを組みたいんですけど。 SELECT文で戻り値とかとれるのかな? ご教授よろしくお願いいたします。
ResultSet
MySQLを使っています。 初歩的なことかもしれませんがよろしくお願いします。 二つのテーブルからselectしたいのですが 一つ目のテーブルはユーザ情報で user_list +----------------+----------------+ |ユーザ通し番号(int)| プロフィール(text)| +----------------+----------------+ | 1 | 人間 | +----------------+----------------+ | 2 | 人間 | +----------------+----------------+ ・ ・ ・ 二つ目は誰かを指名したとして vote +----------------+--------------------+ |ユーザ通し番号(int)| 指名先ユーザ番号(int)| +----------------+--------------------+ | 1 | 3 | +----------------+--------------------+ | 2 | 1 | +----------------+--------------------+ ・ ・ ・ この中から自分がまだ指名していないユーザのリスト一覧が欲しいのですが 自分のユーザ番号が1の場合 select user_list.ユーザ通し番号,user_list.プロフィール from user_list,vote where !(vote.ユーザ通し番号 = 1 and vote.指名先ユーザ番号 = user_list.ユーザ通し番号); とするとvoteテーブルの項目がひとつ以上あれば正常に取得できるのですが、項目が0だと取得できません。 voteテーブルの項目が無い場合もユーザリストを取得するにはどうすればいいのでしょうか?
>>652 MySQLで使えるかどうか判りませんが、
SELECT * FROM uesr_list WHERE NOT EXISTS
(SELECT * FROM vote WHERE ユーザ通し番号=1 AND uesr_list.ユーザ通し番号=指名先ユーザ番号);
654 :
652 :04/10/04 17:41:24 ID:???
WHERE の後にNOT EXISTSはダメみたいです|´・ω・)
MySQL厳しいな……
WHERE 以外のどこにEXISTSを使うんだぁ。 ン? HAVING...
上のやり取りを見て思ったんですが、皆さん実装のときにSQL構文は大文字で書いてます? それとも小文字? どうでもいいような事ですが結構大文字小文字は他人のソース見るときに気になりますよね・・・。 私は小文字ですけど大文字の方が多いのかなぁ。
>>657 「プログラマのためのSQL」も含め、手元にあるDB本は
予約語(SELECT WHERE BEGIN INTEGER ....)や標準関数(MAX SUM COUNT)等は
大文字で、テーブル名やカラム名は小文字になっているので、俺もそうしている。
「プログラマのためのSQL」の場合、テーブル名の頭文字は大文字。
SELECT T1.column1,SUM(column2) FROM Table AS T1 GROUP BY column1;
こんな感じです。
>>657 小文字の方が都合の良い事が多い。
印刷物が大文字なのはただの例。
小文字の方が見やすいし好きなので、小文字。 ただし今のプロジェクトの規約では全て大文字…わかりづれえ
not exists使えるみたいですよ 別にnot in でもいいかと プログラムやってる人は小文字のが都合がいいでしょうね
コボラ以外な
>>661 select * from user_list where not exists (select * from vote);
としたら
ERROR 1064: You have an error in your SQL syntax. Check the manual that corresp
onds to your MySQL server version for the right syntax to use near 'in (select *
from vote)' at line 1
って出ます。(not inも)
バージョンは4.0.20aです。データベースのタイプとか新しいバージョンとかチェックしてみます。
こういうのはMySQLスレの方がいいのかな・・・
664 :
NAME IS NULL :04/10/10 18:02:37 ID:tjm3ZlIx
SQL初心者です。 SQLでローカルのファイル(d:\temp\test)をDBに書く方法を教えてください。 DBは MS SQL Server2000、接続はODBCです。 書き込み先は image型を設定しました。 ローカルのファイルはバイナリだったり、テキストだったり不定です。 ファイルサイズは1MB程度で、最大値の制限等はとりあえず考慮不要です。
665 :
NAME IS NULL :04/10/12 00:20:53 ID:RyKiJxet
あのSQLって、
667 :
NAME IS NULL :04/10/14 15:34:18 ID:/TlgAe3M
すみません。。 何か方法があればご教授下さい。 複数のテーブルがあって、 それぞれに更新日カラム(timestamp)があるとします。 そこで、その複数のテーブルから、 更新日の新しい順に取りたいのですが、 それぞれのテーブルは、カラム数や型がまちまちです。 イメージとしては、 テーブル1 id | name | timestamp ---+-------+----------- 1 | a | 2004-01-01 2 | b | 2004-02-01 3 | c | 2004-03-01 テーブル2 id | name1 | name2 | timestamp ---+-------+-------+---------- 1 | a | aa | 2004-01-02 2 | b | bb | 2004-02-02 から 結果(?) 3 | c | 2004-03-01 2 | b | bb | 2004-02-02 2 | b | 2004-02-01 1 | a | aa | 2004-01-02 1 | a | 2004-01-01 が取得したいです。。 (普通のJOINで無理なのはわかります。。) レコードが順番通りに取得できれば 結果はどんな形でも問題ないです。 よろしくお願いします。
>>667 SELECT id,name,NULL,timestamp FROM Table1 UNION SELECT id,name1,name2,timestamp FROM Table2 ORDER BY timestamp DESC;
>>668 UNION じゃなくて、 UNION ALL の方がよかったかも。
SELECT id,name AS name1,null AS name2,timestamp FROM テーブル1 UNION (SELECT * FROM テーブル2) ORDER BY timestamp DESC
671 :
667 :04/10/14 17:18:33 ID:???
>>668 ,669,670
ありがとうございます!
予期した結果が得られました。
一文で行くことに驚きです。
もっと勉強します…。
672 :
NAME IS NULL :04/10/14 21:47:11 ID:IzZvBEH7
初心者です。 mysql+vb+MyODBC の環境ですが、 住所録を作ってみると、 漢数字"十"だけが見事に文字化けしています。 文字はsjisに設定しています。 対処方法がお分かりになる方がいましたら、ご教示いただけませんでしょうか? よろしくお願いいたします。
675 :
NAME IS NULL :04/10/14 22:05:40 ID:IzZvBEH7
>>673 ,674
早速のご回答、
どうもありがとうございました。
何とかがんばってみます。
676 :
NAME IS NULL :04/10/15 01:36:18 ID:kuiDTThn
オラクルのストアドで質問なんですが、 ある変数を渡すとします。 その変数の値によって、ORDER BY句に指定する項目を変えたいのです。 SQLServerの場合は動的に場合わけをして、最後にExecuteをしていました。 オラクルではどうするのですか?
好きにすればいいじゃん。 PL/SQLはプログラミング言語なんだから分岐くらい好きなだけ書け。
やっぱり日本語はEUCが無難かな
今日からpostgesqlを使い始めたのですが dbの中にどんなテーブルがあるか調べる方法はあるのでしょうか? 自分で作ったものなら、構成が分かっているので SQL書けますが、他人が作ったdbで仕様書も何も無い場合 どうすればいいのかと。
select * from pg_tables
>680 おお、見られました。 どうもです
\d
テーブルってどうやってつくるんでしょうか
684 :
NAME IS NULL :04/10/16 18:14:52 ID:1kpG5WKg
686 :
NAME IS NULL :04/10/16 22:35:53 ID:iqfQyweG
GROUP BYを使うとSELECTで集計関数を使わないといけませんというのはよくある話です。 (例)SELECT 番号 from テーブル group by 日付 これは駄目。。。 その理由は分かるのですが、group by によってグループ化されたそれぞれのグループを構成するレコード がなんなのかをスマートに知る方法で悩んでいます。 良い知恵ないすか??
687 :
NAME IS NULL :04/10/16 23:05:05 ID:JtOmyvAq
オラクルからポストグレスにDBを変更した結果、次のSQLが 通らなくなりました。 SELECT S1.SSSNO,SSNAME,S2.BTYPE1 FROM STZK01 S1 ,STZK02 S2 WHEHE S1.SSKIND(+) = 0 AND S1.SSSNO(+) = S2.SSSNO ORDER BY S1.SSBTNO どうやら(+)というのが、オラクルの方言だという事はわかりました。 (+)がつくと指定カラムのデータが無くても可という意味の様ですが これをポストグレスで実現する方法があるでしょうか? よろしければ、ご教授ください。 ポストグレスで、同様の
ポスト具レスはしらんけどANSIの基準にあわせると LEFT OUTER JOIN とか使えば実現できるよ。
689 :
NAME IS NULL :04/10/16 23:42:01 ID:dYJGDROU
>686 意味がワカラン。
>>686 日付→番号のFDがあれば、SQL99ならエラー出ないよ。
>>687 S1側が無くても可ということは、その並びだとRIGHT JOINになるかな。
SELECT S1.SSSNO,SSNAME,S2.BTYPE1 FROM STZK01 S1 RIGHT JOIN STZK02 S2 USING(SSSNO)
WHEHE S1.SSKIND = 0 OR S1.SSKIND IS NULL ORDER BY S1.SSBTNO;
692 :
NAME IS NULL :04/10/17 13:16:17 ID:AJ0SRVDP
>>688-691 アドバイスありがとうございました!
まだSQLの経験が浅いため
「LEFT OUTER JOIN」や「RIGHT JOIN」の使い方からまだ、よくわかっていません。
これからの使い方から勉強してます。
ほんとに助かりました。
693 :
692 :04/10/17 21:53:01 ID:???
うわ、日本語かなり不自由ですね・・・ 「これらの使い方から、勉強してみます。」 と、書いたつもりが・・・
初歩的な質問かもしれませんが、 テーブル名が違うだけで まったく同じ構造のテーブルA,Bがあるのですが、 AのレコードとBのレコードを比較して 不一致なレコードのみを表示するSQL教えてもらえませんか? Oracle9iです。
>>694 SELECT 片方.何か FROM 片方 WHERE NOT EXISTS
(SELECT もう片方.何か FROM もう片方 WHERE もう片方.何か = 片方.何か)
696 :
694 :04/10/19 11:12:30 ID:???
>>695 えっと表の列の項目が30個ぐらいあるのですが、
その方法だとやたらSQL文が長くなるのですが・・・・。
そうですか
候補キーで比較するのさ。
699 :
694 :04/10/19 14:01:50 ID:???
もっとエレガントな方法ください テーブルA、Bがあって select * where A != B じゃあだめか・・・・・
>>694 Oracleでつかえるかどうかしらんが、
SELECT * FROM TableA EXCEPT SELECT * FROM TableB;
>>694 (select * from A minus select * from B) UNION ALL (select * from B minus select * from A);
702 :
700 :04/10/19 15:07:19 ID:???
間違えてた。 (SELECT * FROM TableA EXCEPT SELECT * FROM TableB) UNION ALL (SELECT * FROM TableB EXCEPT SELECT * FROM TableA);
>694 どのカラムが異なっても駄目、なんてレベルだったら、いっそバルクアウトしてテキストで 比較しろ。その方が速いと思うぞ。
704 :
667 :04/10/20 19:06:24 ID:wWckF4Jt
先日667で質問した者です。 SELECT id,name AS name1,null AS name2,timestamp FROM テーブル1 UNION (SELECT * FROM テーブル2) ORDER BY timestamp DESC に対して、WHERE timestamp >= '2004-02-01' で 更にtimestampで絞り込もうかと思ったんですが、 下記のSQLよりもっとスマートな方法があればご教授もらえますでしょうか。 SELECT id,name AS name1,null AS name2,timestamp FROM テーブル1 WHERE timestamp >= '2004-02-01' UNION (SELECT * FROM テーブル2 WHERE timestamp >= '2004-02-01') ORDER BY timestamp DESC よろしくお願いします。。
>>704 UNION してからWHEREする方がWHERE句が一つで済むかもしれないが、
個別の方が等速か高速だろう。だから、それでいいんじゃないかな。
それより、重複を許可もしくは重複が起こらない状態ならUNION ALLの
方が高速です。
706 :
704 :04/10/20 19:21:21 ID:???
>>705 有難うございます。
やっぱり、個別の方が速いんですね。
ちなみに、個別ではなく
一つのWHERE句でやった場合、
どのようなSQLになるのでしょうか?
恥ずかしながら、
SELECT id,name AS name1,null AS name2,timestamp FROM テーブル1
UNION (SELECT * FROM テーブル2)
WHERE timestamp >= '2004-02-01'
ORDER BY timestamp DESC
ではもちろんダメでした…
>>706 一つで書いても最近の製品ならオプチマイザが判断して
個別に抽出してからUNION結合してくれると思うけどね。
略して書くけど、こんな感じ。
SELECT * FROM (SELECT * FROM A UNION ALL SELECT * FROM B) WHERE timestamp>='2004-02-01' ORDER BY timestamp DESC;
708 :
704 :04/10/20 19:50:16 ID:???
>>707 なるほど。。
いろいろと有難うございました!
プログラムでSQL生成しているので、
一つにまとめる方向で進めたいと思います。
709 :
NAME IS NULL :04/10/21 15:25:59 ID:jhDm5sXO
教えてください。 id | name | created ------------------+------------ 1 | AA | 2004-08-04 00:10:00 ○ 2 | AA | 2004-08-04 00:20:00 3 | BB | 2004-08-04 00:10:00 ○ 4 | BB | 2004-08-05 00:30:00 5 | CC | 2004-08-05 00:40:00 6 | CC | 2004-08-05 00:10:00 ○ 上記の○部分の id を取り出したいのですが、よくわかりません。 どなたか教えてください。
id name date time 1|AA|20040804|1000 ってすれば簡単だよ?
select id from table where created like '%10:00' でもいいけど
712 :
709 :04/10/21 15:35:50 ID:jhDm5sXO
> 710 ごめんなさい。よく分からないです・・・ select id,name,min(created) from このテーブル group by id,name ってやると望む結果が出ないので困っています・・・
713 :
709 :04/10/21 15:39:50 ID:jhDm5sXO
> 710 ごめんなさい。説明不足です。 別に1000が取り出したいのではなく、createdはtimestampなので、 各ID毎の一番毎の古い時間のidが取得したいのです。 なので AA だと 00:20:00 より 00:10:00 みたいな感じです。 なので AA だと id 1 BB は 3 CC は 6が取得したいんですよ。
WHERE to_char(created,'HH24:MI') = '00:10' WHERE dateformat(created,'HH:MM') = '00:10' WHERE format(created,'hh:m') = '00:10'
715 :
709 :04/10/21 15:46:43 ID:jhDm5sXO
何度もごめんなさい。 > 714 時間が 00:10 が重要ではなくて、 AAの中でも一番古い時間のIDを取り出したいのです。 もし、こうなら 1 | AA | 2004-08-03 23:00:00 ○ 2 | AA | 2004-08-04 00:20:00 2004-08-03 23:00:00 < 2004-08-04 00:20:00 なので1を取得したいです。
716 :
709 :04/10/21 15:50:57 ID:jhDm5sXO
ちなみに SELECT name,min(created) FROM このテーブル GROUP BY name ORDER BY min; これでnameと時間は取得できますが、ここにidを追加したときにできません。
select id,name from table tablea where tablea.created = (select min(created) from table tableb where tableb.name = tablea.name) 出ででるかな?
718 :
709 :04/10/21 15:57:42 ID:jhDm5sXO
> 717 すみませんだめです・・・
719 :
709 :04/10/21 16:05:03 ID:jhDm5sXO
できました。 select id,name from table A where A.created = (select min(B.created) from table B where B.name = A.name); みなさんありがとう。
SELECT tbl1.id,tbl1.name,tbl1.created FROM tbl1 INNER JOIN (SELECT name, min(created) AS created FROM tbl1 GROUP BY name) v1 ON tbl1.name=v1.name AND tbl1.created=v1.created
721 :
709 :04/10/21 16:26:43 ID:jhDm5sXO
> 720 ありがとうございます。explainしたらこっちの方が早かったのでこれを使います。 ありがとう。
722 :
720 :04/10/21 16:36:27 ID:???
719と720では、結果はたまたま同じだけどやろうとしていることは違うわけだが、いいのかな?
723 :
709 :04/10/21 16:39:39 ID:jhDm5sXO
> 720 えええ!せっかくできたと思ったら・・・ どう違うんですかね?
724 :
720 :04/10/21 17:06:29 ID:???
あれ、いいのかな?
特定の日から何営業日なのか求めるのに、下記のテーブルからデータを作りたいんだけど、 どんなSQLを書いたらいいんだろう? テーブル(date:日付 count:営業日は1。休業日は0) date,count 2004-10-01,1 2004-10-02,0 2004-10-03,0 2004-10-04,1 2004-10-05,1 2004-10-06,1 作りたいデータ(2004/10/1からの営業日数を算出) date,count_sum 2004-10-01,1 2004-10-02,1 2004-10-03,1 2004-10-04,2 2004-10-05,3 2004-10-06,4
>>725 SELECT date,(SELECT count(*) FROM Table WHERE date BETWEEN '2004-10-1' AND T1.date AND count=1)AS count_sum FROM Table AS T1;
727 :
725 :04/10/21 17:56:01 ID:???
>>726 ありがとん。動いたーーー!!ヽ(゜▽、゜)ノ
SELECT date,(SELECT SUM(tbl.count) FROM tbl WHERE date <= A.date) AS count_sum FROM tbl as A
729 :
725 :04/10/22 00:28:32 ID:???
>>728 ありがとん。
>>726 と
>>728 からこんなん作ってみた。
SELECT date,(SELECT SUM(table.count) FROM table WHERE date BETWEEN '2004-10-1' AND T1.date)AS count_sum FROM table AS T1;
これで、仮に昼夜交代勤務とかで、2営業日とカウントするとかあった場合(今回は無いけど)や、
半日を考慮に入れる場合なんかも対応できそうだよ。
マジでありがとん。
すみません。初心者ですが、質問させてください。 フロントエンドをAccessで作ってADOで接続し、DBはMSDEを使っています。 ある検索条件で持ってきたレコードセットを一発か二発程度でカンマ区切りの テキストファイルに出力する方法はないでしょうか? 以前はSELECT * INTOをcn.Executeでテーブルを作成して、それを作成した テーブルをDocmd.TransferTextで出力していたのですが、ソースを改善したら オブジェクト''オブジェクトテーブル名が見えません''が見えません というエラーが出てしまいます。 どなたか検索した結果をコマンド等で出力する方法を御教授ください。
DTSもしくはBCPでドゾー
>>731 やっぱりDTSかBCPですか。。。。了解しました。
サンクスです。
733 :
NAME IS NULL :04/10/25 16:50:48 ID:nPS1O3VQ
一時テーブル等を作成することなく、SELECT文のみで 1から10、(1,2,3,4,5,6,7,8,9,10) 2から7(2,3,4,5,6,7)というような任意の連番を取得するSQLはありませんでしょうか? DBはSQLServer2000です。よろしくお願いいたします。
ループ
>733 不勉強で申し訳ありませんが、Loopでテーブルを結合するということですか? それともT-SQLを使用するということでしょうか? ヘルプを引いてみたのですが、いまいちピンとくる項目に該当しません。
言葉足らずでもうしわけなかったのですが、ストアドプロシージャという選択は ナシの方向でお願いいたします…
んじゃあ、「一時テーブルでは無い」テーブルに1から必要な数字まで並べておけ それ以前に、そんなものが何のために必要なのかわからんが。
>737 ActiveReportにデータを渡すのに、 社内の標準の都合でSELECT文にて渡さなくてはいけないので… やはりテーブルを作るしか手がありませんでしょうか。
初心者ですが2つ質問させてください 1:MySQLの文字コードを確認したい 2:デフォルトの文字コードを変えたい よろしくおねがいします。
>>739 スレ違い
ヒント mysqladmin
質問ではありませんね。 1:確認すればいいでしょう。 2:変えればいいでしょう。
じゃあ、Oracleのデフォルトの文字コードを変えるやりかたを… と思ったけど、SQLじゃないからスレ違いだ。
>>733-738 要件がよくわからんのだが
between 1 and 10 で済むような話ではないの?
すんませんが、教えてください。 SQL文ってDML、DDL、DCLとか分類されるじゃないですか。で、 SELECT文なんですが、これってDML文に含まれるんですか? なんか、文献によって入るのと入らないのがあるんですが、 正確な定義としてはどうなんでしょう?
それらの略語の意味を考えれ
>>745 DML= Data Manipulation Language
DDL= Data Definition Language
DCL= Data Control Language
でつ。
「教えれ」じゃなくて「考えれ」だが
>>733 どうしてもというなら
select 1
union
select 2
...
SQLServer2000でできるかは知らないけど。
>>744 ボラクルだけは、入らない。
一般的には(その他のDBMSでは)DMLに含まれる。
>748 それ、やってみましたが、0〜999とかやると重くて… OTL 他のアプローチ(VBのコード、ActiveReport等)で出来ないか少し考えてみます。
ActiveReportでできる
Oracle9iで PL/SQLで質問です。 いまAKKOというテーブルがあります。 このAKKOというテーブルのコピー を毎日2時にAKKOn(n=1〜10、nはサイクリックにする:10を超えると1にもどす) という名前のテーブルを作成したいのです。 この要件を満たすPL/SQLを教えてください。 PL/SQLについて詳しく解説しているサイトが無くて・・・
>>744 動きに関係ないし、実務で特に使い分けたりもしないので、気にするな。
試験を受ける気でいるのなら、その試験を受けるDBの説明書読め。
単にOracleはSELECT INTOが使えないからDMLじゃないってだけでHA?
755 :
NAME IS NULL :04/10/26 22:08:19 ID:+RDPVwiR
大文字小文字を同一視して検索したい場合はどうしますか? select * from emp upcase(name)=upcase('HOGE'); とかやったらインデックス使えないし。なんか常套手段ってないスか?
>>755 検索方法はそれでいいと思うけど、インデックスを使いたいなら
関数インデックスを作る。
758 :
NAME IS NULL :04/10/27 01:43:12 ID:r+P4i5sV
>752 そういうバッチ処理は、スクリプトで書いた方が 簡単だと思うが。 あえて書くなら、こんなの書いて、OEMで起動? declare v_sql varchar2(2000); v_tbl varchar2(100); begin v_tbl := 'AKKO' || to_char(mod(trunc(sysdate)-to_date('2001/01/01','YYYY/MM/DD'),10)+1); begin v_sql := 'DROP TABLE ' || v_tbl; execute immediate v_sql; exception when others then null; end; v_sql := 'CREATE TABLE ' || v_tbl || ' as select * from akko'; execute immediate v_sql; end;
759 :
NAME IS NULL :04/10/27 02:41:47 ID:4CD+cdaI
int型の列、Pがあったとして、中に100が入っています。 ここで、updateコマンドで、5を足したいのですが可能でしょうか? SUM()を使えば出来そうな気がするのですが、マニュアル読むかぎり 列どうしでないと出来ないっぽいのですが、出来る方法ありましたら 是非、ご伝授頂きたいと思います。宜しくお願い致します。
update table set P = P + 5
列がPってだけしか示されないとやりづらい・・・ UPDATE テーブル名 SET P=P+5 WHERE 何とかかんとか=ほにゃらら とかすればいいのでは・・・
762 :
761 :04/10/27 02:54:26 ID:???
ああ、書いているうちに終わってたw
763 :
759 :04/10/27 03:00:58 ID:???
>>760-761 なるほど!SUM()とか使わなくとも出来たんですね。ありがとうございました!
今、ご飯食べてるので、終わったら試してみます!
764 :
NAME IS NULL :04/10/27 20:27:51 ID:4CD+cdaI
create table m_d(dstamp date); の中のm_dに 2004-11-25 な日付があって、残り日数を出したい(上記日付から現在の日付を引く)んですが、 SQLで出来ますでしょうか?たとえば、後、30日なら30でいう形です。
お忙しいところ、すみませんが質問をさして頂きます。 DBはOracle9iです。 以下のようなテーブルA、Bより テーブルA 部門コード 年月 金額A AAA 200404 10 AAA 200405 5 AAA 200406 15 AAA 200409 25 AAA 200412 30 CCC 200406 5 テーブルB 部門コード 年月 金額B AAA 200404 5 AAA 200404 10 AAA 200405 20 AAA 200406 15 AAA 200409 40 AAA 200410 5 AAA 200501 60 BBB 200404 20 以下のような結果を得たいのです。 部門コード 2004/04(金額A) 2004/04(金額B) 2004/04〜2004/09(金額A) 2004/04〜2004/09(金額B) AAA 10 15 55 90 BBB NULL 20 NULL 20 CCC 5 NULL 5 NULL それぞれの金額の集計値は該当分がない場合は ゼロではなくNULLとして返ってくるようにしたいのですが。 どなたか愚者に知恵をお貸しください。 お昼からずっと悩んでおります。
とりあえず、方法としまして テーブルAとテーブルBをUNION ALLして 以下のようなテーブルを作るところまでは思いついたのですが ここまでで膠着状態に陥っています。 新テーブル(テーブルA union all テーブルB) 部門コード 年月 金額A 金額項目B AAA 200404 10 NULL AAA 200405 5 NULL AAA 200406 15 NULL AAA 200409 25 NULL AAA 200412 30 NULL CCC 200406 5 NULL AAA 200404 NULL 5 AAA 200404 NULL 10 AAA 200405 NULL 20 AAA 200406 NULL 15 AAA 200409 NULL 40 AAA 200410 NULL 5 AAA 200501 NULL 60 BBB 200404 NULL 20 どうか宜しくお願いします。
すいません、取得したい結果は 部門コード 2004/04(金額A) 2004/04(金額B) 2004/04〜2004/09(金額A) 2004/04〜2004/09(金額B) AAA 10 15 55 90 BBB NULL 20 NULL 20 CCC NULL NULL 5 NULL 以上の通りです。 2004/04(金額A) の部門コードCCCの値が間違えておりました。
>>764 SELECT dstamp-CURRENT_DATE FROM m_d;
769 :
NAME IS NULL :04/10/27 22:20:24 ID:vcMuSB+s
OLACLE(8i)で数値の3桁区切る方法は色々あると思うのですが、 最も一般的と思われる方法をを教えて頂けませんでしょうか。
770 :
764 :04/10/27 22:24:20 ID:4CD+cdaI
>>768 ありがとうございました。これで出来るんですね。。。知らなかった。。。
とても勉強になりました。
select dayofyear(dstamp - current_date) from m_d;
なんて、トンチンカンなSQL書いてしまって、エラー出て悩みまくっていました。
本当にありがとうございました。
771 :
770 :04/10/27 22:51:12 ID:4CD+cdaI
すいません。上記SQLを試してみたのですが、当月分はよいのですが 月が変わると全然違う日付が帰って来てしまうようです。 mysql> insert into m_d values('2005-06-01'); mysql> select dstamp - current_date from m_d; 9574 また、何か見落としているんでしょうか。。。
772 :
770 :04/10/27 23:11:00 ID:???
たびたびすいません。MySQLですが、下記のSQLで無事日数を取ること が出来ました。どうもお手数お掛け致しました。 select to_days(dstamp) - to_days(current_date) from m_d;
773 :
NAME IS NULL :04/11/01 12:07:21 ID:2Tw1B6rM
すみません。どなたか教えて下さい。 INSERT や UPDATEで、'を含んだ文字列は、どのようにSQL文を書いたらいいのでしょうか。 例えば INSERT INTO SAMPLE (ID, WORD) VALUES (1, 'Let's GO!'); と、Let's GO!を登録したいのですが…
>>773 DBによってそれぞれエスケープさせる文字があると思うが、
多くの場合は\で可能かな?
INSERT INTO SAMPLE (ID, WORD) VALUES (1, 'Let\'s GO!');
775 :
773 :04/11/01 16:56:09 ID:???
>>774 ありがとうございました。DBによって違いがあるのですね。
>>773 シングルクォートを二つ並べる処理系もある
INSERT INTO SAMPLE (ID, WORD) VALUES (1, 'Let''s GO!');
どんな処理系?
Oracleだろ。
高いだけあってエスケープも独自仕様なんですね( ´_ゝ`)
失礼だな、Oracleが標準なんだよ
シングルクォート二つが普通。マイナーなのは\'の方。
PostgreSQLもシングルクォートで可能なんですけど、 シングルクォートの方が標準なのか。へぇ〜
SQL ServerもDB2もシングルクォート二つでしょ?
そうだよなぁ、Oracleが標準だよなぁ (+)とかな(w
>>783 どっちでもいい。
多分、Oracle互換のためにクオートも実装してるんではないかと。
>>784 それ激しく便利なんだよな
left joinとか書くよりも直感的でわかりやすいと思うんだよ
787 :
NAME IS NULL :04/11/02 11:58:33 ID:PlFI4bf5
登録日 変更日 04/01/01 04/08/05 04/02/10 04/10/10 04/10/20 00/00/00 上のようなデータから、登録日と変更日の両方合わせての最大値を 取得したいのですが。(上の場合だと「04/10/20」)
788 :
NAME IS NULL :04/11/02 12:12:54 ID:wFpwwGCM
ひと月分のデータを取ってくる激重いSELECT文を 一秒でも速くしないとならんのですが 下の書き方で1と2ではどっちが速いでしょうか?同じ? 1. WHERE RPAD(REG_DT,6) = 200411 2. WHERE REG_DT >= 20041101 AND REG_DT <= 20041130 REG_DTは8桁のNUMBER(not日付型) Oracle9iです
789 :
NAME IS NULL :04/11/02 12:44:58 ID:Y8T1Y7g6
検索ページで次の50件とするときに、最初の50件は TOP関数でやってるんですが次の50件はどうやってますか? (SQLServer2000)
>>787 いろいろ方法があると思うけど、インデックスがうまく機能するのなら、
SELECT MAX(max_date) FROM
(SELECT MAX(登録日) AS max_date FROM Table
UNION
SELECT MAX(変更日) AS max_date FROM Table);
が速いかな? SQLはあっているけど、速度的にどうかは自信なし。
>>788 関数インデックスを作成して1に1票。
つか、実行して計測すればわかるんじゃないの?
791 :
789 :04/11/02 16:47:24 ID:???
SQLで10000件の内300行から310行だけ取り出すやりかたりますか?
よし、やり語ろう。
SQL鯖使っていないんで知らんのだけど、 OFFSETとLIMITってないのか? 標準的にはカーソルを使う。
794 :
789 :04/11/02 17:07:00 ID:???
>>793 さんくす!調べて見ます->OFFSETとLIMIT
>標準的にはカーソルを使う。
カーソルということは、ADOだったらレコードセットをぐるぐるまわす
ということですか?
>>791-794 SELECT * FROM
(SELECT TOP 10 * FROM
(SELECT TOP 310 * FROM TABLENAME ORDER BY SORTKEY) AS T1
ORDER BY SORTKEY DESC) AS T2
ORDER BY SORTKEY;
やり語ってみました。動作は未確認。どこかの受け売りです。
でも僕も方言がなければ頭から舐めて数えます。
最近のは知らないけど、SQLサーバにはOFFSET,LIMITは無かったような・・・
Enterprise Manager 絡みの質問はここでいいんだろうか? スレ・板違いだったらスマソ。
797 :
789 :04/11/02 17:54:04 ID:???
>>795 レスさんくす!
>SQLサーバにはOFFSET,LIMITは無かったような・
調べた結果ありませんでした
提示のSQL理解してみます
799 :
NAME IS NULL :04/11/03 00:42:32 ID:gKJQUjH3
データベースのプロの方、いますか?
800 :
NAME IS NULL :04/11/03 00:57:28 ID:gKJQUjH3
801 :
NAME IS NULL :04/11/03 02:27:45 ID:y6dEl/yN
>>801 神が沢山降臨希望のようですので、現在間に合う状況になりそうです。
本体の方も止めてください。本当にありがとうございました。
また必要情報などがありましたらオフィシャルWebサイトにアップしますのでご支援よろしくお願いします。
-- まさたか@川口? 2004-11-03 (水) 10:06:32 New!
質問です。 table A id,A 1,A 2,A 3,A table B 4,B 5,B 6,B と言うデータが有ったとして、この2つのテーブルをくっ付けて id,A,B 1,A,null 2,A,null 3,A,B 4,null,B 5,null,B と言うデータを取り出したいと思ってます。 これを実現するSQLはどのように書けば良いでしょうか? A left join Bとかでは4,5が出力されませんしここでハマってます。 なおDBはMySQLを使用しています。 どうか宜しくお願いします。
すみません。訂正です。 table B 3,B 4,B 5,B でした。
select isnull(tableA.id, tableB.id) AS idd, tableA.A, tableB.B from tableA full outer join tableB on tableA.id = tableB.id order by idd
>>803 SELECT id,
(SELECT a FROM Table_a WHERE id=T0.id),
(SELECT b FROM Table_b WHERE id=T0.id)
FROM
(SELECT id FROM a UNION SELECT id FROM b)AS T0;
MySQLで動くかどうかは知らん。
807 :
806 :04/11/04 00:42:36 ID:???
最後の行を打ち間違えた。 SELECT id, (SELECT a FROM Table_a WHERE id=T0.id), (SELECT b FROM Table_b WHERE id=T0.id) FROM (SELECT id FROM Table_a UNION SELECT id FROM Table_b)AS T0;
>>805-807 レス有難うございました。
>>805 MySQLではisnullで2つ以上の値を指定する事が出来ないようです。
それからfull outer joinも使えないようでした。
>>806 MySQLでもうまい事出来ました。
unionってのがキモですね、これは勉強になりました。
さらにこれを利用してselectを少なくしてみました。
select ids.id, A, B from (select id from tableA union select id from tableB) as ids left join tableA on ids.id=tableA.id left join tableB on ids.id=tableB.id;
テストテーブルでは軽すぎて速度は測定出来ませんでしたが、本データベースで試して見て速度が速い方を使うことにします。
809 :
806 :04/11/04 05:12:59 ID:???
>>808 俺が書いたSQLはターゲットリストのサブクエリが1行のみ返す状態でないとエラーが発生するので、
貴方が書いたSQLの方が安全かも。
各テーブルにおいてidがUNIQUEであり、インデックスが張られていてインデックス検索が有用なら、
俺が書いた方が高速だと思う。処理系や他の条件によっては変わるだろうけど。
810 :
806 :04/11/04 06:28:10 ID:???
似たようなテーブルがあったのでちょっと試してみたら、 808の方が速かった。 そんなことより、FULL JOIN が使えるのなら、 SELECT * FROM Table_a FULL JOIN Table_b USING(id); で済むし、一番速そうなんだけどw
811 :
796 :04/11/04 09:33:05 ID:???
812 :
796 :04/11/04 09:34:07 ID:???
って違う、
>>798 。
_| ̄|○ 朝っぱらからアンカーミスかよ
813 :
NAME IS NULL :04/11/05 19:04:20 ID:st/1ZvTx
ID (INT) |MAKE_DATE (TIMESTAMP) ----------+--------------------- 1 |1999-12-12 11:11:11 2 |2000-01-01 01:01:01 上記のようなTIMESTAMP型を含むテーブルから 時間の各要素を取り出す方法ってあるですか? SELECT EXTRACT('HOUR',makedate) FROM <TABLE名> WHRER ID = 1; SELECT EXTRACT('HOUR', TIMESTAMP makedate) FROM <TABLE名> WHRER ID = 1; SELECT EXTRACT('HOUR', TIMESTAMP (SELECT makedate FROM <TABLE名> WHRER ID = 1)); こんな感じでいろいろ試してみました
814 :
806 :04/11/05 20:45:05 ID:???
>>813 SELECT EXTRACT(HOUR FROM make_date) FROM Table;
名前欄にレス番が入ったままだった orz
816 :
えせ壊人 :04/11/05 22:03:57 ID:eQUK2KFn
>>813 extractと同等と説明されてるが
date_partだと
>>813 の構文でも上手くいったと思う
今 確認できる環境がないけど試してみ
>>817 じゃなくて、816さんは構文の違いを指摘してるんでしょ?
extract()とdate_part()は機能は同じだけど、カンマか"FROM"か
という違いがある、と。
あとあまり古いドキュメントのURLを貼らないでね。
syozoku namae 001 鈴木 001 佐藤 002 山田 ってデータが入ってるとき SQLで抽出すると syozoku namae 001 鈴木 佐藤 002 山田 のように表示させたい場合ってどのようにしたらいいでしょうか? DBはOracle9iです。お願いします。
>>819 副言語でそのまま取り出して、主言語で加工。
select decode(C.seq, 1, C.seq2, ' ') as syozoku, C.namae, C.seq from ( select A.syozoku as seq2, count(A.syozoku) as seq, Max(A.namae) as namae from meibo as A, meibo as B where A.syozoku = B.syozoku and A.rowid >= B.rowid group by A.syozoku, A.rowid ) as C
MSDEをGUIで操作できるツールってありませんか?
825 :
NAME IS NULL :04/11/07 22:06:58 ID:xiv90rCf
>>824 Italiano?
Portugese?
部門CD、処理日、金額の書かれたテーブルがあるとします。 このテーブルから、『各部門ごとの、一番最近に処理された金額を取得』したいんですが、 とりあえず思いつくのは SELECT CD, DT, VAL FROM (SELECT CD, MAX(DT) AS DT FROM TBL GROUP BY CD) A JOIN TBL ON A.CD = TBL.CD AND A.DT = TBL.DT なんですが、同僚は SELECT * FROM TBL T1 WHERE DT = (SELECT MAX(DT) FROM TBL WHERE CD = T1.CD) のほうがいいと言います。が、このSQLでなんで希望の処理ができるのかいまいち理解出来ません。 確かに結果は同じように見えるんですが・・・ 括弧内のような処理は多々あると思うんですが、そのときの定型的な処理方法があれば 教えていただけませんか?
理解できないってのが、わからない。 書いてある通りで、同僚さんのSQLの方が意味をストレートに汲み取れる と思うのだが。 どう書くかは、索引を意識したり、実行計画を意識したりってのが 未だ無理なら、他人に分かり易いように書けば? でも、dup row になりそうな悪寒。
829 :
NAME IS NULL :04/11/09 20:30:32 ID:PvmqmfFE
>828 いや、もう定型だから後者のように書くけど、ぱっと見でどっちが咄嗟に理解 出来るかといえば前者な漏れ orz でもこれってコスト的には前者の方が低くない? >827 藻舞の同僚の方がSQL出来そうなんで、とりあえず同僚に聞け。 まずはそれからだ。聞く事を恥と考えるな。
すみません。教えて下さい。 セミコロンが含まれる文字列を検索する場合、 SELECT * FROM テーブル名 WHERE フィールド名 like '%;%' ↑これでよいの? どうも、全検索になってしまうんですが。 (Firebird1.5を使ってます)
>>832 FB知らんが、セミコロンの前にエスケープ記号を入れたらいいんじゃね?
834 :
832 :04/11/10 13:02:20 ID:???
>>833 レス、サンクス。
セミコロンのエスケープ記号って、一般的には
何になるのですか?
とりあえず、
1.SELECT * FROM テーブル名 WHERE フィールド名 like '%#;%' ESCAPE '#'
2.SELECT * FROM テーブル名 WHERE フィールド名 like '%\;%'
3.SELECT * FROM テーブル名 WHERE フィールド名 like '%;;%'
を試したところ、1.、2.はヒットせず。
3.だけが、うまくヒットしました。これで良いんですか?
835 :
NAME IS NULL :04/11/10 15:02:46 ID:/ScPk9xz
SQLについて全く初心者なため厨な質問で恐れ入ります。 Excel2000のVBAでADOを使ってAccessのデータベースを 読み込もう(Excelのシートにテーブルを展開しよう)としています。 テーブル名が"GROUP"と言うデータベースを読み込むとき、 cmd.CommandText = "SELECT * FROM GROUP" Set recset = cmd.Execute とすると 「FROM句の構文エラー」と言われてしまいます。 他のテーブル名のデータベースは読み込めるのですが、 この場合どうすればいいのでしょうか。 ご教示お願いいたします。 ちなみに cmd.CommandText = "SELECT * FROM 'GROUP'" としてもだめでした。(「クエリの句が不完全です」)
[GROUP]
837 :
S :04/11/10 15:48:35 ID:???
すみません。教えてください。 ある値より大きい値求めて、それを昇順で並べ替え、 その最初のデータと同じデータを求めるにはどうすればいいんですか。
select * from tbl where data=(select min(data) from tbl where data>ある値)
糞カキコですみません。 (1) DELETE FROM TABLE (2) DELETE TABLE SQL界の主流はどっちですか? 僕は(1)じゃないと落ち着かないんですが、先輩(♀)が(2)な人で対立してます。
主流がどちらかなんてどうでもいい。 夜にとことん話し合え。 全裸で。
841 :
835 :04/11/10 16:36:02 ID:???
>>836 出来ました。ありがとうございます。精進します。
>>839 ANSI準拠なら(1)ではないの? FROMって省略できたっけ?
>840 SELECT * FROM 女 WHERE 年齢 BETWEEN 10 AND 15
844 :
NAME IS NULL :04/11/10 16:47:11 ID:69SzujgL
>>843 必要な部分だけ取り出せよ。
SELECT オパーイ FROM 女 WHERE 年齢 BETWEEN 18 AND 25
>>839 動けばいいだろ。
どっちでもいいよ。
そんなことでもめる暇あったら、もめてる分だけ速く納品しろ。
では
>>847 宛の発注品は変数をa aa aaa aaaaとかで納品します
>847 は脳内社会人? 納品なんて、期日よりも早くても遅くても駄目なのが普通なんですが?
850 :
S :04/11/11 10:33:44 ID:???
>>838 レスありがとうございます。
早速試してみたいと思います。
>>847 納期よりも、FROMをきっかけに
どうやって、先輩を口説き落とすかが
問題だと思います。
先輩の主張を認めるふりをして 先輩・・・実は僕・・・INSERTの仕方もわからないんですっ と
853 :
NAME IS NULL :04/11/11 13:35:32 ID:G1Y3gPo/
先輩・・・今晩、INSERTとJOINについて詳しく教えてください。 いいけど、ついでにUPDATEも教えてあげるわね。 #数ヵ月後に住民票のUPDATEイベント発生・・・
お忙しいところ失礼します。 環境:Oracle9i 以下のような2つのテーブルがあります。 商品テーブルA 商品コード 金額A AAA 1000 BBB 900 DDD 2000 商品テーブルB 商品コード 金額B AAA 900 CCC 200 この2つのテーブルから 結果 商品コード 金額A 金額B AAA 1000 900 BBB 900 NULL CCC NULL 200 DDD 2000 NULL という結果を得たいのですが どのようなSQLを書けば良いでしょうか? FULL OUTER JOINというものを使えば できるのではないかというところまでは辿り着いたのですが。 もしくは、FULL OUTER JOINを使わない方法がありましたら 後学のために教えていただけましたら幸いです。 どなかたかどうかよろしくお願いします。
>>855 すいません、ログを見ずに質問してしまいました。
非常に助かりました、ありがとうございます。
857 :
856 :04/11/11 23:19:29 ID:???
805を参考にしてOracle用に書き直したら select COALESCE(A.商品コード, B.商品コード) AS 商品コード A.金額A, B.金額B from 商品テーブルA as A full outer join 商品テーブルB as B on A.商品コード = B.商品コード order by 商品コード でしょうか? 実行環境がないのでわからないのですが。 どなたかお教えください。
>>857 FULL JOIN を使わない方法が知りたいのじゃなかったのか?
FULL JOINなら単純に
SELECT * FROM A FULL JOIN B USING(code);
で済むと思うが。
OUTER JOIN 系を一切使わないなら
>>807
LEFT JOINの結果とRIGHT JOINの結果をUNION (not ALL) で得るのじゃダメ?
>>854 selet 商品コード, sum(金額A), sum(金額B) from (select 商品コード, 金額A, 0 as 金額B from 商品テーブルA union select 商品コード, 0, 金額B from 商品テーブルB) T group by 商品コード
とか言うのも思いついた。
SQL重い
>> 859 だめ。 Union (not All) だと Inner Join 部分が 2重になっちゃう。
>862 逆だろ UNION ALL だと INNER JOIN で返るのと同じ行が重複するが、 ただの UNION (ALL を付けない UNION) なら重複部分は1行 しか返されない。
FULL JOINを使う
>>858 の方法は
もし、
テーブルAが
商品テーブルA
商品コード 金額A
AAA 1000
AAA 150
BBB 900
DDD 2000
とかなら狂うね。
まあ、商品コードが重複するかしないかが
明記されていないので分からないが。
>>860 のやり方が妥当だろうか。
ゼロの部分をNULLにして数値項目をTO_CHARしないと
駄目だろうけど。
865 :
NAME IS NULL :04/11/14 00:47:07 ID:V5M6q6Hi
質問です。 DATE型の要素を表示する際に、 日付を表示しない方法を考えています。 具体的にはDATE型でフォーマットされているテーブルに、 2004-11という「西暦-月」のみを挿入し、 表示した際に日付を出さないということです。 ちなみに、データ出力時(SELECT文)に日付を出さないという条件をつけるのはダメです。 自分で考えてみた TO_DATE('2004-11','YYYY-MM') という文では、データ出力時に日付まで表示されてしまいます。 何か良い方法はありませんでしょうか。
副言語で取得して、ホスト言語で加工汁
867 :
NAME IS NULL :04/11/14 05:42:36 ID:gZNduTNd
>>865 日付はダミーで入れといて、
SELECT TO_CHAR(カラム名,'YYYY-MM') FROM テーブル名;
でどうですか?
date_formatは駄目なの?
869 :
NAME IS NULL :04/11/14 06:22:32 ID:XwWBrCKZ
MySQL だったら date_format() それ以外だったら to_char()
870 :
NAME IS NULL :04/11/14 12:03:02 ID:+I1IWcq/
金額を格納するフィールドには通常どのような型に設定すれば良いですか? Firebirdなのですが。
>>865 DATE型で定義されている以上無理じゃない?
DATE型で有る以上ダミーの日のデータは必要だし
ダミーでも日付が有ればそのままだとそれが出てきてしまう。
それが嫌ならDATE型をやめるしかないな。
year型とtinyint型で年と月のカラムを作成してそこに突っ込んでいくか
int型で西暦0年1月からの経過月数を保存しておくか(2004-10なら2004*12+10-1#一発で計算する方方有るかも)
いっそのこと文字列型としてそのまま保存しちゃうか。
872 :
865 :04/11/14 15:14:06 ID:???
>>867 SELECT * FROM xxxxxx で出力しなければいけないので、
その方法は使えないのです。
>>868 ・867
本気初心者なんで、変な回答してるかもしれませんが・・・
ORACLE SQL*Plus使ってます。
TO_CHARは・・・DATE型っていう指定があるのでダメっぽいです。
>>871 DATE型の指定がくせ者ですよね・・・。
みなさん、色々ありがとうございます。
まだ解決していませんが、もう少しがんばってみようと思います。
一般的なプロジェクトならSELECT *は使用禁止だと思うんだが。
>SELECT * FROM xxxxxx で出力しなければいけないので、 なんじゃその規約 野糞未満じゃねーか
>>872 select * from (SELECT TO_CHAR(カラム名,'YYYY-MM') FROM テーブル名)
なんだ宿題か
>>873 昔、糞えせの下でPGしてたとき、そんな規約があったな
つーか、200カラム以上あってSELECT文にカラム名(長い&日本語)書くとバグると思うから止めてねって何よ orz
878 :
NAME IS NULL :04/11/14 18:11:59 ID:3xr8bqJJ
SELECT *,TO_CHAR(カラム名,'YYYY-MM') as 適当な名前 FROM テーブル名 ORACLE SQL*Plus っていうのじゃできないかな?
>>870 オレは int4 を使っている。
扱った経験があるのは YEN だけだけど。
880 :
NAME IS NULL :04/11/15 00:39:51 ID:bZZx79pg
>872 ビュー作ってそれを select * するんじゃ駄目なのか? (select * する時点でダメダメだが) というか、その DATE 型の要素を表示するのは、なんなんだ? そちら側で加工して出力するんじゃ駄目なの?
更新SQLで副問合せの結果を反映させる方法はあってますか? update tableA set a = (select aa from tableY) b = (select bb from tableY) where c = 1 aとbの副問合せがtableYの同じ行でaとbをセットしてくれるか心配なんですが。。。
882 :
881 :04/11/15 09:09:33 ID:???
SQLServer2000の環境です
883 :
881 :04/11/15 09:49:51 ID:???
ちょっと間違えました tableAのdとtableYのdが等しい条件が抜けていました update tableA set a = (select aa from tableY) b = (select bb from tableY) where c = 1 and tableA.d = tableY.d です tableA as Aとか別名つけると構文エラーみたいです
update tableA set a = Y.aa, b = Y.bb from tableA as A, tableY as Y where c = 1 and A.d=Y.d
885 :
881 :04/11/15 12:27:03 ID:???
>>884 返信ありがとうございます。
うまくうごきました!
漠然と質問で申し訳ありません。 ・使用SQL :SQL7.0 ・データ総件数 約10万件強 ・フィールド数 50弱 ・フィールド全長 350程度 ・主キー設定 5フィールド ・サーバーマシン自体はデフラグ済み というテーブルAがあります。 『SELECT * FROM A 』 という全件出力ではさほど時間がかからないのですが 『SELECT * FROM A WHERE (主キーの内の1つ) = 'nurupo' 』 といったWhere条件をつけると途端にタイムアウトしてしまいます。 全てのキーを指定して1件のレコードを出すまでに凡そ5秒かかっている状態です。 これは単純にデータ量が多い為と判断していいものなんでしょうか。 他、考えられる要因などがあれば教えて頂きたいのですが。
>>886 SELECT * FROM Aだとさほど時間がかからないというのは、
1件目のデータが出てくるまでの時間がかからないということでは?
10万件全部出せばやっぱり5秒以上かかるんじゃないですかね。
ようするに両方ともシーケンススキャンやってるけど、
1件目が返ってくる時間だけみれば全件出力の方が速く見えるのでは。
888 :
886 :04/11/15 15:51:22 ID:???
>>887 見た目の問題と言う事でしょうか。
ただ、質問の仕方が悪かったせいもありますが
『何故条件1つ加えただけでタイムアウトするほど処理が遅くなるのか?』
という所が疑問だったりします。スイマセン。_| ̄|○
(主キーの内の1つ) しか指定してなけりゃ、全件検索になりはしないか?
890 :
886 :04/11/15 15:59:44 ID:???
>>889 例ですが、コード、枝番コード、明細番号、連番、更新年月と言った感じで5つ主キー設定されているようです。
『 WHERE コード = '0001'』 とだけ付け加えた場合で。
だから、そういう主キーの場合には[コード]だけ検索する場合の高速化には 無効じゃないかと。
892 :
886 :04/11/15 16:20:43 ID:???
>>891 高速化したいというわけではなく、単純な条件一つでどうしてタイムアウトするまで遅くなるのか、ですね。
887の回答読んでわからない頭の持ち主なので もはやどうにもならないと思われ。
>892 だから、「単純な条件一つ」に適合するインデックスがないから、全件スキャンしとるだけだろうが。 せめて show plan くらいしてみろよ……
895 :
886 :04/11/15 17:51:40 ID:???
了解です。失礼しました・・・
896 :
NAME IS NULL :04/11/19 02:37:52 ID:zEwlut0u
select * from table なSQLからカーソル開いて数件取得するのと limit でSQLで制限かけて数件取得するのってメモリやパフォーマンスに 大きな違いはありますか?
次の 3 行を一つの ( できれば効率のよい ) SQL にできますか? a, b, c を一つの SQL で取得したいのです。 select count(*) as a from t; select count(*) as b from t where x > 10; select count(*) as c from t where y > 20;
union
うそついた 悪いね 普通に取れる
900 :
NAME IS NULL :04/11/20 18:40:19 ID:qbgr6YW3
DBに該当する条件のデータが一つでも あるかどうかを調べるためのSQLを教えてください。 できるだけ高速のを
>>900 UNIXの場合でいい?
find (DBのデータがあるパス) (調べたいデータをそれなりのバイナリに変換した値)
>>902 肝心のスピードが遅いから、ネタとしてもつまらんな。
where hoge='ほにゃらら' and rownum=1 で値が返ってくるかどうか
rownum=1ってなんじゃ
Oracleだね 「where hoge='ほにゃらら'」だけで返ってくる件数が膨大な場合、 確かにrownumを指定することで早く戻ってくるようにはなる
OracleのrownumってOrder by前の番号だったような・・・それだとどんな結果が返ってくるんだ??
order byなんかが必要なようには見えないが? アホか
データがあるかないかだから、別にどんなクソソートで1軒目が出てきても関係ないような。
>>908 知ってる知識を言ってみたかっただけじゃないの?
911 :
NAME IS NULL :04/11/22 03:19:49 ID:Cdqu3I2P
where=1
912 :
NAME IS NULL :04/11/22 03:21:19 ID:Cdqu3I2P
SELECT *nn
913 :
NAME IS NULL :04/11/23 11:55:35 ID:jlWg8Xtz
次のようなテーブルがあるとします。 id|data ------- 1 |1 2 |2 3 |1 4 |3 ここからdataの重複を排除し、以下のようなデータが取りたいです。 id|data ------- 2 |2 3 |1 4 |3 select * from table group by dataですと idの1,2,4が選択されちゃいますしそもそも group byをこういった使いかたして良いのか 常に同じデータが出てくると保障されているのか 分からないので困ってます。 何か良い方法は無いでしょうか。 DBはMySQLです。
>>913 SELECT (SELECT MAX(id) FROM table WHERE data=T1.data),data FROM table AS T1 GROUP BY data;
以下のようなデータって表だけじゃわかりづらい、もうちょっと文章で説明すべき
916 :
NAME IS NULL :04/11/23 15:14:08 ID:jlWg8Xtz
select * from (select * from table order by id desc) T group by data group byで最初に出てくるものが使われると言う保障がある稼動は和紙欄。
MySQLってサブクエリ使えたっけ?
↑ なんでgoogleやYahoo!の入力欄に同じようなこと書いてボタン押せば わかることを掲示板で聞くのか理解に苦しむ。
>>913 のMySQLの質問に対する答えがサブクエリ使ったものばかりだから確認してるだけじゃないの?
でも、使えるようになったのは、遙か昔から何度も既出だよな。
使えるのって4.1からじゃなかったっけ? たしか4.1ってマルチバイト対応がイマイチだから本番サーバに誰も使ってないんじゃ? MySQL5はシラネ
>DBはMySQLです。 バージョン書いてない方が悪い
すいません。 今日の日付以降のデータの中で、1番小さい日付のデータを取得するSQL を教えてください。 環境はVB.net2003です。 よろしくお願いします
SELECT 最小値(日付フィールド) FROM tbl WHERE 日付フィールドが今日以降
>
>>924 さんへ
説明不足でした。
今このようにしてるんですけど今日以前のデータが取得されてしまうんですが
どうすればいいのですか。
sql = "SELECT * FROM tblSchedule " & _
"WHERE fldDate=(SELECT MIN(fldDate) FROM tblSchedule " & _
"WHERE fldDate>=" & Format(Now(), "yyyy/MM/dd") & ") " & _
"ORDER BY fldTime;"
とりあえず、そのsqlっつー変数にセットされている内容を確認してみれ。
927 :
NAME IS NULL :04/11/25 22:21:24 ID:GJuNQxbV
日付に秒まで入ってるんじゃないの? trun(変数)でもすべし。
>>927 >>926 が正しい。
日付をクォートで囲ってないので 2004/11/25 ≒ 7.29 になってしまう。
ありがとうございます。 日付を#で囲ったらできました。
930 :
なみ :04/11/27 01:21:20 ID:tK3UBASD
oracle初心者です。 oracleのサービス関連でお聞きしたいことがありますが、 こちらの掲示板でよろしいでしょうか?
931 :
なみ :04/11/27 01:29:53 ID:tK3UBASD
Oracle 総合 Session2 がありましたので そちらに書き込みしました。 お邪魔しました。
932 :
なみ :04/11/27 02:13:03 ID:tK3UBASD
なみさん
934 :
NAME IS NULL :04/11/29 10:13:45 ID:N6q3BKcM
SQL鯖2000です。 商品コード、更新日がPKとなっている商品マスタというテーブルがあり、内容は以下のようになっています。 商品コード,価格,更新日 1, 100, 10/1 1, 200, 11/1 1, 300, 12/1 2, 10, 10/1 2, 20, 11/1 3,1000, 10/1 ここから、以下のような結果を取得したいのです。 要するに、各商品の更新日が最新のものだけを取得したい、という事です。 商品コード,価格,更新日 1, 300, 12/1 2, 20, 11/1 3,1000, 10/1 どう記述すればよいのか・・・ ヒントおねがいします。
更新日はホントにそういう風に入れてるの? それじゃ年が更新したりしたらメチャクチャに・・・
更新日はdate型なのでちゃんと年月日時分秒まで入ってます。 まぎらわしくてスミマセン。 ちなみに商品コード、価格共にintです。
937 :
ラブ@らぶねっと :04/11/29 11:13:32 ID:2WZTOsEE
SELECT 商品コード, MAX(更新日) FROM 商品マスタ GROUP BY 商品コード この問い合わせで、各アイテムの最終更新日が拾えます。 それに価格を付き合わせれば目的の抽出ができますよね。
>937 なるほど サブクエリって事ですよね? なんとなくイメージできました。 試してみます。 ありがトン
SQLの使い方について、質問です。 第1正規化の反対のするには、どの様に書けばいいのでしょう? 例えば、 正規化前のテーブルが ID data1 data2 001 あ い 002 か き とあり、 正規化後のデータ ID data_no data 001 1 あ 001 2 い 002 1 か 002 2 き (だだし、data_no,には、1か2しか入らない。) という場合に、 正規化後のテーブルを正規化前の形式に出力するSQL文です。 どなたか、よろしくお願いします
すみません、 幅が崩れました 正規化後のテーブルは ID data_no data 001 1 あ 001 2 い 002 1 か 002 2 き です。
SELECT ID, (SELECT data FROM tbl WHERE ID=t.ID AND data_no=1) AS data1, (SELECT data FROM tbl WHERE ID=t.ID AND data_no=2) AS data2 FROM tbl AS t て感じか?
>941以外では select t1.id, t1.data, t2.data from tbl t1, tbl t2 where t1.id = t2.id and t1.id = 1 and t2.id = 2 とか。data_noが1、2のどちらかが存在しない場合は外部結合を使 うか、あるいは片方だけを取り出すselect文とのunionにするか。 もしくは select id, max(data_1), max(data_2) from (select id, data data_1, NULL data_2 from tbl where data_no = 1 union select id, NULL data_1, data data_2 from tbl where data_no = 2) なんかも。この場合はunion allにしておいた方が速いのかな。
列 a, b, c が同じ型(数値)で、『a, b, c の中で最も大きな値』を そのレコードの値としてソートしたいのですが、 …わかりづらいですね_| ̄|○ 申し訳ない。つまり | a b c --+---------------- い| 1 2 3 (3が最大) ろ| 0 0 4 (4が最大) は| 4 5 6 (6が最大) の時、い<ろ<は と並ばせたいのですが、どのようにすれば良いでしょうか? RDBMS は DB2 を用いています。 ORDER BY で弄っているのですが、思うような結果が得られないでいます…
>>943 SELECT *,case WHEN a>b AND a>c THEN a WHEN b>a AND b>c THEN b ELSE c END AS s FROM Table ORDER BY s;
かな? 比較する列が増えると大変だが....
>>944 なるほど。やはりどうしても泥臭くはなってしまうのですね…
ありがとうございます。ちょっと触ろうとしたのですがさくっと扱えなかったので
DB2 のリファレンスと格闘してみます(Oracle の記述はネットやらにそこそこあったのですが...)
>>943 select key from
(select key,a as value from table
union select key,b as value from table
union select key,c as value from table ) as a
order by max(value)
group by key
試してないのでもし通らなかったらスマン。
947 :
sage :04/12/05 23:12:57 ID:QODHCzZH
商品A登録日、商品B登録日という二つの日付型フィールドから、 日付データの新しいほうのデータを取得したいのですが 商品A | 商品B | 商品A登録日 | 商品B登録日 ***** **** 2004/12/01 2004/11/01 ↓ 抽出結果 商品A | 商品B | 商品最新登録日 ***** **** 2004/12/01 ご教授願います。
ageちゃいました・・・ スマソ
>>947 SELECT 商品A , 商品B , CASE WHEN 商品A登録日 > 商品B登録日 THEN 商品A登録日 ELSE 商品B登録日 FROM Table;
950 :
949 :04/12/05 23:18:14 ID:???
END が抜けてた。 SELECT 商品A , 商品B , CASE WHEN 商品A登録日 > 商品B登録日 THEN 商品A登録日 ELSE 商品B登録日 END FROM Table;
スキーマ=ユーザと考えたら駄目ですか?
あなたの心のスキーマ お埋めします
テーブルの削除と作成(というか一時的に作ってたテーブルのリネーム)を アトミックに行えなくて困ってます. perl-5.8.5 + mysql-3.23 で, $dbh->{AutoCommit} = 0; $dbh->do("DROP TABLE hoge"); $dbh->do("ALTER TABLE hoge_tmp RENAME TO hoge"); $dbh->commit; ってやってるのですが,この作業の最中に,他のスレッドが hoge を使おうとすると, 「テーブルがないよ」と言われる場合があります. 何か根本的に間違ってるのでしょうか?
>>956 テーブルをリネームする必要があるという設計が間違ってる予感。
何でリネームするのさ?
普通なら select * into hoge from hoge_tmp とかでデータを写すものだと思う。
データを写した後のhoge_tmpはtrancateするなりdropするなりすればいい。
少なくとも、リネームするときは他のスレッドがhogeを使おうとしない設計にするべきだろ。 ロックとかデータの整合性とかの点で、RDB使う意味無くなる。
959 :
956 :04/12/08 01:49:46 ID:???
>>957 ,958
ありがとうございます.
以下のように改めました.
$dbh->{AutoCommit}=0;
$dbh->do("DROP TABLE hoge_tmp");
$dbh->do("CREATE TABLE hoge_tmp ... SELECT ...");
$dbh->do("TRUNCATE TABLE hoge");
$dbh->do("INSERT INTO hoge SELECT * FROM hoge_tmp");
$dbh->commit;
>955 恋人スキーマが空っぽなので埋めてください
961 :
SQL初心者 :04/12/11 17:14:31 ID:bTxzaHjt
SQL文で少数点第三位を切り上げる方法を教えて下さい 例 5000 ÷ 6 = 833.333333 → 833.34にする方法 お願いします
>>961 round((5000/6)+0.009,2) とかじゃだめなの?
963 :
NAME IS NULL :04/12/13 10:07:31 ID:iwUEodU9
SQL言語ってどの会社が作っているんですか?
>>959 truncateしたときって、暗黙にcommitされちゃうから
table hogeがからっぽな瞬間があるよ。
967 :
NAME IS NULL :04/12/14 01:24:49 ID:4jo5gRvJ
table 1 table 2 |国語成績 | 数学成績| |国語成績 | 数学成績| |80 | 70 | |60 | 55 | 結果としてこの表を出したいんです さらに名前という列を追加して名前を入れたいんです。 |名前 | 国語成績|数学成績| |山下 | 80 | 70 | |井上 | 60 | 55 |
968 :
NAME IS NULL :04/12/14 01:25:53 ID:4jo5gRvJ
table 1 table 2 |国語成績 | 数学成績| |国語成績 | 数学成績| |80 | 70 | |60 | 55 | 結果としてこの表を出したいんです さらに名前という列を追加して名前を入れたいんです。 |名前 | 国語成績|数学成績| |山下 | 80 | 70 | |井上 | 60 | 55 |
969 :
NAME IS NULL :04/12/14 01:36:31 ID:4jo5gRvJ
しまった 二重カキコしてしまいました。すいません。 お願いします
union
971 :
968 :04/12/14 02:04:53 ID:4jo5gRvJ
select 国語成績,数学成績 from (select table 1.国語成績 from table 1 union select table 2.国語成績 from table 2) , (select table 1.数学成績 from table 1 union select table 2.数学成績 from table 2 これをためしてもエラーが出ました。 unionの使い方まちがってますか? 誰かおねがいします。
意味が良くわからんが、 SELECT [名前], [国語成績], [数学成績] FROM ( SELECT '山下' AS [名前], [table 1].[国語成績], [table 1].[数学成績] FROM [table 1] UNION SELECT '井上' AS [名前], [table 2].[国語成績], [table 2].[数学成績] FROM [table 2] ) こんな感じか? ちなみに眠いからテストはしてないYO。
973 :
968 :04/12/14 04:16:16 ID:8peVtg2k
>972 サンクス できました
974 :
NAME IS NULL :04/12/14 15:09:46 ID:gYkAsbc2
Prologプログラマです。一応その視点からの皆さんへの質問です。 皆さんは、SQLの仕様に不満はありませんか。
Prologなんて知らねーから、その視点とか言われても知らん。
SQLはいわゆる第三世代言語ともオブジェクト指向言語とも相性が 悪いのが難点なのだが。Prologとは仲良しなのかね?
978 :
NAME IS NULL :04/12/14 15:45:16 ID:4jkkJIXP
【序 論】
オウム事件とは、「オウム、創価、統一が共同でやっていた覚醒剤密造などの不法行為がばれそうになり、全ての罪をオウムに押付けた。」事件であると理解しています。
統一教会は、その起源から考えて、KCIA及びCIAの影響下にあると考えるべきです。
日本側のCIA専属のお爺さんたち、つまり、笹川さん、児玉さん、中曽根さんたちが、統一とつるんでいたのも、CIAの犬同士という絆があったわけです。
一方で、創価は創価で、笹川一派を通じて、統一と繋がりがありますし、それ以前に創価内部に深く入り込んでいる暴力団、
後藤組のもつ北朝鮮コネクションから、オウムの麻薬ビジネスに関わっていたわけです。
もちろん、日本社会に創価マフィアのネットワークをはりめぐらした学会を、CIAが放っておくわけがなく、マネーロンダリングなどに、しっかり利用されています。
宗教法人の財務の閉鎖性をCIAが利用しないと考える方が異常です。
そして、CIAお得意の麻薬ビジネスの日本支部が、オウムだったわけで、その収益が北朝鮮に還元されていたのも当然のことであり、
北の現体制を維持するための、CIAの有難い配慮だったわけです。
なにしろ北の体制が崩壊すると、一番困るのは、CIAのスポンサーである軍産複合体と国際金融資本であり、極東の緊張は、彼らの飯の種なわけですから。
麻薬王にして、CIAの帝王である大ブッシュさんが、統一の文と仲良しなのも、アッタリマエなわけですね。
今度の米大統領選でも、随分と統一のカネが小ブッシュ陣営に流れたようですね。
尚、本件の主たる議論は、2チャンネル、警察板の「告発します 第3部」スレッドにて、進めています。
http://mentai.2ch.net/test/read.cgi?bbs=police&key=985780338&ls=100
979 :
NAME IS NULL :04/12/14 16:23:58 ID:gYkAsbc2
>977 私も含めて、オンメモリーのリレーショナルデータベースとして Prolog、バックエンドにRDBMSを配置しC言語インターフェイスで繋ぐ というのが一般的なようです。Prologのデータベースに見つからない時 ORACLEから探すというような使い方をすることもあります。 ただ、私はProlog以前はSQLが専門だったので平気なのですが、 一般にPrologプログラマからはSQLの仕様は評判が悪い。副照会の 辺りに批判が集中するようです。一方、Prologは集約に弱い。 それから、全解探索機構がかえって仇となって、すべてシーケンシャル サーチになってしまう。いくらオンメモリーでも100万件を超えると やはり大変です。そんなことでSQLをPrologに変換するのは簡単ですが、 Prologコードを解析して最適なSQL文を生成するのは案外むずかしい。 それで、Prologを書けば、勝手にそれに対応するSQLが生成されて、 自由自在に行き来すると云うわけにはなかなかいきません。
980 :
NAME IS NULL :04/12/14 19:33:16 ID:qbSzLZbl
質問なのですが カラムのUNIQUE指定を外す構文を教えてください。
知りません。
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
>>982 こいつ最近見ないと思ったら、久々の登場だな。
SQLの勉強始めようと思っています 本当に初歩的な質問&多少すれ違いで申し訳ないんですが・・・ データベースを管理するためのシステム(ソフトウェア)がDBMSで DBMSを定義、操作する言語がSQLですよね? で、DBMSにはOracle、フリーのFirebirdなどがあり SQL言語にはPostgreQL、MySQLがあるって考えで合ってますか? また、現在は只のSQLって言語は使用されてるんですか?
>>985 >データベースを管理するためのシステム(ソフトウェア)がDBMSで
>DBMSを定義、操作する言語がSQLですよね?
は、まぁそれでいいとして、
>で、DBMSにはOracle、フリーのFirebirdなどがあり
>SQL言語にはPostgreQL、MySQLがあるって考えで合ってますか?
は、禿しく勘違い。そこに上げたのは全てDBMSの製品名で、
それぞれに国際標準規格(ISO-SQL)±αのSQLが載っている。
釣りだといいな…
988 :
NAME IS NULL :04/12/15 16:59:46 ID:MM590eEu
PostgreSQL を使用しています。 SELECT (SELECT B.keyword FROM B WHERE A.id=B.id LIMIT 1) FROM A; として、Aの表のidをBの表で合致するkeywordで置き換えたい時、 激しく時間がかかるので、A と B を JOIN させましたが、 SELECT A.name, B.keyword FROM A CROSS JOIN B WHERE A.id=B.id; Bの表に合致するレコードが複数あった場合は、レコード数が増えて、 正しく表示されません。外部結合や内部結合に単に変えても、 Bに対して LIMIT の指定が出来ないので、うまくいきません。 何か良い方法はないでしょうか?
>>988 SELECT DISTINCT A.name,B.keyword FROM A JOIN B USING(id);
でいいのか? なんか、それ以前に(ry
990 :
NAME IS NULL :04/12/15 19:51:58 ID:wKX08Pae
Firebird1.03を利用しています。 部署毎の売上合計金額を、降順に表示したく SELECT ORDER.SECTION, Sum(MAINORDER.ACCOUNT) FROM ORDER GROUP BY MAINORDER2.SECTION ORDER BY Sum(ORDER.ACCOUNT) DESC; としました。MS Accessではこれでできるのですが Firebirdでは「(ORDER BYにある)Sumなんて知らない。」 とエラーになります。 どなたか 1.他に合計金額でソートするSQL句 2.他の方法で実現する方法 を教えていただけないでしょうか。 よろしくお願いします。
991 :
990 :04/12/15 19:53:52 ID:wKX08Pae
すみません。SQLを切り貼りして中途半端に修正してました。 正しくは SELECT ORDER.SECTION, Sum(ORDER.ACCOUNT) FROM ORDER GROUP BY ORDER.SECTION ORDER BY Sum(ORDER.ACCOUNT) DESC; です。 どなたかよろしくお願いします。
>>991 SELECT ORDER.SECTION, Sum(ORDER.ACCOUNT) AS Total
FROM ORDER
GROUP BY ORDER.SECTION
ORDER BY Total DESC;
で、どぉ。
>>991 CREATE VIEW test AS
SELECT ORDER.SECTION, Sum(ORDER.ACCOUNT) AS TotalAccount
FROM ORDER
GROUP BY ORDER.SECTION;
でビューを作成して
SELECT t.ORDERSECTION, t.TotalAccount
FROM test t
ORDER BY t.TotalAccount DESC;
にしる。
FB1.03使っているけど、
>>992 の方式はうまくいかなかった(工夫すればできるかもしれないけど)。
FB1.5でできるかもしれないけど、持ってないからわからん。
って、よく見たらもうすぐ1000じゃねえかよ。
994 :
NAME IS NULL :04/12/15 21:20:04 ID:PR2HhgMt
まだ他に質問スレが残ってるからそこに移動してもよかったろうに。 まあいいけどさ。
>>996 次スレでいきなりレプリケーションみたいなネタが着てるけど、
このスレは、ストアド類もなしに出来ればベンダーに依存しない
純粋なSQLネタがいいな。
質問者が元のテーブル等と、期待する結果のサンプルを出して、
答える人がSQLだけを考えるみたいな。
998 :
991 :04/12/16 09:54:11 ID:OCa5514Y
スレが残り少ないのでまとめレスで失礼します。
>>992 試した結果、「(ORDER BYにある)○○(列名)なんて知らない。」
と言われてしまいました。
>>993 アドバイスの通り、ビューで対応したく思います。
お二方、みなさん、アドバイスありがとうございました。
1000ならE.F.コッド復活
1000ならE.F.コッド復活しない
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。