トップページ⇒db
1001コメント336KB

SQL質疑応答スレ

レス数が1000を超えています。これ以上書き込みはできません。
0001名無しさん@お腹いっぱい。03/06/30 20:46ID:m1O8kdcm
です。
0002名無しさん@お腹いっぱい。03/06/30 20:49ID:vwwrk7GD
おっぱいがいっぱい
0003名無しさん@お腹いっぱい。03/07/02 14:38ID:???
age
0004あぼーんNGNG
あぼーん
0005あぼーんNGNG
あぼーん
0006あぼーんNGNG
あぼーん
0007あぼーんNGNG
あぼーん
0008あぼーんNGNG
あぼーん
0009あぼーんNGNG
あぼーん
0010あぼーんNGNG
あぼーん
0011あぼーんNGNG
あぼーん
0012あぼーんNGNG
あぼーん
0013あぼーんNGNG
あぼーん
0014あぼーんNGNG
あぼーん
0015あぼーんNGNG
あぼーん
0016あぼーんNGNG
あぼーん
0017あぼーんNGNG
あぼーん
0018あぼーんNGNG
あぼーん
0019あぼーんNGNG
あぼーん
0020あぼーんNGNG
あぼーん
0021あぼーんNGNG
あぼーん
0022あぼーんNGNG
あぼーん
0023あぼーんNGNG
あぼーん
0024あぼーんNGNG
あぼーん
0025あぼーんNGNG
あぼーん
0026あぼーんNGNG
あぼーん
0027名無しさん@お腹いっぱい。03/07/14 15:52ID:Cb391GNe
SQL99って流行ってる?

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

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

