SQL質疑応答スレ

このエントリーをはてなブックマークに追加
1名無しさん@お腹いっぱい。
です。
2名無しさん@お腹いっぱい。:03/06/30 20:49 ID:vwwrk7GD
おっぱいがいっぱい
3名無しさん@お腹いっぱい。:03/07/02 14:38 ID:???
age
4あぼーん:あぼーん
あぼーん
5あぼーん:あぼーん
あぼーん
6あぼーん:あぼーん
あぼーん
7あぼーん:あぼーん
あぼーん
8あぼーん:あぼーん
あぼーん
9あぼーん:あぼーん
あぼーん
10あぼーん:あぼーん
あぼーん
11あぼーん:あぼーん
あぼーん
12あぼーん:あぼーん
あぼーん
13あぼーん:あぼーん
あぼーん
14あぼーん:あぼーん
あぼーん
15あぼーん:あぼーん
あぼーん
16あぼーん:あぼーん
あぼーん
17あぼーん:あぼーん
あぼーん
18あぼーん:あぼーん
あぼーん
19あぼーん:あぼーん
あぼーん
20あぼーん:あぼーん
あぼーん
21あぼーん:あぼーん
あぼーん
22あぼーん:あぼーん
あぼーん
23あぼーん:あぼーん
あぼーん
24あぼーん:あぼーん
あぼーん
25あぼーん:あぼーん
あぼーん
26あぼーん:あぼーん
あぼーん
27名無しさん@お腹いっぱい。:03/07/14 15:52 ID:Cb391GNe
SQL99って流行ってる?

Oracleなどほとんどの商用DBはSQL92どまりらしいけど。
28山崎 渉:03/07/15 11:19 ID:???

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
29あぼーん:あぼーん
あぼーん
30ぼるじょあ ◆ySd1dMH5Gk :03/08/02 05:12 ID:???
     ∧_∧  ∧_∧
ピュ.ー (  ・3・) (  ^^ ) <これからも僕たちを応援して下さいね(^^)。
  =〔~∪ ̄ ̄ ̄∪ ̄ ̄〕
  = ◎――――――◎                      山崎渉&ぼるじょあ
31名無しさん@お腹いっぱい。:03/08/12 16:39 ID:???
SQLスレの予感
32山崎 渉:03/08/15 22:17 ID:???
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
33あぼーん:あぼーん
あぼーん
34山崎 渉:03/08/15 22:30 ID:???
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
35名無しさん@お腹いっぱい。:03/08/19 03:00 ID:???
あげてみる
36あぼーん:あぼーん
あぼーん
37あぼーん:あぼーん
あぼーん
38名無しさん@お腹いっぱい。:03/08/25 21:26 ID:OQMUnVn1
left joinとright joinではどちらが速いか教えてください。
39名無しさん@お腹いっぱい。:03/08/25 22:50 ID:???
駆動表を勉強しれ。

連結元の件数が多ければ、RIGHT JOIN
連結先の件数が多ければ、LEFT JOIN
40名無しさん@お腹いっぱい。:03/08/26 00:36 ID:???
>>39
おいおい(w
41名無しさん@お腹いっぱい。:03/08/30 05:54 ID:R83zjMCW
>>38>>39
すげぇな おまいら
42名無しさん@お腹いっぱい。:03/08/30 15:07 ID:???
??
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回書けば出来るとは思いますが、一回で出来る方法があったら教えてください
45名無しさん@お腹いっぱい。:03/09/08 06:50 ID:???
UPDATE てーぶる SET hinmei='みかん', kisetu='冬' WHERE no=1
46NAME IS NULL:03/10/13 10:52 ID:???
INSERT チンポ TO マンコ
47NAME IS NULL:03/10/16 02:51 ID:???
>>46
1行でエラーが発生しました。
ORA-00925: INTOキーワードがありません。
48NAME IS NULL:03/11/04 04:11 ID:???
>>47
SQLServerならINTOを省略できるから間違いじゃない
49NAME IS NULL:03/12/18 10:16 ID:mo4ixJvn
てーぶるkpーおしえて
50NAME 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

これだと全件取り出しちゃうみたいなんです。
無理ですか?
分かりづらい質問ですいません。
51NAME IS NULL:04/01/14 18:30 ID:???
MySQLの3.xとか言う落ちじゃないよな?
52NAME IS NULL:04/01/14 21:30 ID:ROKXiftA
その通りですが・・。
まずいですか?3.23.58
5350:04/01/15 01:26 ID:VcgRyZxp
しつこくてすいません。
mysqlの3.xだとどのような問題があるのでしょうか?
もしかして4.xだと大丈夫なのですか?
54NAME IS NULL:04/01/15 22:20 ID:???
4.1から副問い合わせが使える。
5550:04/01/17 01:01 ID:???
そうだったんですか。
う〜ん。使ってるレンタル鯖が3.2・・・。
ありがとうございました。
56NAME IS NULL:04/01/20 02:26 ID:hoZb2qM0
すみません。質問です。(SQLサーバーを使用しています。)
SELECT * FROM table ORDER BY itemA
のitemAの順を、
3,2,1,0,4 のように4を最後に並ばせる方法ってないでしょうか?
どうぞよろしくお願いします。
57378: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
でどうでしょう?
58NAME IS NULL:04/01/20 05:30 ID:I5YcFOky
>>378さま
ありがとうございます。
SQL初心者なんで、教えていただいた構文を調べながら(初めて見る構文があるので)、
試してみます。本当に感謝デス。
59NAME IS NULL:04/01/20 07:34 ID:ETLdlIOQ
おはマンコー!!\(・∀・)/
http://www.k-514.com/
60NAME 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で教えて頂けると助かります。
教えて!エロい(略
61NAME IS NULL:04/01/21 04:39 ID:zGXdiK63
すいません、追加です。現状はTABLE1の他のカラムも取得したいので
EXCEPTを使って取得したレコードを
副問い合わせとして再度TABLE1と結合しております。
もうちょっとスマートに書けないでしょうか?
62NAME IS NULL:04/01/21 05:19 ID:???
SELECT * FROM table1
WHERE id NOT IN (SELECT id FROM table2)
63NAME IS NULL:04/01/22 00:26 ID:???
>>61
> EXCEPTを使って取得したレコードを

この意味がよくわからんのだが…

select * from TABLE1 t1
where not exists ( select 'x' from TABLE2 where ID = t1.ID)
64NAME IS NULL:04/01/22 03:39 ID:WDrQMFPj
>>62
まるまる解決しました。あー今月来月分の仕事終了です。
何か一つお礼がしたいんですが、最近悩んでいる事とかありませんか?

>>63
select t1 except select 2して引き算したテーブルを作っていました。
not に続く処理が頭から完全に飛んでたのでもっかい覚え直しました。
ご指摘ありがとうございました。

65NAME IS NULL:04/01/22 22:57 ID:???
Oracleだよね。exceptなんてキーワードあったっけ?
minusじゃなくて?
66NAME IS NULL:04/01/23 05:37 ID:???
>>64
妹さんを私にください
67NAME IS NULL:04/01/23 17:41 ID:TwaTmWW+
女の兄弟はいませんので、母でもいいでしょうか?
68NAME IS NULL:04/01/24 01:01 ID:9DEbow83
外部結合ってどういう時に使うの?
単にテーブルをつなげるだけなら内部結合でも外部結合でもいいと思うんだけど・・・
69NAME IS NULL:04/01/24 02:30 ID:???
実際に試せよ…
0.1秒で理解できる
70NAME IS NULL:04/01/24 10:40 ID:???
>68
お前なぁ・・・
マソコとアナルじゃ全然違うって事くらいわかるだろ?
71NAME IS NULL:04/01/25 21:09 ID:iduq6cK/
>>66
>>68さんを差し上げます。外部結合でお悩みですので、是非実践を交えて
教えてあげてください。むしろ妹信奉者ですか?
72NAME IS NULL:04/01/28 22:55 ID:???
結合した後の表に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) ...

ここでエラーがでる。。
73NAME IS NULL:04/01/28 23:48 ID:???
>>72

select name
from (select * from student natural join enrolled) A
group by ...

こうなら書けるけど。
うーん…
74NAME IS NULL:04/01/31 06:31 ID:???
をいをい
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 スキーマ.パッケージ
コマンドが正解でした。
77NAME IS NULL:04/02/02 16:21 ID:sPKbo93r
初心者質問です。宜しくお願いします。

COBOLからSQL使ってます。
delete文を発行してDBの削除をしてるのですが、、、
削除の際に、削除件数を取得することは出来ますか?

deleteを発行する前に、selectCountするしかないのでしょうか?
78NAME IS NULL:04/02/02 21:23 ID:???
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() で比較して一致したらプログラムが止まらないようにしてみました。
いいのかしら、こんなのでも。
81NAME IS NULL:04/02/05 00:06 ID:???
良くないだろ・・・
キーが重複してないものだけINSERTすればいいんじゃない。
82 :04/02/05 11:23 ID:???
>81
重複してないチェックをどうやるとスマートに行くんでしょうか。
select user from tbl where user=a; で件数0を確認してから
insert すると、とんでもなく遅いんですが。
83NAME IS NULL:04/02/05 19:50 ID:???
select キー from tblで、キーだけ取得して配列かコレクションかなんかに入れといて、
insert投げる前にキーが被ってないか確認してから投げろ。
updateなら、insertするデータと同じキーをdeleteしてからinsertしろ。
84NAME IS NULL:04/02/06 10:27 ID:???
INSERT元がテーブルなら、BにあってAに無い物だけAにINSERT。
WHERE句で指定できるだろ。
85NAME 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です。
8685:04/02/15 14:46 ID:9pK84ZeX
MySQLではinner joinでなく「join」とやってみたら、うまくいきました。
87NAME IS NULL:04/02/15 19:54 ID:???
10日もまえの質問でなんだけどさー、>>79って、単に
for( ... ) {
try {
stmt.executeUpdate("insert .... ");
} catch(SQLException e) {}
}
でいいと思うんだが。っていうか俺そうしてるし。
88NAME 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);

とかやってみました。洒落にならんほど遅かったです。なんか間違ってます?
90NAME IS NULL:04/02/16 20:02 ID:/mbbqIps
interval型の時間計算の結果で、列名が定まらず、?column?になりますよね。それを?column?にせず、列名をつけるにはどうしたらいいですか?教えて下さいお願いします。
91NAME IS NULL:04/02/16 22:44 ID:???
as delta
92NAME IS NULL:04/02/21 00:15 ID:???
SQLってASやらISやらONやら無駄な前置詞が多すぎる。
無くても一意な構文になんだろーがよっつーコマンドがすげー多いかと。
ピュアな英文に近づけようという努力だと思うけど余計なお世話かと。
つーか邪魔かと。
93NAME IS NULL:04/02/22 11:56 ID:???
>>92
SQLServerはかなり省略できるところが多い
それに慣れると他で書くときに戸惑うが。
94NAME IS NULL:04/02/22 13:53 ID:???
>>93
そーなんだ。自分Oracleオンリーロンリー
95NAME 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型
96NAME IS NULL:04/02/23 15:41 ID:DcJjCQuL
女性が「泥棒!」…無実?の68歳男性“ショック死”

 三重県警四日市南署は、同県四日市市内のスーパーで、今月17日に「泥棒」と叫び声を挙げた、
子連れの女性を捜している。「泥棒」呼ばわりされた男性(68)は、買い物客に取り押さえられた後に
死亡したが、防犯ビデオの分析などから、何ら犯罪行為をしていない可能性が強いという。

詳しくは、
http://headlines.yahoo.co.jp/hl?a=20040221-00000303-yom-soci
(2004/2/21/11:17 読売新聞 )

■こういう糞女には、ちゃんと責任取らせないとだめです。
 被害者の男性は、犯罪者の汚名を着せられたまま亡くなったのですよ。その無念を想像してください。

三重県警察本部059・222・0110   四日市南警察署0593・55・0110

http://www.police.pref.mie.jp/SITE1PUB/servlet/enquete.EnqueteForm/5
三重県警ご意見BOX
http://www.npa.go.jp/goiken/index.htm
警察庁ご意見箱
97NAME IS NULL:04/02/24 10:00 ID:I8JzCQL6
NOは数値フィールドで

SELECT NO FROM HOGE

のようなSQLでNOの出力を ( ) で囲んで出力したいのですが、どうしたらよいでしょうか?

(5678)
(7789)
(6783)

のようにしたいのですが。
98NAME IS NULL:04/02/24 11:12 ID:???
文字列連結演算子を使うのは?
PostgreSQLなら、|| だが、ほかは知らん
99NAME 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の使い方がわかりません。
100NAME IS NULL:04/02/24 22:15 ID:???
>>99
UNIONじゃダメなの?
101NAME IS NULL:04/02/25 10:40 ID:nmQBoTK6
>>100
UNIONでいけました。
UNIONでいけるけど、遅くなってしまうようです・・・otz
ABを各INSERTして仮想テーブルに入れてGROUPBYでCを作ってたんですが、
実行速度が遅くてほかの手段を考えてたんです。
ありがとうございます。
102NAME IS NULL:04/02/25 14:21 ID:???
>>98
連結演算子でいけました。
MS SQL でしたので、+でした。
ありがとうございました。
103NAME IS NULL:04/02/26 02:00 ID:eh35xVEj
ビュー(仮想表)に対して更新系SQLを実行するのは有りですか?
104NAME IS NULL:04/02/26 02:10 ID:pYxJcbTI
ある月の月末日を求めるにはどうすればいいのでしょう?
105NAME 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
という風にできるみたいなのですが・・・。
106NAME IS NULL:04/02/26 19:29 ID:???
>>105
SELECT A,B,''
FROM TABLE1
107NAME IS NULL:04/02/26 19:30 ID:???
>>105
SELECT A,B,' '
FROM TABLE1
108NAME IS NULL:04/02/26 19:30 ID:???
>>105
SELECT A,B,' '
FROM TABLE1
109NAME IS NULL:04/02/27 00:27 ID:fCj3A/6A
>>104
そういう関数あるよ。Oracleだけど。
LAST_DAYだっけかな。
110NAME IS NULL:04/02/27 01:03 ID:???
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の中で最も古い日付とする

(゚∞゚)まじわかんない
111NAME IS NULL:04/02/27 03:13 ID:???
SQL書くの面倒なんで、ヒントだけ。
1.from句に3つ書く。(table1,table2のid1-sub_id-sub_id_value,table2のid1-min(date))
2.上記3つをjoin
で出来る気がする。

#RDBの名前とバージョン位は書いて。。。
112NAME IS NULL:04/02/27 13:26 ID:???
outの3行目の「xxy」って何だよ。「qrs」の間違いじゃないのか?
113NAME IS NULL:04/02/27 14:54 ID:qYf9aHRS
>>112
おっしゃる通りです。
間違えです。
ちなみにMySQL最新版です。
114NAME IS NULL:04/02/27 20:42 ID:???
UPDATEで更新するとき

foreach($list as $key => $value){
UPDATE table SET num = $value WHERE id = $key;
}

とループ処理の中にUPDATE文を入れても問題ないのでしょうか?
それともこういうやり方は良くないのでしょうか?
115NAME IS NULL:04/02/27 23:23 ID:???
>>114
それ何の言語よ?
116NAME IS NULL:04/02/28 01:03 ID:???
>>115
PHPです。。
117NAME IS NULL:04/02/28 10:58 ID:???
>114
そのループがどの程度回るかにもよるな。
多くても数十回程度ならさほど問題ないと思うjが。
数万とか回る可能性があるなら別の方法を検討したほうが良い。
118NAME IS NULL:04/02/28 16:20 ID:???
>>117
そうですか・・・
ループは多くても50回くらいです。
テーブルを行ごとに違う値で初期化しようと
思ったのですが、どうやら問題なさそうですね。
本当は一度に初期化できるような方法があればベストですが・・・
119NAME IS NULL:04/02/28 17:02 ID:yUYsACos
YBBの流出、創価学会の犯罪だってよ。
なんで大手新聞は報道しないんだ?

http://ahiru.zive.net/joyful/img/901.jpg
http://ahiru.zive.net/joyful/img/902.jpg
120NAME IS NULL:04/03/10 10:11 ID:Sgv/7OC0
質問です。
データの型がNumber型の項目を前方一致検索したいんですけど、
検索条件の値が数字でない文字列(zとかxとか)であった場合、
SQLの文法だけで対応できるものなのでしょうか。
結果としては「ヒットせず」で正常に終了させたいんですけど。

WHERE句の条件でなにか関数使わないとだめですかね。
使うとしたらどういうもんがいいんでしょう・・・。
へぼくてすいませんです。
121NAME IS NULL:04/03/10 20:35 ID:???
>>120
RDBのバージョンぐらい書け

ORACLEでの方法だがTO_CHAR(NUMBER型の項目) LIKE '検索文字列%'
122NAME IS NULL:04/03/12 00:23 ID:???
そもそもNumber型に文字列検索しても。。。
123NAME IS NULL:04/03/17 17:33 ID:???
 Number 型で前方一致って……
>121 の方法を使ったとしても、
'100%' とあったら、100 でも 1000 でも 10000 でもヒットしちまうわけだが、
 それってどういう意味を持つ検索なんだ?
124NAME IS NULL:04/03/18 07:24 ID:???
お偉いさんが無茶苦茶言ってるだけのような。
125NAME IS NULL:04/04/02 21:02 ID:???
すみません、質問があるのですが。
例えば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オブジェクトに格納する部分が
上手くいかないのです。どうかご教授お願い致します。
126NAME IS NULL:04/04/03 13:09 ID:???
SELECT * FROM table_name
WHERE
key = number(0) OR
key = number(1) OR

key = number(n)
127NAME IS NULL:04/04/05 08:51 ID:???
>>126
解決しました!ただ
key = number(n) OR
をn回分、Forで回して付け足せばいいだけのことでしたorz
本当にありがとう御座います!
128NAME 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'
などと数えようかと思ってますが…
129NAME IS NULL:04/04/05 13:54 ID:???
>>128
Oracleは知らんので、とりあえず、1行目のhogeが最頻値
SELECT hoge,COUNT(*)AS cnt FROM fuga GROUP BY hoge ORDER BY cnt DESC;
130NAME IS NULL:04/04/05 14:16 ID:???
質問させてください。
借りてるレンタル鯖でMySQLが使えるのですが、どうやってアクセスしたらいいのでしょうか?
SSHもTelnetも使えないようなのです。

よろしくお願いします。
131NAME IS NULL:04/04/05 14:33 ID:???
>>130
鯖屋に聞けよ。
132NAME IS NULL:04/04/05 15:34 ID:???
DBに関してはサポート対象外とのことでしたので・・・

よろしくお願いします。
133NAME IS NULL:04/04/05 15:37 ID:???
そーいうのは事実上「使えない」というんじゃないか?
134NAME IS NULL:04/04/05 15:45 ID:???
知識が無きゃ使うな。ってことだろう。
135NAME 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)
136NAME IS NULL:04/04/06 06:57 ID:???
>>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
137NAME IS NULL:04/04/06 18:01 ID:c+YhLR8o
>>136
なるほど!ASをつかえば良いんですね。
ありがとうございます
138NAME IS NULL:04/04/07 01:29 ID:???
>>137
いや、ASを使うとかは関係ない
>>135のSQLと見比べてみな
139NAME IS NULL:04/04/07 12:56 ID:???
秘技「わかったふり」
140NAME IS NULL:04/04/07 18:36 ID:???
ACCESSのVB内でセットしたRecordsetオブジェクトのデータを参照して
レポート作成するのってどうコーディングするべきなのでしょうか?
141NAME IS NULL:04/04/07 18:37 ID:???
しまった、SQL全然関係ないし…逝ってきますorz
142NAME IS NULL:04/04/12 15:30 ID:XPJNTJHE
SQLという範囲からはずれてると思いますが、
「複合キー」というのは、1つの行において、
複数のカラムを合わせたモノを1つのキーとして扱うという感じでしょうか?
143NAME IS NULL:04/04/12 15:50 ID:???
>>142
正解
144NAME 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と呼べるのでしょうか?
145NAME IS NULL:04/04/12 21:10 ID:???
>>144
不正解

複合キーというのは、候補キーの一つ。
つうことで、正確に言うと>>142も半分正解か。
複合キーというのは、二つ以上のカラムを合わせてuniqueとなるキー。
>>144の例だとidだけで行を特定できるので、and depId='0500'は全くの不要だし。
146NAME IS NULL:04/04/12 21:20 ID:???
> >>144の例だとidだけで行を特定できる
そうか?
147NAME 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の使い方を全然理解して無いよーな気がムラムラなんですが。。
どーすりゃいいのか、識者の方ご教授下さいませ。
150NAME IS NULL:04/04/13 09:55 ID:???
>>149
SELECT 名称 FROM TBL1 WHERE SUBSTRING ( コード FROM 2 FOR 1) = '1';
151ちんぽ初心者:04/04/13 10:09 ID:???
>>150
ありがたき幸せ!!!
152NAME IS NULL:04/04/13 11:20 ID:???
135といい、とにかくSELECTするのが流行っているのか?
153NAME IS NULL:04/04/13 11:23 ID:???
>>152
サブクエリを覚えて嬉しいんだYO
154NAME 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する以外に、
何か良い方法はないでしょうか?
155NAME IS NULL:04/04/14 08:00 ID:???
>>154
tbl1.name = tbl2.keyword ってことなら、
UPDATE tbl1 SET name=tbl2.keyword FROM tbl2 WHERE tbl1.keyword_id=tbl2.keyword_id;
で、できる。

しっかし、こういうメンテみたいな事を、日常的に発生するのか?
メンテとか仕様変更程度なら、プログラム側でループさせてもいいような気もする。
156NAME IS NULL:04/04/14 09:16 ID:goCOTvMk
>「複合キー」というのは、1つの行において、
>複数のカラムを合わせたモノを1つのキーとして扱うという感じでしょうか?

これ以外の複合キーってあるんかな?
157NAME IS NULL:04/04/15 14:44 ID:kKTGTXIq
MSAccessのSelect文で
1
2
3
:

と出力されるような関数または技はありますか?
158NAME IS NULL:04/04/15 17:01 ID:jvLa74JA
項目A 項目B 項目C
20050  200  50
20000  100  50
30000  100  00

このような感じのテーブルから、項目Aが項目B+項目Cの形になっている物を
取得したいのですが。
それと、日付型との比較の仕方も教えてもらえないでしょうか。
159NAME IS NULL:04/04/15 17:30 ID:???
>>158
SELECT * FROM t1 WHERE 項目A = 項目B||項目C;

日付型との比較って?
160NAME 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

このようなテーブルから、今日の日付よりも大きい物を取得したいのですが。
161NAME IS NULL:04/04/15 18:33 ID:???
>>160
WHERE CAST(項目D AS DATE) > CURRENT_DATE;
162NAME IS NULL:04/04/16 10:53 ID:dIVUU8kI
>>161
ありがとうございます。
あと、項目Dが1月以上前の日付になっているデータを取り出すやり方も教えて貰えないでしょうか。
163NAME IS NULL:04/04/16 13:44 ID:J3JWWPjP
まずは自分で調べてみたら?
「こういう方法でここまで調べて、こんな状況まではたどり着いたけど、
ここから先はどうすればいいのか」
みたいな感じでさ。
164NAME IS NULL:04/04/16 14:25 ID:???
>>162
たぶん日本語の勉強も必要だな。ヒントだけ。
WHERE CAST(項目D AS DATE) < CURRENT_DATE - 一ヶ月 ;
165NAME IS NULL:04/04/18 04:34 ID:???
オラクルで
ALL OUTER JOIN をやるにはどうしますか?
166NAME IS NULL:04/04/20 00:37 ID:???
>>165
8i以前ってことか?

左外部結合するSQL
UNION
右外部結合するSQL
167NAME IS NULL:04/04/20 01:09 ID:???
つーか、
FULL OUTER JOIN じゃないのか?
168NAME IS NULL:04/04/23 03:24 ID:???
どれくらいのことができればSQL使えると人様に胸張って言えるかな?
169NAME IS NULL:04/04/23 11:12 ID:BroRaDV4
select * from TABLE_NAME
170NAME IS NULL:04/04/23 12:11 ID:???
DROP DATABASE
171NAME IS NULL:04/04/23 15:42 ID:???
彼女にINSERTしてCOMMITできるようになってから。
172NAME IS NULL:04/04/23 16:55 ID:???
>>171
INSERTしておいてROLLBACKする方がいいなw
173NAME IS NULL:04/04/23 17:24 ID:???
漏れは、INSERTとROLLBACKを、DBがハングアップするまで
ループ処理したいなw
174NAME IS NULL:04/04/23 17:28 ID:???
BIJIN TRANSACTION
175NAME 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文はできたの
ですが、もっとスマートな方法はないもんかと思いまして。
176NAME IS NULL:04/04/25 02:16 ID:OEZtU36x
ああ、ズレてる…
177NAME 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
178NAME IS NULL:04/04/25 16:07 ID:???
>>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を持つ行を弾いた感じです。
179NAME 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です。
180NAME IS NULL:04/04/26 23:08 ID:hVx47epU
SQLServer2000で「SELECT * FROM ユーザー名 .テーブル名」というように、
テーブル名の前にユーザー名をつけないとSELECTできません。
テーブル名だけでSELECTできるようにするには、どのように設定したらよいでしょうか?
Enterprise Managerとかで設定できそうな気がするのですが、わかりません。
どうぞよろしくお願いいたします
181180:04/04/26 23:36 ID:hVx47epU
自己解決しました
182NAME IS NULL:04/04/26 23:42 ID:???
>>179
list()のような集約関数がないとむりぽ。
183179:04/04/27 00:00 ID:ZINPSHoZ
>>182
これ、むりぽなんですか?
よく使われそうな気がするんですけど。。
184NAME IS NULL:04/04/27 05:06 ID:???
>>183
一般的にRDBでは動的にカラムを増やすようなことしない。
やるとすれば↓のような結果をもらってクライアント側で処理する

id|value1|value3
--+------+---------
1|aaaa |hhhh
1|aaaa |iiii
2|bbbb |jjjj
3|cccc |
185NAME IS NULL:04/04/27 20:21 ID:???
>>184 名回答!
186NAME IS NULL:04/04/29 13:23 ID:???
  バックアップしたデータを丸ごと、またDBのテーブルに毎日突っ込んでる俺はどうですか?
187NAME IS NULL:04/05/05 18:22 ID:???
>>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);
188NAME IS NULL:04/05/05 22:27 ID:???
>>186
まぁ、趣味は人それぞれだからな・・・
189NAME IS NULL:04/05/05 23:55 ID:???
>>186
で、バックアップしたデータを突っ込んでいるテーブルのバックアップはどうするんだ?
190NAME 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で実現させる方法はないでしょうか?
よろしくお願いします。

191NAME IS NULL:04/05/08 03:11 ID:???
一発では難しいなぁ。どうしても2つになってしまう。

update スレ立て set クソスレフラグ=0 where ユーザID='漏れ';
select ユーザID from 2chねら
where ユーザID not in (select ユーザID from スレ立て where クソスレフラグ=1);
192NAME IS NULL:04/05/08 07:32 ID:???
>>191
update文は関係ないだろ。あと、INよりEXISTSの方が高速。
SELECT ユーザID FROM 2chねらー
WHERE NOT EXISTS (SELECT * FROM スレ立て WHERE スレ立て.ユーザID=2chねらー.ユーザID AND クソスレフラグ=1);
193NAME IS NULL:04/05/09 21:12 ID:???
「クソスレを立てたことがない」人を検索すればいいんだから、

SELECT * FROM 2chねらーテーブル
WHERE ユーザID NOT IN
    (SELECT ユーザID FROM スレ立てテーブル WHERE クソスレフラグ<>'0')