連結元の件数が多ければ、RIGHT JOIN
連結先の件数が多ければ、LEFT JOIN
0040名無しさん@お腹いっぱい。03/08/26 00:36ID:???
>>39
おいおい(w
0041名無しさん@お腹いっぱい。03/08/30 05:54ID:R83zjMCW
>>38>>39
すげぇな おまいら
0042名無しさん@お腹いっぱい。03/08/30 15:07ID:???
??
0043名無しさん@お腹いっぱい。03/09/08 05:23ID:mSUFriDx
update について質問なんですが

no  hinmei   kisetu
1   りんご    夏
2   キャベツ   春
3   リカヴィネ  終

ってデータが入ってるとき
りんごと夏をいっぺん みかん 冬などにupdate出返ることはできるんでしょうか?

どの本を見ても、set hinmei='みかん' where no='1' みたいな書き方しか書いてません。
updateを2回書けば出来るとは思いますが、一回で出来る方法があったら教えてください
0044名無しさん@お腹いっぱい。03/09/08 05:38ID:mSUFriDx
日本語が、おかしいので、書き直します。

update について質問なんですが

no  hinmei   kisetu
1   りんご    夏
2   キャベツ   春
3   リカヴィネ  終

と、データが入ってる時
りんごと夏を一度に みかん,冬などにupdateすることは、可能でしょうか?

update文一回で

no  hinmei   kisetu
1   みかん    冬
2   キャベツ   春
3   リカヴィネ  終
としたいです。

どの本を見ても、set hinmei='みかん' where no='1' みたいな書きかたなので、
updateを2回書けば出来るとは思いますが、一回で出来る方法があったら教えてください
0045名無しさん@お腹いっぱい。03/09/08 06:50ID:???
UPDATE てーぶる SET hinmei='みかん', kisetu='冬' WHERE no=1
0046NAME IS NULL03/10/13 10:52ID:???
INSERT チンポ TO マンコ
0047NAME IS NULL03/10/16 02:51ID:???
>>46
1行でエラーが発生しました。
ORA-00925: INTOキーワードがありません。
0048NAME IS NULL03/11/04 04:11ID:???
>>47
SQLServerならINTOを省略できるから間違いじゃない
0049NAME IS NULL03/12/18 10:16ID:mo4ixJvn
てーぶるkpーおしえて
0050NAME IS NULL04/01/13 23:07ID: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

これだと全件取り出しちゃうみたいなんです。
無理ですか?
分かりづらい質問ですいません。
0051NAME IS NULL04/01/14 18:30ID:???
MySQLの3.xとか言う落ちじゃないよな?
0052NAME IS NULL04/01/14 21:30ID:ROKXiftA
その通りですが・・。
まずいですか?3.23.58
00535004/01/15 01:26ID:VcgRyZxp
しつこくてすいません。
mysqlの3.xだとどのような問題があるのでしょうか?
もしかして4.xだと大丈夫なのですか?
0054NAME IS NULL04/01/15 22:20ID:???
4.1から副問い合わせが使える。
00555004/01/17 01:01ID:???
そうだったんですか。
う〜ん。使ってるレンタル鯖が3.2・・・。
ありがとうございました。
0056NAME IS NULL04/01/20 02:26ID:hoZb2qM0
すみません。質問です。(SQLサーバーを使用しています。)
SELECT * FROM table ORDER BY itemA
のitemAの順を、
3,2,1,0,4 のように4を最後に並ばせる方法ってないでしょうか?
どうぞよろしくお願いします。
005737804/01/20 04:43ID:luLzxi/Z
SELECT *, case when itemA = 4 then 4
else 3 - itemA
end as SortKey
FROM table
ORDER BY SortKey
でどうでしょう?
0058NAME IS NULL04/01/20 05:30ID:I5YcFOky
>>378さま
ありがとうございます。
SQL初心者なんで、教えていただいた構文を調べながら(初めて見る構文があるので)、
試してみます。本当に感謝デス。
0059NAME IS NULL04/01/20 07:34ID:ETLdlIOQ
おはマンコー!!\(・∀・)/
http://www.k-514.com/
0060NAME IS NULL04/01/21 04:26ID:zGXdiK63
TABLE1 (id 0,1,2,3,4)
TABLE2 (id 0,2,4)
という二つのテーブルを結合する時に「TABLE2に同じIDが無い」という条件で
TABLE1のIDを取得出来ないでしょうか?
OracleのSQLで教えて頂けると助かります。
教えて!エロい(略
0061NAME IS NULL04/01/21 04:39ID:zGXdiK63
すいません、追加です。現状はTABLE1の他のカラムも取得したいので
EXCEPTを使って取得したレコードを
副問い合わせとして再度TABLE1と結合しております。
もうちょっとスマートに書けないでしょうか?
0062NAME IS NULL04/01/21 05:19ID:???
SELECT * FROM table1
WHERE id NOT IN (SELECT id FROM table2)
0063NAME IS NULL04/01/22 00:26ID:???
>>61
> EXCEPTを使って取得したレコードを

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

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

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

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

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

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

こうなら書けるけど。
うーん…
0074NAME IS NULL04/01/31 06:31ID:???
をいをい
0075 04/02/02 10:40ID:???
DB2に登録されたパッケージを削除しようとおもい、
以下のコマンド

delete from syscat.packages where pkgname ="XXX" and pkgschema = 'YYY'

を実行したところ

DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL
処理中に、そのコマンドが返されました。
SQL0607N "DELETE" はシステム・オブジェクト用に定義されていません。
SQLSTATE=42832

というエラーが発生してDELETEできませんでした。
このコマンドを成功させる為に
DELETEをシステム・オブジェクト用に定義するには
どのようにすればよいのでしょうか?
それともそもそもコマンドが間違っているのでしょうか?

データベース:DB2V8
0076 04/02/02 13:54ID:???
自己解決しました。
drop package スキーマ.パッケージ
コマンドが正解でした。
0077NAME IS NULL04/02/02 16:21ID:sPKbo93r
初心者質問です。宜しくお願いします。

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

deleteを発行する前に、selectCountするしかないのでしょうか?
0078NAME IS NULL04/02/02 21:23ID:???
SQL%ROWCOUNT
0079 04/02/03 13:41ID:Vsq7rVXO
初歩的ですみません。
postgreSQLですが、
hoge INTEGER UNIQUE で定義したカラムに
INSERT INTO で重複した値を入れたときにエラーが出るんですが、
「無い物だけINSERTして重複したものは捨てる」という
使い方をしたいのです。エラー回避の方法をご教授ください。
0080 04/02/03 17:19ID:???
79でし。
エラーコード "Cannot insert a duplicate key into unique index" を
strstr() で比較して一致したらプログラムが止まらないようにしてみました。
いいのかしら、こんなのでも。
0081NAME IS NULL04/02/05 00:06ID:???
良くないだろ・・・
キーが重複してないものだけINSERTすればいいんじゃない。
0082 04/02/05 11:23ID:???
>81
重複してないチェックをどうやるとスマートに行くんでしょうか。
select user from tbl where user=a; で件数0を確認してから
insert すると、とんでもなく遅いんですが。
0083NAME IS NULL04/02/05 19:50ID:???
select キー from tblで、キーだけ取得して配列かコレクションかなんかに入れといて、
insert投げる前にキーが被ってないか確認してから投げろ。
updateなら、insertするデータと同じキーをdeleteしてからinsertしろ。
0084NAME IS NULL04/02/06 10:27ID:???
INSERT元がテーブルなら、BにあってAに無い物だけAにINSERT。
WHERE句で指定できるだろ。
0085NAME IS NULL04/02/15 13:31ID: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です。
00868504/02/15 14:46ID:9pK84ZeX
MySQLではinner joinでなく「join」とやってみたら、うまくいきました。
0087NAME IS NULL04/02/15 19:54ID:???
10日もまえの質問でなんだけどさー、>>79って、単に
for( ... ) {
try {
stmt.executeUpdate("insert .... ");
} catch(SQLException e) {}
}
でいいと思うんだが。っていうか俺そうしてるし。
0088NAME IS NULL04/02/16 06:21ID:ae9l//XG
PostgreSQL詳しくないので何とも言えないけど、PL/SQLでいうEXCEPTION
に相当するものがあると思うのだが
0089 04/02/16 16:00ID: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);

とかやってみました。洒落にならんほど遅かったです。なんか間違ってます?
0090NAME IS NULL04/02/16 20:02ID:/mbbqIps
interval型の時間計算の結果で、列名が定まらず、?column?になりますよね。それを?column?にせず、列名をつけるにはどうしたらいいですか?教えて下さいお願いします。
0091NAME IS NULL04/02/16 22:44ID:???
as delta
0092NAME IS NULL04/02/21 00:15ID:???
SQLってASやらISやらONやら無駄な前置詞が多すぎる。
無くても一意な構文になんだろーがよっつーコマンドがすげー多いかと。
ピュアな英文に近づけようという努力だと思うけど余計なお世話かと。
つーか邪魔かと。
0093NAME IS NULL04/02/22 11:56ID:???
>>92
SQLServerはかなり省略できるところが多い
それに慣れると他で書くときに戸惑うが。
0094NAME IS NULL04/02/22 13:53ID:???
>>93
そーなんだ。自分Oracleオンリーロンリー
0095NAME IS NULL04/02/23 15:08ID: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型
0096NAME IS NULL04/02/23 15:41ID: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
警察庁ご意見箱
0097NAME IS NULL04/02/24 10:00ID:I8JzCQL6
NOは数値フィールドで

SELECT NO FROM HOGE

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

(5678)
(7789)
(6783)

のようにしたいのですが。
0098NAME IS NULL04/02/24 11:12ID:???
文字列連結演算子を使うのは?
PostgreSQLなら、|| だが、ほかは知らん
0099NAME IS NULL04/02/24 17:59ID:u8c4IGLn
T-SQLで

A  B
01  02
02  04
04  06
05  
A・Bというテーブルから

C
01
02
04
05
06
Cを作りたいときはどうすればいいんでしょうか。
どちらにもあるときはどちらか、片方しかないときは
あるもの、どちらにもないときは出さない。という形です。
うまいJOINの使い方がわかりません。
0100NAME IS NULL04/02/24 22:15ID:???
>>99
UNIONじゃダメなの?
0101NAME IS NULL04/02/25 10:40ID:nmQBoTK6
>>100
UNIONでいけました。
UNIONでいけるけど、遅くなってしまうようです・・・otz
ABを各INSERTして仮想テーブルに入れてGROUPBYでCを作ってたんですが、
実行速度が遅くてほかの手段を考えてたんです。
ありがとうございます。
0102NAME IS NULL04/02/25 14:21ID:???
>>98
連結演算子でいけました。
MS SQL でしたので、+でした。
ありがとうございました。
0103NAME IS NULL04/02/26 02:00ID:eh35xVEj
ビュー(仮想表)に対して更新系SQLを実行するのは有りですか?
0104NAME IS NULL04/02/26 02:10ID:pYxJcbTI
ある月の月末日を求めるにはどうすればいいのでしょう?
0105NAME IS NULL04/02/26 17:13ID:blydrWJ8

SQL文でスペースのみが帰ってくるSELECT文を作りたいのですが、
方法がわかりません。
SELECT A,B,スペース FROM TABLE1
といった感じにしたいのです。
ちなみにORACLE9iです。
SQLSERVERだと
SELECT A,B,SPACE(20) FROM TABLE1
という風にできるみたいなのですが・・・。
0106NAME IS NULL04/02/26 19:29ID:???
>>105
SELECT A,B,''
FROM TABLE1
0107NAME IS NULL04/02/26 19:30ID:???
>>105
SELECT A,B,' '
FROM TABLE1
0108NAME IS NULL04/02/26 19:30ID:???
>>105
SELECT A,B,' '
FROM TABLE1
0109NAME IS NULL04/02/27 00:27ID:fCj3A/6A
>>104
そういう関数あるよ。Oracleだけど。
LAST_DAYだっけかな。
0110NAME IS NULL04/02/27 01:03ID:???
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の中で最も古い日付とする

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

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

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

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

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

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

ORACLEでの方法だがTO_CHAR(NUMBER型の項目) LIKE '検索文字列%'
0122NAME IS NULL04/03/12 00:23ID:???
そもそもNumber型に文字列検索しても。。。
0123NAME IS NULL04/03/17 17:33ID:???
 Number 型で前方一致って……
>121 の方法を使ったとしても、
'100%' とあったら、100 でも 1000 でも 10000 でもヒットしちまうわけだが、
 それってどういう意味を持つ検索なんだ?
0124NAME IS NULL04/03/18 07:24ID:???
お偉いさんが無茶苦茶言ってるだけのような。
0125NAME IS NULL04/04/02 21:02ID:???
すみません、質問があるのですが。
例えば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オブジェクトに格納する部分が
上手くいかないのです。どうかご教授お願い致します。
0126NAME IS NULL04/04/03 13:09ID:???
SELECT * FROM table_name
WHERE
key = number(0) OR
key = number(1) OR
…
key = number(n)
0127NAME IS NULL04/04/05 08:51ID:???
>>126
解決しました!ただ
key = number(n) OR
をn回分、Forで回して付け足せばいいだけのことでしたorz
本当にありがとう御座います!
0128NAME IS NULL04/04/05 13:19ID:udoPtN7v
Oracle7で最頻値を求める方法が分かりません。
SELECT mode(hoge) FROM fuga
などというふうにして、fuga表のhoge列最頻値が求められればいいのですが…

最悪、DISTINCT句でhoge列の取りうる値を全てリストアップし、それぞれ
SELECT count(hoge) FROM fuga WHERE hoge = 'arege'
などと数えようかと思ってますが…
0129NAME IS NULL04/04/05 13:54ID:???
>>128
Oracleは知らんので、とりあえず、1行目のhogeが最頻値
SELECT hoge,COUNT(*)AS cnt FROM fuga GROUP BY hoge ORDER BY cnt DESC;
0130NAME IS NULL04/04/05 14:16ID:???
質問させてください。
借りてるレンタル鯖でMySQLが使えるのですが、どうやってアクセスしたらいいのでしょうか?
SSHもTelnetも使えないようなのです。

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

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

複合キーというのは、候補キーの一つ。
つうことで、正確に言うと>>142も半分正解か。
複合キーというのは、二つ以上のカラムを合わせてuniqueとなるキー。
>>144の例だとidだけで行を特定できるので、and depId='0500'は全くの不要だし。
0146NAME IS NULL04/04/12 21:20ID:???
> >>144の例だとidだけで行を特定できる
そうか?
0147NAME IS NULL04/04/12 23:16ID:eYJS7Ezv
複合キーを使ったSELECTの模範例って、どんな感じ?
0148表領域の変更について04/04/13 00:28ID:I8fFeKV0
ALTERコマンドで、ユーザー毎に表領域の変更ができますが、
Table単位で、表領域の変更をしたく思います。
Tableを新規作成し、古いものを消去すれば良いのかもしれませんが、
より効率的な方法があると聞いてます。
どなたかご存知な方教えて頂けないでしょうか?
よろしくお願いします!!


0149ちんぽ初心者04/04/13 09:32ID:hzQSiapO
すんません。質問ッス。

こんなテーブル:TBL1があったとします。
名称   コード
りんご  001
ゴリラ  010
ラッパ  002
パンダ  021

このテーブルから、「コード」の2桁目が'1'であるレコードの「名称」を取得したくて、、、

SELECT 名称 FROM TBL1 WHERE (SELECT SUBSTRING ( コード FROM 2 FOR 1) = 1)

なんてSQLを書いてみたんですが、37000な感じです。
根本的に、SUBSTRINGの使い方を全然理解して無いよーな気がムラムラなんですが。。
どーすりゃいいのか、識者の方ご教授下さいませ。
0150NAME IS NULL04/04/13 09:55ID:???
>>149
SELECT 名称 FROM TBL1 WHERE SUBSTRING ( コード FROM 2 FOR 1) = '1';
0151ちんぽ初心者04/04/13 10:09ID:???
>>150
ありがたき幸せ!!!
0152NAME IS NULL04/04/13 11:20ID:???
135といい、とにかくSELECTするのが流行っているのか?
0153NAME IS NULL04/04/13 11:23ID:???
>>152
サブクエリを覚えて嬉しいんだYO
0154NAME IS NULL04/04/14 00:58ID: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する以外に、
何か良い方法はないでしょうか?
0155NAME IS NULL04/04/14 08:00ID:???
>>154
tbl1.name = tbl2.keyword ってことなら、
UPDATE tbl1 SET name=tbl2.keyword FROM tbl2 WHERE tbl1.keyword_id=tbl2.keyword_id;
で、できる。

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

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

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

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

日付型との比較って?
0160NAME IS NULL04/04/15 17:47ID:jvLa74JA
>>159
できました。ありがとうございます。
あと、二つ目の質問の方は

項目D(日付/時刻型)
2004/04/01 12:00:00
2004/05/01 12:00:00

2004/04/15 12:00:00

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

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

id|value1|value3
--+------+---------
1|aaaa |hhhh
1|aaaa |iiii
2|bbbb |jjjj
3|cccc |
0185NAME IS NULL04/04/27 20:21ID:???
>>184 名回答!
0186NAME IS NULL04/04/29 13:23ID:???
  バックアップしたデータを丸ごと、またDBのテーブルに毎日突っ込んでる俺はどうですか?
0187NAME IS NULL04/05/05 18:22ID:???
>>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);
0188NAME IS NULL04/05/05 22:27ID:???
>>186
まぁ、趣味は人それぞれだからな・・・
0189NAME IS NULL04/05/05 23:55ID:???
>>186
で、バックアップしたデータを突っ込んでいるテーブルのバックアップはどうするんだ?
0190NAME IS NULL04/05/08 01:52ID:PG+kCctR
すいません、教えてください。