194NAME IS NULL:04/05/10 11:34 ID:???
>>191ワロタ
195190:04/05/14 02:02 ID:OjLux1Gu
どうもありがとう。
皆さんの回答を参考に、なんとか問題解決出来ました。
普段は select なんちゃら from なんちゃら where なんちゃら order by なんちゃら
この程度のSQLで実現できる、単純業務に従事する漏れ。
これじゃ、いつまでたってもスキルアップは望めませんな・・・
もっと勉強しないといかんなぁ。
196NAME 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
としたいのですがどうしたらよいのでしょうか?
お願いします、教えて下さい!
197196: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の偉大さを思い知らされました・・・
198NAME 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文おしえてください。
199NAME IS NULL:04/05/14 13:08 ID:???
>>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を参考にして考えれ。要領は同じ。
200NAME IS NULL:04/05/14 13:17 ID:???
>>198
SELECT キャラ,萌え度,キタ回数,coalesce(作画枚数,0) from デジコ LEFT OUTER JOIN プチコ Using(キャラ);
201NAME IS NULL:04/05/16 18:29 ID:e1RqkHtX
すいません。JOIN後のテーブルに任意の名前を付けたいときはどうしたら
良いですか?
select a,b
from (a left join b) as table3
↑省略しすぎ(汗
としてもエラーになってしまうし困っています。
ちなみに.MDBです。
よろしくお願いします。

202NAME IS NULL:04/05/17 02:08 ID:???
MySQLで特定の月情報を取得する場合、month(DATETIMEカラム) = 1等といったように記述出来ますが、Oralceの場合、特定月の条件はどのようにして記述すればいいのでしょうか?
203NAME IS NULL:04/05/17 09:19 ID:???
>>202
Oracleにはdate_partって関数はないのか?
204NAME IS NULL:04/05/17 11:42 ID:???
>>201
( )必要だっけ?
205NAME IS NULL:04/05/17 19:20 ID:n2kYxM4x
>>204
いや全く必要ない。
で回答はどこ?
206NAME IS NULL:04/05/17 19:33 ID:???
JOIN後のテーブル名? に何か意味あるの?
207NAME IS NULL:04/05/17 21:26 ID:n2kYxM4x
>>206
DB板はスレ違いかも知れないと今気づきましたが、
気づかないフリで説明します。
VB.netでは複数のテーブルをJOINするとtableという自動で仮名がつきます。
全く同じデータセットに同じテーブル名(table)をいれると
???としたエラーが炸裂するのでどうしてもJOIN後にテーブル名を
付けたいんです。こんなケースはDB単独では珍しいらしく手持ちの
SQL本には記載がなかったりする。
レスサンスコ。まだ会社(泣
208NAME IS NULL:04/05/17 23:00 ID:???
>>202
TO_CHAR(DATEカラム, 'mm') = '1'みたいに文字列に変換すればいいのでは?
209208:04/05/17 23:01 ID:???
>>208
ごめん、
TO_CHAR(DATEカラム, 'mm') = '01'だね・・・。
210NAME IS NULL:04/05/18 10:24 ID:???
select a, b
from (SELECT a,b FROM a left join b) table3
211NAME IS NULL:04/05/18 10:42 ID:FLZcxqMK
>>208
どうもありがとうございます。これで何とかなりそうです。
212NAME IS NULL:04/05/18 11:48 ID:+5UV1MyO
>>210
神さまありがとうございます。
213NAME IS NULL:04/05/18 17:28 ID:???
うほっ
214NAME IS NULL:04/05/18 22:33 ID:???
すいません、oracle9iで1つのカラムに入っているレコードを全て1行で取得したいのですが。
例えば、

id
----
1
2
3


1,2,3
の様にSQLのみで1行で取得するにはどうすればいいでしょうか?
よろしくお願いします。
215NAME IS NULL:04/05/19 02:23 ID:???
>>214
マルチ
216NAME IS NULL:04/05/19 19:23 ID:???
>>214
マルチだが答えてやるこんちくしょう

ピボットテーブル

でぐぐれうんこ

あとSQL入門書(定番のSQLポケットリファレンスでいいぞ)買って来いヘタレ野郎
217NAME IS NULL:04/05/20 14:00 ID:+X5a+mzG
テーブル名:アニオタ
視聴者  萌え1 萌え2 
----------------------------------
A    ミドリ ヒナタ
B    アヤセ テマリ


を↓の表にするビュー作成を教えてください・・。

視聴者 萌え 
A    ミドリ
A    ヒナタ
B    アヤセ
B    テマリ
218NAME IS NULL:04/05/20 14:45 ID:???
union
219NAME 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''の部分で行き詰ってまつ。
誰かおせーて。
220NAME IS NULL:04/05/21 01:25 ID:???
SELECT 視聴者, 萌え
FROM (
SELECT 視聴者, 萌え1 萌え
FROM アニオタ
) UNION (
SELECT 視聴者, 萌え2 萌え
FROM アニオタ
)
ORDER BY 視聴者;
221NAME IS NULL:04/05/21 12:26 ID:???
>>219
convert とか cast とか
222NAME IS NULL:04/05/22 03:00 ID:3pK+cfvK
MS SQL 2000にて、レコードがインサートされたら、とか
あるフィールドの値がhogeだったら、とかの条件で
外部exeを起動する方法ってあるのでしょうか?
よろしくお願いします。
223NAME IS NULL:04/05/22 03:38 ID:3pK+cfvK
sp_start_jobストアドを利用できるようです。
224NAME IS NULL:04/05/23 18:32 ID:3VGGJqhw
すみませんが教えてください。
select文でfromとwhereはどちらが先に解釈され、
条件が絞り込まれるのでしょうか?
またsql命令の優先順位や処理速度を調べる良い文献などはないでしょうか?
おねがいします。
225NAME IS NULL:04/05/23 19:26 ID:???
>>224
各句の意味を考えればだいたい判ると思うぞ。
つか、FROMとWHEREの優先順位すら判らないというのは、
重症だぞ。
226NAME IS NULL:04/05/23 20:11 ID:???
実行プラン見るってのじゃダメなのかい?
227224: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の最適化の方がよりよいと思われたので、
できれば良い文献をキボン
今もってる本は答えしか載ってないので物足りないのです。
よろしくお願いします。
228NAME IS NULL:04/05/23 21:36 ID:???
あ、馬鹿の方ですか
229NAME IS NULL:04/05/23 21:38 ID:???
>>227
どのWHEREがFROMより上だってか?

で、文献だけど、漏れは「プログラマのためのSQL」
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894714809/250-9004556-6950643
を読んでいる。
230224:04/05/23 21:56 ID:MO/uZXID
>>229
実践だけだと馬鹿にされるよー
特定できなくってすまんね。で優先となってるポイwhereは
where (c.order = ?) の部分

from句部分よりwhere句部分が優先になることが、納得いかなかったのですが
やはりfrom句部分が優先のはずなのですね?(テーブルの条件を記述する以上
当然かもしれませんが)
文献は明日でも本屋に行って確認してみます。
ありがとう
231NAME IS NULL:04/05/23 22:34 ID:???
>>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 =? の抽出をしているはずだが違うのか?
232224:04/05/23 22:48 ID:MO/uZXID
.>>231
その解釈で正解だとわたしも思います。
テスト用の環境(Rowが2・3行)で無知な人間がたまたまテーブル設計をしたので
fromよりwhereが優先のように見えたのでしょうねきっと。
でも>>229さまのおかげでもっと深くまで理解できそうです。
レスさんくす
233NAME 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だと思うのですが、どうしても解りませんでした。
よろしくお願いします!
234NAME IS NULL:04/05/24 11:39 ID:???
>>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;
235233:04/05/24 11:49 ID:+HRlZqXP
>>234
ありがとうございます。データ取得できました!

心苦しくももう一つお聞きしたいのですが、IDの値を指定して
データを取得したい場合は、副問合せというものを使用すれば
よいのでしょうか?
236NAME IS NULL:04/05/24 12:00 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;
237233:04/05/24 14:35 ID:+HRlZqXP
>>236
ありがとうございます。
データは取得できたのですが、先生から
「副問合せ使え!ゴルァ!」と言われてしまいました。

副問合せ全くわからないです。
ネットで調べても2テーブル使用例しか発見できず・・・。
色々試行錯誤してみましたが、変な風にデータが取れてきてしまいます。

本当に申し訳ないのですが、教えていただけないでしょうか?
いや、ほんと厚かましいと思っているんですが。
238無駄じゃ:04/05/24 14:53 ID:???
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
239NAME IS NULL:04/05/24 15:02 ID:???
>>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;
240233:04/05/24 15:04 ID:+HRlZqXP
>>238
2chで初めて神に遭遇しました。
ありがとうございます!
このSQLを元に副問合せを勉強します。
SQL自体に挫折しかかっていたので、
色々な意味で本当に助かりました!
241233:04/05/24 15:08 ID:+HRlZqXP
>>239
なんでもデータ件数が多くなった場合に、効率よく
処理するために副問合せを使うとの事だったんです。

そういうやり方もあるんですか。
試してみます。
ありがとうございます!
242NAME IS NULL:04/05/24 15:16 ID:???
>>241
ああ、効率を考えるなら、
SELECT * FROM (SELECT * FROM tb1 JOIN tb2 USING(id) WHERE id=1)AS tb4 JOIN tb3 USING(cd);
だな。
しかし効率は、 WHERE id=1 を最初に持ってきた>>236 と同じ。
243NAME IS NULL:04/05/26 14:36 ID:???
SQL*Loaderのことについて質問させてください。
固定長のデータを取り込む際に、文字列の後ろについた空白を削除して
データをINSERTしたい場合は、
FIELD3 POSITION(16:23) CHAR "to_date(:FIELD3,'YYYYMMDD')"(これは日付ですが・・・)
のようにTrimか何かをつかえばよろしいのでしょうか?
244NAME IS NULL:04/05/26 16:08 ID:fy6id3aK
ちょっとスレタイからはズレますが、

ttp://www.spice-of-life.net/tapkit/ja/images/many_to_many.png

こういうテーブル構造だった場合、
Employeeテーブルと、ProjectテーブルにデータをINSERTした後、
両者を関連づけするためのEmployeeProjectテーブルにも、
明示的に関連づけをINSERTせんといかんですよね?

・・・救いようがないくらいにウンコな質問してスマソ
245NAME IS NULL:04/05/26 17:49 ID:???
>>244
この図はLEFT(RIGHT) JOIN を使うって意味じゃないのか?
246NAME IS NULL:04/05/26 18:16 ID:???
>>244
EmployeeProjectはプロジェクトに参加している社員名簿ってことだろ。

社員が増えた -> Employeeに追加
新規プロジェクト発足 -> Projectに追加
そのプロジェクトの人員決定 -> EmployeeProjectに追加

ただこれだけだが。プロジェクトだけ決まってもそれに参加する人員が決まってなければ
EmployeeProjectにデータはいれない(入れられない)だけ。

あとは、外部キーとか参照整合性制約で調べるよろし。
247NAME IS NULL:04/05/26 19:13 ID:fy6id3aK
>>245>>246
ハゲシククスコ。
調べてきます。
248NAME IS NULL:04/05/28 22:08 ID:???
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ファイルを読み込んでます。
249NAME IS NULL:04/05/28 22:35 ID:???
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ファイルを読み込んでいます。
250NAME IS NULL:04/05/28 22:37 ID:???
>>249
二重書き込みすいません・・・
251NAME IS NULL:04/05/28 22:38 ID:???
日付と言ってもなぁ…
252NAME IS NULL:04/05/31 09:54 ID:???
>>250
外部処理

vbとか。
253NAME IS NULL:04/05/31 11:48 ID:74MMxq7S
テーブル名:デジコ
キャラ 萌え度
--------------------------
A    4    
B    7    
C    10

から
萌え度が5未満と5以上で
あぼーん と キターに分けて

キャラ イケてる
--------------------------
A    あぼーん    
B    キター
C    キター
というビューを作りたいのですが教えてください。



254NAME IS NULL:04/05/31 12:34 ID:???
なんつーか、
最低でもDBとバージョン言ってくれなきゃダメじゃないか。
255NAME IS NULL:04/05/31 13:13 ID:???
>>253
CREATE VIEW view1 AS SELECT キャラ,CASE WHEN 萌え度>=5 THEN 'キター' ELSE 'あぼーん' END AS イケてる FROM デジコ;
256NAME IS NULL:04/05/31 16:06 ID:???
>>252
ありがとうございます。
SQLではなく、抽出後プログラム上での
細工で何とかせい、との事でしょうか?

定番の書き方でもあるんかいなと
思っていたのですが・・・
257NAME IS NULL:04/05/31 22:13 ID:???
>>256
>日付のみ並んだ一時的なテーブルを作って
>外部結合すればよいのかな?と思うのですが・・・
しろよ
でNVL使えばおわりだろ
258NAME 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だけで算出しようと思っています。
259NAME IS NULL:04/06/02 09:18 ID:???
>>258
標準偏差を用いても、その例に挙げたテーブルのニンジンの場合だと、
結局20000円(?)のニンジンも除外できないと思うが。

中位数を求めてそれを中心とした基準値範囲(中位数の50%〜200%等)で抽出した行の平均値(avg)を
出すってのはどうだろうか。

例えのニンジンの場合だと全体行が偶数なので、150と200の中間数175が中位数で、
その50%(87.5)から200%(350)までに収まる行の平均値を出すといった感じ。

で、中位数を求めるSQLを書こうと思ったのだが、これはこれで面倒だな。
検索するなり書籍を漁るなりして調べてください。ちょっと考えたけどダメだった...orz
260258:04/06/02 09:52 ID:7Ib8/agG
うむむ、そうなのですか・・perlで同じことをしようとしたときに統計学の反復切断法が
あるよと教えていただいて今までcgiで同じようなものを作って管理してたのですが
流石にデータ量が多くなってくるとキツイのでsqlへの移行をしようとしました。

やっぱり書籍読むのがいいですかね・・
月の小遣いが3000円なもので、できれば最初のうちはネットだけで済ませたいと
思い、mysql総合スレのテンプレサイトを読み漁っていたのですがアホには
むずかしいようです。
今から立ち読みしてきます。
261NAME IS NULL:04/06/02 10:37 ID:7Xm0LIwh
ちょっとスレ違いな気もしますが、
既存の仕様書もないテーブル構造をリバース(という表現は不適切かもしれませんが)するときに、
テーブル間のリレーション関係が、一対多か多対一か多対多か、という判断をするには、
どのような見方をすればいいんでしょうか?
262259: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;
上位の最小値と下位の最大値を出したところ。これの平均を取れば中位数となる。
と、アイテム別の抽出はまだ行っていないので、このままだと全データの中位数にしかならん。

263259:04/06/02 13:58 ID:???
暇つぶし&腹ごなしでitemname別に中位数をだし、その中位数の20%から200%までに
収まっている値の平均値を一発で出すSQLを書いてみたが、なんじゃこりゃーって感じになったぞw
PostgreSQLのEXPLAINでクエリープランを表示すると66行で実行コストもとんでもねぇ値。
まだ無駄が残っていそうな感じでじっくり見直せばもう少しマシになるかもしれんが、
とても実用範囲に収まりそうにねぇな。
264NAME IS NULL:04/06/02 16:43 ID:???
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一発で取得する方法はありませんでしょうか?
265NAME IS NULL:04/06/02 17:54 ID:???
SELECT エントリー.id,エントリーcategory,エントリー,postedOn
FROM エントリー LEFT JOIN カテゴリー ON エントリー.category = カテゴリー.category
WHERE カテゴリー.name = "ルート1"
ORDER BY postedOn

こんなんでいいのか…電波受信しきれないorz
266258:04/06/02 18:33 ID:???
>>259
遅レスすいません。PC関連書籍いっぱい置いてある店に行って立ち読みして
帰ってくるのは半日がかりなもので。
レスありがとうございます。

やっぱりmysqlから該当データを取り出してperl側で処理させる方がいいのかな。
今はローカルだけどネット越しに複数箇所からmysqlに問い合わせがあった場合
結果だけを返すのに比べて転送量が結構凄いことにならないかなぁと考えた為
mysql側で処理しようと思いました。
若しくは、ネット越しにcgiに問い合わせをかけてcgiの内部処理として
mysqlを呼び出してデータ取り出してcgiで処理して結果を返すってのも
ありですかねぇ。
これから中位数を求める計算式とsqlのコードに再度取り組んで見ます。

#データベースのプログラムっていうのかコードって言うのか、
#ほかの言語と違ってなんかとっつきにくいですねぇ。
267264: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カラムに持つエントリーを全て取得したいということです。
268NAME IS NULL:04/06/02 20:04 ID:???
階層が葉まででいいなら、カテゴリから
A. ルート1自身
B. parentIDが A な物
C. parentIDが B な物
をUNIONで結んで、それとエントリーを結びつければ。
269264:04/06/02 20:28 ID:???
>>268
>>267 の「0001(ルート1)、0003(枝1)、0005(葉1)、0006(葉2)」いずれか
という中に0001(ルート1) を親に持つ「0004(枝2)」を入れるのを忘れてました。。

なおかつ 要件の提示がだめだめでしたね orz
階層の深さは不定で、仕様上はいくらでも深くできるようにしたいと思ってます。
また検索対象にするカテゴリーも階層のどの部分からでも可としたいです。
せっかく答えていただいたのに申しわけないです。
MLで http://www.mysql.gr.jp/mysqlml/mysql/msg/6207
から始まるスレッドを見つけたのですが、このような木構造に
ついてはみなさん苦労されているようで、
再帰で行なうか、
http://www.mysql.gr.jp/mysqlml/mysql/msg/6220
のような方法を取らざるおえないみたいですね。
もうちっと自分で考えてみます。すみませんでした。
270NAME IS NULL:04/06/02 20:54 ID:???
>264

Oracleなら正にその為に作られた様な階層問合せという構文があり
ますが、他のRDBMSであまり聞かないので需要があまりないという
事でしょうねぇ。

データ構造自体が再帰的な構造になっているので何等かの形で再帰
的な処理を行なわざるを得ないでしょう。
271259: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テーブルに更新が入ればトリガを使って中位数テーブルを更新
抽出時に双方のテーブルを結合すれば実用できそうかな。
272NAME IS NULL:04/06/02 21:24 ID:???
>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とかの場合、量が多いのだから例外
とはしないのか、逆に量が極端に多いから例外とするのか。

273272: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」の様なマジックナンバーが多数
出て来るのならビューを作っておいてもいいかもしれませんが。
274NAME IS NULL:04/06/03 00:37 ID:???
>>272
標準偏差を用いて外れ値を検出する場合はたしかに標準偏差自体が
外れ値の影響を受けてしまうのでうまくないが、四分位範囲を用いた
方法なら外れ値の影響を受けにくい。
275272: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%より多くなってしまいますが、データ数が十分
に多ければ問題にはならないでしょう。
276NAME IS NULL:04/06/03 10:12 ID:???
AテーブルのTimeカラムが'2004/06/08'より以前の
レコードを1000件だけ削除したい場合、下記のような
SQLで良いんでしょうか?
うまく実行されていないような感じで・・・

delete
from A
where Time
in(
select
top 1000
Time
from A
where Time <= '2004/06/08'

よろしくお願いします。
)
277NAME IS NULL:04/06/03 13:41 ID:???
>>276
[Time]に重複がある場合は、千件以上削除されるね。
278NAME IS NULL:04/06/03 21:41 ID:???
>>276
カーソル使いましょう。
279276: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は定義できず、悩み中。
奥が深いっすね・・
280NAME IS NULL:04/06/04 16:39 ID:???
sql文について質問させて下さい。
任意のidが分かっている状態で、
そのidの前のidと次のidを得るsql文を作る事は可能でしょうか?

並び方はidの昇順、降順ではなく別のカラムでorder byされているものとします。

出来ればmysql3.23で動作するsql文を教えて下さい。
宜しくお願いします。
281NAME IS NULL:04/06/04 16:52 ID:???
WHERE ID < 任意のID
ORDER BY ID DESC
で取った最初の1件。
282NAME IS NULL:04/06/04 17:46 ID:???
>>280
SELECT * FROM table1 ORDER BY num;
id | num
--+----
C | 10
E | 20
D | 30
B | 40
A | 50

で、idにDを指定したら EDBを抽出するという意味かな?
つーか、サンプルテーブルと期待する結果ぐらい書けよ。
283249: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ファイルを読み込んでいます。
284NAME IS NULL:04/06/06 17:57 ID:???
自分の仕事が終わらないからって丸投げはよくないよ
285NAME IS NULL:04/06/06 18:05 ID:???
>>283
括弧要るのか?
全部取っ払ってみれ。
286249:04/06/06 18:29 ID:IlRX9Yvv
ありがとうございます。
>284
そんなつもりじゃ無いです。
晒すネタは多い方が良いかと・・・

>284
>括弧要るのか?
はずすとエラーしました。

文法的におかしく無ければ
あきらめるしかないのか・・・
キチンとしたRDBじゃないとだめなのかなぁ
287280:04/06/07 09:11 ID:???
>>281
その方法だとIDの昇順、降順になってしまいます。

>>282
失礼しました。
おっしゃるとおりです。
idにDを指定したらEとBを得たいのですが、方法が分かりません。
288NAME IS NULL:04/06/07 09:45 ID:???
>>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を含めたテーブルにするべきなんだろうな。
289NAME 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
290NAME IS NULL:04/06/07 10:48 ID:???
>>289
WHERE キャラ NOT IN ('D','E',....);
291NAME IS NULL:04/06/07 16:19 ID:???
FROM (select * from デジコ where キャラ not in ('A','B'))



頼むから正規化しろよ
292280:04/06/07 16:21 ID:???
>>288
ありがとうございます!

すごく複雑ですね。
mysql3.23ではVIEW、サブクエリ、トリガは使えないので
別の方法で乗り切るしかなさそうです。
ありがとうございました。
293NAME IS NULL:04/06/07 18:08 ID:nSfxM7N+
どなたか教えてください。オラクル8i使用中 REDOログ がごみ箱に・・・・原因がわかりません。どなたか同じ現象を起こした方いらっしゃいませんか
294NAME IS NULL:04/06/07 21:45 ID:???
>>293
> REDOログ がごみ箱に・・・・
なったんか?
ならんのか?
はいらんのか?

まさか....恋したのか?(w

逝っている事が判りません、誰か通訳出来る方いらっしゃいませんか?

(助けたくても助けられないじゃん!)
295NAME IS NULL:04/06/07 21:49 ID:???
ガゴミ箱って何を入れる奴?
やっぱガゴミ?
296NAME IS NULL:04/06/07 23:07 ID:???
オラクル8iを使用してストアドプロシージャを作成。

INSERT文の中でSELECT文を使い、他のテーブルにあるデータを登録したいのですが、
SELECT文のCASEの部分でコンパイルエラーになってしまいます。

エラーの内容は「記号CASEが見つかりました。」という感じです。

INSERT文中のSELECTではCASEを使えないのでしょうか?
297NAME IS NULL:04/06/08 02:13 ID:pFkODj97
Postgres7.4使ってます。
一本のSQLでサブクエリで検索した結果によって
update内容を変えたりできるでしょうか?

あるテーブルを検索して値がAならCにBならDにupdateするとか。
298NAME IS NULL:04/06/08 07:24 ID:???
>>297
できる。
299297:04/06/08 13:28 ID:pFkODj97
>>298
どうすればいいでしょうか?
300NAME IS NULL:04/06/08 13:45 ID:???
>>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;
値の種類が増えたら面倒だとか、想定が違うとかだけ言うなよ。
てめーの脳内までしらんからな。
301NAME IS NULL:04/06/08 17:15 ID:LsPNiv6w
質問が意味不明ですいませんでした。
REDOログがごみ箱に入ってしまってました。どうしてごみ箱に入っていたのかがわかりません。
なにかの以上で入るのでしょうか?
どなたか同じ現象を起こした方いらっしゃいませんか。

302NAME IS NULL:04/06/08 20:17 ID:???
>>301
削除{した|された}から入ってるんだろ?それも「ゴミ箱を使って削除」だから、
エクスプローラ経由で(手動で)削除したかなんかだろうな。
プログラムで kill していたりバッチで del してもゴミ箱には入らないからな。

システムログ見てログインしている奴さがして聞いてみるべし。
まさか「ログオンしっぱなしの鯖」なんちゅうんじゃないだろな?
303296:04/06/08 21:52 ID:???
誰か教えてください。
お願いします。
304NAME IS NULL:04/06/09 05:48 ID:???
>>303
せめて例となるSQLくらい書け。
305NAME IS NULL:04/06/09 05:50 ID:???
>>303
つか、ストアドと言っているが、8iまでは 'CASE' なんて
キーワードはPL/SQLには予約されていない。9iからだ。

それと、それがINSERT...SELECT構文で使えるかどうかはまた別。
306NAME IS NULL:04/06/09 08:29 ID:???
>>296
何がしたいのかわからんが、
とりあえず勘でDECODEを使えと言ってみる。
307296: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は使えないのでしょうか?
308296:04/06/09 21:20 ID:???
>>306
DECODEを使うとCASEと同じような事ができるようですね。
この2つは違うのでしょうか?
309NAME IS NULL:04/06/10 14:04 ID:???
>>308
しらべろや
310NAME IS NULL:04/06/10 23:44 ID:???
8iってのが微妙
たしかCASE文が使えたのは、バージョン8.1.6から
だったように記憶しておるです
311NAME IS NULL:04/06/12 22:56 ID:???
PL/SQLってMySQL上でも使えるんでしょうか?
書くとエラーが出てしまいます。
312NAME IS NULL:04/06/13 11:30 ID:???
>311
PL/SQL≒Oracle方言
313NAME IS NULL:04/06/13 17:39 ID:???
蟻が塔ございました。
314NAME 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です  


315NAME IS NULL:04/06/14 16:05 ID:???
NOT IN
316NAME IS NULL:04/06/14 18:01 ID:???
>>314
SELECT id FROM 計上先 WHERE NOT EXISTS (SELECT * FROM 見積 WHERE id=計上先.id);

#計上先テーブルが正規化されてないのが気になるが。まぁガンガレ。
317NAME IS NULL:04/06/14 18:11 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 です。
318NAME IS NULL:04/06/14 18:26 ID:???
>>317
カラムの型がワカランのだが、INTEGERなどの数値型で、1か0だけなら、
SELECT sum(flag1),sum(flag2),sum(flag3) FROM table;
でいけると思うが。ダメかな。
319NAME IS NULL:04/06/14 18:31 ID:???
あと、SELECTリストにサブクエリがかけるのなら、
SELECT (SELECT COUNT(*) FROM table WHERE flag1=1),(SELECT COUNT(*) FROM table WHERE flag2=1),(SELECT COUNT(*) FROM table WHERE flag3=1);
とするのが、汎用的な解か?
320317:04/06/14 19:01 ID:???
>>318

型はcharです。
intだとその方法がスマートですね。

>>319

ありがとうございますー
これでやってみます。
321NAME IS NULL:04/06/14 19:43 ID:???
>>320
CHARでも自動変換されない?
どっちにしても
SELECT sum(flag1 = 1),...
とかで十分な気がする。
322317:04/06/14 20:41 ID:???
>>321

自動変換されましたー
ありがとうございます!
323NAME IS NULL:04/06/15 17:48 ID:anO/9QVt
>>314じゃないのですが似たような事してるので質問します。

>>316で回答されている
SELECT id FROM 計上先 WHERE NOT EXISTS (SELECT * FROM 見積 WHERE id=計上先.id);
の*をidにした方が速くなったりしますか?
324NAME IS NULL:04/06/15 18:30 ID:???
>>323
いまどきのRDBMならかわらんだろ。
行があるかどうかだけ確認していると思われ。
パーサのことを考えると下手にカラム名を書くより*の方が
楽なような気もする。
それよりか、安易に(NOT) INを使って次のようなSQLを
書かないことに気をつけたほうがよかね。
SELECT id FROM 計上先 WHERE id NOT IN (SELECT id FROM 見積);
325NAME IS NULL:04/06/15 18:49 ID:???
>>324
どうもです。
326NAME IS NULL:04/06/16 08:19 ID:???
327NAME IS NULL:04/06/18 01:03 ID:???
>>326
単なるEmacs信者じゃん。
「何だか知らないけど使うな」とかそんなんあるし…
328NAME IS NULL:04/06/18 12:25 ID:???
すいませんが質問させてください

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

よろしくお願いします
329NAME 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);

みたいな事をやりたいのです。
330NAME IS NULL:04/06/19 00:50 ID:???
>>329
できます。
331NAME IS NULL:04/06/19 01:05 ID:+pGZo/Sk
ありがとうございます。
やってみます。
332NAME IS NULL:04/06/19 01:44 ID:???
>>328
サブクエリにする理由が不明
333我流ぷろぐらま:04/06/19 15:20 ID:???
検索してもログよんでも見当がつかないので質問させていただきます

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を併記するしかないのかな
お手数おかけしますが手が空いたときにでもご教授ください
334NAME IS NULL:04/06/19 15:49 ID:???
>>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で適当な文字列を返すようにすれば良いかと。
335NAME IS NULL:04/06/19 15:53 ID:???
>>334さん
ありがとうございますです
おかげでなんとか今日中に仕上げられそうです
336NAME 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を使わない方がいいのでしょうか?
337NAME IS NULL:04/06/20 01:12 ID:???
>>336
上は基本的にテーブル順スキャンする。
下は見積.idにインデックスが張られていればインデックススキャンする。
(NOT)IN(サブクエリ)の形式はほとんど(NOT)EXISTS(相関サブクエリ)に
置き換えられるので、EXISTSを使った方が速い。
338NAME IS NULL:04/06/20 03:40 ID:???
idにインデックスが張られていた場合は早くなる、という事でしょうか?

SELECT id FROM 計上先 WHERE NOT EXISTS (SELECT * FROM 見積 WHERE id=計上先.id);

in句の場合はidを指定(?)していますが、EXISTSだとidを指定していませんよね。SELECT *だし。
なのになんでEXISTSでidが条件となっているように出来るんでしょうか?
インデックス張っているからでしょうか?
339NAME IS NULL:04/06/20 08:23 ID:I55AKty9
WindowsXP pro sp2にSQL7.0DesktopEditionをインストールしてるんですが
インストールの初めでユーザーアカウントがログイン出来ずに失敗してしまいます。
WindowsXPのユーザーアカウント作成方法はWindows2000とかと異なるのでしょうか?
WindowsXPにSQL7.0をインストールされた方、ご教授願います。
よろしくお願いします。
340NAME IS NULL:04/06/20 08:41 ID:???
なんでXP proにSQL鯖なんだよ
MSDEで十分だろ
341NAME IS NULL:04/06/20 09:44 ID:???
>>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述語に左辺がなく、右辺の真偽のみ。
342NAME IS NULL:04/06/20 09:46 ID:I55AKty9
>>340
答えられないから?
343NAME IS NULL:04/06/20 10:48 ID:???
>>342 最新版のMSDE2000Aは使わないの?
344NAME IS NULL:04/06/20 17:22 ID:I55AKty9
>>343
もちろん持ってるし別で使ってます。
今回は7.0の環境が特別に必要なので。
345NAME IS NULL:04/06/20 18:08 ID:???
>>344
その「特別に必要」の理由を教えてけろ
346NAME IS NULL:04/06/20 19:18 ID:???
>>341
WHEREよりINの方が早いと教わって、今の所、EXISTS述語というのを使ったことが(見たことも)なかったので、
良く分からなかったのですが、丁寧にありがとうございました。
347NAME IS NULL:04/06/20 19:47 ID:???
>>345
おそらく、現在稼動中のSQL Server 7.0 相当の環境を開発機の
中に作ろうとしてるのでは無いかと。
しかし、MSDE7ってWindowsXPで動作保障されているのかなぁ。。
348NAME IS NULL:04/06/20 20:14 ID:???
>>347
動作対象に入ってる
http://www.microsoft.com/japan/sql/evaluation/sysreqs/70.mspx

気になるのはXPのほうがSP2だということかな。
SP1でも試したほうがいいと思う
349NAME IS NULL:04/06/20 21:14 ID:???
>>348
DEならXPでもいいのか。サンクス
350NAME IS NULL:04/06/20 21:16 ID:???
DEっていう
351NAME IS NULL:04/06/22 11:03 ID:1HWKGmgT
bytea 型のデータに SQL で,
insert into するにはどう書けばいいの?
352NAME IS NULL:04/06/22 14:20 ID:???
SQLを教えてください。

テーブルA |  テーブルB
―――――――――――――――
ABC100   |  ABC103
DEF100   |  ABC104
ABC101   |  ABC100
ABC102   |  DEF100
ABC102   |  ABC101
DEF102   |  ABC102
―――――――――――――――

の様なテーブルから

ABC100
ABC101
ABC102
ABC103
ABC104


の様なレコードを取得したいのですが
SQL文がわかりません。

宜しくお願いします。
353NAME IS NULL:04/06/22 14:28 ID:???
>>352
テーブルAとテーブルBって...?
別々のテーブルなのか? それともカラム名なのか?
抽出条件はABCから始まっている行なのか?

単発SQLより、DBの基礎をやり直した方がいいんじゃね。
354NAME IS NULL:04/06/22 14:39 ID:???
>>353
テーブルA [CODE]|  テーブルB [CODE]
―――――――――――――――
ABC100       |  ABC103
DEF100       |  ABC104
ABC101       |  ABC100
ABC102       |  DEF100
ABC102       |  ABC101
DEF102       |  ABC102
―――――――――――――――

すみません。
テーブルは別々です。
抽出条件が、[CODE]がABCから始まっている重複しない
レコードです。

お願いします。
355NAME IS NULL:04/06/22 14:45 ID:???
>>354
SELECT code FROM tableA WHERE code LIKE 'ABC%' UNION SELECT code FROM tableB WHERE code LIKE 'ABC%';
356NAME IS NULL:04/06/22 14:52 ID:???
>>355
できました。
ありがとうございました。
357NAME 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です。
358NAME IS NULL:04/06/23 16:38 ID:???
>>357
FULL OUTER JOINは使えなかったっけ?

しかし、どうでもいいけどイタいテーブルだな…。
359NAME IS NULL:04/06/24 07:57 ID:???
>>358
おまけに、このパターンは聞きっぱなし厨のようだ。
360NAME 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がそれを許してくれません。
もっと効率いい方法があればお願いします。
361NAME IS NULL:04/06/24 13:10 ID:???
>>360
これでいいのかな?
select * from TEST as T1 where 日付=(select max(日付) from TEST group by 番号 having 番号=T1.番号);
362361:04/06/24 13:21 ID:???
あれ、ひょっとして結果は360とおんなじになっちゃう?
重複したときはどういう結果がほしいんかな?
363NAME IS NULL:04/06/24 13:40 ID:???
レスありがとう御座います。
重複はありえないって事で良いかもしれません。

それと>>361が実行できないのですが
364NAME IS NULL:04/06/24 13:42 ID:???
あ、asを消すと逝けました。どうもです。
365NAME IS NULL:04/06/24 16:58 ID:???
>>361を使っての続きなのですが
テーブルをサブクエリーに置き換えたいのですが凄く長いのです。

ここのテーブルをサブクエリーにしたい場合    こっち側も同じ様にサブクエリー
          ↓                   を書くしかないのでしょうか
          ↓                             ↓
select * from TEST as T1 where 日付=(select max(日付) from TEST group by 番号 having 番号=T1.番号);

修正が面倒になるし処理に無駄が出そうなのですがどうなのでしょう?
366361:04/06/24 19:58 ID:???
>>365
某MLで似たような質問が出てましたが、
単純に重複するサブクエリを簡略化するような回答は無いですね。(今のところ)
俺も知りたいところだ。
サブクエリが不変ならViewを使う手もある。処理そのものは変わらんけど。

んで、まぁ勝手な想像なんだけど、重複や繰り返しのサブクエリがある場合に、
その処理毎にそのサブクエリを処理するんじゃなくて、内部的に保持して
使いまわすことにより高速化を図るように各DBベンダーががんばってんじゃ
ないかなぁ。

実際PostgreSQLはサブクエリまわりで高速化されているし。
367NAME 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も指定しろ、と言われてしまいます。
どのように書けば良いでしょうか?
368NAME IS NULL:04/06/25 08:30 ID:???
>>366
ありがとう御座います。
処理自体はうまく実行できてるのでこれで行きます。
どうもです。
369NAME IS NULL:04/06/25 10:56 ID:???
はじめまして。
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')")
これだとエラーになってしまうんです。

すいませんどなたか助けてください。
370NAME IS NULL:04/06/25 11:15 ID:???
誰か>>367のやりたいことの解説キボンヌ
371NAME IS NULL:04/06/25 13:12 ID:???
>>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;
372NAME IS NULL:04/06/25 13:19 ID:???
369はSQL Serverがどうこうじゃなくて、完全にASPの使い方の問題と思われ。
373NAME IS NULL:04/06/25 13:27 ID:???
>>372
やっぱそーか。ってか、そうだよなぁ。
ついつい、M$の特殊仕様と疑ってしまう。
374NAME IS NULL:04/06/25 13:43 ID:PSV9Ft8u
Oracleで言う所のNvl関数はSQLServerにはありませんか?
某会議室で検索したのだけどログがサーバーエラー出て見れません・・・
375NAME IS NULL:04/06/25 13:48 ID:???
isnull
376NAME IS NULL:04/06/25 13:52 ID:???
ありがとうございます!
377369:04/06/25 13:55 ID:IMVNNnLT
>>371
ありがとうございます。でもじつは
今2つのデータテーブル(フィールドはどちらも前述のId、Name、Address、Tel)を1つにまとめたいと考えていて、
そこで問題なのがおたがいのIDが重複している可能性があるので、一度両方のデータセットを取得して、
IDの衝突がないことを確認してその時点でのクエリ(rs配列にあるValue)をInsertしていく・・
という方法を考えています。こういう場合は、他にもっといい方法があるのでしょうか?
本をいろいろ探してみても変数をSQL文に代入する例は殆どありません。でもこういうケースって多いと思うのですが・・?
みなさんはどう解決してるのですか?お願いいたします。
378NAME IS NULL:04/06/25 14:11 ID:???
こーいうとこ見てだいたい見当つかんかな。
ttp://www.ken3.org/cgi-bin/test/test027-2.asp
379NAME IS NULL:04/06/25 14:52 ID:???
>>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);

かな。ともに未確認。
380NAME IS NULL:04/06/25 15:55 ID:???
文字列型のフィールドに対し、部分比較をするにはどうしたら良いでしょうか?

data_a
-------------
aaaiii
aaakk
bbbcc
aaacc

のようなテーブルがあった場合に、フィールド「data_a」から、頭3桁が「aaa」の
データを取りだすということなんですけど、良い方法はありますでしょうか?
宜しくお願いします。
381NAME IS NULL:04/06/25 16:02 ID:???
>>380
SELECT data_a FROM field WHERE data_a LIKE aaa%;
もしくは
SELECT data_a FROM field WHERE data_a LIKE aaa*;
382NAME IS NULL:04/06/25 16:03 ID:???
>>381
ありがとうございました!
383NAME IS NULL:04/06/25 16:03 ID:???
>>380
SELECT * FROM table WHERE data_a LIKE 'aaa%';
384380:04/06/25 16:09 ID:???
すみません。もう一つだけ聞かせて下さい。
>>380のようなテーブルの中から、頭から3桁目だけを比較したいのですが、
良い方法があったら教えて下さい。
教えて君ですみません。
385NAME IS NULL:04/06/25 16:17 ID:???
>>384
WHERE data_a LIKE '__a%';
386NAME IS NULL:04/06/25 16:24 ID:???
>>385
ありがとうございます。
大変助かりました。
387NAME 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で
でもその他の項目はどうやれば...みたいな感じで
わかんなくなってきました...

実現可能でしょうか?
388NAME IS NULL:04/07/01 17:33 ID:???
サブクエリを使って。
389NAME IS NULL:04/07/01 18:02 ID:???
>>387

select * from table
where 部品番号 & 注文日 in (
SELECT 部品番号 & Max(注文日) AS 式1
FROM table
group by 部品番号
)

access2002で確認した。
390NAME IS NULL:04/07/01 18:48 ID:cbRg6fOS
プロシジャの内容(定義)を見る方法を
教えてください。
391NAME IS NULL:04/07/01 19:24 ID:???
>>390 MSSQLならsp_helptextを使うとか(あとは検索してね)
392NAME IS NULL:04/07/01 21:44 ID:???
部品番号ごとの最新の注文日をとってくるだけでしょ?
様々な解がありそうですが?
>>388さんのやり方以外でもUNION句とWHERE条件の絞込みで楽勝っぽい。
GROUP BYとMAXやTOPとDISTINCTでもいけそうだよ!!
393NAME 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

どなたかよろしくご教示ねがいます
394NAME IS NULL:04/07/01 23:32 ID:???
宿題丸投げスレだ…

で、そうやって仕事を丸投げして
お前は金をもらうわけだ
395NAME IS NULL:04/07/02 00:00 ID:???
>>393
その程度のSQLが書けないようだとDBなんて弄るメリット無いだろ。
396NAME IS NULL:04/07/02 00:48 ID:???
>>389
いつも思うんだが
この手の問題があると真っ先に ... in ( select max(...) from ... ) な
レスがつくんだが、これってどっかで流行ってんのか?
397NAME IS NULL:04/07/02 01:20 ID:???
>>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 注文.顧客番号, 注文.販売月, 注文.顧客番号
398NAME 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/

このような技術の雛形などご存知の方いましたらどうかご教授下さい。
399NAME IS NULL:04/07/02 07:29 ID:???
文字列リテラルのサニタリーチェックって何?
400NAME IS NULL:04/07/02 15:23 ID:???
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
:
401NAME IS NULL:04/07/02 18:11 ID:???
んだ。
402 ' → '':04/07/02 21:25 ID:???
>>399
sanitary belt 生理帯.
sanitary engineer 衛生技師; 配管工; 〔米〕 〔婉曲〕 ごみ清掃[収集]員.
sanitary engineering 衛生工事[工学].
sanitary landfill 地下埋め込み式ごみ処理(法・場).
sanitary napkin 〔米〕,
sanitary towel 〔英〕 生理用ナプキン.
sanitary ware [集合的に] 衛生陶器 《便器・浴槽など》
404NAME IS NULL:04/07/03 21:43 ID:???
生理だな。
405oraora:04/07/05 01:32 ID:RTzQYzWC
@先発 select for upate
A後発 select for update nowait
だとAはエラーが返されるけど、
Aでロックをかけようとしたとき、
既にロックをかけている@をエラーにする
オプションってないの?
406NAME IS NULL:04/07/05 03:06 ID:???
初心者でございます。

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
と出力するにはどうしたらいいのでしょうか。
よろしくおねがいします。
407NAME IS NULL:04/07/05 07:30 ID:???
>>406
SELECT kanji,c FROM (SELECT sex,count(sex)AS c FROM a GROUP BY sex)AS a2,b WHERE a2.sex=b.sex;
408NAME IS NULL:04/07/06 00:25 ID:???
試してみます。
ありがとうございました。
409NAME IS NULL:04/07/06 10:29 ID:???
index,num
----------
1,100
2,200
3,1000
.
.
というようなテーブルから単純にselectで抽出した不特定の行数を数えるのはsqlで
可能ですか?それとも外部処理ですか?
ふと疑問に思い質問します。
当方趣味でsqliteを使い気象観測データのようなものをデータベースで利用中。


410NAME IS NULL:04/07/06 10:48 ID:???
>>409
select count(*) from table;
ということじゃないのか?
411NAME IS NULL:04/07/06 10:52 ID:???
テストデータを示すなら、セットで期待する結果も書いたほうがいいでつよ。
行数カウントならCOUNTでいけるのでわ。
412NAME IS NULL:04/07/06 11:47 ID:???
>410,411ありがとうございました。count()で可能でしたか。勉強になりますた。
SQLの結果をperlで受けて配列の要素数を数えれば事足りましたが、もしや
SQLで処理ができるかもしれない、と思い考え中でした!
413NAME IS NULL:04/07/06 18:44 ID:10rxnk3A
お願いします
値が1,2,3と入ってる列を
1,3,2という順番に並び替えしたいんですが
どうやればいいでしょうか?


1,2,3とか3,2,1ならOrderByでいけるんですが〜
414413: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の順で選択したいんですけど
いい方法を教えてください!
初心者ですんまそん
415NAME IS NULL:04/07/06 19:09 ID:???
>>414
order by 個数 ってこと?
416NAME IS NULL:04/07/06 19:13 ID:???
>>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;
417413:04/07/06 22:34 ID:10rxnk3A
無理なのかーw

そうなのよ、ただ単純になのよー
システムの都合上、意味はない順番になってしまったらしくて
Replace関数とか使ってもむりっぽいよねー

何かいい手ないかなー
418NAME IS NULL:04/07/06 22:37 ID:???
>>417
そーゆー時こそ、PG側でなんとかすんだろーがー
419NAME IS NULL:04/07/06 23:34 ID:???
>>417
そもそも、ORDER BY 句をつけない限り、抽出される順番は保障されていないはず。
基本的には見つけた順なので、内部の通し番号(rowidとかoid)順になるのだろうけど、
これとて、DBによってはUPDATEなどで変わるものと変わらないものがあるし、
DBメンテやアナライズでかわるものもある。
420NAME 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 を見るってイメージなんですが
421NAME IS NULL:04/07/06 23:39 ID:???
>>420
SELECT * FROM table ORDER BY COALESCE(列A,列B);
422NAME IS NULL:04/07/07 00:00 ID:???
ありがとうございます
汎用関数であっさりできるんですね
調べ方が足りなかったようです
精進します
423NAME IS NULL:04/07/07 00:03 ID:???
coalesceが使えなければnvl。

where句に関数はイヤだけどね
424NAME IS NULL:04/07/07 08:42 ID:???
>>413
並べ方に規則性が無いのなら
規則を作ってやる必要がある。
列を追加して、並べ替え専用の列でも作ったら?



設計を見直した方がいいような気もするけど。。。
425NAME IS NULL:04/07/08 03:30 ID:t5U4zZXH
みにくくて申し訳ないんですが
これおねがいします。
ttp://v.isp.2ch.net/up/23ab1028188e.JPG
Oracleです
426NAME IS NULL:04/07/08 04:13 ID:???
ab
427NAME IS NULL:04/07/08 08:03 ID:???
>>426
ありがとうございます!たすかりました
428NAME IS NULL:04/07/10 23:36 ID:+YSVeqKQ
教えてください。
テーブルAに列a,b,cがあって、a,bが重複してる行を
削除したいんですけど、SQLではどしたらよいのでしょうか。
429NAME IS NULL:04/07/11 00:09 ID:???
列a = 列b
430NAME 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です。

431NAME 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です。
432NAME IS NULL:04/07/11 01:11 ID:???
>>431
aa bb cc が残って、
aa bb dd を残さない理由は?
ORDER BY 句も使わずに単純に先に出てきた方を残すのか?
どっちゃにしろ面倒だが。
433NAME IS NULL:04/07/11 01:42 ID:p5TFt5ON
単純に先に出てきた方を残します。
面倒ですか〜。
434NAME IS NULL:04/07/11 01:58 ID:yVwQ3n9P
N速に書き込めません。

何とかして下さい。
435NAME IS NULL:04/07/11 04:48 ID:???
>>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
ありがとうございます。
できそうな感じです。明日やってみますです。
437NAME 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」と
同じ値にするにはどうすれば良いでしょうか?
438NAME IS NULL:04/07/15 09:46 ID:???
>>437
例えが悪いのか、その条件だと項目1がuniqueであるべきなので
必然的に、項目1が同じ場合は項目2も同じはずなんだが。
439NAME 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でどう表現すればいいのでしょうか?
440NAME IS NULL:04/07/15 11:01 ID:???
とりあえずこのスレでgroup byを検索しろ
441437:04/07/15 11:25 ID:???
>>438
例をなるべく簡素にしようと思ったんですが例が悪かったかもしれません
「項目1」はユニークじゃ無いんですが別の列と組み合わせると
ユニークって事になってます。

実際にはunionの上下とも検索条件は日付で下の方は上の1ヵ月後です。
で、上下の検索結果を結合したいんです。
日付違いで同じ「項目1」があれば下の「項目2」を上の「項目2」に変換したいんです。
442NAME IS NULL:04/07/15 13:50 ID:???
>>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) というように、
複合キーで結合するよろし。
443NAME IS NULL:04/07/15 13:57 ID:/sT/J1jd
>>440
氏ね
444NAME IS NULL:04/07/15 14:02 ID:???
>>443
逆切れするまえに、>>442のような自己結合を覚えればいい。
445おっくん:04/07/15 14:13 ID:43wxXaSZ
主キーについて教えてください
もきゅ
446437:04/07/15 14:16 ID:???
>>442
ありがとう御座います。参考にして今からやってみます。
447NAME IS NULL:04/07/15 18:35 ID:???
448NAME IS NULL:04/07/16 21:43 ID:???
"01","01","茨城","水戸"
"01","02","茨城","つくば"
・・・(略)
"12","01","東京","足立区"
"12","02","東京","荒川区"

↑みたいなデータがあったときに、

"01","99"
   ↑キーの二つ目の'99'はデータベースに存在しない

という検索キーから
"茨城",""
   ↑ブランク、またはnull
を一回のselectで取得するSQL教えてください。
 
 
 
もちろん、二回select発行するより早い奴で。
449NAME IS NULL:04/07/16 22:11 ID:???
キチガイは寝てな
450NAME IS NULL:04/07/17 00:35 ID:???
>>448
そういう腐れテーブルを設計するなら、
"01","99","茨城",""
って行も足しとけ。
451NAME IS NULL:04/07/17 00:42 ID:???
>>448
データを正規化することから始めろ
452NAME IS NULL:04/07/17 01:31 ID:???
>>450>>451
私が設計したわけじゃなくて、今そこで動いてるマスタテーブルがこ・・ゴフッ
453NAME IS NULL:04/07/17 02:19 ID:???
>>452
正規化されていないテーブルを出しといて、
>もちろん、二回select発行するより早い奴で。
と聞くのは、厚かましい。
2回発行するのが許されるのならそーしとけ。
454NAME IS NULL:04/07/17 02:29 ID:???
"01","99" を2つのカラムにして、データテーブルと INNER JOIN 後に DISTINCT
455NAME IS NULL:04/07/17 22:32 ID:???
select二回発行より速いって縛りがなければ何とでもなるけどな。
サブクエリ使っていいなら。
456NAME IS NULL:04/07/17 23:04 ID:???
>>448
あんたが悪いわけじゃないみたいだからさ
457NAME IS NULL:04/07/18 00:31 ID:???
>>456
いや、「もちろん、二回select発行するより早い奴で。」という
ど厚かましい要求がガンだと思う。
458NAME IS NULL:04/07/18 01:21 ID:???
>>457
わかるわかる。
でもな、そんなにカリカリしてたら
ハゲ板の世話になる事になるよ。
459NAME IS NULL:04/07/18 22:33 ID:???
DB(MySQL)を使ってスケジュール情報を管理したいと思います。
ここでいうスケジュールとは
「内容(文字列)」、「開始日時(日時型)」、「終了日時(日時型)」
が1セットになったもので、これをレコードとして登録します。

こういった情報を登録しておいて

・レコードを追加する際にダブルブッキングのチェック
・今の時間に一致するスケジュール情報の検索
・今から指定時間以内に開始日時になるスケジュール情報の検索

をSQL文で簡単に取得するにはどうすればよいでしょうか?

DBに慣れていないもので、全レコードを取り出してチェックするしか
方法が思い浮かびません・・・。
460NAME IS NULL:04/07/19 00:14 ID:???
>>459
ダブルブッキングチェックはOVERLAPS述語をつかうけど、
MySQLで使えるのかな? それ以前に、CHECK制約で無理ぽ?
Ruleかトリガ、もしくは先にチェックしてからINSERTかな。

下の2行はBETWEEN述語を用いれば簡単に出来る。
461459:04/07/19 00:21 ID:???
MySQLでもOVERLAPS使えるようです。
http://dev.mysql.com/doc/mysql/ja/Functions_that_test_spatial_relationships_between_geometries.html

BETWEENを使った場合、
>・今の時間に一致するスケジュール情報の検索
は簡単に出来そうですが、

>・今から指定時間以内に開始日時になるスケジュール情報の検索
はどのようにしますか?
462NAME IS NULL:04/07/19 00:25 ID:???
>>461
WHERE 開始時間 BETWEEN now() AND now()+interval'指定時間';
463459:04/07/19 00:31 ID:???
>>462
マーベラス!!
やっぱりいくら優秀なDBシステムでも、賢い人が使わないと
パフォーマンスを引き出すことはできませんね。精進します!
464NAME 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
465別々スレ62:04/07/20 12:17 ID:???
すんません。ちょっと質問なんですがPostgreSQLで。
文字列の場合、
 ・char
 ・varchar
 ・text
の違いがわかりません(><)
誰か教えてください。特に、charとtextの違い。
やっぱり、textの方がメモリを食うんですか?
466464 :04/07/20 12:20 ID:???
自己レスです。
EXTRACT(YEAR_MONTH FROM DATE)
で年月のgroup byが出来ましたので解決しました。
467NAME IS NULL:04/07/20 12:22 ID:???
468NAME IS NULL:04/07/20 12:43 ID:???
>>465
とうとう来たかw
ほとんどネタにしかとれんが、本当にわからないならなぜマニュアルを読まないんだ。
http://www.postgresql.jp/document/pg74doc/html/datatype-character.html

PostgreSQLの場合は日本語などマルチバイト文字でも一字は一字としてカウントするので、
内部的(バイト数)には全て可変長で対処しているような気がする。

マニュアルには性能に関する差異はないとあるが、
char = text+空白パッド+文字数制限
varchar = text+文字数制限
だろうから、挿入や更新の際はtextが一番高速のような気がする。
469NAME IS NULL:04/07/20 12:59 ID:???
内容変わらないけれど 7.4.3 のリンクも張っておく。
http://www.postgresql.jp/document/pg743doc/html/datatype-character.html
470459:04/07/20 15:47 ID:???
すいません、MySQLではOverlaps使えないようです。
マニュアルには記載がありますが、「未実装」と書かれていました。
http://www.mysql.jp/mysql/Manual/4.1.1/html-split/manual_10.html#SEC723

ダブルブッキングのチェックはどうすればよろしいでしょうか?
471NAME IS NULL:04/07/20 16:15 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 が成り立っていなけりゃならんが。
472別々スレ62:04/07/20 22:03 ID:???
>>468
マジレスありがとうございます(><)
感動です。やっと、このスレで成仏できます。(><)
今、>>468のマニュアルを読んでみました。
textは文字列の長さに制限がありません。
だから、すごいメモリ食うんじゃないかな?と思ったんです。
登録する予定ものが文字数が不確定なので、
多めにvarcharでとったの方がいいのかな?とか思っていたんですが・・・。
あるサイトで「PostgreSQLではtextが一番早いで!」って書いてあったから、
varchar使うか、text使うか迷っていたんです(><)
でも、>>468さんのおかげでtextを使うことにしました。
これで、成仏できます。
ありがとう>>468さん (><)
473NAME IS NULL:04/07/21 23:47 ID:???
集計キーが違う集計クエリーをUNIONで結びつけるのに
いい方法ないでしょうか。

ダミーで項目を揃えても、2つのクエリーをそれぞれSELECT文で
もう一括りしてからUNIONでくっつけようとしてもダメでした。

>>464
SELECT SUBSTR(日付,1,7),SUM(数),SUM(円) GROUP BY SUBSTR(日付,1,7)


PostgreSQLです。
474NAME IS NULL:04/07/22 00:11 ID:???
>>473
普通にできそうな事のように思えるのだが、
例えのテーブルと希望する結果を挙げてみれ
475NAME IS NULL:04/07/22 00:14 ID:???
select a, b, c, from unko union select null, nulll, null from dual

とかってできるだろ?
476473: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
477473:04/07/22 00:24 ID:???
>>475
集計キーが異なるとダメみたいです
478NAME IS NULL:04/07/22 00:45 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;
479473:04/07/22 00:50 ID:???
>>478
オー、集計する前にUNIONしちゃうわけですね。サンクス、試してみます。
480NAME IS NULL:04/07/23 09:49 ID:???
values( CAST('" + sData + "' AS TIMESTAMP),・・・・)
これで、String型のデータ(YYYY-MM-DD HH:MM:SSの形式で入ってる)を
TIMESTAMPに変更しようとしたら、エラーが出たのですが、どこがおかしい
のでしょうか?
481NAME IS NULL:04/07/23 20:16 ID:???
もしかしてSQLServerだとしたら
timestamp 型の値は日付データではありません。
中身は単なる一意キーです。


482NAME IS NULL:04/07/23 21:39 ID:???
>>481
SQLServerのTIMESTAMPはユニークになるけど、
レコードの内容を更新するとTIMESTAMPも変わってしまうから
キーには出来ないよ。
483NAME IS NULL:04/07/23 22:21 ID:???
「その時点での」テーブル内一意ってことです。
ごめんなさい。
484NAME IS NULL:04/07/25 22:47 ID:???
質問です。
オラクルのTO_CHAR句をSQLserverで代替するのはどうやればいいのですか?
手持ちの本や、ネットで調べたのですがのってなくて・・・
やりたいことは、100000とあるデータにカンマをつけるだけです。
485NAME IS NULL:04/07/26 10:30 ID:???
>>484
一発では出来ないので
CASTでCHARかVARCHARにしてから
WHILEループを書くしかないんじゃないかな
486NAME IS NULL:04/07/26 11:37 ID:???
>>485
有難うございます。
487NAME 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です。
488NAME IS NULL:04/07/26 15:01 ID:???
>>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 取引先コード;
どぉですか。
489NAME IS NULL:04/07/26 15:06 ID:???
>>488
ゴメソ 1行目を訂正
×SELECT code
○SELECT 取引先コード
490487: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
491487:04/07/26 15:16 ID:J5YziJL0
あぁインデントつけて見やすくしたつもりが
すべて消えてる・・・ 見づらくてすみません。
492NAME IS NULL:04/07/26 17:02 ID:KcwHZUve
二つのテーブルからのCOUNT()を合計するにはどーするんでしょうか。
493NAME IS NULL:04/07/26 18:03 ID:???
足せ
494459:04/07/26 22:57 ID:???
以前、スケジュール管理に関して質問したものです。
ダブルブッキングのチェックはできるようになりましたが、複数のユーザーから
ほぼ同時に予約処理が行われた場合、タイミング次第でダブルブッキングして
しまうようなレコードが追加されてしまうことはありませんか?
MySQLはマルチスレッドだと本に書かれていましたが、排他処理を行うことは
できるのでしょうか?
495NAME IS NULL:04/07/26 23:20 ID:???
>>494
テーブルをロックする。
ttp://dev.mysql.com/doc/mysql/ja/LOCK_TABLES.html
ダブルブッキングチェックをする。
問題がなければ新しい予定を挿入する。
ロック解除。
496NAME IS NULL:04/07/27 09:05 ID:MnORfm0Z
493>そりゃそーですが、文がわからん。
おしえて。
497NAME IS NULL:04/07/30 09:09 ID:Gc8sLY6c
SQLでデータの長さなんか取れたりしますかね。
サイズ未指定で作成したBLOBカラムなんかの実データのサイズが知りたいんですが。
分からないんであれば、サイズを保持するカラム足してテーブルコンバートしなきゃならなくなっちゃうYO!
(Firebird1.5でつ)
498NAME IS NULL:04/07/30 11:49 ID:???
>>497
Firebirdはしらんが、length(BLOBカラム) じゃダメなんか?
499NAME IS NULL:04/07/30 15:07 ID:???
select length(カラム名)

だと駄目みたい。
500NAME IS NULL:04/07/31 00:18 ID:???
おしえてください。
カーソル同士をJOINってできますか?
501NAME IS NULL:04/07/31 01:01 ID:???
?JOINされたものをカーソルにするんでないの?
502NAME IS NULL:04/08/03 17:19 ID:wblkt8Jn
Oracle での テーブル定義の変更 をするSQL

ALTER TABLE Table_A MODIFY Field_A char(10)

を SQLServer用に 書くとしたらどのような命令をすればいいのでしょうか?

上記はORACLE専用だったみたいで・・・
503NAME IS NULL:04/08/03 17:28 ID:???
表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はわかります。 でもそれ以外はなぜエラーなんでしょう?

504503:04/08/03 17:30 ID:???
DとEの違いがわからない・・・・・
505NAME IS NULL:04/08/04 04:32 ID:???
DとEの違い
 ()の位置
 Dの(COL1,COL2) だとSELECTの書式エラー。
 (COL1),(COL2)と表記すると動くはず。
506503:04/08/04 07:31 ID:???
>>505

ありがとうございました^^
507NAME IS NULL:04/08/04 17:15 ID:???
テーブル名:ユーザーリスト
+-------+--------------------+
|user_id| INT AUTO_INCREMENT |
+-------+--------------------+
| name | CHAR(20)      |
+-------+--------------------+

上記のようなテーブルがあります。
user_idを指定せずにINSERTした場合、自動的に
値が割り振られますが、Perlなどから利用する場合、
レコードに実際に割り当てられたuser_idの値を
取り出すにはどうすればよいでしょうか?
508NAME IS NULL:04/08/04 17:29 ID:???
MySQL : LAST_INSERT_ID
SQL Server : IDENT_CURRENTなど
509507:04/08/04 17:34 ID:???
マルチスレッド動作でも問題なくINSERTしたレコードの値が取り出せますか?
どうやって実装されているのか分からないので、ちょっと心配なのですが。
510NAME IS NULL:04/08/04 17:39 ID:???
>502
ALTER TABLE Table_A ALTER COLUMN Field_A char(10)
だが、6.5 以降でないと使えないとか、いろいろ制約あるぞ。
511NAME IS NULL:04/08/04 17:49 ID:???
どっちも接続ごとに管理されているから、複数スレッドで同じ接続を
共用するような造りにしていなければ大丈夫。
512NAME IS NULL:04/08/06 09:12 ID:???
ORACLEの関数 ROUNDについて、

日付を四捨五入する使い方があるみたいですけど、
これの法則が、あいまいにしかわかりません。
4日なら切り捨て?5日以上なら繰り上げ?
いろいろ調べたのですけど・・・・
混乱するばかり・・
513512:04/08/06 11:04 ID:???
現在2002年11月26日午後3時15分です。
次のSQL文を実行した時に、戻される値を、(A)〜(E)の中から選んで下さい。

  SQL> SELECT ROUND(SYSDATE,'MON') FROM DUAL;

↑これの答えが
514NAME IS NULL:04/08/06 11:24 ID:???
MySQL使ってます。
BEETWEEN句を使って、TIMESTAMP型のカラムが now() より n時間以内 の
レコードを取り出そうとしていますがうまくいきません。
TIMESTAMP型とnow()の戻り値の型は比較できないのでしょうか?
515NAME IS NULL:04/08/06 12:15 ID:???
>>514
BEETWEEN???

BETWEENは a BETWEEN x AND y の場合 x<y じゃないとダメなのかも。