まず、次の二つのテーブルがあるとします。

・2chねらーテーブル
 ユーザID(PK)

・スレ立てテーブル
 ユーザID(PK)
 スレ立て日付
 クソスレフラグ(デフォルト = '0')

2chが会員制という前提ですが、2chねらーテーブルには2ch会員全ユーザが、
スレ立てテーブルには、スレを立てたユーザIDとスレ立て日付が。
また、立てたスレがクソスレと認定されれば、クソスレフラグに'1'が入るものとします。

この2テーブルから、 優良2chねらーを抽出したいのです。
優良の定義とは・・・

・クソスレを立てていない(クソスレフラグ = '0')
・そもそもスレを立てたことがない(スレ立てテーブルに該当IDなし)

というものです。
これを、一回のSQLで実現させる方法はないでしょうか?
よろしくお願いします。

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

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

SELECT * FROM 2chねらーテーブル
WHERE ユーザID NOT IN
    (SELECT ユーザID FROM スレ立てテーブル WHERE クソスレフラグ<>'0')
0194NAME IS NULL04/05/10 11:34ID:???
>>191ワロタ
019519004/05/14 02:02ID:OjLux1Gu
どうもありがとう。
皆さんの回答を参考に、なんとか問題解決出来ました。
普段は select なんちゃら from なんちゃら where なんちゃら order by なんちゃら
この程度のSQLで実現できる、単純業務に従事する漏れ。
これじゃ、いつまでたってもスキルアップは望めませんな・・・
もっと勉強しないといかんなぁ。
0196NAME IS NULL04/05/14 11:52ID: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
としたいのですがどうしたらよいのでしょうか?
お願いします、教えて下さい!
019719604/05/14 11:59ID: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の偉大さを思い知らされました・・・
0198NAME IS NULL04/05/14 12:57ID:nNcVZ+ed

テーブル名:デジコ
キャラ 萌え度 キタ回数
--------------------------
A    6    11
B    7    12


テーブル名:プチコ
キャラ  作画枚数
--------------------------
A    100    