a BETWEEN now() - interval'1 hour' AND now();
でどぉっすか?
516514: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」となりました。
517514: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日と
比較してしまい、うまくいきませんでした。
518NAME IS NULL:04/08/06 14:49 ID:???
>>517
day(now()-interval 1day)
かな? MySQLは使ってなくて書式に間違いがあるかもしれんが。
519NAME IS NULL:04/08/06 15:59 ID:???
>513
 SQL リファレンスに各書式での丸め条件載ってるが……
 例題だと12が返ってくるんじゃなかったかな?
520512:04/08/06 16:14 ID:???
>>513

すみません、オラクルのSQL リファレンスって売ってるんですか?
初歩的なことですみません。

オラクルマスター問題集と、黒本しかてもとにありません。
521NAME IS NULL:04/08/06 19:00 ID:???
Oracle Technology Network の Web Site ttp://otn.oracle.co.jp/ にいってみそ。
んで ID 交付してもらってログインすりゃ、全マニュアル PDF で落とし放題だ。

つーか問題集にそれくらい書いてないんか……
522NAME IS NULL:04/08/06 19:05 ID:???
あー念のため。
OTN Standard とか OTN Professional の有償サービスにはいくなよ(藁
ページ上部の「お客様情報」ってとこから無料で新規ID登録できっから。
523NAME IS NULL:04/08/10 22:07 ID:???
一度のSELECTで、小計1(SUM(なんたら))、小計2(SUM(かんたら))、総計(小計1+小計2)を
取得したいのですが、なるべくならサブクエリを切りたくありません。
プログラム中で色々とSQLの編集を行うので、複雑にしたくないのです。
小計1・2のエイリアスを参照できないか、と試してみたものの、
一度のSELECTでは無理なようでした。
良い方法はないでしょうか?
環境はOracle9.2です。
524NAME IS NULL:04/08/10 22:08 ID:AX2MPVIQ
すいません。質問なので一度ageます。
525NAME IS NULL:04/08/11 13:37 ID:???
ビューにしろ
526NAME 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

と言った感じで連番にするにはどうしたらいいでしょうか?
527NAME IS NULL:04/08/12 15:17 ID:???
>>526
SELECT id,(SELECT COUNT(*) FROM table AS T2 WHERE T1.no>=T2.no),data FROM table AS T1;
528NAME IS NULL:04/08/12 17:03 ID:???
助けてください。

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の一覧を取得する方法がわかりません。(○印部分)

教えてください。


529NAME IS NULL:04/08/12 17:12 ID:???
select id,min(created) from hoge group by id;
530528:04/08/12 17:15 ID:9vICwHsM
肝心なことを書き忘れた。Postgresを使っています。
DISTINCTとか使ってみたけど、IDを重複せずに出力したけど、
それを元にIDごとの order by created limit 1 をしたいけどできない・・
531528:04/08/12 17:18 ID:9vICwHsM
できました!ありがとう。
532NAME IS NULL:04/08/12 21:58 ID:???
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 {条件式};

だと正しく動作するのですが、なぜでしょう?
533NAME 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
534NAME 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で求めたいです。よろしくお願いします。カミサマ。
535NAME IS NULL:04/08/13 20:27 ID:???
↑ああっ、すみません gpじゃなくて全てgrです。
536NAME IS NULL:04/08/13 20:45 ID:???
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だとこんなんで行けるけど
537534:04/08/13 22:01 ID:???
>>536
ありがとう!助かりました。Postgresでもいけました。
本当になるほど、ですね。半紙に筆で書いて飾っておきます。
無理だと思ってました。もっと精進してここで回答者に
なれるようにがんばります。
538NAME IS NULL:04/08/16 21:10 ID:???
質問なのですが、ACCESSであるフィールドに関して重複しているレコードを
1行と見なし、総件数をカウントするSQLを組みたいのです。
例えば、あるフィールドの値が100、100、200、300という4件のレコードの場合、
総件数は3件としたい訳です。

select count(*)
from (
select distinct field_A
from table_A
) count

SQL Serverでは上記でいけたのですが、ACCESSではFROM句の
構文エラーとなってしまいうまくいきません。
どなたかご教授お願い致します。
539NAME IS NULL:04/08/16 21:15 ID:???
出来るが?
540NAME IS NULL:04/08/16 21:36 ID:???
>>538
SELECT count(DISTINCT field_A) FROM table_A;
541NAME IS NULL:04/08/17 10:26 ID:???
こんなテーブルがあるのですが、

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になります。
542538:04/08/17 10:38 ID:???
解決しました。どうもありがとうございました。
543541: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;

でループを回してます。
544NAME IS NULL:04/08/17 13:03 ID:???
>>541
pageの文字数が全て同じで、書式が一桁の数字+',html'で統一されているのであれば、

SELECT * FROM text WHERE page < '2,html';
でいいんじゃね。
545NAME IS NULL:04/08/17 13:10 ID:???
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
546541:04/08/17 13:22 ID:???
ご回答ありがとうございます。

544さん
残念ながら文字数は決まってないので時間で見るしかないんですよー。

545さん
ご回答ありがとうございます。
でも、試してみたのですがエラーになりました。

ERROR: Relation "a" does not exist

肝心なことを言い忘れたのですが、DBはPostgresです。
547545:04/08/17 13:53 ID:???
>>546
最後の行が間違っていた。
どう違っているくらいは藻前が見つけてくれ。
エラーメッセージにヒントがあるし。
548544:04/08/17 14:03 ID:???
あああ、漏れはアフォか。完全に質問の意図を理解してなかった。
逝ってきまつ。
549541:04/08/17 14:35 ID:???
できました!ありがとう!

545さんありがとう。

僕もここで答えられるようなスキルになりたいので544さんのお気持ちは全然うれしいです。
550541:04/08/17 17:57 ID:???
質問です。

SQLをもう少し勉強したいのですが、なかなか良い書籍が見つからずに困っています。
何か良い書籍などございましたら教えてください。

オススメの書籍とかありますか?
551NAME IS NULL:04/08/17 18:38 ID:???
552NAME IS NULL:04/08/18 20:10 ID:???
code | name | address
001 | 山田 | 東京
002 | 鈴木 | 千葉
003 | 斉藤 | 埼玉

こんなテーブルがあり、code=003の斉藤さんのレコードを
主キーのcodeだけ000にして、nameとaddressを同じテーブルに
コピーするためには、どんなSQL文を書けばいいでしょうか?

553NAME IS NULL:04/08/18 20:14 ID:???
insert into Table(code, name, address) select '000', name, address from Table where code = '003'
554NAME IS NULL:04/08/19 21:52 ID:cL69zpwQ
SELECT * FROM TBL WHERE ... FOR UPDATE NOWAIT

としたときに、参考書では、
セレクトした行が誰かによってロックされていたときに、制御が
すぐもどされます、と記述があります。

で、この場合、SELECTで取れてくるべきデータは当然取れてくれるんですよね?
555NAME IS NULL:04/08/19 21:53 ID:cL69zpwQ
ワーイ

IDが69だー。

556NAME IS NULL:04/08/19 23:45 ID:XDjDY+ON
>>550
先輩に聞くなんちゃらっていう本。
常々気にしていた「結合と副問い合わせの違い」っていうのがオビに
載ってたの見て買っちゃった。当たり前の記述も多いけど、かゆいと
ころに手が届くQ&A多い。おすすめ。

557NAME IS NULL:04/08/22 02:41 ID:ClvP/KPv
一発で取れた時の感動はいいよな〜
SQL最高!!
558NAME IS NULL:04/08/22 07:15 ID:???
無理に一発で取らないで分割したほうが速いってこともあるがな。
559NAME IS NULL:04/08/24 17:19 ID:???
すいません、質問です。
本みて作った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で昇順にソートされた結果を
上下にくっつけた結果がほしいのですが、何か方法はないでしょうか?
560NAME IS NULL:04/08/24 17:44 ID:???
>>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);
561NAME IS NULL:04/08/24 17:56 ID:???
列名3が数値型なら、
select *
from テーブル
where 列名1='14'
order by
case 列名2
when '320' then -列名3
else 列名3
end
562NAME IS NULL:04/08/24 17:57 ID:???
>>560
サンクスコ

結局別々にやっちゃいました。
563NAME IS NULL:04/08/25 00:30 ID:???
今後、このスレでの質問・問い合わせは SQL でお願いします。
564NAME IS NULL:04/08/25 01:16 ID:???
SELECT 'いやです' as ANSWER
565NAME IS NULL:04/08/25 11:04 ID:???
delete このスレ where レス番 = 563
566NAME IS NULL:04/08/25 14:42 ID:???
oracleですが
table1
aaa date
でテーブルを作り、

select * from table1
where aaa between 20040801
and 20040831
で問い合わせてもオケですかね?
567NAME IS NULL:04/08/26 01:34 ID:???
>>566
質問はSQLでおねがいします
568566:04/08/26 10:24 ID:???
>>567
う、ソレはムズイ…('A`)
え〜と、どう書けばいいかな…
569NAME IS NULL:04/08/26 10:40 ID:???
INSERT INTO SQL質疑応答スレ
570NAME IS NULL:04/08/26 13:05 ID:???
segmentation fault
Number:570 at SQL質疑応答スレ
core dumped.
571NAME IS NULL:04/08/26 19:43 ID:???
select '
>>566 Oracle は知りませんが・・・。通るとしても実装依存なので、
暇なら '2004-08-01' と編集したほうがいいんじゃないかと思います。
'
572NAME IS NULL:04/08/26 19:44 ID:???
select '
あ、失敗してしまいました。。引用符の中の引用符をエスケープし忘れました。
'
573NAME IS NULL:04/08/27 10:59 ID:???
>>571
なるほど
アリガトンゴザイマスタ
SQL+からは>>566でselect文実行できて
プログラム側からだとエラーになっていたので、悩んでました
アリガトンゴザイマスタ
574573:04/08/27 11:04 ID:???
しまった
>>567
でしたね
え〜
insert into SQL質疑応答スレ values(
>>571
,TO_CHAR(>>573)
575NAME IS NULL:04/08/27 20:52 ID:???
変な流れになってるな。
>>567は無視でよろしく。

ネタはこっち

SELECT * に続けて何か書け!
http://pc5.2ch.net/test/read.cgi/db/1058307199/
576NAME IS NULL:04/08/30 00:54 ID:AKKr2SCF
抽出条件で、たとえば相手が5つの数字であることが分かり切っている場合 Like '###8#' みたいな
書き方って出来ませんでしたっけ。
Accessではたしか出来たはずなんですけど、DelphiからAccessMDBだとダメみたいで。
何か書き方が違うのかな
577NAME IS NULL:04/08/30 01:03 ID:???
>>576 like で任意の一文字にマッチする記号は _ アンスコじゃね?
578576:04/08/30 01:09 ID:???
>>577
すげえ
'_'でいけました
感謝です
579NAME IS NULL:04/08/30 05:51 ID:muvL5Gtl
SQLの検索で質問なのですが

テーブルAの得意先コードから得意先マスタテーブルの得意先名を得るんですが、
テーブルAの得意先コードがNULLだった場合は、
テーブルBの得意先コードから得意先マスタテーブルの得意先名を得る

こういう場合ってどういう風に書けばいいのか教えて下さい
580NAME IS NULL:04/08/30 06:48 ID:???
>>579
なんか肝心なところが抜けてないか?
テーブルAとBの関係がワカラン。
何をもってテーブルAやBの得意先コードを抽出しているのか?
581580:04/08/30 06:52 ID:???
ひょっとしてこんなんでいいのか?

SELECT * FROM
(SELECT 得意先コード FROM テーブルA UNION SELECT 得意先コード FROM テーブルB) AS S1
JOIN 得意先マスター USING (得意先コード);
582NAME IS NULL:04/08/31 01:18 ID:???
SQL学習中のものですが、ORDER BY をいつもなぜか
SORT BY と書き間違えてしまいます。何か良い薬はありませんか?
583NAME IS NULL:04/08/31 01:45 ID:???
死ねば
584NAME IS NULL:04/08/31 01:50 ID:???
バカにつけるクスリなぞ無く、そしてバカは氏んでも治らな(ry
585NAME IS NULL:04/08/31 03:58 ID:???
>>582のねらいが、俺にはさっぱり読めないわけだが
586NAME IS NULL:04/08/31 13:09 ID:???
>>583-586がねらい通りになってるって事か
587NAME 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に索引が張っているとします。

588NAME IS NULL:04/09/05 13:10 ID:???
>>587
3つとも同じじゃないかな?感だけど。
589NAME IS NULL:04/09/05 15:28 ID:???
タイム計ってみればいいのでは?
590NAME IS NULL:04/09/05 16:38 ID:???
結合の順番を明示的に指定したい場合はJOIN句を使うと良いと思うよ。
591587:04/09/05 17:07 ID:???
>588-590
レスどうもです。
確かに、タイム計れば結果がわかりますね。失礼しました。
で、何故こんな事を聞くかというと、
いろんなサイトや文献を見ると、
やれ、大きいテーブルはFROM句の前がいいとか後がいいとか、
Where句は上から順に絞り込むとか、位置は関係ないとか、
極論すればオプティマイザが賢いかアホか、等...
どれが正解なのかわからなかったものですから。
あと、明示的したい場合はJOINでするようにします。

ところで、JOINではなく、例題のようにWhere句で等結合を
させた場合、A、B、Cの交差表はどの時点で作られるのですか?

A,B,Cの交差表を作ってからWhereの絞込みを行うのか、
先にWhereの絞込みで各テーブルの仮想結果セットが作られてから
結合するのですか?

これはRDBMSによって違う?

教えて君で申し訳ないです。
592NAME IS NULL:04/09/05 20:50 ID:???
DBMSによっても違うだろうし、コストベースオプティマイザなら
その日の気分によっても違う。
気になるなら実際にアクセスプランを見てみれば良い。

それから、joinで結合順序が固定されるというのも、一部のDBMS
特有の動作だったりする。普遍的なルールじゃない。
593NAME IS NULL:04/09/05 20:51 ID:???
>>591
いまどきのRDBMSならオプチマイザが判断してくれるので、
>>587程度の例ならどれも同じ。

結合に用いるカラム(今回の例だとid)がユニークであるのかどうなど
統計情報によって結合順が変わってくる。
C.idがユニークなら、AかBのテーブルを読んでからC.idをインデックス
スキャンした方が速い。
逆にC.idの重複が多い場合は先にCを読んでA,Bを入れ子ループするか、
A,Bを先に結合した表とCをそれぞれソートしてからマージ結合するに
なると思う。

どのような順序で結合するかはRDBMSやマシンスペック(メモリ量など)
によっても変わってくると思う。
594NAME IS NULL:04/09/06 10:28 ID:???
>>587
あまりきれいなやり方ではないが、
A,B,Cのテーブルを結合するときに、
A.id=B.id
,B.id=C.id
,A.id=C.id
のように、結合条件を全て指定してやると
その中で一番効率のよい結合条件で結合してくれる。
595NAME 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
よろしく
596NAME IS NULL:04/09/06 12:45 ID:???
>>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);

ところで、オラクラーってこんなやつばっかか?
597596:04/09/06 12:46 ID:???
うげ、それぞれ2行目のSQLが間違っていた。
AND NOT EXISTS (SELECT * FROM tbl_c WHERE cbid=tbl_b.bid);
598NAME IS NULL:04/09/07 01:36 ID:XZ/CGetQ
カラム名に( )は使えませんか?
使いかたを知っている方お願いしますm<_ _)m
599NAME IS NULL:04/09/07 05:45 ID:???
CREATE TABLE test([(w] text)

試したら出来たけど、Accessって恐ろしいな
600NAME IS NULL:04/09/07 11:45 ID:WU8jHQSW
テーブルからテーブルにコピーする時、エラーの起きるものを無視してコピーするにはどうしたら良いですか?
例えばこんな感じで数値に変換できないレコードを無視したい。
insert into gaiku select to_number(gaikuno,'99990') from gaiku_tmp;
もっと複雑な物なので、除外するのが面倒なんです。
601NAME IS NULL:04/09/07 15:58 ID:???
低レベルな質問でごめんなさい
何かどっかで読んだようなきいたような話なんですけど

WHERE (条件A OR 条件B) AND (条件C OR 条件D)

みたいな場合、カッコでくくったことによる優先順位って、ちゃんとつけてくれるんですか。
それともカッコなんか無視されて

WHERE 条件A OR (条件B AND 条件C) OR 条件D

みたいな解釈をされちゃう可能性があるんですか。
ちらっと実験してみたところ、カッコによる優先順位はちゃんとつけてくれるように見えるんですけど。

心配なので確認したいなと。
602NAME IS NULL:04/09/07 16:36 ID:???
無視されたら括弧付けてる意味無いだろ。
そうは思わないか?
603601: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 とかになったらもうやってられないなと思いまして。

いや、大丈夫ならいいんです。
お騒がせしてごめんなさい
604598:04/09/07 18:16 ID:cJghFX6x
全角文字の()を使うことでできました。。。
605NAME 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 とはしたくありません。

この場合、方法はあるのでしょうか?
よろしくお願いします。

606NAME IS NULL:04/09/07 19:16 ID:???
>603
それを確認するために、ちゃんと単体テストをやってスキーリしなされ。
つーか普通するだろ?
607NAME IS NULL:04/09/07 20:30 ID:???
>>605
どうしてもと言われればテンポラリテーブル作るかも。
608NAME IS NULL:04/09/07 20:35 ID:gSoaBm+0
経験が豊富な方に質問ですが、
カラム名に日本語を使用するのは邪道でしょうか?

カラム名に日本語を使用するメリット、デメリットを教えて下さい。
お願いしますm(_ _)m
609NAME IS NULL:04/09/07 20:49 ID:???
>>608
・プログラムやSQLを書く時にいちいちIMEを操作するのはウザイ。
・全角、半角を間違えたり、"へ"や"ぺ"を平仮名と片仮名間違えたり
すると泣ける。
610NAME 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

またパフォーマンスに大きな違いがあるのでしょうか?
611605:04/09/07 21:38 ID:JHskel+H
>>607
SQL1本では・・・できないものでしょうか(汗
なにせ項目が多いものでテンポラリ作ってInsertするとメモリが・・・

すみません
612NAME IS NULL:04/09/07 21:50 ID:???
できない
613NAME IS NULL:04/09/07 21:58 ID:???
>>605
RULEを定義すれば出来るんじゃないか。
614NAME IS NULL:04/09/07 21:59 ID:???
>>610
効率以前にそんなSQLあんのか?どんなRDBMS?
615NAME IS NULL:04/09/08 01:06 ID:???
>608
基本的に列名には名詞や固有名詞を使う頻度が多くなるから
漢字のみで構成される機会がおおいですよね。

で、漢字の場合はある程度の略称で記述してあっても
わかりやすいです。ヘタな英単語で表記するなら、漢字か、
ローマ字読みで。

別にNAME如きにNAMAEまでするのはどうかと思いますが、
出資法上限利率とか利息制限法上限利率とか
完済時戻し利息とかを
無理やり英単語にされると混乱するので。それならいっそ、
"A"とか"B"とかにして、定義付けしてもらった方がよっぽどマシ。

まぁ、メリットデメリットあるでしょうから、好みに合う方を
使えばよろしいのでは?
616NAME IS NULL:04/09/08 02:17 ID:???
>614

まぁまぁ、そうカッカなさらずに。
文法間違いは脳内オプティマイザで処理してあげましょうや。

>610

1番と2番は結果は同じですが、
3番目は違います(外部結合。あと文法に誤りがありますよ)
まず、そこは理解していますか?

で、1番と2番のパフォーマンスの違いですが、そもそも
2番の省略形が1番です(どちらも交差結合を経て等結合)
RDBMSによっては、両者を明確に違うものとして考えて処理する
やつがおるかも知れませんが、まぁ、一緒でしょう。
なので、パフォーマンスは一緒のはずです。
気になるなら使用しているRDBMSの実行計画を確認してください。
617616:04/09/08 02:29 ID:???
>610

616に書き込んだ後で気づきましたが
ひょっとしてLeft JoinではなくInner Joinを書きたかったの?

618NAME IS NULL:04/09/08 14:39 ID:???
>605
insert into TABLEA ( ID, ... )
select 2, ... from TABLEA where ID=1
じゃあ駄目って理由がよくわからん。
... の部分がとっても多くて面倒ってこと?

常に ID に下駄を履かせてよく、かつ履かせた下駄に重複する ID はもともと存在しない、なら、
insert into TABLEA
select ID+1, ... from TABLEA
とかでいけそうだが。
619NAME IS NULL:04/09/08 15:07 ID:???
>>616
> で、1番と2番のパフォーマンスの違いですが、そもそも
> 2番の省略形が1番です(どちらも交差結合を経て等結合)

文法的にはそうだけど、実際には交差結合を行わずに等結合でしょ。
3番目がINNER JOINの書き間違いなら3つとも実行効率は同じで、
違うとしたらパーサに掛かる時間ぐらいなものかな。
測定しても誤差程度でしか差は無いだろうけど。

SQLの書き方によって効率(速度)が変わる例も確かにあるが、
相関サブクエリでループしているときとかで、単純な結合なら
オプチマイザが結合順序とその結合方法を判断してくれますよ。
620608:04/09/09 19:44 ID:nx8af/Rc
>>609
>>615

回答ありがとうございます。。。
今後の参考にさせてもらいます。。。
621NAME IS NULL:04/09/10 00:55 ID:ULGRyzE5
SQLServer2000でトランザクション処理をしています。
そのトランザクション処理の中にはInsert文やUpdate文が数十個書いてあります。
BEGIN TRANSACTIONでトランザクション処理を開始しているのですが、
同時に数十人がアクセスしたときにデッドロックがおこってしまいます。
BEGIN TRANSACTIONをしていたら、一人の人がその中に入ると、
他の人は待ち状態にならないのでしょうか?
622NAME IS NULL:04/09/10 01:27 ID:???
621です。
待ち状態があまりにも長いとデッドロックになったりするものなんですか?
623NAME IS NULL:04/09/10 01:41 ID:???
>>622
時間切れ投了となります。
624NAME IS NULL:04/09/10 01:51 ID:???
>>623

待ち時間が長すぎて、SQLサーバがデッドロックと間違えたということはありえるんですかね?

625NAME IS NULL:04/09/10 20:05:34 ID:B+rMfOQH
ストアドの変数として、配列を定義したいのですが
可能でしょうか?

例)VB
Redim str(0 TO 100) As String 

??
626NAME IS NULL:04/09/10 23:01:09 ID:???
それぐらい検索しろや!
627NAME IS NULL:04/09/11 09:53:42 ID:???
検索したけど見つかりません。
628NAME IS NULL:04/09/11 14:13:51 ID:???
マニュアルを見よう
629NAME IS NULL:04/09/11 14:19:20 ID:???
DBの種類ぐらい書けや
630NAME IS NULL:04/09/11 15:17:50 ID:???
> BEGIN TRANSACTIONをしていたら、一人の人がその中に入ると、
> 他の人は待ち状態にならないのでしょうか?

なりません。待たせても構わない(並列度が低くても良い)のであれば、begin transaction の直後に、
そのトランザクション内で使用するすべてのテーブルに排他ロックをかければいいです。

select top 0 '' from TABLE_A (XLOCK), TABLE_B (XLOCK), TABLE_C (XLOCK) ...

このようにすれば、他の人は待ち状態になりデッドロックは発生しません。
631NAME IS NULL:04/09/12 01:37:17 ID:Nc5WKefO
>>630
トランザクションの意味ないんじゃ・・・。テーブルをトランザクション中にさわられたら。
一つにストアドで20個ほどのテーブルを更新する時ってみんなどうしてるんですか?
全てのテーブルにロックをかけてるの?かけないとデッドロックなんてすぐに起こるんじゃ?
632NAME IS NULL:04/09/12 05:11:07 ID:???
>>631 なんかトランザクションの意味を勘違いしていないか?
トランザクションの目的は排他ではなく原子性だよ?

実際には並列度が極端に落ちるのを嫌って、適切なロック粒度・ロック順というのを考えるんだけど。

> そのトランザクション処理の中にはInsert文やUpdate文が数十個書いてあります。

これだけの情報じゃどうしようもないな。SERIALIZABLE分離レベルで完全排他しとけば
とりあえずデッドロックは起こらない、としか言いようがない。
633NAME IS NULL:04/09/12 10:22:29 ID:???
>>632
なるほど。トランザクション処理は何人かで重なると待ちが入るとばかり思ってました。
だから、デッドロックなど起こるわけ無いのにと悩んでいました。
今、1つのストアドで数十個、中で同じテーブルを何度もInsertかけたり
してややこしいのでロック順とか考えるのは大変そうです。
一度、SERIALIZABLEでロックして試してみます。
634NAME IS NULL:04/09/12 15:50:03 ID:???
>>633
参考になるかどうわからんけど
http://www.atmarkit.co.jp/fnetwork/rensai/sql28/sql1.html
635NAME IS NULL:04/09/12 17:52:04 ID:???
SQL serverで
select SUM(price),name
from customer
group by name
とし、その結果を順位付けしてやりたいのです。
サブクエリでは集計関数が使えず、RANKもROW_NUMBERも
つかえないので困っています。よろしくお願いします。
636NAME IS NULL:04/09/12 19:08:27 ID:???
>>635
SQL Serverは使ったこと無いけど、サブクエリで集計関数が使えないってのは本当か?
なんかの間違いじゃないのか?
637635:04/09/12 19:21:03 ID:???
>>636
うーん間違いですかね。環境が手元にないのでエラーメッセージがうろ覚えなんですが、
'サブクエリ内ではHAVINGなどの句を使えません'みたいなエラーが出たんです。
ちなみに集計関数が使えたらどうされますか。
638NAME IS NULL:04/09/12 19:45:54 ID:???
>>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;

こんな感じかな。不等号の向きは昇順なのか降順なのかわからんので、反対かもしれんが。
確認してないので間違ってたらスマソ。
639NAME IS NULL:04/09/12 20:22:37 ID:???
すみません。質問です。
MDBって複数項目を問い合わせデータでUpdateすることってできないんですか?

--
ex.
update hoge1Mst set
(Koumoku1, Koumoku2) = (select Koumoku1, Koumoku2 from hoge2Mst)
where Koumoku3 = '001';
--
640NAME IS NULL:04/09/12 20:59:57 ID:???
>>634 なんじゃこりゃ? 最悪な連載だなあ。

「SERIALIZABLEトランザクション分離レベルは一番分離レベルが高いトランザクションタイプで、
 ほかの同じオブジェクトを利用するトランザクションが並行して実行されるのを防止します。」
なんて平然と間違ったこと書いてるな。こういうので、>>621 みたいに勘違いする被害者が出るわけか。

ロック互換性の表も BooksOnline の間違いがそのまま載っているし…。
641NAME IS NULL:04/09/12 21:55:52 ID:???
>>640
何が間違ってるんですか?
642635:04/09/13 08:41:36 ID:???
>>638
おそレスですがありがとうございます。
643NAME IS NULL:04/09/13 17:30:47 ID:???
>>600
もう解決済みかもしれんけど、LIKE演算子で値が0〜9だけで構成されてる奴を拾ってINSERTするとか。
かなり重くなりそうだが。
644NAME IS NULL:04/09/14 20:22:48 ID:Ilhknr43
Oracle9iでUPDATE文を10個連続で実行するpl/sqlプログラムを作りました。

UPDATE対象のテーブルを未作成で、エラーとなるように実行したとき、
SQL*PLUSにエラーメッセージが20行程度出力されたあと、
改行が無限に出力され、操作できなくなります。
(ほっておくとずっと改行されます)

同じUPDATE文を、ただのSQLスクリプトとして作成した場合は、それぞれ
エラーメッセージが正しく返ってくるのですが。
エラーメッセージのバッファかなにかがあふれているのでしょうか?

対処法をご存じの方いらっしゃらないでしょうか。
645NAME IS NULL:04/09/22 13:59:41 ID:???
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;

とやったのですが、文法エラーになりました。
646NAME IS NULL:04/09/22 14:46:32 ID:???
あらー
647NAME IS NULL:04/09/22 16:50:53 ID:puHGPQqJ
SYBASE Adaptive Server on Solarisを使っています。
Select文で出力するRowの数を指定するにはどうしたらいいのでしょうか?

超初心者質問ですいません。
648NAME IS NULL:04/09/22 21:37:09 ID:???
>>645
updateしたいレコードのID値を一度Selectで取ってきてから
updateするときにそのIDを指定する。
MySQLがサブクエリ使用可能なバージョンならサブクエリで書いてもいい
649NAME IS NULL:04/09/23 00:28:53 ID:???
>645
 その構文使えるの、MySQL 4.0 以降じゃなかったっけ。
 MySQL のバージョンは?
650NAME IS NULL:04/09/23 13:50:26 ID:xu7mwazl
javaプログラムでJDBCによるデータベースへのアクセスでデータベースの
中の数値ってプログラム上の変数に設定とか参照とかするにはどうすれば
いいのでしょうか。
a=データベースの値
みたいプルグラムを組みたいんですけど。
SELECT文で戻り値とかとれるのかな?
ご教授よろしくお願いいたします。

651NAME IS NULL:04/09/23 21:35:16 ID:???
ResultSet
652NAME IS NULL:04/10/04 13:16:32 ID:???
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テーブルの項目が無い場合もユーザリストを取得するにはどうすればいいのでしょうか?
653NAME IS NULL:04/10/04 17:13:41 ID:???
>>652
MySQLで使えるかどうか判りませんが、

SELECT * FROM uesr_list WHERE NOT EXISTS
(SELECT * FROM vote WHERE ユーザ通し番号=1 AND uesr_list.ユーザ通し番号=指名先ユーザ番号);
654652:04/10/04 17:41:24 ID:???
WHERE の後にNOT EXISTSはダメみたいです|´・ω・)
655NAME IS NULL:04/10/04 17:46:47 ID:???
MySQL厳しいな……
656NAME IS NULL:04/10/04 18:14:52 ID:???
WHERE 以外のどこにEXISTSを使うんだぁ。



ン? HAVING...
657NAME IS NULL:04/10/07 15:12:39 ID:???
上のやり取りを見て思ったんですが、皆さん実装のときにSQL構文は大文字で書いてます?
それとも小文字?
どうでもいいような事ですが結構大文字小文字は他人のソース見るときに気になりますよね・・・。
私は小文字ですけど大文字の方が多いのかなぁ。
658NAME IS NULL:04/10/07 15:55:02 ID:???
>>657
「プログラマのためのSQL」も含め、手元にあるDB本は
予約語(SELECT WHERE BEGIN INTEGER ....)や標準関数(MAX SUM COUNT)等は
大文字で、テーブル名やカラム名は小文字になっているので、俺もそうしている。

「プログラマのためのSQL」の場合、テーブル名の頭文字は大文字。

SELECT T1.column1,SUM(column2) FROM Table AS T1 GROUP BY column1;
こんな感じです。
659NAME IS NULL:04/10/07 17:50:35 ID:???
>>657
小文字の方が都合の良い事が多い。
印刷物が大文字なのはただの例。
660NAME IS NULL:04/10/07 20:52:21 ID:???
小文字の方が見やすいし好きなので、小文字。
ただし今のプロジェクトの規約では全て大文字…わかりづれえ
661NAME IS NULL:04/10/08 06:31:06 ID:???
not exists使えるみたいですよ
別にnot in でもいいかと

プログラムやってる人は小文字のが都合がいいでしょうね
662NAME IS NULL:04/10/08 08:57:16 ID:???
コボラ以外な
663NAME IS NULL:04/10/08 13:50:08 ID:???
>>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スレの方がいいのかな・・・
664NAME IS NULL:04/10/10 18:02:37 ID:tjm3ZlIx
SQL初心者です。
SQLでローカルのファイル(d:\temp\test)をDBに書く方法を教えてください。

DBは MS SQL Server2000、接続はODBCです。
書き込み先は image型を設定しました。
ローカルのファイルはバイナリだったり、テキストだったり不定です。
ファイルサイズは1MB程度で、最大値の制限等はとりあえず考慮不要です。
665NAME IS NULL:04/10/12 00:20:53 ID:RyKiJxet
>>664
ODBCでできるかは知りませんが、ADOならできます。
次のURLのSample2が参考になると思います。
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q258038
666NAME IS NULL:04/10/12 02:33:59 ID:???
あのSQLって、
667NAME 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で無理なのはわかります。。)

レコードが順番通りに取得できれば
結果はどんな形でも問題ないです。

よろしくお願いします。
668NAME IS NULL:04/10/14 16:19:08 ID:???
>>667
SELECT id,name,NULL,timestamp FROM Table1 UNION SELECT id,name1,name2,timestamp FROM Table2 ORDER BY timestamp DESC;
669NAME IS NULL:04/10/14 16:20:35 ID:???
>>668
UNION じゃなくて、 UNION ALL の方がよかったかも。
670NAME IS NULL:04/10/14 16:23:37 ID:???
SELECT id,name AS name1,null AS name2,timestamp FROM テーブル1
UNION (SELECT * FROM テーブル2)
ORDER BY timestamp DESC
671667:04/10/14 17:18:33 ID:???
>>668,669,670

ありがとうございます!
予期した結果が得られました。

一文で行くことに驚きです。
もっと勉強します…。
672NAME IS NULL:04/10/14 21:47:11 ID:IzZvBEH7
初心者です。

mysql+vb+MyODBC
の環境ですが、
住所録を作ってみると、
漢数字"十"だけが見事に文字化けしています。
文字はsjisに設定しています。
対処方法がお分かりになる方がいましたら、ご教示いただけませんでしょうか?
よろしくお願いいたします。
673NAME IS NULL:04/10/14 21:58:13 ID:???
674NAME IS NULL:04/10/14 21:58:24 ID:???
675NAME IS NULL:04/10/14 22:05:40 ID:IzZvBEH7
>>673,674

早速のご回答、
どうもありがとうございました。

何とかがんばってみます。
676NAME IS NULL:04/10/15 01:36:18 ID:kuiDTThn
オラクルのストアドで質問なんですが、
ある変数を渡すとします。
その変数の値によって、ORDER BY句に指定する項目を変えたいのです。
SQLServerの場合は動的に場合わけをして、最後にExecuteをしていました。
オラクルではどうするのですか?
677NAME IS NULL:04/10/15 01:53:45 ID:???
好きにすればいいじゃん。
PL/SQLはプログラミング言語なんだから分岐くらい好きなだけ書け。
678NAME IS NULL:04/10/15 05:52:18 ID:???
やっぱり日本語はEUCが無難かな
679NAME IS NULL:04/10/16 00:32:52 ID:???
今日からpostgesqlを使い始めたのですが
dbの中にどんなテーブルがあるか調べる方法はあるのでしょうか?

自分で作ったものなら、構成が分かっているので
SQL書けますが、他人が作ったdbで仕様書も何も無い場合
どうすればいいのかと。

680NAME IS NULL:04/10/16 00:54:20 ID:???
select * from pg_tables
681NAME IS NULL:04/10/16 00:59:49 ID:???
>680
おお、見られました。
どうもです
682NAME IS NULL:04/10/16 02:07:08 ID:???
\d
683NAME IS NULL:04/10/16 18:14:42 ID:???
テーブルってどうやってつくるんでしょうか
684NAME IS NULL:04/10/16 18:14:52 ID:1kpG5WKg
 
685NAME IS NULL:04/10/16 20:43:00 ID:???
686NAME IS NULL:04/10/16 22:35:53 ID:iqfQyweG
GROUP BYを使うとSELECTで集計関数を使わないといけませんというのはよくある話です。
(例)SELECT 番号 from テーブル group by 日付   これは駄目。。。

その理由は分かるのですが、group by によってグループ化されたそれぞれのグループを構成するレコード
がなんなのかをスマートに知る方法で悩んでいます。
良い知恵ないすか?? 
687NAME 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

どうやら(+)というのが、オラクルの方言だという事はわかりました。
(+)がつくと指定カラムのデータが無くても可という意味の様ですが
これをポストグレスで実現する方法があるでしょうか?

よろしければ、ご教授ください。
ポストグレスで、同様の
688NAME IS NULL:04/10/16 23:08:25 ID:???
ポスト具レスはしらんけどANSIの基準にあわせると
LEFT OUTER JOIN とか使えば実現できるよ。
689NAME IS NULL:04/10/16 23:42:01 ID:dYJGDROU
>686

意味がワカラン。
690NAME IS NULL:04/10/17 00:58:55 ID:???
>>686
日付→番号のFDがあれば、SQL99ならエラー出ないよ。
691NAME IS NULL:04/10/17 02:25:15 ID:???
>>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;
692NAME IS NULL:04/10/17 13:16:17 ID:AJ0SRVDP
>>688-691
アドバイスありがとうございました!
まだSQLの経験が浅いため
「LEFT OUTER JOIN」や「RIGHT JOIN」の使い方からまだ、よくわかっていません。
これからの使い方から勉強してます。
ほんとに助かりました。
693692:04/10/17 21:53:01 ID:???
うわ、日本語かなり不自由ですね・・・
「これらの使い方から、勉強してみます。」
と、書いたつもりが・・・
694NAME IS NULL:04/10/19 10:13:49 ID:???
初歩的な質問かもしれませんが、

テーブル名が違うだけで
まったく同じ構造のテーブルA,Bがあるのですが、
AのレコードとBのレコードを比較して
不一致なレコードのみを表示するSQL教えてもらえませんか?
Oracle9iです。
695NAME IS NULL:04/10/19 10:54:14 ID:???
>>694
SELECT 片方.何か FROM 片方 WHERE NOT EXISTS
(SELECT もう片方.何か FROM もう片方 WHERE もう片方.何か = 片方.何か)
696694:04/10/19 11:12:30 ID:???
>>695

えっと表の列の項目が30個ぐらいあるのですが、
その方法だとやたらSQL文が長くなるのですが・・・・。
697NAME IS NULL:04/10/19 11:57:18 ID:???
そうですか
698NAME IS NULL:04/10/19 12:26:45 ID:???
候補キーで比較するのさ。
699694:04/10/19 14:01:50 ID:???
もっとエレガントな方法ください
テーブルA、Bがあって

select * where A != B

じゃあだめか・・・・・
700NAME IS NULL:04/10/19 14:19:08 ID:???
>>694
Oracleでつかえるかどうかしらんが、
SELECT * FROM TableA EXCEPT SELECT * FROM TableB;
701NAME IS NULL:04/10/19 15:01:58 ID:???
>>694
(select * from A minus select * from B) UNION ALL (select * from B minus select * from A);
702700:04/10/19 15:07:19 ID:???
間違えてた。
(SELECT * FROM TableA EXCEPT SELECT * FROM TableB) UNION ALL (SELECT * FROM TableB EXCEPT SELECT * FROM TableA);
703NAME IS NULL:04/10/20 00:15:45 ID:???
>694
 どのカラムが異なっても駄目、なんてレベルだったら、いっそバルクアウトしてテキストで
比較しろ。その方が速いと思うぞ。
704667: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

よろしくお願いします。。
705NAME IS NULL:04/10/20 19:13:23 ID:???
>>704
UNION してからWHEREする方がWHERE句が一つで済むかもしれないが、
個別の方が等速か高速だろう。だから、それでいいんじゃないかな。

それより、重複を許可もしくは重複が起こらない状態ならUNION ALLの
方が高速です。
706704: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

ではもちろんダメでした…
707NAME IS NULL:04/10/20 19:27:06 ID:???
>>706
一つで書いても最近の製品ならオプチマイザが判断して
個別に抽出してからUNION結合してくれると思うけどね。

略して書くけど、こんな感じ。
SELECT * FROM (SELECT * FROM A UNION ALL SELECT * FROM B) WHERE timestamp>='2004-02-01' ORDER BY timestamp DESC;
708704:04/10/20 19:50:16 ID:???
>>707

なるほど。。
いろいろと有難うございました!

プログラムでSQL生成しているので、
一つにまとめる方向で進めたいと思います。
709NAME 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 を取り出したいのですが、よくわかりません。

どなたか教えてください。

710NAME IS NULL:04/10/21 15:31:26 ID:???
id name date time
1|AA|20040804|1000

ってすれば簡単だよ?
711NAME IS NULL:04/10/21 15:35:01 ID:???
select id from table where created like '%10:00'

でもいいけど
712709:04/10/21 15:35:50 ID:jhDm5sXO
> 710
ごめんなさい。よく分からないです・・・

select id,name,min(created) from このテーブル group by id,name
ってやると望む結果が出ないので困っています・・・
713709: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が取得したいんですよ。
714NAME IS NULL:04/10/21 15:42:27 ID:???
WHERE to_char(created,'HH24:MI') = '00:10'
WHERE dateformat(created,'HH:MM') = '00:10'
WHERE format(created,'hh:m') = '00:10'
715709: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を取得したいです。
716709:04/10/21 15:50:57 ID:jhDm5sXO
ちなみに

SELECT name,min(created) FROM このテーブル GROUP BY name ORDER BY min;
これでnameと時間は取得できますが、ここにidを追加したときにできません。
717NAME IS NULL:04/10/21 15:51:56 ID:???
select id,name from table tablea
where tablea.created =
(select min(created) from table tableb where tableb.name = tablea.name)

出ででるかな?
718709:04/10/21 15:57:42 ID:jhDm5sXO
> 717
すみませんだめです・・・
719709: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);

みなさんありがとう。
720NAME IS NULL:04/10/21 16:05:19 ID:???
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
721709:04/10/21 16:26:43 ID:jhDm5sXO
> 720
ありがとうございます。explainしたらこっちの方が早かったのでこれを使います。
ありがとう。
722720:04/10/21 16:36:27 ID:???
719と720では、結果はたまたま同じだけどやろうとしていることは違うわけだが、いいのかな?

723709:04/10/21 16:39:39 ID:jhDm5sXO
> 720
えええ!せっかくできたと思ったら・・・
どう違うんですかね?
724720:04/10/21 17:06:29 ID:???
あれ、いいのかな?
725NAME IS NULL:04/10/21 17:39:56 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
726NAME IS NULL:04/10/21 17:52:22 ID:???
>>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;
727725:04/10/21 17:56:01 ID:???
>>726
ありがとん。動いたーーー!!ヽ(゜▽、゜)ノ
728NAME IS NULL:04/10/21 18:04:43 ID:???
SELECT date,(SELECT SUM(tbl.count) FROM tbl WHERE date <= A.date) AS count_sum FROM tbl as A
729725: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営業日とカウントするとかあった場合(今回は無いけど)や、
半日を考慮に入れる場合なんかも対応できそうだよ。

マジでありがとん。
730NAME IS NULL:04/10/22 20:11:49 ID:???
すみません。初心者ですが、質問させてください。
フロントエンドをAccessで作ってADOで接続し、DBはMSDEを使っています。
ある検索条件で持ってきたレコードセットを一発か二発程度でカンマ区切りの
テキストファイルに出力する方法はないでしょうか?
以前はSELECT * INTOをcn.Executeでテーブルを作成して、それを作成した
テーブルをDocmd.TransferTextで出力していたのですが、ソースを改善したら
オブジェクト''オブジェクトテーブル名が見えません''が見えません
というエラーが出てしまいます。
どなたか検索した結果をコマンド等で出力する方法を御教授ください。
731NAME IS NULL:04/10/22 20:48:43 ID:???
DTSもしくはBCPでドゾー
732NAME IS NULL:04/10/22 22:10:23 ID:???
>>731
やっぱりDTSかBCPですか。。。。了解しました。
サンクスです。
733NAME 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です。よろしくお願いいたします。
734NAME IS NULL:04/10/25 17:00:59 ID:???
ループ
735NAME IS NULL:04/10/25 17:07:16 ID:???
>733
不勉強で申し訳ありませんが、Loopでテーブルを結合するということですか?
それともT-SQLを使用するということでしょうか?
ヘルプを引いてみたのですが、いまいちピンとくる項目に該当しません。
736NAME IS NULL:04/10/25 17:11:23 ID:???
言葉足らずでもうしわけなかったのですが、ストアドプロシージャという選択は
ナシの方向でお願いいたします…
737NAME IS NULL:04/10/25 17:16:51 ID:???
んじゃあ、「一時テーブルでは無い」テーブルに1から必要な数字まで並べておけ

それ以前に、そんなものが何のために必要なのかわからんが。
738NAME IS NULL:04/10/25 17:19:42 ID:???
>737
ActiveReportにデータを渡すのに、
社内の標準の都合でSELECT文にて渡さなくてはいけないので…

やはりテーブルを作るしか手がありませんでしょうか。
739NAME IS NULL:04/10/25 18:08:18 ID:???
初心者ですが2つ質問させてください
1:MySQLの文字コードを確認したい
2:デフォルトの文字コードを変えたい
よろしくおねがいします。
740NAME IS NULL:04/10/25 19:35:08 ID:???
>>739
スレ違い
ヒント mysqladmin

741NAME IS NULL:04/10/25 19:40:02 ID:???
質問ではありませんね。
1:確認すればいいでしょう。
2:変えればいいでしょう。
742NAME IS NULL:04/10/25 20:01:11 ID:???
じゃあ、Oracleのデフォルトの文字コードを変えるやりかたを…
と思ったけど、SQLじゃないからスレ違いだ。
743NAME IS NULL:04/10/26 01:10:11 ID:???
>>733-738
要件がよくわからんのだが
between 1 and 10 で済むような話ではないの?
744NAME IS NULL:04/10/26 02:26:27 ID:???
すんませんが、教えてください。

SQL文ってDML、DDL、DCLとか分類されるじゃないですか。で、
SELECT文なんですが、これってDML文に含まれるんですか?