キャラ 萌え度 キタ回数 作画枚数
A    6    11  100
B    7    12    0(NULLではない)
をだすようなSQL文おしえてください。
0199NAME IS NULL04/05/14 13:08ID:???
>>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を参考にして考えれ。要領は同じ。
0200NAME IS NULL04/05/14 13:17ID:???
>>198
SELECT キャラ,萌え度,キタ回数,coalesce(作画枚数,0) from デジコ LEFT OUTER JOIN プチコ Using(キャラ);
0201NAME IS NULL04/05/16 18:29ID:e1RqkHtX
すいません。JOIN後のテーブルに任意の名前を付けたいときはどうしたら
良いですか?
select a,b
from (a left join b) as table3
↑省略しすぎ(汗
としてもエラーになってしまうし困っています。
ちなみに.MDBです。
よろしくお願いします。

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

id
----
1
2
3

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

ピボットテーブル

でぐぐれうんこ

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

#データベースのプログラムっていうのかコードって言うのか、
#ほかの言語と違ってなんかとっつきにくいですねぇ。
026726404/06/02 18:56ID:???
>>265
済みません言葉がたりませんでした。各カテゴリーは親カテゴリ(parentId)
を持っていて、木構造になっているのです。
>>264の例だと
ルート1
┗枝1
  ┗葉1
  ┗葉2
┗枝2
ルート2
┗枝3
  ┗葉3
になっているということです。
やりたいのは、任意のカテゴリ*以下*に所属する全てのエントリー
つまりカテゴリ0001(ルート1)なら
「0001(ルート1)、0003(枝1)、0005(葉1)、0006(葉2)」のいずれかを
categoryカラムに持つエントリーを全て取得したいということです。
0268NAME IS NULL04/06/02 20:04ID:???
階層が葉まででいいなら、カテゴリから
A. ルート1自身
B. parentIDが A な物
C. parentIDが B な物
をUNIONで結んで、それとエントリーを結びつければ。
026926404/06/02 20:28ID:???
>>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
のような方法を取らざるおえないみたいですね。
もうちっと自分で考えてみます。すみませんでした。
0270NAME IS NULL04/06/02 20:54ID:???
>264

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

それと、それがINSERT...SELECT構文で使えるかどうかはまた別。
0306NAME IS NULL04/06/09 08:29ID:???
>>296
何がしたいのかわからんが、
とりあえず勘でDECODEを使えと言ってみる。
030729604/06/09 21:18ID:???
説明が足りなかったようですみません。

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は使えないのでしょうか?
030829604/06/09 21:20ID:???
>>306
DECODEを使うとCASEと同じような事ができるようですね。
この2つは違うのでしょうか?
0309NAME IS NULL04/06/10 14:04ID:???
>>308
しらべろや
0310NAME IS NULL04/06/10 23:44ID:???
8iってのが微妙
たしかCASE文が使えたのは、バージョン8.1.6から
だったように記憶しておるです
0311NAME IS NULL04/06/12 22:56ID:???
PL/SQLってMySQL上でも使えるんでしょうか?
書くとエラーが出てしまいます。
0312NAME IS NULL04/06/13 11:30ID:???
>311
PL/SQL≒Oracle方言
0313NAME IS NULL04/06/13 17:39ID:???
蟻が塔ございました。
0314NAME IS NULL04/06/14 15:26ID: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です  


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

#計上先テーブルが正規化されてないのが気になるが。まぁガンガレ。
0317NAME IS NULL04/06/14 18:11ID:???
すいません、このようなテーブルがあるときに、

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 です。
0318NAME IS NULL04/06/14 18:26ID:???
>>317
カラムの型がワカランのだが、INTEGERなどの数値型で、1か0だけなら、
SELECT sum(flag1),sum(flag2),sum(flag3) FROM table;
でいけると思うが。ダメかな。
0319NAME IS NULL04/06/14 18:31ID:???
あと、SELECTリストにサブクエリがかけるのなら、
SELECT (SELECT COUNT(*) FROM table WHERE flag1=1),(SELECT COUNT(*) FROM table WHERE flag2=1),(SELECT COUNT(*) FROM table WHERE flag3=1);
とするのが、汎用的な解か?
032031704/06/14 19:01ID:???
>>318

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

>>319

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

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

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

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

よろしくお願いします
0329NAME IS NULL04/06/18 23:35ID: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);
〜
みたいな事をやりたいのです。
0330NAME IS NULL04/06/19 00:50ID:???
>>329
できます。
0331NAME IS NULL04/06/19 01:05ID:+pGZo/Sk
ありがとうございます。
やってみます。
0332NAME IS NULL04/06/19 01:44ID:???
>>328
サブクエリにする理由が不明
0333我流ぷろぐらま04/06/19 15:20ID:???
検索してもログよんでも見当がつかないので質問させていただきます

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

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

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

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

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

の様なテーブルから

ABC100
ABC101
ABC102
ABC103
ABC104


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

【必要な機能】 ロボット検索技術を応用した、インターネット上の販売情報を検索することができるソフト。商品名やスペック等からリアルタイムな情報を検索することができる。その得た情報をMYSQLなどのDBに落とし込みたい。
【.  目 的  】 リアルタイムに価格比較できるPC比較サイトを作りたい
【. 使用OS 】 windowsXP
【.  条 件  】 10万以内なら払いたい
■試したけど条件を満たさなかったソフト
【. 名  称  】 まったく見つからず
■これだけはやりました
【 >>1-10、FAQ集、上手な検索の仕方 を読んだ 】 はい
【  調べたサイトの名前  】 GOOGLE YAHOO など大手検索エンジン
【検索キーワードは?  ..】 ロボット型検索技術 クロール ソフト

恐らくこのようなソフトはないと思います。。
この技術の最も単純なソフト。もしくは応用が聞くような単純ソフトがあれば・・・・などと不遜にも考えています。

ちなみに下記2サイトで私がやりたいような事を行っております。

http://www.bestgate.net/

http://yasune.dokoda.jp/

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

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


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


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

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

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

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



設計を見直した方がいいような気もするけど。。。
0425NAME IS NULL04/07/08 03:30ID:t5U4zZXH
みにくくて申し訳ないんですが
これおねがいします。
ttp://v.isp.2ch.net/up/23ab1028188e.JPG
Oracleです
0426NAME IS NULL04/07/08 04:13ID:???
ab
0427NAME IS NULL04/07/08 08:03ID:???
>>426
ありがとうございます!たすかりました
0428NAME IS NULL04/07/10 23:36ID:+YSVeqKQ
教えてください。
テーブルAに列a,b,cがあって、a,bが重複してる行を
削除したいんですけど、SQLではどしたらよいのでしょうか。
0429NAME IS NULL04/07/11 00:09ID:???
列a = 列b
0430NAME IS NULL04/07/11 00:25ID:V6myGrYp
すみません。質問がダメダメでした。
テーブルA
aa bb cc
aa bb dd
aa yy zz
のとき、
aa bb cc
xx yy zz
にしたいんですけど。DB2です。

0431NAME IS NULL04/07/11 00:27ID:V6myGrYp
訂正です。

すみません。質問がダメダメでした。
テーブルA
aa bb cc
aa bb dd
aa yy zz
のとき、
aa bb cc
aa yy zz
にしたいんですけど。DB2です。
0432NAME IS NULL04/07/11 01:11ID:???
>>431
aa bb cc が残って、
aa bb dd を残さない理由は?
ORDER BY 句も使わずに単純に先に出てきた方を残すのか?
どっちゃにしろ面倒だが。
0433NAME IS NULL04/07/11 01:42ID:p5TFt5ON
単純に先に出てきた方を残します。
面倒ですか〜。
0434NAME IS NULL04/07/11 01:58ID:yVwQ3n9P
N速に書き込めません。