なんか、文献によって入るのと入らないのがあるんですが、
正確な定義としてはどうなんでしょう?
745NAME IS NULL:04/10/26 02:49:12 ID:???
それらの略語の意味を考えれ
746NAME IS NULL:04/10/26 14:01:43 ID:???
>>745
DML= Data Manipulation Language
DDL= Data Definition Language
DCL= Data Control Language
でつ。
747NAME IS NULL:04/10/26 14:04:02 ID:???
「教えれ」じゃなくて「考えれ」だが
748NAME IS NULL:04/10/26 15:39:17 ID:???
>>733
どうしてもというなら
select 1
union
select 2
...

SQLServer2000でできるかは知らないけど。
749NAME IS NULL:04/10/26 16:01:29 ID:???
>>744
ボラクルだけは、入らない。
一般的には(その他のDBMSでは)DMLに含まれる。
750NAME IS NULL:04/10/26 16:24:37 ID:???
>748
それ、やってみましたが、0〜999とかやると重くて… OTL
他のアプローチ(VBのコード、ActiveReport等)で出来ないか少し考えてみます。
751NAME IS NULL:04/10/26 16:30:59 ID:???
ActiveReportでできる
752NAME IS NULL:04/10/26 17:21:32 ID:???
Oracle9iで
PL/SQLで質問です。

いまAKKOというテーブルがあります。

このAKKOというテーブルのコピー
を毎日2時にAKKOn(n=1〜10、nはサイクリックにする:10を超えると1にもどす)
という名前のテーブルを作成したいのです。

この要件を満たすPL/SQLを教えてください。
PL/SQLについて詳しく解説しているサイトが無くて・・・
753NAME IS NULL:04/10/26 17:28:16 ID:???
>>744
動きに関係ないし、実務で特に使い分けたりもしないので、気にするな。
試験を受ける気でいるのなら、その試験を受けるDBの説明書読め。
754NAME IS NULL:04/10/26 17:29:39 ID:???
単にOracleはSELECT INTOが使えないからDMLじゃないってだけでHA?
755NAME IS NULL:04/10/26 22:08:19 ID:+RDPVwiR
大文字小文字を同一視して検索したい場合はどうしますか?

select * from emp upcase(name)=upcase('HOGE');

とかやったらインデックス使えないし。なんか常套手段ってないスか?
756NAME IS NULL:04/10/27 00:01:02 ID:???
>>755
検索方法はそれでいいと思うけど、インデックスを使いたいなら
関数インデックスを作る。
757新人ちゃん:04/10/27 01:27:47 ID:???
>>756
7ヘー
758NAME 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;
759NAME IS NULL:04/10/27 02:41:47 ID:4CD+cdaI
int型の列、Pがあったとして、中に100が入っています。
ここで、updateコマンドで、5を足したいのですが可能でしょうか?

SUM()を使えば出来そうな気がするのですが、マニュアル読むかぎり
列どうしでないと出来ないっぽいのですが、出来る方法ありましたら
是非、ご伝授頂きたいと思います。宜しくお願い致します。
760NAME IS NULL:04/10/27 02:52:12 ID:???
update table set
P = P + 5
761NAME IS NULL:04/10/27 02:54:04 ID:???
列がPってだけしか示されないとやりづらい・・・

UPDATE テーブル名 SET P=P+5 WHERE 何とかかんとか=ほにゃらら とかすればいいのでは・・・
762761:04/10/27 02:54:26 ID:???
ああ、書いているうちに終わってたw
763759:04/10/27 03:00:58 ID:???
>>760-761
なるほど!SUM()とか使わなくとも出来たんですね。ありがとうございました!
今、ご飯食べてるので、終わったら試してみます!
764NAME 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でいう形です。
765NAME IS NULL:04/10/27 20:42:50 ID:???
お忙しいところ、すみませんが質問をさして頂きます。
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として返ってくるようにしたいのですが。
どなたか愚者に知恵をお貸しください。
お昼からずっと悩んでおります。
766NAME IS NULL:04/10/27 20:43:23 ID:???
とりあえず、方法としまして
テーブル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

どうか宜しくお願いします。
767NAME IS NULL:04/10/27 21:13:04 ID:???
すいません、取得したい結果は

部門コード  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の値が間違えておりました。
768NAME IS NULL:04/10/27 21:56:56 ID:???
>>764
SELECT dstamp-CURRENT_DATE FROM m_d;
769NAME IS NULL:04/10/27 22:20:24 ID:vcMuSB+s
OLACLE(8i)で数値の3桁区切る方法は色々あると思うのですが、
最も一般的と思われる方法をを教えて頂けませんでしょうか。
770764:04/10/27 22:24:20 ID:4CD+cdaI
>>768
ありがとうございました。これで出来るんですね。。。知らなかった。。。
とても勉強になりました。

select dayofyear(dstamp - current_date) from m_d;
なんて、トンチンカンなSQL書いてしまって、エラー出て悩みまくっていました。
本当にありがとうございました。
771770: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

また、何か見落としているんでしょうか。。。
772770:04/10/27 23:11:00 ID:???
たびたびすいません。MySQLですが、下記のSQLで無事日数を取ること
が出来ました。どうもお手数お掛け致しました。