何とかして下さい。
0435NAME IS NULL04/07/11 04:48ID:???
>>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
行を特定する擬似列があるのと、行値コンストラクタが出来ないと無理だな。
0436名無しさん@そうだ選挙に行こう04/07/11 12:27ID:zk9WAf2Q
ありがとうございます。
できそうな感じです。明日やってみますです。
0437NAME IS NULL04/07/15 09:35ID:i+QgLaVI
Oracle8i使用。
例
SELECT 項目1, 項目2, 項目3 FROM T1
union all
SELECT 項目1, 項目2, 項目3 FROM T1 where 項目2 = 3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

ALTER TABLE Table_A MODIFY Field_A char(10)

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

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

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

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

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

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

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

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

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

a BETWEEN now() - interval'1 hour' AND now();
でどぉっすか?
051651404/08/06 12:55ID:???
intervalを使えば正しく比較できるようです。
「SELECT date from access_log」の結果は「20040805174512」でしたが、
「SELECT date - interval 0 hour from access_log;」とやると
「2004-08-05 17:45:12」となりました。
051751404/08/06 13:54ID:???
かなり初心者ネタかもしれませんが質問です。
レコードの抽出範囲を「本日」「前日」「今月」「先月」「今年」「去年」
というふうに区切りたいのですが、どうすればよいですか?

前日のレコードを抽出するのに
mysql> SELECT * from access_log
where year(date) = year(now())
and month(date) = month(now())
and day(date) = day(now) - 1;
とやったのですが、1日に実行すると、0日と
比較してしまい、うまくいきませんでした。
0518NAME IS NULL04/08/06 14:49ID:???
>>517
day(now()-interval 1day)
かな? MySQLは使ってなくて書式に間違いがあるかもしれんが。
0519NAME IS NULL04/08/06 15:59ID:???
>513
 SQL リファレンスに各書式での丸め条件載ってるが……
 例題だと12が返ってくるんじゃなかったかな?
052051204/08/06 16:14ID:???
>>513

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

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

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

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

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

教えてください。


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

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

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

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

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になります。
054253804/08/17 10:38ID:???
解決しました。どうもありがとうございました。
054354104/08/17 10:46ID:???
今は分からないので、

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;

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

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

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

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

ERROR: Relation "a" does not exist

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

545さんありがとう。

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

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

オススメの書籍とかありますか?
0551NAME IS NULL04/08/17 18:38ID:???
>>550
ttp://www.1point.jp/~book_2ch/computer/db.html
0552NAME IS NULL04/08/18 20:10ID:???
code | name | address
001 | 山田 | 東京
002 | 鈴木 | 千葉
003 | 斉藤 | 埼玉

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

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

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

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

IDが69だー。

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

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

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

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

ネタはこっち

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

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

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

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

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

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

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

これはRDBMSによって違う?

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

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

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

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

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

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

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

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

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

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

心配なので確認したいなと。
0602NAME IS NULL04/09/07 16:36ID:???
無視されたら括弧付けてる意味無いだろ。
そうは思わないか?
060360104/09/07 17:27ID:???
そりゃ思います思います。
ただ、

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

とか、何かすべての組み合わせで書いてるの見たことがある気がするようなしないような。

まあ、2 X 2 ぐらいだったら全部の組み合わせで書いてもいいんですけど。
3 X 3 とかになったらもうやってられないなと思いまして。

いや、大丈夫ならいいんです。
お騒がせしてごめんなさい
060459804/09/07 18:16ID:cJghFX6x
全角文字の()を使うことでできました。。。
0605NAME IS NULL04/09/07 18:17ID:JHskel+H
TABLEAのID=1のレコードを、同テーブルにID=2で追加したいのですが、

Insert into TABLEA
Select * From TABLEA Where ID=1

では値が重複してしまいます。
ただ、ID以外の項目が変動しても修正しなくて良いよう、
Select 2 AS ID, ... From TABLEA とはしたくありません。

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

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

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

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

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

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

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

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

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

>610

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

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

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

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

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

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

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

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

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

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

例)VB
Redim str(0 TO 100) As String 
↓
??
0626NAME IS NULL04/09/10 23:01:09ID:???
それぐらい検索しろや!
0627NAME IS NULL04/09/11 09:53:42ID:???
検索したけど見つかりません。
0628NAME IS NULL04/09/11 14:13:51ID:???
マニュアルを見よう
0629NAME IS NULL04/09/11 14:19:20ID:???
DBの種類ぐらい書けや
0630NAME IS NULL04/09/11 15:17:50ID:???
> BEGIN TRANSACTIONをしていたら、一人の人がその中に入ると、
> 他の人は待ち状態にならないのでしょうか?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

mysql+vb+MyODBC
の環境ですが、
住所録を作ってみると、
漢数字"十"だけが見事に文字化けしています。
文字はsjisに設定しています。
対処方法がお分かりになる方がいましたら、ご教示いただけませんでしょうか?
よろしくお願いいたします。
0673NAME IS NULL04/10/14 21:58:13ID:???
>>672
所謂5C問題。
ttp://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&q=5c+%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91+MySQL
0674NAME IS NULL04/10/14 21:58:24ID:???
http://www.psl.ne.jp/perl/pdojo00c.html
0675NAME IS NULL04/10/14 22:05:40ID:IzZvBEH7
>>673,674

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

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

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

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

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

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

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

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

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

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

select * where A != B

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

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

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

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

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

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

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

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

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

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

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

select id,name,min(created) from このテーブル group by id,name
ってやると望む結果が出ないので困っています・・・
071370904/10/21 15:39:50ID:jhDm5sXO
> 710

ごめんなさい。説明不足です。
別に1000が取り出したいのではなく、createdはtimestampなので、
各ID毎の一番毎の古い時間のidが取得したいのです。

なので AA だと 00:20:00 より 00:10:00 みたいな感じです。
なので AA だと id 1 BB は 3 CC は 6が取得したいんですよ。
0714NAME IS NULL04/10/21 15:42:27ID:???
WHERE to_char(created,'HH24:MI') = '00:10'
WHERE dateformat(created,'HH:MM') = '00:10'
WHERE format(created,'hh:m') = '00:10'
071570904/10/21 15:46:43ID: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を取得したいです。
071670904/10/21 15:50:57ID:jhDm5sXO
ちなみに

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

出ででるかな?
071870904/10/21 15:57:42ID:jhDm5sXO
> 717
すみませんだめです・・・
071970904/10/21 16:05:03ID:jhDm5sXO
できました。

select id,name from table A where A.created = (select min(B.created) from table B where B.name = A.name);

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

072370904/10/21 16:39:39ID:jhDm5sXO
> 720
えええ!せっかくできたと思ったら・・・
どう違うんですかね?
072472004/10/21 17:06:29ID:???
あれ、いいのかな?
0725NAME IS NULL04/10/21 17:39:56ID:???
特定の日から何営業日なのか求めるのに、下記のテーブルからデータを作りたいんだけど、
どんな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
0726NAME IS NULL04/10/21 17:52:22ID:???
>>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;
072772504/10/21 17:56:01ID:???
>>726
ありがとん。動いたーーー!!ヽ(゜▽、゜)ノ
0728NAME IS NULL04/10/21 18:04:43ID:???
SELECT date,(SELECT SUM(tbl.count) FROM tbl WHERE date <= A.date) AS count_sum FROM tbl as A
072972504/10/22 00:28:32ID:???
>>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営業日とカウントするとかあった場合(今回は無いけど)や、
半日を考慮に入れる場合なんかも対応できそうだよ。

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

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

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

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

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

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

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

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

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

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

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

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

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