select to_days(dstamp) - to_days(current_date) from m_d;
773NAME 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!を登録したいのですが…
774NAME IS NULL:04/11/01 13:02:34 ID:???
>>773
DBによってそれぞれエスケープさせる文字があると思うが、
多くの場合は\で可能かな?
INSERT INTO SAMPLE (ID, WORD) VALUES (1, 'Let\'s GO!');
775773:04/11/01 16:56:09 ID:???
>>774
ありがとうございました。DBによって違いがあるのですね。
776NAME IS NULL:04/11/01 20:11:42 ID:???
>>773
シングルクォートを二つ並べる処理系もある
INSERT INTO SAMPLE (ID, WORD) VALUES (1, 'Let''s GO!');
777NAME IS NULL:04/11/01 20:13:17 ID:???
どんな処理系?
778NAME IS NULL:04/11/01 20:50:27 ID:???
Oracleだろ。
779NAME IS NULL:04/11/01 21:25:45 ID:???
高いだけあってエスケープも独自仕様なんですね( ´_ゝ`)
780NAME IS NULL:04/11/01 21:42:42 ID:???
失礼だな、Oracleが標準なんだよ
781NAME IS NULL:04/11/01 21:42:55 ID:???
シングルクォート二つが普通。マイナーなのは\'の方。
782NAME IS NULL:04/11/01 21:46:16 ID:???
PostgreSQLもシングルクォートで可能なんですけど、
シングルクォートの方が標準なのか。へぇ〜
783NAME IS NULL:04/11/01 21:51:37 ID:???
SQL ServerもDB2もシングルクォート二つでしょ?
784NAME IS NULL:04/11/01 22:20:49 ID:???
そうだよなぁ、Oracleが標準だよなぁ
(+)とかな(w
785NAME IS NULL:04/11/01 22:22:01 ID:???
>>783
どっちでもいい。
多分、Oracle互換のためにクオートも実装してるんではないかと。
786NAME IS NULL:04/11/01 22:42:36 ID:???
>>784
それ激しく便利なんだよな
left joinとか書くよりも直感的でわかりやすいと思うんだよ
787NAME 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」)
788NAME 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です
789NAME IS NULL:04/11/02 12:44:58 ID:Y8T1Y7g6
検索ページで次の50件とするときに、最初の50件は
TOP関数でやってるんですが次の50件はどうやってますか?
(SQLServer2000)
790NAME IS NULL:04/11/02 12:52:17 ID:???
>>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票。
つか、実行して計測すればわかるんじゃないの?
791789:04/11/02 16:47:24 ID:???
SQLで10000件の内300行から310行だけ取り出すやりかたりますか?
792NAME IS NULL:04/11/02 16:56:19 ID:???
よし、やり語ろう。
793NAME IS NULL:04/11/02 17:01:27 ID:???
SQL鯖使っていないんで知らんのだけど、
OFFSETとLIMITってないのか?
標準的にはカーソルを使う。
794789:04/11/02 17:07:00 ID:???
>>793
さんくす!調べて見ます->OFFSETとLIMIT
>標準的にはカーソルを使う。
カーソルということは、ADOだったらレコードセットをぐるぐるまわす
ということですか?
795NAME IS NULL:04/11/02 17:29:26 ID:???
>>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は無かったような・・・
796NAME IS NULL:04/11/02 17:38:15 ID:???
Enterprise Manager 絡みの質問はここでいいんだろうか?
スレ・板違いだったらスマソ。
797789:04/11/02 17:54:04 ID:???
>>795
レスさんくす!
>SQLサーバにはOFFSET,LIMITは無かったような・
調べた結果ありませんでした
提示のSQL理解してみます
798NAME IS NULL:04/11/02 23:11:57 ID:???
>>796
ここでもOKだと思うけど、MSSQLスレのほうがいいかも。

MS SQL Server 総合スレ2
http://pc5.2ch.net/test/read.cgi/db/1093012583/
799NAME IS NULL:04/11/03 00:42:32 ID:gKJQUjH3
データベースのプロの方、いますか?
800NAME IS NULL:04/11/03 00:57:28 ID:gKJQUjH3
801NAME IS NULL:04/11/03 02:27:45 ID:y6dEl/yN
>>800
ネットワークのプロ募集ちゃうんか?
802NAME IS NULL:04/11/03 12:25:00 ID:???
>>801
神が沢山降臨希望のようですので、現在間に合う状況になりそうです。
本体の方も止めてください。本当にありがとうございました。
また必要情報などがありましたらオフィシャルWebサイトにアップしますのでご支援よろしくお願いします。
-- まさたか@川口? 2004-11-03 (水) 10:06:32 New!
803NAME IS NULL:04/11/03 21:59:07 ID:???
質問です。

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を使用しています。
どうか宜しくお願いします。
804NAME IS NULL:04/11/03 22:00:09 ID:???
すみません。訂正です。

table B
3,B
4,B
5,B

でした。
805NAME IS NULL:04/11/04 00:40:43 ID:???
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
806NAME IS NULL:04/11/04 00:41:17 ID:???
>>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で動くかどうかは知らん。
807806: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;
808NAME IS NULL:04/11/04 02:17:50 ID:???
>>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;
テストテーブルでは軽すぎて速度は測定出来ませんでしたが、本データベースで試して見て速度が速い方を使うことにします。
809806:04/11/04 05:12:59 ID:???
>>808
俺が書いたSQLはターゲットリストのサブクエリが1行のみ返す状態でないとエラーが発生するので、
貴方が書いたSQLの方が安全かも。

各テーブルにおいてidがUNIQUEであり、インデックスが張られていてインデックス検索が有用なら、
俺が書いた方が高速だと思う。処理系や他の条件によっては変わるだろうけど。
810806:04/11/04 06:28:10 ID:???
似たようなテーブルがあったのでちょっと試してみたら、
808の方が速かった。
そんなことより、FULL JOIN が使えるのなら、
SELECT * FROM Table_a FULL JOIN Table_b USING(id);
で済むし、一番速そうなんだけどw
811796:04/11/04 09:33:05 ID:???
>>796
遅レスだがサンクス。
812796:04/11/04 09:34:07 ID:???
って違う、>>798
_| ̄|○ 朝っぱらからアンカーミスかよ
813NAME 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));

こんな感じでいろいろ試してみました
814806:04/11/05 20:45:05 ID:???
>>813
SELECT EXTRACT(HOUR FROM make_date) FROM Table;
815NAME IS NULL:04/11/05 20:45:57 ID:???
名前欄にレス番が入ったままだった orz
816えせ壊人:04/11/05 22:03:57 ID:eQUK2KFn
>>813
extractと同等と説明されてるが
date_partだと>>813の構文でも上手くいったと思う

今 確認できる環境がないけど試してみ
817NAME IS NULL:04/11/06 00:33:23 ID:???
>>816
ttp://www.postgresql.jp/document/pg721doc/user/functions-datetime.html
'EXTRACT'は'DATE_PART'と同じ
EXTRACTで無理な事はDATE_PARTでも無理
818NAME IS NULL:04/11/06 11:33:32 ID:???
>>817
じゃなくて、816さんは構文の違いを指摘してるんでしょ?
extract()とdate_part()は機能は同じだけど、カンマか"FROM"か
という違いがある、と。
あとあまり古いドキュメントのURLを貼らないでね。
819NAME IS NULL:04/11/07 01:50:37 ID:???
syozoku namae
001 鈴木
001     佐藤
002 山田
ってデータが入ってるとき
SQLで抽出すると
syozoku namae
001 鈴木
佐藤
002 山田
のように表示させたい場合ってどのようにしたらいいでしょうか?
DBはOracle9iです。お願いします。
820NAME IS NULL:04/11/07 02:34:23 ID:???
821NAME IS NULL:04/11/07 02:38:34 ID:???
>>819
副言語でそのまま取り出して、主言語で加工。
822NAME IS NULL:04/11/07 04:38:18 ID:???
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
823NAME IS NULL:04/11/07 18:06:43 ID:???
MSDEをGUIで操作できるツールってありませんか?
824NAME IS NULL:04/11/07 19:58:57 ID:???
825NAME IS NULL:04/11/07 22:06:58 ID:xiv90rCf
>>824
Italiano?
Portugese?
826NAME IS NULL:04/11/07 23:43:13 ID:???
827NAME IS NULL:04/11/09 15:51:14 ID:???
部門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でなんで希望の処理ができるのかいまいち理解出来ません。
確かに結果は同じように見えるんですが・・・

括弧内のような処理は多々あると思うんですが、そのときの定型的な処理方法があれば
教えていただけませんか?
828NAME IS NULL:04/11/09 19:57:21 ID:???
理解できないってのが、わからない。
書いてある通りで、同僚さんのSQLの方が意味をストレートに汲み取れる
と思うのだが。

どう書くかは、索引を意識したり、実行計画を意識したりってのが
未だ無理なら、他人に分かり易いように書けば?


でも、dup row になりそうな悪寒。
829NAME IS NULL:04/11/09 20:30:32 ID:PvmqmfFE
830NAME IS NULL:04/11/09 20:33:35 ID:???
>828
いや、もう定型だから後者のように書くけど、ぱっと見でどっちが咄嗟に理解
出来るかといえば前者な漏れ orz

でもこれってコスト的には前者の方が低くない?

>827
藻舞の同僚の方がSQL出来そうなんで、とりあえず同僚に聞け。
まずはそれからだ。聞く事を恥と考えるな。
831NAME IS NULL:04/11/09 21:50:12 ID:???
それがSQL的に何かといわれれば、scalar subquery
というものだと思います。
http://www.postgresql.jp/document/current/html/sql-expressions.html#SQL-SYNTAX-SCALAR-SUBQUERIES
で、FROM句に書く方はtable subquery。
832NAME IS NULL:04/11/09 22:29:22 ID:???
すみません。教えて下さい。
セミコロンが含まれる文字列を検索する場合、

SELECT * FROM テーブル名 WHERE フィールド名 like '%;%'

↑これでよいの?
どうも、全検索になってしまうんですが。
(Firebird1.5を使ってます)
833NAME IS NULL:04/11/10 00:06:07 ID:???
>>832
FB知らんが、セミコロンの前にエスケープ記号を入れたらいいんじゃね?
834832: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.だけが、うまくヒットしました。これで良いんですか?
835NAME 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'"
としてもだめでした。(「クエリの句が不完全です」)
836NAME IS NULL:04/11/10 15:35:19 ID:???
[GROUP]
837:04/11/10 15:48:35 ID:???
すみません。教えてください。
ある値より大きい値求めて、それを昇順で並べ替え、
その最初のデータと同じデータを求めるにはどうすればいいんですか。

838NAME IS NULL:04/11/10 15:53:42 ID:???
select * from tbl where data=(select min(data) from tbl where data>ある値)
839NAME IS NULL:04/11/10 16:18:28 ID:???
糞カキコですみません。

(1) DELETE FROM TABLE
(2) DELETE TABLE

SQL界の主流はどっちですか?
僕は(1)じゃないと落ち着かないんですが、先輩(♀)が(2)な人で対立してます。
840NAME IS NULL:04/11/10 16:32:46 ID:???
主流がどちらかなんてどうでもいい。
夜にとことん話し合え。
全裸で。
841835:04/11/10 16:36:02 ID:???
>>836
出来ました。ありがとうございます。精進します。
842U ◆CZtFsGiu0c :04/11/10 16:37:56 ID:???
>>839
ANSI準拠なら(1)ではないの? FROMって省略できたっけ?
843NAME IS NULL:04/11/10 16:42:39 ID:???
>840
SELECT * FROM 女 WHERE 年齢 BETWEEN 10 AND 15
844NAME IS NULL:04/11/10 16:47:11 ID:69SzujgL
>>843

必要な部分だけ取り出せよ。

SELECT オパーイ FROM 女 WHERE 年齢 BETWEEN 18 AND 25
845NAME IS NULL:04/11/10 16:52:39 ID:???
1行選択されました。
URL
--------------------------- ------------ ------
ttp://www.kiyosan.co.jp/php4/search_categ.php?id=105
846NAME IS NULL:04/11/10 16:55:40 ID:???
>>844
>>843の*はアナルだろ
847NAME IS NULL:04/11/11 04:41:54 ID:???
>>839
動けばいいだろ。
どっちでもいいよ。
そんなことでもめる暇あったら、もめてる分だけ速く納品しろ。
848NAME IS NULL:04/11/11 09:04:20 ID:???
では>>847宛の発注品は変数をa aa aaa aaaaとかで納品します
849NAME IS NULL:04/11/11 09:35:27 ID:???
>847 は脳内社会人?
納品なんて、期日よりも早くても遅くても駄目なのが普通なんですが?
850:04/11/11 10:33:44 ID:???
>>838
レスありがとうございます。
早速試してみたいと思います。
851NAME IS NULL:04/11/11 12:58:28 ID:???
>>847
納期よりも、FROMをきっかけに
どうやって、先輩を口説き落とすかが
問題だと思います。
852NAME IS NULL:04/11/11 13:07:12 ID:???
先輩の主張を認めるふりをして
先輩・・・実は僕・・・INSERTの仕方もわからないんですっ
853NAME IS NULL:04/11/11 13:35:32 ID:G1Y3gPo/
先輩・・・今晩、INSERTとJOINについて詳しく教えてください。

いいけど、ついでにUPDATEも教えてあげるわね。


#数ヵ月後に住民票のUPDATEイベント発生・・・
854NAME IS NULL:04/11/11 22:38:41 ID:???
お忙しいところ失礼します。
環境: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を使わない方法がありましたら
後学のために教えていただけましたら幸いです。
どなかたかどうかよろしくお願いします。
855NAME IS NULL:04/11/11 22:58:53 ID:???
856NAME IS NULL:04/11/11 23:09:43 ID:???
>>855
すいません、ログを見ずに質問してしまいました。
非常に助かりました、ありがとうございます。
857856: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 商品コード

でしょうか?
実行環境がないのでわからないのですが。
どなたかお教えください。
858NAME IS NULL:04/11/11 23:41:43 ID:???
>>857
FULL JOIN を使わない方法が知りたいのじゃなかったのか?
FULL JOINなら単純に
SELECT * FROM A FULL JOIN B USING(code);
で済むと思うが。

OUTER JOIN 系を一切使わないなら >>807
859NAME IS NULL:04/11/11 23:54:52 ID:???
LEFT JOINの結果とRIGHT JOINの結果をUNION (not ALL) で得るのじゃダメ?
860NAME IS NULL:04/11/12 07:57:33 ID:???
>>854
selet 商品コード, sum(金額A), sum(金額B) from (select 商品コード, 金額A, 0 as 金額B from 商品テーブルA union select 商品コード, 0, 金額B from 商品テーブルB) T group by 商品コード
とか言うのも思いついた。
861NAME IS NULL:04/11/12 17:57:04 ID:???
SQL重い
862NAME IS NULL:04/11/12 19:32:12 ID:???
>> 859 だめ。

Union (not All) だと Inner Join 部分が 2重になっちゃう。
863名無しさん:04/11/12 20:48:21 ID:???
>862
逆だろ

UNION ALL だと INNER JOIN で返るのと同じ行が重複するが、
ただの UNION (ALL を付けない UNION) なら重複部分は1行
しか返されない。

864NAME IS NULL:04/11/13 00:13:50 ID:???
FULL JOINを使う>>858の方法は
もし、
テーブルAが
商品テーブルA

商品コード 金額A
AAA   1000
AAA   150
BBB   900
DDD   2000

とかなら狂うね。
まあ、商品コードが重複するかしないかが
明記されていないので分からないが。

>>860のやり方が妥当だろうか。
ゼロの部分をNULLにして数値項目をTO_CHARしないと
駄目だろうけど。
865NAME IS NULL:04/11/14 00:47:07 ID:V5M6q6Hi
質問です。

DATE型の要素を表示する際に、
日付を表示しない方法を考えています。
具体的にはDATE型でフォーマットされているテーブルに、
2004-11という「西暦-月」のみを挿入し、
表示した際に日付を出さないということです。
ちなみに、データ出力時(SELECT文)に日付を出さないという条件をつけるのはダメです。
自分で考えてみた
TO_DATE('2004-11','YYYY-MM')
という文では、データ出力時に日付まで表示されてしまいます。
何か良い方法はありませんでしょうか。
866NAME IS NULL:04/11/14 01:09:08 ID:???
副言語で取得して、ホスト言語で加工汁
867NAME IS NULL:04/11/14 05:42:36 ID:gZNduTNd
>>865
日付はダミーで入れといて、
SELECT TO_CHAR(カラム名,'YYYY-MM') FROM テーブル名;
でどうですか?
868NAME IS NULL:04/11/14 06:02:16 ID:???
date_formatは駄目なの?
869NAME IS NULL:04/11/14 06:22:32 ID:XwWBrCKZ
MySQL だったら date_format()
それ以外だったら to_char()
870NAME IS NULL:04/11/14 12:03:02 ID:+I1IWcq/
金額を格納するフィールドには通常どのような型に設定すれば良いですか?
Firebirdなのですが。
871NAME IS NULL:04/11/14 12:03:55 ID:???
>>865
DATE型で定義されている以上無理じゃない?
DATE型で有る以上ダミーの日のデータは必要だし
ダミーでも日付が有ればそのままだとそれが出てきてしまう。
それが嫌ならDATE型をやめるしかないな。
year型とtinyint型で年と月のカラムを作成してそこに突っ込んでいくか
int型で西暦0年1月からの経過月数を保存しておくか(2004-10なら2004*12+10-1#一発で計算する方方有るかも)
いっそのこと文字列型としてそのまま保存しちゃうか。
872865:04/11/14 15:14:06 ID:???
>>867
SELECT * FROM xxxxxx で出力しなければいけないので、
その方法は使えないのです。

>>868・867
本気初心者なんで、変な回答してるかもしれませんが・・・
ORACLE SQL*Plus使ってます。
TO_CHARは・・・DATE型っていう指定があるのでダメっぽいです。

>>871
DATE型の指定がくせ者ですよね・・・。

みなさん、色々ありがとうございます。
まだ解決していませんが、もう少しがんばってみようと思います。
873NAME IS NULL:04/11/14 15:41:19 ID:???
一般的なプロジェクトならSELECT *は使用禁止だと思うんだが。
874NAME IS NULL:04/11/14 16:03:47 ID:???
>SELECT * FROM xxxxxx で出力しなければいけないので、
なんじゃその規約
野糞未満じゃねーか
875NAME IS NULL:04/11/14 16:04:31 ID:???
>>872
select * from (SELECT TO_CHAR(カラム名,'YYYY-MM') FROM テーブル名)
876NAME IS NULL:04/11/14 16:40:18 ID:???
なんだ宿題か
877NAME IS NULL:04/11/14 16:41:50 ID:???
>>873
昔、糞えせの下でPGしてたとき、そんな規約があったな

つーか、200カラム以上あってSELECT文にカラム名(長い&日本語)書くとバグると思うから止めてねって何よ orz
878NAME IS NULL:04/11/14 18:11:59 ID:3xr8bqJJ
SELECT *,TO_CHAR(カラム名,'YYYY-MM') as 適当な名前 FROM テーブル名

ORACLE SQL*Plus っていうのじゃできないかな?
879NAME IS NULL:04/11/14 18:17:24 ID:???
>>870
オレは int4 を使っている。
扱った経験があるのは YEN だけだけど。
880NAME IS NULL:04/11/15 00:39:51 ID:bZZx79pg
>872
 ビュー作ってそれを select * するんじゃ駄目なのか?
(select * する時点でダメダメだが)

 というか、その DATE 型の要素を表示するのは、なんなんだ?
 そちら側で加工して出力するんじゃ駄目なの?
881NAME IS NULL:04/11/15 09:07:49 ID:???
更新SQLで副問合せの結果を反映させる方法はあってますか?
update tableA
set a = (select aa from tableY)
b = (select bb from tableY)
where c = 1
aとbの副問合せがtableYの同じ行でaとbをセットしてくれるか心配なんですが。。。
882881:04/11/15 09:09:33 ID:???
SQLServer2000の環境です
883881: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とか別名つけると構文エラーみたいです
884NAME IS NULL:04/11/15 11:35:02 ID:???
update tableA
set a = Y.aa, b = Y.bb
from tableA as A, tableY as Y
where c = 1 and A.d=Y.d
885881:04/11/15 12:27:03 ID:???
>>884
返信ありがとうございます。
うまくうごきました!
886NAME IS NULL:04/11/15 15:20:08 ID:???
漠然と質問で申し訳ありません。

・使用SQL :SQL7.0
・データ総件数 約10万件強
・フィールド数 50弱
・フィールド全長 350程度
・主キー設定 5フィールド

・サーバーマシン自体はデフラグ済み

というテーブルAがあります。

『SELECT * FROM A 』
という全件出力ではさほど時間がかからないのですが
『SELECT * FROM A WHERE (主キーの内の1つ) = 'nurupo' 』
といったWhere条件をつけると途端にタイムアウトしてしまいます。
全てのキーを指定して1件のレコードを出すまでに凡そ5秒かかっている状態です。

これは単純にデータ量が多い為と判断していいものなんでしょうか。
他、考えられる要因などがあれば教えて頂きたいのですが。
887NAME IS NULL:04/11/15 15:36:28 ID:???
>>886
SELECT * FROM Aだとさほど時間がかからないというのは、
1件目のデータが出てくるまでの時間がかからないということでは?
10万件全部出せばやっぱり5秒以上かかるんじゃないですかね。

ようするに両方ともシーケンススキャンやってるけど、
1件目が返ってくる時間だけみれば全件出力の方が速く見えるのでは。
888886:04/11/15 15:51:22 ID:???
>>887
見た目の問題と言う事でしょうか。
ただ、質問の仕方が悪かったせいもありますが

『何故条件1つ加えただけでタイムアウトするほど処理が遅くなるのか?』
という所が疑問だったりします。スイマセン。_| ̄|○
889NAME IS NULL:04/11/15 15:55:00 ID:???
(主キーの内の1つ)

しか指定してなけりゃ、全件検索になりはしないか?
890886:04/11/15 15:59:44 ID:???
>>889
例ですが、コード、枝番コード、明細番号、連番、更新年月と言った感じで5つ主キー設定されているようです。
『 WHERE コード = '0001'』 とだけ付け加えた場合で。
891NAME IS NULL:04/11/15 16:05:12 ID:???
だから、そういう主キーの場合には[コード]だけ検索する場合の高速化には
無効じゃないかと。
892886:04/11/15 16:20:43 ID:???
>>891
高速化したいというわけではなく、単純な条件一つでどうしてタイムアウトするまで遅くなるのか、ですね。
893NAME IS NULL:04/11/15 16:31:32 ID:???
887の回答読んでわからない頭の持ち主なので
もはやどうにもならないと思われ。
894NAME IS NULL:04/11/15 17:25:20 ID:???
>892
 だから、「単純な条件一つ」に適合するインデックスがないから、全件スキャンしとるだけだろうが。
 せめて show plan くらいしてみろよ……
895886:04/11/15 17:51:40 ID:???
了解です。失礼しました・・・
896NAME IS NULL:04/11/19 02:37:52 ID:zEwlut0u
select * from table なSQLからカーソル開いて数件取得するのと
limit でSQLで制限かけて数件取得するのってメモリやパフォーマンスに
大きな違いはありますか?
897NAME IS NULL:04/11/20 00:44:50 ID:???
次の 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;
898NAME IS NULL:04/11/20 01:09:41 ID:???
union
899NAME IS NULL:04/11/20 01:10:09 ID:???
うそついた 悪いね 普通に取れる
900NAME IS NULL:04/11/20 18:40:19 ID:qbgr6YW3
DBに該当する条件のデータが一つでも
あるかどうかを調べるためのSQLを教えてください。

できるだけ高速のを
901NAME IS NULL:04/11/20 18:48:26 ID:???
>>900
exist()
902NAME IS NULL:04/11/20 20:04:02 ID:???
>>900
UNIXの場合でいい?

find (DBのデータがあるパス) (調べたいデータをそれなりのバイナリに変換した値)
903NAME IS NULL:04/11/21 09:35:34 ID:???
>>902
肝心のスピードが遅いから、ネタとしてもつまらんな。
904NAME IS NULL:04/11/21 12:46:48 ID:???
where hoge='ほにゃらら' and rownum=1
で値が返ってくるかどうか
905NAME IS NULL:04/11/21 19:00:27 ID:???
rownum=1ってなんじゃ
906NAME IS NULL:04/11/21 19:31:37 ID:???
Oracleだね
「where hoge='ほにゃらら'」だけで返ってくる件数が膨大な場合、
確かにrownumを指定することで早く戻ってくるようにはなる
907NAME IS NULL:04/11/21 21:24:17 ID:???
OracleのrownumってOrder by前の番号だったような・・・それだとどんな結果が返ってくるんだ??
908NAME IS NULL:04/11/21 22:11:40 ID:???
order byなんかが必要なようには見えないが?
アホか
909NAME IS NULL:04/11/21 22:11:46 ID:???
データがあるかないかだから、別にどんなクソソートで1軒目が出てきても関係ないような。
910NAME IS NULL:04/11/21 22:12:23 ID:???
>>908
知ってる知識を言ってみたかっただけじゃないの?
911NAME IS NULL:04/11/22 03:19:49 ID:Cdqu3I2P
where=1
912NAME IS NULL:04/11/22 03:21:19 ID:Cdqu3I2P
SELECT *nn
913NAME 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です。
914NAME IS NULL:04/11/23 13:03:00 ID:???
>>913
SELECT (SELECT MAX(id) FROM table WHERE data=T1.data),data FROM table AS T1 GROUP BY data;
915NAME IS NULL:04/11/23 13:06:32 ID:???
以下のようなデータって表だけじゃわかりづらい、もうちょっと文章で説明すべき
916NAME 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で最初に出てくるものが使われると言う保障がある稼動は和紙欄。
917NAME IS NULL:04/11/23 20:18:02 ID:???
MySQLってサブクエリ使えたっけ?
918NAME IS NULL:04/11/23 21:18:37 ID:???

なんでgoogleやYahoo!の入力欄に同じようなこと書いてボタン押せば
わかることを掲示板で聞くのか理解に苦しむ。
919NAME IS NULL:04/11/23 22:08:23 ID:???
>>913のMySQLの質問に対する答えがサブクエリ使ったものばかりだから確認してるだけじゃないの?
920NAME IS NULL:04/11/23 22:17:17 ID:???
でも、使えるようになったのは、遙か昔から何度も既出だよな。
921NAME IS NULL:04/11/23 22:21:19 ID:???
使えるのって4.1からじゃなかったっけ?
たしか4.1ってマルチバイト対応がイマイチだから本番サーバに誰も使ってないんじゃ?
MySQL5はシラネ
922NAME IS NULL:04/11/24 00:44:03 ID:???
>DBはMySQLです。
バージョン書いてない方が悪い
923ichigo:04/11/24 13:10:03 ID:???
すいません。
今日の日付以降のデータの中で、1番小さい日付のデータを取得するSQL
を教えてください。
環境はVB.net2003です。
よろしくお願いします
924NAME IS NULL:04/11/24 14:33:46 ID:???
SELECT 最小値(日付フィールド) FROM tbl WHERE 日付フィールドが今日以降
925ichigo:04/11/24 16:56:58 ID:???
>>>924さんへ
説明不足でした。
今このようにしてるんですけど今日以前のデータが取得されてしまうんですが
どうすればいいのですか。
sql = "SELECT * FROM tblSchedule " & _
"WHERE fldDate=(SELECT MIN(fldDate) FROM tblSchedule " & _
"WHERE fldDate>=" & Format(Now(), "yyyy/MM/dd") & ") " & _
"ORDER BY fldTime;"
926NAME IS NULL:04/11/24 17:16:01 ID:???
とりあえず、そのsqlっつー変数にセットされている内容を確認してみれ。
927NAME IS NULL:04/11/25 22:21:24 ID:GJuNQxbV
日付に秒まで入ってるんじゃないの?
trun(変数)でもすべし。
928NAME IS NULL:04/11/26 03:05:02 ID:???
>>927
>>926が正しい。
日付をクォートで囲ってないので 2004/11/25 ≒ 7.29 になってしまう。
929ichigo:04/11/26 15:10:00 ID:???
ありがとうございます。
日付を#で囲ったらできました。
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
ERROR:referer情報が変です。(ref1)http://www.dd.iij4u.or.jp/~cap/iyan.html が表示されてしまいました。
933NAME IS NULL:04/11/27 08:58:55 ID:???
なみさん
934NAME 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

どう記述すればよいのか・・・
ヒントおねがいします。
935NAME IS NULL:04/11/29 10:46:23 ID:???
更新日はホントにそういう風に入れてるの?
それじゃ年が更新したりしたらメチャクチャに・・・
936NAME IS NULL:04/11/29 11:11:42 ID:???
更新日はdate型なのでちゃんと年月日時分秒まで入ってます。
まぎらわしくてスミマセン。
ちなみに商品コード、価格共にintです。
937ラブ@らぶねっと:04/11/29 11:13:32 ID:2WZTOsEE
SELECT 商品コード, MAX(更新日)
FROM 商品マスタ
GROUP BY 商品コード

この問い合わせで、各アイテムの最終更新日が拾えます。
それに価格を付き合わせれば目的の抽出ができますよね。
938NAME IS NULL:04/11/29 12:18:06 ID:???
>937
なるほど
サブクエリって事ですよね?
なんとなくイメージできました。
試してみます。
ありがトン
939NAME IS NULL:04/12/01 23:21:09 ID:???
SQLの使い方について、質問です。
第1正規化の反対のするには、どの様に書けばいいのでしょう?

例えば、
正規化前のテーブルが
ID data1 data2
001 あ    い
002 か    き

とあり、
正規化後のデータ

ID  data_no data
001 1 あ
001    2 い
002 1     か
002  2     き

(だだし、data_no,には、1か2しか入らない。)

という場合に、
正規化後のテーブルを正規化前の形式に出力するSQL文です。
どなたか、よろしくお願いします
940NAME IS NULL:04/12/01 23:22:30 ID:???
すみません、
幅が崩れました
正規化後のテーブルは

ID  data_no data
001  1   あ
001  2   い
002  1   か
002  2   き

です。
941NAME IS NULL:04/12/01 23:39:13 ID:???
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

て感じか?
942NAME IS NULL:04/12/01 23:46:16 ID:???
>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にしておいた方が速いのかな。
943NAME IS NULL:04/12/02 15:12:28 ID:???
列 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 で弄っているのですが、思うような結果が得られないでいます…
944NAME IS NULL:04/12/02 18:31:56 ID:???
>>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;
かな? 比較する列が増えると大変だが....
945NAME IS NULL:04/12/02 19:15:51 ID:???
>>944
なるほど。やはりどうしても泥臭くはなってしまうのですね…
ありがとうございます。ちょっと触ろうとしたのですがさくっと扱えなかったので
DB2 のリファレンスと格闘してみます(Oracle の記述はネットやらにそこそこあったのですが...)
946NAME IS NULL:04/12/02 21:15:06 ID:???
>>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

試してないのでもし通らなかったらスマン。
947sage: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

ご教授願います。
948NAME IS NULL:04/12/05 23:14:27 ID:???
ageちゃいました・・・
スマソ
949NAME IS NULL:04/12/05 23:17:31 ID:???
>>947
SELECT 商品A , 商品B , CASE WHEN 商品A登録日 > 商品B登録日 THEN 商品A登録日 ELSE 商品B登録日 FROM Table;
950949:04/12/05 23:18:14 ID:???
END が抜けてた。
SELECT 商品A , 商品B , CASE WHEN 商品A登録日 > 商品B登録日 THEN 商品A登録日 ELSE 商品B登録日 END FROM Table;
951NAME IS NULL:04/12/06 21:08:14 ID:???
スキーマ=ユーザと考えたら駄目ですか?
952NAME IS NULL:04/12/06 21:09:29 ID:???
>>951
上は間違えです、すいません。
953NAME IS NULL:04/12/06 21:10:49 ID:???
>>951
上は間違えです、すいません。
954NAME IS NULL:04/12/06 21:10:16 ID:???
>>951
上は間違えです、すいません。
955NAME IS NULL:04/12/07 20:32:59 ID:???
あなたの心のスキーマ
お埋めします
956NAME IS NULL:04/12/08 00:42:42 ID:???
テーブルの削除と作成(というか一時的に作ってたテーブルのリネーム)を
アトミックに行えなくて困ってます.
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 を使おうとすると,
「テーブルがないよ」と言われる場合があります.
何か根本的に間違ってるのでしょうか?
957NAME IS NULL:04/12/08 01:06:25 ID:???
>>956
テーブルをリネームする必要があるという設計が間違ってる予感。
何でリネームするのさ?

普通なら select * into hoge from hoge_tmp とかでデータを写すものだと思う。
データを写した後のhoge_tmpはtrancateするなりdropするなりすればいい。
958NAME IS NULL:04/12/08 01:20:22 ID:???
少なくとも、リネームするときは他のスレッドがhogeを使おうとしない設計にするべきだろ。
ロックとかデータの整合性とかの点で、RDB使う意味無くなる。
959956: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;
960NAME IS NULL:04/12/11 16:18:37 ID:???
>955
恋人スキーマが空っぽなので埋めてください
961SQL初心者:04/12/11 17:14:31 ID:bTxzaHjt
SQL文で少数点第三位を切り上げる方法を教えて下さい

 5000 ÷ 6 = 833.333333 → 833.34にする方法

お願いします                 
962NAME IS NULL:04/12/12 03:07:34 ID:???
>>961

round((5000/6)+0.009,2) とかじゃだめなの?
963NAME IS NULL:04/12/13 10:07:31 ID:iwUEodU9
SQL言語ってどの会社が作っているんですか?
964NAME IS NULL:04/12/13 11:54:28 ID:???
965NAME IS NULL:04/12/13 19:05:09 ID:???
ttp://www.sql.com/
じゃない。
966NAME IS NULL:04/12/13 22:14:37 ID:???
>>959 truncateしたときって、暗黙にcommitされちゃうから
table hogeがからっぽな瞬間があるよ。
967NAME IS NULL:04/12/14 01:24:49 ID:4jo5gRvJ
table 1          table 2
|国語成績 | 数学成績|       |国語成績  |  数学成績|
|80   | 70 | |60   | 55   |



結果としてこの表を出したいんです
さらに名前という列を追加して名前を入れたいんです。


|名前  | 国語成績|数学成績|
|山下  | 80 | 70 |
|井上  | 60 | 55 |
968NAME IS NULL:04/12/14 01:25:53 ID:4jo5gRvJ
table 1          table 2
|国語成績 | 数学成績|       |国語成績  |  数学成績|
|80   | 70 | |60   | 55   |



結果としてこの表を出したいんです
さらに名前という列を追加して名前を入れたいんです。


|名前  | 国語成績|数学成績|
|山下  | 80 | 70 |
|井上  | 60 | 55 |
969NAME IS NULL:04/12/14 01:36:31 ID:4jo5gRvJ
しまった 二重カキコしてしまいました。すいません。
お願いします
970NAME IS NULL:04/12/14 01:48:20 ID:???
union
971968: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の使い方まちがってますか?
誰かおねがいします。
972NAME IS NULL:04/12/14 03:06:58 ID:???
意味が良くわからんが、

SELECT [名前], [国語成績], [数学成績] FROM (
SELECT '山下' AS [名前],  [table 1].[国語成績], [table 1].[数学成績] FROM [table 1]
UNION
SELECT '井上' AS [名前],  [table 2].[国語成績], [table 2].[数学成績] FROM [table 2] )

こんな感じか?
ちなみに眠いからテストはしてないYO。
973968:04/12/14 04:16:16 ID:8peVtg2k
>972
サンクス
できました
974NAME IS NULL:04/12/14 15:09:46 ID:gYkAsbc2
Prologプログラマです。一応その視点からの皆さんへの質問です。
皆さんは、SQLの仕様に不満はありませんか。
975NAME IS NULL:04/12/14 15:18:36 ID:???
Prologなんて知らねーから、その視点とか言われても知らん。
976NAME IS NULL:04/12/14 15:24:49 ID:???
>>974
:-)
977NAME IS NULL:04/12/14 15:42:57 ID:???
SQLはいわゆる第三世代言語ともオブジェクト指向言語とも相性が
悪いのが難点なのだが。Prologとは仲良しなのかね?
978NAME 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
979NAME 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が生成されて、
自由自在に行き来すると云うわけにはなかなかいきません。
980NAME IS NULL:04/12/14 19:33:16 ID:qbSzLZbl
質問なのですが
カラムのUNIQUE指定を外す構文を教えてください。
981NAME IS NULL:04/12/14 19:56:47 ID:???
知りません。
982NAME IS NULL:04/12/14 20:53:06 ID:???
  ∧ ∧     ┌───────── 
  ( ´ー`)   < シラネーヨ 
   \ <     └───/|──── 
    \.\______// 
      \       / 
       ∪∪ ̄∪∪ 
983NAME IS NULL:04/12/14 22:59:30 ID:???
>>982
なつかしー
984NAME IS NULL:04/12/15 00:37:20 ID:???
>>982
こいつ最近見ないと思ったら、久々の登場だな。
985NAME IS NULL:04/12/15 10:09:25 ID:???
SQLの勉強始めようと思っています
本当に初歩的な質問&多少すれ違いで申し訳ないんですが・・・

データベースを管理するためのシステム(ソフトウェア)がDBMSで
DBMSを定義、操作する言語がSQLですよね?
で、DBMSにはOracle、フリーのFirebirdなどがあり
SQL言語にはPostgreQL、MySQLがあるって考えで合ってますか?
また、現在は只のSQLって言語は使用されてるんですか?
986NAME IS NULL:04/12/15 11:05:07 ID:???
>>985
>データベースを管理するためのシステム(ソフトウェア)がDBMSで
>DBMSを定義、操作する言語がSQLですよね?

は、まぁそれでいいとして、

>で、DBMSにはOracle、フリーのFirebirdなどがあり
>SQL言語にはPostgreQL、MySQLがあるって考えで合ってますか?

は、禿しく勘違い。そこに上げたのは全てDBMSの製品名で、
それぞれに国際標準規格(ISO-SQL)±αのSQLが載っている。
987NAME IS NULL:04/12/15 16:54:26 ID:???
釣りだといいな…
988NAME 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 の指定が出来ないので、うまくいきません。

何か良い方法はないでしょうか?
989NAME IS NULL:04/12/15 18:17:20 ID:???
>>988
SELECT DISTINCT A.name,B.keyword FROM A JOIN B USING(id);
でいいのか? なんか、それ以前に(ry
990NAME 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.他の方法で実現する方法
を教えていただけないでしょうか。
よろしくお願いします。
991990: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;
です。
どなたかよろしくお願いします。
992NAME IS NULL:04/12/15 19:57:17 ID:???
>>991
SELECT ORDER.SECTION, Sum(ORDER.ACCOUNT) AS Total
FROM ORDER
GROUP BY ORDER.SECTION
ORDER BY Total DESC;
で、どぉ。
993NAME IS NULL:04/12/15 20:51:01 ID:???
>>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じゃねえかよ。
994NAME IS NULL:04/12/15 21:20:04 ID:PR2HhgMt
次スレを立ててみますた。

SQL質疑応答スレ Part 2
http://pc5.2ch.net/test/read.cgi/db/1103113155/
995NAME IS NULL:04/12/15 22:30:48 ID:???
>>966
ご指摘どもです。現在はDELETEを使っています。
http://dev.mysql.com/doc/mysql/ja/Implicit_commit.html
を参考にしました。
996NAME IS NULL:04/12/16 02:17:36 ID:???
まだ他に質問スレが残ってるからそこに移動してもよかったろうに。
まあいいけどさ。
997NAME IS NULL:04/12/16 03:45:18 ID:???
>>996
次スレでいきなりレプリケーションみたいなネタが着てるけど、
このスレは、ストアド類もなしに出来ればベンダーに依存しない
純粋なSQLネタがいいな。

質問者が元のテーブル等と、期待する結果のサンプルを出して、
答える人がSQLだけを考えるみたいな。
998991:04/12/16 09:54:11 ID:OCa5514Y
スレが残り少ないのでまとめレスで失礼します。
>>992
試した結果、「(ORDER BYにある)○○(列名)なんて知らない。」
と言われてしまいました。
>>993
アドバイスの通り、ビューで対応したく思います。

お二方、みなさん、アドバイスありがとうございました。
999NAME IS NULL:04/12/16 11:56:17 ID:???
1000ならE.F.コッド復活
1000NAME IS NULL:04/12/16 11:56:37 ID:???
1000ならE.F.コッド復活しない
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。