UPDATE テーブル名 SET P=P+5 WHERE 何とかかんとか=ほにゃらら とかすればいいのでは・・・
076276104/10/27 02:54:26ID:???
ああ、書いているうちに終わってたw
076375904/10/27 03:00:58ID:???
>>760-761
なるほど!SUM()とか使わなくとも出来たんですね。ありがとうございました!
今、ご飯食べてるので、終わったら試してみます!
0764NAME IS NULL04/10/27 20:27:51ID:4CD+cdaI
create table m_d(dstamp date); の中のm_dに

2004-11-25

な日付があって、残り日数を出したい(上記日付から現在の日付を引く)んですが、
SQLで出来ますでしょうか?たとえば、後、30日なら30でいう形です。
0765NAME IS NULL04/10/27 20:42:50ID:???
お忙しいところ、すみませんが質問をさして頂きます。
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として返ってくるようにしたいのですが。
どなたか愚者に知恵をお貸しください。
お昼からずっと悩んでおります。
0766NAME IS NULL04/10/27 20:43:23ID:???
とりあえず、方法としまして
テーブル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

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

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

select dayofyear(dstamp - current_date) from m_d;
なんて、トンチンカンなSQL書いてしまって、エラー出て悩みまくっていました。
本当にありがとうございました。
077177004/10/27 22:51:12ID:4CD+cdaI
すいません。上記SQLを試してみたのですが、当月分はよいのですが
月が変わると全然違う日付が帰って来てしまうようです。

mysql> insert into m_d values('2005-06-01');
mysql> select dstamp - current_date from m_d;
9574

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

select to_days(dstamp) - to_days(current_date) from m_d;
0773NAME IS NULL04/11/01 12:07:21ID:2Tw1B6rM
すみません。どなたか教えて下さい。
INSERT や UPDATEで、'を含んだ文字列は、どのようにSQL文を書いたらいいのでしょうか。
例えば
INSERT INTO SAMPLE (ID, WORD) VALUES (1, 'Let's GO!');
と、Let's GO!を登録したいのですが…
0774NAME IS NULL04/11/01 13:02:34ID:???
>>773
DBによってそれぞれエスケープさせる文字があると思うが、
多くの場合は\で可能かな?
INSERT INTO SAMPLE (ID, WORD) VALUES (1, 'Let\'s GO!');
077577304/11/01 16:56:09ID:???
>>774
ありがとうございました。DBによって違いがあるのですね。
0776NAME IS NULL04/11/01 20:11:42ID:???
>>773
シングルクォートを二つ並べる処理系もある
INSERT INTO SAMPLE (ID, WORD) VALUES (1, 'Let''s GO!');
0777NAME IS NULL04/11/01 20:13:17ID:???
どんな処理系?
0778NAME IS NULL04/11/01 20:50:27ID:???
Oracleだろ。
0779NAME IS NULL04/11/01 21:25:45ID:???
高いだけあってエスケープも独自仕様なんですね( ´_ゝ`)
0780NAME IS NULL04/11/01 21:42:42ID:???
失礼だな、Oracleが標準なんだよ
0781NAME IS NULL04/11/01 21:42:55ID:???
シングルクォート二つが普通。マイナーなのは\'の方。
0782NAME IS NULL04/11/01 21:46:16ID:???
PostgreSQLもシングルクォートで可能なんですけど、
シングルクォートの方が標準なのか。へぇ〜
0783NAME IS NULL04/11/01 21:51:37ID:???
SQL ServerもDB2もシングルクォート二つでしょ?
0784NAME IS NULL04/11/01 22:20:49ID:???
そうだよなぁ、Oracleが標準だよなぁ
(+)とかな(w
0785NAME IS NULL04/11/01 22:22:01ID:???
>>783
どっちでもいい。
多分、Oracle互換のためにクオートも実装してるんではないかと。
0786NAME IS NULL04/11/01 22:42:36ID:???
>>784
それ激しく便利なんだよな
left joinとか書くよりも直感的でわかりやすいと思うんだよ
0787NAME IS NULL04/11/02 11:58:33ID:PlFI4bf5
登録日   変更日
04/01/01  04/08/05
04/02/10  04/10/10
04/10/20  00/00/00

上のようなデータから、登録日と変更日の両方合わせての最大値を
取得したいのですが。(上の場合だと「04/10/20」)
0788NAME IS NULL04/11/02 12:12:54ID: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です
0789NAME IS NULL04/11/02 12:44:58ID:Y8T1Y7g6
検索ページで次の50件とするときに、最初の50件は
TOP関数でやってるんですが次の50件はどうやってますか?
(SQLServer2000)
0790NAME IS NULL04/11/02 12:52:17ID:???
>>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票。
つか、実行して計測すればわかるんじゃないの?
079178904/11/02 16:47:24ID:???
SQLで10000件の内300行から310行だけ取り出すやりかたりますか?
0792NAME IS NULL04/11/02 16:56:19ID:???
よし、やり語ろう。
0793NAME IS NULL04/11/02 17:01:27ID:???
SQL鯖使っていないんで知らんのだけど、
OFFSETとLIMITってないのか?
標準的にはカーソルを使う。
079478904/11/02 17:07:00ID:???
>>793
さんくす!調べて見ます->OFFSETとLIMIT
>標準的にはカーソルを使う。
カーソルということは、ADOだったらレコードセットをぐるぐるまわす
ということですか?
0795NAME IS NULL04/11/02 17:29:26ID:???
>>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は無かったような・・・
0796NAME IS NULL04/11/02 17:38:15ID:???
Enterprise Manager 絡みの質問はここでいいんだろうか?
スレ・板違いだったらスマソ。
079778904/11/02 17:54:04ID:???
>>795
レスさんくす!
>SQLサーバにはOFFSET,LIMITは無かったような・
調べた結果ありませんでした
提示のSQL理解してみます
0798NAME IS NULL04/11/02 23:11:57ID:???
>>796
ここでもOKだと思うけど、MSSQLスレのほうがいいかも。

MS SQL Server 総合スレ2
http://pc5.2ch.net/test/read.cgi/db/1093012583/
0799NAME IS NULL04/11/03 00:42:32ID:gKJQUjH3
データベースのプロの方、いますか?
0800NAME IS NULL04/11/03 00:57:28ID:gKJQUjH3
いないみたいですね、では。

http://eq2.maido3.com/pukiwiki.php?%C8%EF%BA%D2%C3%CF%A4%CE%C0%BC%2F%A5%CD%A5%C3%A5%C8%A5%EF%A1%BC%A5%AF%A5%A8%A5%F3%A5%B8%A5%CB%A5%A2%B5%DE%CA%E7%A1%AA
0801NAME IS NULL04/11/03 02:27:45ID:y6dEl/yN
>>800
ネットワークのプロ募集ちゃうんか?
0802NAME IS NULL04/11/03 12:25:00ID:???
>>801
神が沢山降臨希望のようですので、現在間に合う状況になりそうです。
本体の方も止めてください。本当にありがとうございました。
また必要情報などがありましたらオフィシャルWebサイトにアップしますのでご支援よろしくお願いします。
-- まさたか@川口? 2004-11-03 (水) 10:06:32 New!
0803NAME IS NULL04/11/03 21:59:07ID:???
質問です。

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

table B
3,B
4,B
5,B

でした。
0805NAME IS NULL04/11/04 00:40:43ID:???
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
0806NAME IS NULL04/11/04 00:41:17ID:???
>>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で動くかどうかは知らん。
080780604/11/04 00:42:36ID:???
最後の行を打ち間違えた。

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

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

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

今 確認できる環境がないけど試してみ
0817NAME IS NULL04/11/06 00:33:23ID:???
>>816
ttp://www.postgresql.jp/document/pg721doc/user/functions-datetime.html
'EXTRACT'は'DATE_PART'と同じ
EXTRACTで無理な事はDATE_PARTでも無理
0818NAME IS NULL04/11/06 11:33:32ID:???
>>817
じゃなくて、816さんは構文の違いを指摘してるんでしょ?
extract()とdate_part()は機能は同じだけど、カンマか"FROM"か
という違いがある、と。
あとあまり古いドキュメントのURLを貼らないでね。
0819NAME IS NULL04/11/07 01:50:37ID:???
syozoku namae
001 鈴木
001     佐藤
002 山田
ってデータが入ってるとき
SQLで抽出すると
syozoku namae
001 鈴木
佐藤
002 山田
のように表示させたい場合ってどのようにしたらいいでしょうか?
DBはOracle9iです。お願いします。
0820NAME IS NULL04/11/07 02:34:23ID:???
>>819
0821NAME IS NULL04/11/07 02:38:34ID:???
>>819
副言語でそのまま取り出して、主言語で加工。
0822NAME IS NULL04/11/07 04:38:18ID:???
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
0823NAME IS NULL04/11/07 18:06:43ID:???
MSDEをGUIで操作できるツールってありませんか?
0824NAME IS NULL04/11/07 19:58:57ID:???
ttp://www.asql.biz/DbaMgr.shtm
0825NAME IS NULL04/11/07 22:06:58ID:xiv90rCf
>>824
Italiano?
Portugese?
0826NAME IS NULL04/11/07 23:43:13ID:???
>>823
開発用に使うだけならSQLServer 2000 dev editionはどう?
http://direct.ips.co.jp/PC/Template/Goods/GoodsTemp1.cfm?GM_ID=MSC3235&CM_ID=00300215121&SPM_ID=1003&HN_NO=00300&PM_No=&PM_Class=
0827NAME IS NULL04/11/09 15:51:14ID:???
部門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でなんで希望の処理ができるのかいまいち理解出来ません。
確かに結果は同じように見えるんですが・・・

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

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


でも、dup row になりそうな悪寒。
0829NAME IS NULL04/11/09 20:30:32ID:PvmqmfFE
http://www.keyman.or.jp/ml/907/20041108/A0ABA4/kUqywWAed/
0830NAME IS NULL04/11/09 20:33:35ID:???
>828
いや、もう定型だから後者のように書くけど、ぱっと見でどっちが咄嗟に理解
出来るかといえば前者な漏れ orz

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

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

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

↑これでよいの?
どうも、全検索になってしまうんですが。
(Firebird1.5を使ってます)
0833NAME IS NULL04/11/10 00:06:07ID:???
>>832
FB知らんが、セミコロンの前にエスケープ記号を入れたらいいんじゃね?
083483204/11/10 13:02:20ID:???
>>833
レス、サンクス。

セミコロンのエスケープ記号って、一般的には
何になるのですか?

とりあえず、
1.SELECT * FROM テーブル名 WHERE フィールド名 like '%#;%' ESCAPE '#'
2.SELECT * FROM テーブル名 WHERE フィールド名 like '%\;%'
3.SELECT * FROM テーブル名 WHERE フィールド名 like '%;;%'
を試したところ、1.、2.はヒットせず。
3.だけが、うまくヒットしました。これで良いんですか?
0835NAME IS NULL04/11/10 15:02:46ID:/ScPk9xz
SQLについて全く初心者なため厨な質問で恐れ入ります。
Excel2000のVBAでADOを使ってAccessのデータベースを
読み込もう(Excelのシートにテーブルを展開しよう)としています。

テーブル名が"GROUP"と言うデータベースを読み込むとき、

cmd.CommandText = "SELECT * FROM GROUP"
Set recset = cmd.Execute

とすると
「FROM句の構文エラー」と言われてしまいます。
他のテーブル名のデータベースは読み込めるのですが、
この場合どうすればいいのでしょうか。
ご教示お願いいたします。

ちなみに
cmd.CommandText = "SELECT * FROM 'GROUP'"
としてもだめでした。(「クエリの句が不完全です」)
0836NAME IS NULL04/11/10 15:35:19ID:???
[GROUP]
0837S04/11/10 15:48:35ID:???
すみません。教えてください。
ある値より大きい値求めて、それを昇順で並べ替え、
その最初のデータと同じデータを求めるにはどうすればいいんですか。

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

(1) DELETE FROM TABLE
(2) DELETE TABLE

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

find (DBのデータがあるパス) (調べたいデータをそれなりのバイナリに変換した値)
0903NAME IS NULL04/11/21 09:35:34ID:???
>>902
肝心のスピードが遅いから、ネタとしてもつまらんな。
0904NAME IS NULL04/11/21 12:46:48ID:???
where hoge='ほにゃらら' and rownum=1
で値が返ってくるかどうか
0905NAME IS NULL04/11/21 19:00:27ID:???
rownum=1ってなんじゃ
0906NAME IS NULL04/11/21 19:31:37ID:???
Oracleだね
「where hoge='ほにゃらら'」だけで返ってくる件数が膨大な場合、
確かにrownumを指定することで早く戻ってくるようにはなる
0907NAME IS NULL04/11/21 21:24:17ID:???
OracleのrownumってOrder by前の番号だったような・・・それだとどんな結果が返ってくるんだ??
0908NAME IS NULL04/11/21 22:11:40ID:???
order byなんかが必要なようには見えないが?
アホか
0909NAME IS NULL04/11/21 22:11:46ID:???
データがあるかないかだから、別にどんなクソソートで1軒目が出てきても関係ないような。
0910NAME IS NULL04/11/21 22:12:23ID:???
>>908
知ってる知識を言ってみたかっただけじゃないの?
0911NAME IS NULL04/11/22 03:19:49ID:Cdqu3I2P
where=1
0912NAME IS NULL04/11/22 03:21:19ID:Cdqu3I2P
SELECT *nn
0913NAME IS NULL04/11/23 11:55:35ID: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です。
0914NAME IS NULL04/11/23 13:03:00ID:???
>>913
SELECT (SELECT MAX(id) FROM table WHERE data=T1.data),data FROM table AS T1 GROUP BY data;
0915NAME IS NULL04/11/23 13:06:32ID:???
以下のようなデータって表だけじゃわかりづらい、もうちょっと文章で説明すべき
0916NAME IS NULL04/11/23 15:14:08ID:jlWg8Xtz
select * from (select * from table order by id desc) T group by data
group byで最初に出てくるものが使われると言う保障がある稼動は和紙欄。
0917NAME IS NULL04/11/23 20:18:02ID:???
MySQLってサブクエリ使えたっけ?
0918NAME IS NULL04/11/23 21:18:37ID:???
↑
なんでgoogleやYahoo!の入力欄に同じようなこと書いてボタン押せば
わかることを掲示板で聞くのか理解に苦しむ。
0919NAME IS NULL04/11/23 22:08:23ID:???
>>913のMySQLの質問に対する答えがサブクエリ使ったものばかりだから確認してるだけじゃないの?
0920NAME IS NULL04/11/23 22:17:17ID:???
でも、使えるようになったのは、遙か昔から何度も既出だよな。
0921NAME IS NULL04/11/23 22:21:19ID:???
使えるのって4.1からじゃなかったっけ?
たしか4.1ってマルチバイト対応がイマイチだから本番サーバに誰も使ってないんじゃ?
MySQL5はシラネ
0922NAME IS NULL04/11/24 00:44:03ID:???
>DBはMySQLです。
バージョン書いてない方が悪い
0923ichigo04/11/24 13:10:03ID:???
すいません。
今日の日付以降のデータの中で、1番小さい日付のデータを取得するSQL
を教えてください。
環境はVB.net2003です。
よろしくお願いします
0924NAME IS NULL04/11/24 14:33:46ID:???
SELECT 最小値(日付フィールド) FROM tbl WHERE 日付フィールドが今日以降
0925ichigo04/11/24 16:56:58ID:???
>>>924さんへ
説明不足でした。
今このようにしてるんですけど今日以前のデータが取得されてしまうんですが
どうすればいいのですか。
sql = "SELECT * FROM tblSchedule " & _
"WHERE fldDate=(SELECT MIN(fldDate) FROM tblSchedule " & _
"WHERE fldDate>=" & Format(Now(), "yyyy/MM/dd") & ") " & _
"ORDER BY fldTime;"
0926NAME IS NULL04/11/24 17:16:01ID:???
とりあえず、そのsqlっつー変数にセットされている内容を確認してみれ。
0927NAME IS NULL04/11/25 22:21:24ID:GJuNQxbV
日付に秒まで入ってるんじゃないの?
trun(変数)でもすべし。
0928NAME IS NULL04/11/26 03:05:02ID:???
>>927
>>926が正しい。
日付をクォートで囲ってないので 2004/11/25 ≒ 7.29 になってしまう。
0929ichigo04/11/26 15:10:00ID:???
ありがとうございます。
日付を#で囲ったらできました。
0930なみ04/11/27 01:21:20ID:tK3UBASD
oracle初心者です。
oracleのサービス関連でお聞きしたいことがありますが、
こちらの掲示板でよろしいでしょうか?
0931なみ04/11/27 01:29:53ID:tK3UBASD
Oracle 総合 Session2 がありましたので
そちらに書き込みしました。
お邪魔しました。
0932なみ04/11/27 02:13:03ID:tK3UBASD
ERROR:referer情報が変です。(ref1)http://www.dd.iij4u.or.jp/~cap/iyan.html が表示されてしまいました。
0933NAME IS NULL04/11/27 08:58:55ID:???
なみさん
0934NAME IS NULL04/11/29 10:13:45ID: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

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

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

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

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

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

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

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

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

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

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

試してないのでもし通らなかったらスマン。
0947sage04/12/05 23:12:57ID:QODHCzZH
商品A登録日、商品B登録日という二つの日付型フィールドから、
日付データの新しいほうのデータを取得したいのですが

商品A | 商品B | 商品A登録日 | 商品B登録日
***** **** 2004/12/01 2004/11/01

↓ 抽出結果

商品A | 商品B | 商品最新登録日
***** **** 2004/12/01

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

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

お願いします                 
0962NAME IS NULL04/12/12 03:07:34ID:???
>>961

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



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


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



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


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

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

こんな感じか?
ちなみに眠いからテストはしてないYO。
097396804/12/14 04:16:16ID:8peVtg2k
>972
サンクス
できました
0974NAME IS NULL04/12/14 15:09:46ID:gYkAsbc2
Prologプログラマです。一応その視点からの皆さんへの質問です。
皆さんは、SQLの仕様に不満はありませんか。
0975NAME IS NULL04/12/14 15:18:36ID:???
Prologなんて知らねーから、その視点とか言われても知らん。
0976NAME IS NULL04/12/14 15:24:49ID:???
>>974
:-)
0977NAME IS NULL04/12/14 15:42:57ID:???
SQLはいわゆる第三世代言語ともオブジェクト指向言語とも相性が
悪いのが難点なのだが。Prologとは仲良しなのかね?
0978NAME IS NULL04/12/14 15:45:16ID: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
0979NAME IS NULL04/12/14 16:23:58ID:gYkAsbc2
>977 私も含めて、オンメモリーのリレーショナルデータベースとして
Prolog、バックエンドにRDBMSを配置しC言語インターフェイスで繋ぐ
というのが一般的なようです。Prologのデータベースに見つからない時
ORACLEから探すというような使い方をすることもあります。
ただ、私はProlog以前はSQLが専門だったので平気なのですが、
一般にPrologプログラマからはSQLの仕様は評判が悪い。副照会の
辺りに批判が集中するようです。一方、Prologは集約に弱い。
それから、全解探索機構がかえって仇となって、すべてシーケンシャル
サーチになってしまう。いくらオンメモリーでも100万件を超えると
やはり大変です。そんなことでSQLをPrologに変換するのは簡単ですが、
Prologコードを解析して最適なSQL文を生成するのは案外むずかしい。
それで、Prologを書けば、勝手にそれに対応するSQLが生成されて、
自由自在に行き来すると云うわけにはなかなかいきません。
0980NAME IS NULL04/12/14 19:33:16ID:qbSzLZbl
質問なのですが
カラムのUNIQUE指定を外す構文を教えてください。
0981NAME IS NULL04/12/14 19:56:47ID:???
知りません。
0982NAME IS NULL04/12/14 20:53:06ID:???
  ∧ ∧     ┌───────── 
  ( ´ー`)   < シラネーヨ 
   \ <     └───/|──── 
    \.\______// 
      \       / 
       ∪∪ ̄∪∪ 
0983NAME IS NULL04/12/14 22:59:30ID:???
>>982
なつかしー
0984NAME IS NULL04/12/15 00:37:20ID:???
>>982
こいつ最近見ないと思ったら、久々の登場だな。
0985NAME IS NULL04/12/15 10:09:25ID:???
SQLの勉強始めようと思っています
本当に初歩的な質問&多少すれ違いで申し訳ないんですが・・・

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

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

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

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

何か良い方法はないでしょうか?
0989NAME IS NULL04/12/15 18:17:20ID:???
>>988
SELECT DISTINCT A.name,B.keyword FROM A JOIN B USING(id);
でいいのか? なんか、それ以前に(ry
0990NAME IS NULL04/12/15 19:51:58ID: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.他の方法で実現する方法
を教えていただけないでしょうか。
よろしくお願いします。
099199004/12/15 19:53:52ID:wKX08Pae
すみません。SQLを切り貼りして中途半端に修正してました。
正しくは
SELECT ORDER.SECTION, Sum(ORDER.ACCOUNT)
FROM ORDER
GROUP BY ORDER.SECTION
ORDER BY Sum(ORDER.ACCOUNT) DESC;
です。
どなたかよろしくお願いします。
0992NAME IS NULL04/12/15 19:57:17ID:???
>>991
SELECT ORDER.SECTION, Sum(ORDER.ACCOUNT) AS Total
FROM ORDER
GROUP BY ORDER.SECTION
ORDER BY Total DESC;
で、どぉ。
0993NAME IS NULL04/12/15 20:51:01ID:???
>>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じゃねえかよ。
0994NAME IS NULL04/12/15 21:20:04ID:PR2HhgMt
次スレを立ててみますた。

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

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

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