SQL質疑応答スレ
レス数が1000を超えています。これ以上書き込みはできません。
0001名無しさん@お腹いっぱい。
03/06/30 20:46ID:m1O8kdcm0002名無しさん@お腹いっぱい。
03/06/30 20:49ID:vwwrk7GD0003名無しさん@お腹いっぱい。
03/07/02 14:38ID:???0004あぼーん
NGNG0005あぼーん
NGNG0006あぼーん
NGNG0007あぼーん
NGNG0008あぼーん
NGNG0009あぼーん
NGNG0010あぼーん
NGNG0011あぼーん
NGNG0012あぼーん
NGNG0013あぼーん
NGNG0014あぼーん
NGNG0015あぼーん
NGNG0016あぼーん
NGNG0017あぼーん
NGNG0018あぼーん
NGNG0019あぼーん
NGNG0020あぼーん
NGNG0021あぼーん
NGNG0022あぼーん
NGNG0023あぼーん
NGNG0024あぼーん
NGNG0025あぼーん
NGNG0026あぼーん
NGNG0027名無しさん@お腹いっぱい。
03/07/14 15:52ID:Cb391GNeOracleなどほとんどの商用DBはSQL92どまりらしいけど。
0028山崎 渉
03/07/15 11:19ID:???__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
0029あぼーん
NGNG0030ぼるじょあ ◆ySd1dMH5Gk
03/08/02 05:12ID:???ピュ.ー ( ・3・) ( ^^ ) <これからも僕たちを応援して下さいね(^^)。
=〔~∪ ̄ ̄ ̄∪ ̄ ̄〕
= ◎――――――◎ 山崎渉&ぼるじょあ
0031名無しさん@お腹いっぱい。
03/08/12 16:39ID:???0032山崎 渉
03/08/15 22:17ID:???│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
0033あぼーん
NGNG0034山崎 渉
03/08/15 22:30ID:???│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
0035名無しさん@お腹いっぱい。
03/08/19 03:00ID:???0036あぼーん
NGNG0037あぼーん
NGNG0038名無しさん@お腹いっぱい。
03/08/25 21:26ID:OQMUnVn10039名無しさん@お腹いっぱい。
03/08/25 22:50ID:???連結元の件数が多ければ、RIGHT JOIN
連結先の件数が多ければ、LEFT JOIN
0040名無しさん@お腹いっぱい。
03/08/26 00:36ID:???おいおい(w
0042名無しさん@お腹いっぱい。
03/08/30 15:07ID:???0043名無しさん@お腹いっぱい。
03/09/08 05:23ID:mSUFriDxno hinmei kisetu
1 りんご 夏
2 キャベツ 春
3 リカヴィネ 終
ってデータが入ってるとき
りんごと夏をいっぺん みかん 冬などにupdate出返ることはできるんでしょうか?
どの本を見ても、set hinmei='みかん' where no='1' みたいな書き方しか書いてません。
updateを2回書けば出来るとは思いますが、一回で出来る方法があったら教えてください
0044名無しさん@お腹いっぱい。
03/09/08 05:38ID:mSUFriDxupdate について質問なんですが
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:???0046NAME IS NULL
03/10/13 10:52ID:???0047NAME IS NULL
03/10/16 02:51ID:???1行でエラーが発生しました。
ORA-00925: INTOキーワードがありません。
0048NAME IS NULL
03/11/04 04:11ID:???SQLServerならINTOを省略できるから間違いじゃない
0049NAME IS NULL
03/12/18 10:16ID:mo4ixJvn0050NAME IS NULL
04/01/13 23:07ID:ryPWdc91値の取得に困ってしまいました。
どなたか知恵を貸してください。
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 NULL
04/01/14 18:30ID:???0052NAME IS NULL
04/01/14 21:30ID:ROKXiftAまずいですか?3.23.58
005350
04/01/15 01:26ID:VcgRyZxpmysqlの3.xだとどのような問題があるのでしょうか?
もしかして4.xだと大丈夫なのですか?
0054NAME IS NULL
04/01/15 22:20ID:???005550
04/01/17 01:01ID:???う〜ん。使ってるレンタル鯖が3.2・・・。
ありがとうございました。
0056NAME IS NULL
04/01/20 02:26ID:hoZb2qM0SELECT * FROM table ORDER BY itemA
のitemAの順を、
3,2,1,0,4 のように4を最後に並ばせる方法ってないでしょうか?
どうぞよろしくお願いします。
0057378
04/01/20 04:43ID:luLzxi/Zelse 3 - itemA
end as SortKey
FROM table
ORDER BY SortKey
でどうでしょう?
0058NAME IS NULL
04/01/20 05:30ID:I5YcFOkyありがとうございます。
SQL初心者なんで、教えていただいた構文を調べながら(初めて見る構文があるので)、
試してみます。本当に感謝デス。
0059NAME IS NULL
04/01/20 07:34ID:ETLdlIOQhttp://www.k-514.com/
0060NAME IS NULL
04/01/21 04:26ID:zGXdiK63TABLE2 (id 0,2,4)
という二つのテーブルを結合する時に「TABLE2に同じIDが無い」という条件で
TABLE1のIDを取得出来ないでしょうか?
OracleのSQLで教えて頂けると助かります。
教えて!エロい(略
0061NAME IS NULL
04/01/21 04:39ID:zGXdiK63EXCEPTを使って取得したレコードを
副問い合わせとして再度TABLE1と結合しております。
もうちょっとスマートに書けないでしょうか?
0062NAME IS NULL
04/01/21 05:19ID:???WHERE id NOT IN (SELECT id FROM table2)
0063NAME IS NULL
04/01/22 00:26ID:???> EXCEPTを使って取得したレコードを
この意味がよくわからんのだが…
select * from TABLE1 t1
where not exists ( select 'x' from TABLE2 where ID = t1.ID)
0064NAME IS NULL
04/01/22 03:39ID:WDrQMFPjまるまる解決しました。あー今月来月分の仕事終了です。
何か一つお礼がしたいんですが、最近悩んでいる事とかありませんか?
>>63
select t1 except select 2して引き算したテーブルを作っていました。
not に続く処理が頭から完全に飛んでたのでもっかい覚え直しました。
ご指摘ありがとうございました。
0065NAME IS NULL
04/01/22 22:57ID:???minusじゃなくて?
0066NAME IS NULL
04/01/23 05:37ID:???妹さんを私にください
0067NAME IS NULL
04/01/23 17:41ID:TwaTmWW+0068NAME IS NULL
04/01/24 01:01ID:9DEbow83単にテーブルをつなげるだけなら内部結合でも外部結合でもいいと思うんだけど・・・
0069NAME IS NULL
04/01/24 02:30ID:???0.1秒で理解できる
0070NAME IS NULL
04/01/24 10:40ID:???お前なぁ・・・
マソコとアナルじゃ全然違うって事くらいわかるだろ?
0071NAME IS NULL
04/01/25 21:09ID:iduq6cK/>>68さんを差し上げます。外部結合でお悩みですので、是非実践を交えて
教えてあげてください。むしろ妹信奉者ですか?
0072NAME IS NULL
04/01/28 22:55ID:???結合後の表には使えないんでしょうか?
;; 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 NULL
04/01/28 23:48ID:???select name
from (select * from student natural join enrolled) A
group by ...
こうなら書けるけど。
うーん…
0074NAME IS NULL
04/01/31 06:31ID:???以下のコマンド
delete from syscat.packages where pkgname ="XXX" and pkgschema = 'YYY'
を実行したところ
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL
処理中に、そのコマンドが返されました。
SQL0607N "DELETE" はシステム・オブジェクト用に定義されていません。
SQLSTATE=42832
というエラーが発生してDELETEできませんでした。
このコマンドを成功させる為に
DELETEをシステム・オブジェクト用に定義するには
どのようにすればよいのでしょうか?
それともそもそもコマンドが間違っているのでしょうか?
データベース:DB2V8
0077NAME IS NULL
04/02/02 16:21ID:sPKbo93rCOBOLからSQL使ってます。
delete文を発行してDBの削除をしてるのですが、、、
削除の際に、削除件数を取得することは出来ますか?
deleteを発行する前に、selectCountするしかないのでしょうか?
0078NAME IS NULL
04/02/02 21:23ID:???0079
04/02/03 13:41ID:Vsq7rVXOpostgreSQLですが、
hoge INTEGER UNIQUE で定義したカラムに
INSERT INTO で重複した値を入れたときにエラーが出るんですが、
「無い物だけINSERTして重複したものは捨てる」という
使い方をしたいのです。エラー回避の方法をご教授ください。
エラーコード "Cannot insert a duplicate key into unique index" を
strstr() で比較して一致したらプログラムが止まらないようにしてみました。
いいのかしら、こんなのでも。
0081NAME IS NULL
04/02/05 00:06ID:???キーが重複してないものだけINSERTすればいいんじゃない。
重複してないチェックをどうやるとスマートに行くんでしょうか。
select user from tbl where user=a; で件数0を確認してから
insert すると、とんでもなく遅いんですが。
0083NAME IS NULL
04/02/05 19:50ID:???insert投げる前にキーが被ってないか確認してから投げろ。
updateなら、insertするデータと同じキーをdeleteしてからinsertしろ。
0084NAME IS NULL
04/02/06 10:27ID:???WHERE句で指定できるだろ。
0085NAME IS NULL
04/02/15 13:31ID:9pK84ZeXselect 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です。
008685
04/02/15 14:46ID:9pK84ZeX0087NAME IS NULL
04/02/15 19:54ID:???for( ... ) {
try {
stmt.executeUpdate("insert .... ");
} catch(SQLException e) {}
}
でいいと思うんだが。っていうか俺そうしてるし。
0088NAME IS NULL
04/02/16 06:21ID:ae9l//XGに相当するものがあると思うのだが
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 NULL
04/02/16 20:02ID:/mbbqIps0091NAME IS NULL
04/02/16 22:44ID:???0092NAME IS NULL
04/02/21 00:15ID:???無くても一意な構文になんだろーがよっつーコマンドがすげー多いかと。
ピュアな英文に近づけようという努力だと思うけど余計なお世話かと。
つーか邪魔かと。
0093NAME IS NULL
04/02/22 11:56ID:???SQLServerはかなり省略できるところが多い
それに慣れると他で書くときに戸惑うが。
0094NAME IS NULL
04/02/22 13:53ID:???そーなんだ。自分Oracleオンリーロンリー
0095NAME IS NULL
04/02/23 15:08ID:Ne2ZGl5J$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 NULL
04/02/23 15:41ID:DcJjCQuL三重県警四日市南署は、同県四日市市内のスーパーで、今月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 NULL
04/02/24 10:00ID:I8JzCQL6SELECT NO FROM HOGE
のようなSQLでNOの出力を ( ) で囲んで出力したいのですが、どうしたらよいでしょうか?
(5678)
(7789)
(6783)
のようにしたいのですが。
0098NAME IS NULL
04/02/24 11:12ID:???PostgreSQLなら、|| だが、ほかは知らん
0099NAME IS NULL
04/02/24 17:59ID:u8c4IGLnA B
01 02
02 04
04 06
05
A・Bというテーブルから
C
01
02
04
05
06
Cを作りたいときはどうすればいいんでしょうか。
どちらにもあるときはどちらか、片方しかないときは
あるもの、どちらにもないときは出さない。という形です。
うまいJOINの使い方がわかりません。
0100NAME IS NULL
04/02/24 22:15ID:???UNIONじゃダメなの?
0101NAME IS NULL
04/02/25 10:40ID:nmQBoTK6UNIONでいけました。
UNIONでいけるけど、遅くなってしまうようです・・・otz
ABを各INSERTして仮想テーブルに入れてGROUPBYでCを作ってたんですが、
実行速度が遅くてほかの手段を考えてたんです。
ありがとうございます。
0102NAME IS NULL
04/02/25 14:21ID:???連結演算子でいけました。
MS SQL でしたので、+でした。
ありがとうございました。
0103NAME IS NULL
04/02/26 02:00ID:eh35xVEj0104NAME IS NULL
04/02/26 02:10ID:pYxJcbTI0105NAME IS NULL
04/02/26 17:13ID:blydrWJ8SQL文でスペースのみが帰ってくるSELECT文を作りたいのですが、
方法がわかりません。
SELECT A,B,スペース FROM TABLE1
といった感じにしたいのです。
ちなみにORACLE9iです。
SQLSERVERだと
SELECT A,B,SPACE(20) FROM TABLE1
という風にできるみたいなのですが・・・。
0106NAME IS NULL
04/02/26 19:29ID:???SELECT A,B,''
FROM TABLE1
0107NAME IS NULL
04/02/26 19:30ID:???SELECT A,B,' '
FROM TABLE1
0108NAME IS NULL
04/02/26 19:30ID:???SELECT A,B,' '
FROM TABLE1
0109NAME IS NULL
04/02/27 00:27ID:fCj3A/6Aそういう関数あるよ。Oracleだけど。
LAST_DAYだっけかな。
0110NAME IS NULL
04/02/27 01:03ID:???| 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 NULL
04/02/27 03:13ID:???1.from句に3つ書く。(table1,table2のid1-sub_id-sub_id_value,table2のid1-min(date))
2.上記3つをjoin
で出来る気がする。
#RDBの名前とバージョン位は書いて。。。
0112NAME IS NULL
04/02/27 13:26ID:???0113NAME IS NULL
04/02/27 14:54ID:qYf9aHRSおっしゃる通りです。
間違えです。
ちなみにMySQL最新版です。
0114NAME IS NULL
04/02/27 20:42ID:???foreach($list as $key => $value){
UPDATE table SET num = $value WHERE id = $key;
}
とループ処理の中にUPDATE文を入れても問題ないのでしょうか?
それともこういうやり方は良くないのでしょうか?
0115NAME IS NULL
04/02/27 23:23ID:???それ何の言語よ?
0116NAME IS NULL
04/02/28 01:03ID:???PHPです。。
0117NAME IS NULL
04/02/28 10:58ID:???そのループがどの程度回るかにもよるな。
多くても数十回程度ならさほど問題ないと思うjが。
数万とか回る可能性があるなら別の方法を検討したほうが良い。
0118NAME IS NULL
04/02/28 16:20ID:???そうですか・・・
ループは多くても50回くらいです。
テーブルを行ごとに違う値で初期化しようと
思ったのですが、どうやら問題なさそうですね。
本当は一度に初期化できるような方法があればベストですが・・・
0119NAME IS NULL
04/02/28 17:02ID:yUYsACosなんで大手新聞は報道しないんだ?
http://ahiru.zive.net/joyful/img/901.jpg
http://ahiru.zive.net/joyful/img/902.jpg
0120NAME IS NULL
04/03/10 10:11ID:Sgv/7OC0データの型がNumber型の項目を前方一致検索したいんですけど、
検索条件の値が数字でない文字列(zとかxとか)であった場合、
SQLの文法だけで対応できるものなのでしょうか。
結果としては「ヒットせず」で正常に終了させたいんですけど。
WHERE句の条件でなにか関数使わないとだめですかね。
使うとしたらどういうもんがいいんでしょう・・・。
へぼくてすいませんです。
0121NAME IS NULL
04/03/10 20:35ID:???RDBのバージョンぐらい書け
ORACLEでの方法だがTO_CHAR(NUMBER型の項目) LIKE '検索文字列%'
0122NAME IS NULL
04/03/12 00:23ID:???0123NAME IS NULL
04/03/17 17:33ID:???>121 の方法を使ったとしても、
'100%' とあったら、100 でも 1000 でも 10000 でもヒットしちまうわけだが、
それってどういう意味を持つ検索なんだ?
0124NAME IS NULL
04/03/18 07:24ID:???0125NAME IS NULL
04/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 NULL
04/04/03 13:09ID:???WHERE
key = number(0) OR
key = number(1) OR
…
key = number(n)
0127NAME IS NULL
04/04/05 08:51ID:???解決しました!ただ
key = number(n) OR
をn回分、Forで回して付け足せばいいだけのことでしたorz
本当にありがとう御座います!
0128NAME IS NULL
04/04/05 13:19ID:udoPtN7vSELECT mode(hoge) FROM fuga
などというふうにして、fuga表のhoge列最頻値が求められればいいのですが…
最悪、DISTINCT句でhoge列の取りうる値を全てリストアップし、それぞれ
SELECT count(hoge) FROM fuga WHERE hoge = 'arege'
などと数えようかと思ってますが…
0129NAME IS NULL
04/04/05 13:54ID:???Oracleは知らんので、とりあえず、1行目のhogeが最頻値
SELECT hoge,COUNT(*)AS cnt FROM fuga GROUP BY hoge ORDER BY cnt DESC;
0130NAME IS NULL
04/04/05 14:16ID:???借りてるレンタル鯖でMySQLが使えるのですが、どうやってアクセスしたらいいのでしょうか?
SSHもTelnetも使えないようなのです。
よろしくお願いします。
0131NAME IS NULL
04/04/05 14:33ID:???鯖屋に聞けよ。
0132NAME IS NULL
04/04/05 15:34ID:???よろしくお願いします。
0133NAME IS NULL
04/04/05 15:37ID:???0134NAME IS NULL
04/04/05 15:45ID:???0135NAME IS NULL
04/04/06 02:16ID:NYkMvrBLACCESSで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 NULL
04/04/06 06:57ID:???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 NULL
04/04/06 18:01ID:c+YhLR8oなるほど!ASをつかえば良いんですね。
ありがとうございます
0138NAME IS NULL
04/04/07 01:29ID:???いや、ASを使うとかは関係ない
>>135のSQLと見比べてみな
0139NAME IS NULL
04/04/07 12:56ID:???0140NAME IS NULL
04/04/07 18:36ID:???レポート作成するのってどうコーディングするべきなのでしょうか?
0141NAME IS NULL
04/04/07 18:37ID:???0142NAME IS NULL
04/04/12 15:30ID:XPJNTJHE「複合キー」というのは、1つの行において、
複数のカラムを合わせたモノを1つのキーとして扱うという感じでしょうか?
0143NAME IS NULL
04/04/12 15:50ID:???正解
0144NAME IS NULL
04/04/12 17:58ID:XPJNTJHEクスコ
んじゃ、
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 NULL
04/04/12 21:10ID:???不正解
複合キーというのは、候補キーの一つ。
つうことで、正確に言うと>>142も半分正解か。
複合キーというのは、二つ以上のカラムを合わせてuniqueとなるキー。
>>144の例だとidだけで行を特定できるので、and depId='0500'は全くの不要だし。
0146NAME IS NULL
04/04/12 21:20ID:???そうか?
0147NAME IS NULL
04/04/12 23:16ID:eYJS7Ezv0148表領域の変更について
04/04/13 00:28ID:I8fFeKV0Table単位で、表領域の変更をしたく思います。
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 NULL
04/04/13 09:55ID:???SELECT 名称 FROM TBL1 WHERE SUBSTRING ( コード FROM 2 FOR 1) = '1';
0152NAME IS NULL
04/04/13 11:20ID:???0153NAME IS NULL
04/04/13 11:23ID:???サブクエリを覚えて嬉しいんだYO
0154NAME IS NULL
04/04/14 00:58ID:sNa3vHBTid 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 NULL
04/04/14 08:00ID:???tbl1.name = tbl2.keyword ってことなら、
UPDATE tbl1 SET name=tbl2.keyword FROM tbl2 WHERE tbl1.keyword_id=tbl2.keyword_id;
で、できる。
しっかし、こういうメンテみたいな事を、日常的に発生するのか?
メンテとか仕様変更程度なら、プログラム側でループさせてもいいような気もする。
0156NAME IS NULL
04/04/14 09:16ID:goCOTvMk>複数のカラムを合わせたモノを1つのキーとして扱うという感じでしょうか?
これ以外の複合キーってあるんかな?
0157NAME IS NULL
04/04/15 14:44ID:kKTGTXIq1
2
3
:
と出力されるような関数または技はありますか?
0158NAME IS NULL
04/04/15 17:01ID:jvLa74JA20050 200 50
20000 100 50
30000 100 00
このような感じのテーブルから、項目Aが項目B+項目Cの形になっている物を
取得したいのですが。
それと、日付型との比較の仕方も教えてもらえないでしょうか。
0159NAME IS NULL
04/04/15 17:30ID:???SELECT * FROM t1 WHERE 項目A = 項目B||項目C;
日付型との比較って?
0160NAME IS NULL
04/04/15 17:47ID:jvLa74JAできました。ありがとうございます。
あと、二つ目の質問の方は
項目D(日付/時刻型)
2004/04/01 12:00:00
2004/05/01 12:00:00
2004/04/15 12:00:00
このようなテーブルから、今日の日付よりも大きい物を取得したいのですが。
0161NAME IS NULL
04/04/15 18:33ID:???WHERE CAST(項目D AS DATE) > CURRENT_DATE;
0162NAME IS NULL
04/04/16 10:53ID:dIVUU8kIありがとうございます。
あと、項目Dが1月以上前の日付になっているデータを取り出すやり方も教えて貰えないでしょうか。
0163NAME IS NULL
04/04/16 13:44ID:J3JWWPjP「こういう方法でここまで調べて、こんな状況まではたどり着いたけど、
ここから先はどうすればいいのか」
みたいな感じでさ。
0164NAME IS NULL
04/04/16 14:25ID:???たぶん日本語の勉強も必要だな。ヒントだけ。
WHERE CAST(項目D AS DATE) < CURRENT_DATE - 一ヶ月 ;
0165NAME IS NULL
04/04/18 04:34ID:???ALL OUTER JOIN をやるにはどうしますか?
0166NAME IS NULL
04/04/20 00:37ID:???8i以前ってことか?
左外部結合するSQL
UNION
右外部結合するSQL
0167NAME IS NULL
04/04/20 01:09ID:???FULL OUTER JOIN じゃないのか?
0168NAME IS NULL
04/04/23 03:24ID:???0169NAME IS NULL
04/04/23 11:12ID:BroRaDV40170NAME IS NULL
04/04/23 12:11ID:???0171NAME IS NULL
04/04/23 15:42ID:???0172NAME IS NULL
04/04/23 16:55ID:???INSERTしておいてROLLBACKする方がいいなw
0173NAME IS NULL
04/04/23 17:24ID:???ループ処理したいなw
0174NAME IS NULL
04/04/23 17:28ID:???0175NAME IS NULL
04/04/25 02:15ID:OEZtU36xVALUE_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 NULL
04/04/25 02:16ID:OEZtU36x0177NAME IS NULL
04/04/25 02:22ID:OEZtU36xTAB_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 NULL
04/04/25 16:07ID:???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 NULL
04/04/26 21:30ID:9BxX3SKmid|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 NULL
04/04/26 23:08ID:hVx47epUテーブル名の前にユーザー名をつけないとSELECTできません。
テーブル名だけでSELECTできるようにするには、どのように設定したらよいでしょうか?
Enterprise Managerとかで設定できそうな気がするのですが、わかりません。
どうぞよろしくお願いいたします
0181180
04/04/26 23:36ID:hVx47epU0182NAME IS NULL
04/04/26 23:42ID:???list()のような集約関数がないとむりぽ。
0183179
04/04/27 00:00ID:ZINPSHoZこれ、むりぽなんですか?
よく使われそうな気がするんですけど。。
0184NAME IS NULL
04/04/27 05:06ID:???一般的にRDBでは動的にカラムを増やすようなことしない。
やるとすれば↓のような結果をもらってクライアント側で処理する
id|value1|value3
--+------+---------
1|aaaa |hhhh
1|aaaa |iiii
2|bbbb |jjjj
3|cccc |
0185NAME IS NULL
04/04/27 20:21ID:???0186NAME IS NULL
04/04/29 13:23ID:???0187NAME IS NULL
04/05/05 18:22ID:???左右が逆かもしれないけど...
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 NULL
04/05/05 22:27ID:???まぁ、趣味は人それぞれだからな・・・
0189NAME IS NULL
04/05/05 23:55ID:???で、バックアップしたデータを突っ込んでいるテーブルのバックアップはどうするんだ?
0190NAME IS NULL
04/05/08 01:52ID:PG+kCctRまず、次の二つのテーブルがあるとします。
・2chねらーテーブル
ユーザID(PK)
・スレ立てテーブル
ユーザID(PK)
スレ立て日付
クソスレフラグ(デフォルト = '0')
2chが会員制という前提ですが、2chねらーテーブルには2ch会員全ユーザが、
スレ立てテーブルには、スレを立てたユーザIDとスレ立て日付が。
また、立てたスレがクソスレと認定されれば、クソスレフラグに'1'が入るものとします。
この2テーブルから、 優良2chねらーを抽出したいのです。
優良の定義とは・・・
・クソスレを立てていない(クソスレフラグ = '0')
・そもそもスレを立てたことがない(スレ立てテーブルに該当IDなし)
というものです。
これを、一回のSQLで実現させる方法はないでしょうか?
よろしくお願いします。
0191NAME IS NULL
04/05/08 03:11ID:???update スレ立て set クソスレフラグ=0 where ユーザID='漏れ';
select ユーザID from 2chねら
where ユーザID not in (select ユーザID from スレ立て where クソスレフラグ=1);
0192NAME IS NULL
04/05/08 07:32ID:???update文は関係ないだろ。あと、INよりEXISTSの方が高速。
SELECT ユーザID FROM 2chねらー
WHERE NOT EXISTS (SELECT * FROM スレ立て WHERE スレ立て.ユーザID=2chねらー.ユーザID AND クソスレフラグ=1);
0193NAME IS NULL
04/05/09 21:12ID:???SELECT * FROM 2chねらーテーブル
WHERE ユーザID NOT IN
(SELECT ユーザID FROM スレ立てテーブル WHERE クソスレフラグ<>'0')
0194NAME IS NULL
04/05/10 11:34ID:???0195190
04/05/14 02:02ID:OjLux1Gu皆さんの回答を参考に、なんとか問題解決出来ました。
普段は select なんちゃら from なんちゃら where なんちゃら order by なんちゃら
この程度のSQLで実現できる、単純業務に従事する漏れ。
これじゃ、いつまでたってもスキルアップは望めませんな・・・
もっと勉強しないといかんなぁ。
0196NAME IS NULL
04/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
としたいのですがどうしたらよいのでしょうか?
お願いします、教えて下さい!
0197196
04/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 NULL
04/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 NULL
04/05/14 13:08ID:???>テーブル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 NULL
04/05/14 13:17ID:???SELECT キャラ,萌え度,キタ回数,coalesce(作画枚数,0) from デジコ LEFT OUTER JOIN プチコ Using(キャラ);
0201NAME IS NULL
04/05/16 18:29ID:e1RqkHtX良いですか?
select a,b
from (a left join b) as table3
↑省略しすぎ(汗
としてもエラーになってしまうし困っています。
ちなみに.MDBです。
よろしくお願いします。
0202NAME IS NULL
04/05/17 02:08ID:???0203NAME IS NULL
04/05/17 09:19ID:???Oracleにはdate_partって関数はないのか?
0204NAME IS NULL
04/05/17 11:42ID:???( )必要だっけ?
0205NAME IS NULL
04/05/17 19:20ID:n2kYxM4xいや全く必要ない。
で回答はどこ?
0206NAME IS NULL
04/05/17 19:33ID:???0207NAME IS NULL
04/05/17 21:26ID:n2kYxM4xDB板はスレ違いかも知れないと今気づきましたが、
気づかないフリで説明します。
VB.netでは複数のテーブルをJOINするとtableという自動で仮名がつきます。
全く同じデータセットに同じテーブル名(table)をいれると
???としたエラーが炸裂するのでどうしてもJOIN後にテーブル名を
付けたいんです。こんなケースはDB単独では珍しいらしく手持ちの
SQL本には記載がなかったりする。
レスサンスコ。まだ会社(泣
0208NAME IS NULL
04/05/17 23:00ID:???TO_CHAR(DATEカラム, 'mm') = '1'みたいに文字列に変換すればいいのでは?
0210NAME IS NULL
04/05/18 10:24ID:???from (SELECT a,b FROM a left join b) table3
0211NAME IS NULL
04/05/18 10:42ID:FLZcxqMKどうもありがとうございます。これで何とかなりそうです。
0212NAME IS NULL
04/05/18 11:48ID:+5UV1MyO神さまありがとうございます。
0213NAME IS NULL
04/05/18 17:28ID:???0214NAME IS NULL
04/05/18 22:33ID:???例えば、
id
----
1
2
3
を
1,2,3
の様にSQLのみで1行で取得するにはどうすればいいでしょうか?
よろしくお願いします。
0215NAME IS NULL
04/05/19 02:23ID:???マルチ
0216NAME IS NULL
04/05/19 19:23ID:???マルチだが答えてやるこんちくしょう
ピボットテーブル
でぐぐれうんこ
あとSQL入門書(定番のSQLポケットリファレンスでいいぞ)買って来いヘタレ野郎
0217NAME IS NULL
04/05/20 14:00ID:+X5a+mzG視聴者 萌え1 萌え2
----------------------------------
A ミドリ ヒナタ
B アヤセ テマリ
を↓の表にするビュー作成を教えてください・・。
視聴者 萌え
A ミドリ
A ヒナタ
B アヤセ
B テマリ
0218NAME IS NULL
04/05/20 14:45ID:???0219NAME IS NULL
04/05/20 20:52ID:+w96lQEkを繋げて新しい文字列を作るのってどうやるのですか?
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 NULL
04/05/21 01:25ID:???FROM (
SELECT 視聴者, 萌え1 萌え
FROM アニオタ
) UNION (
SELECT 視聴者, 萌え2 萌え
FROM アニオタ
)
ORDER BY 視聴者;
0221NAME IS NULL
04/05/21 12:26ID:???convert とか cast とか
0222NAME IS NULL
04/05/22 03:00ID:3pK+cfvKあるフィールドの値がhogeだったら、とかの条件で
外部exeを起動する方法ってあるのでしょうか?
よろしくお願いします。
0223NAME IS NULL
04/05/22 03:38ID:3pK+cfvK0224NAME IS NULL
04/05/23 18:32ID:3VGGJqhwselect文でfromとwhereはどちらが先に解釈され、
条件が絞り込まれるのでしょうか?
またsql命令の優先順位や処理速度を調べる良い文献などはないでしょうか?
おねがいします。
0225NAME IS NULL
04/05/23 19:26ID:???各句の意味を考えればだいたい判ると思うぞ。
つか、FROMとWHEREの優先順位すら判らないというのは、
重症だぞ。
0226NAME IS NULL
04/05/23 20:11ID:???0227224
04/05/23 21:24ID:MO/uZXID重症ですか(鬱)
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 NULL
04/05/23 21:36ID:???0229NAME IS NULL
04/05/23 21:38ID:???どのWHEREがFROMより上だってか?
で、文献だけど、漏れは「プログラマのためのSQL」
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894714809/250-9004556-6950643
を読んでいる。
0230224
04/05/23 21:56ID:MO/uZXID実践だけだと馬鹿にされるよー
特定できなくってすまんね。で優先となってるポイwhereは
where (c.order = ?) の部分
from句部分よりwhere句部分が優先になることが、納得いかなかったのですが
やはりfrom句部分が優先のはずなのですね?(テーブルの条件を記述する以上
当然かもしれませんが)
文献は明日でも本屋に行って確認してみます。
ありがとう
0231NAME IS NULL
04/05/23 22:34ID:???(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 =? の抽出をしているはずだが違うのか?
0232224
04/05/23 22:48ID:MO/uZXIDその解釈で正解だとわたしも思います。
テスト用の環境(Rowが2・3行)で無知な人間がたまたまテーブル設計をしたので
fromよりwhereが優先のように見えたのでしょうねきっと。
でも>>229さまのおかげでもっと深くまで理解できそうです。
レスさんくす
0233NAME IS NULL
04/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 NULL
04/05/24 11:39ID:???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;
0235233
04/05/24 11:49ID:+HRlZqXPありがとうございます。データ取得できました!
心苦しくももう一つお聞きしたいのですが、IDの値を指定して
データを取得したい場合は、副問合せというものを使用すれば
よいのでしょうか?
0236NAME IS NULL
04/05/24 12:00ID:???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;
0237233
04/05/24 14:35ID:+HRlZqXPありがとうございます。
データは取得できたのですが、先生から
「副問合せ使え!ゴルァ!」と言われてしまいました。
副問合せ全くわからないです。
ネットで調べても2テーブル使用例しか発見できず・・・。
色々試行錯誤してみましたが、変な風にデータが取れてきてしまいます。
本当に申し訳ないのですが、教えていただけないでしょうか?
いや、ほんと厚かましいと思っているんですが。
0238無駄じゃ
04/05/24 14:53ID:???FROM tb1,tb2,tb3 WHERE tb1.id=tb2.id AND tb2.cd=tb3.cd) tbl4
WHERE tbl4.id=1
0239NAME IS NULL
04/05/24 15:02ID:???副問い合わせ? ひょっとしたら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;
0240233
04/05/24 15:04ID:+HRlZqXP2chで初めて神に遭遇しました。
ありがとうございます!
このSQLを元に副問合せを勉強します。
SQL自体に挫折しかかっていたので、
色々な意味で本当に助かりました!
0241233
04/05/24 15:08ID:+HRlZqXPなんでもデータ件数が多くなった場合に、効率よく
処理するために副問合せを使うとの事だったんです。
そういうやり方もあるんですか。
試してみます。
ありがとうございます!
0242NAME IS NULL
04/05/24 15:16ID:???ああ、効率を考えるなら、
SELECT * FROM (SELECT * FROM tb1 JOIN tb2 USING(id) WHERE id=1)AS tb4 JOIN tb3 USING(cd);
だな。
しかし効率は、 WHERE id=1 を最初に持ってきた>>236 と同じ。
0243NAME IS NULL
04/05/26 14:36ID:???固定長のデータを取り込む際に、文字列の後ろについた空白を削除して
データをINSERTしたい場合は、
FIELD3 POSITION(16:23) CHAR "to_date(:FIELD3,'YYYYMMDD')"(これは日付ですが・・・)
のようにTrimか何かをつかえばよろしいのでしょうか?
0244NAME IS NULL
04/05/26 16:08ID:fy6id3aKttp://www.spice-of-life.net/tapkit/ja/images/many_to_many.png
こういうテーブル構造だった場合、
Employeeテーブルと、ProjectテーブルにデータをINSERTした後、
両者を関連づけするためのEmployeeProjectテーブルにも、
明示的に関連づけをINSERTせんといかんですよね?
・・・救いようがないくらいにウンコな質問してスマソ
0245NAME IS NULL
04/05/26 17:49ID:???この図はLEFT(RIGHT) JOIN を使うって意味じゃないのか?
0246NAME IS NULL
04/05/26 18:16ID:???EmployeeProjectはプロジェクトに参加している社員名簿ってことだろ。
社員が増えた -> Employeeに追加
新規プロジェクト発足 -> Projectに追加
そのプロジェクトの人員決定 -> EmployeeProjectに追加
ただこれだけだが。プロジェクトだけ決まってもそれに参加する人員が決まってなければ
EmployeeProjectにデータはいれない(入れられない)だけ。
あとは、外部キーとか参照整合性制約で調べるよろし。
0248NAME IS NULL
04/05/28 22:08ID:???日付 金額
----------------------
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 NULL
04/05/28 22:35ID:???日付 金額
-----------------------
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 NULL
04/05/28 22:37ID:???二重書き込みすいません・・・
0251NAME IS NULL
04/05/28 22:38ID:???0252NAME IS NULL
04/05/31 09:54ID:???外部処理
vbとか。
0253NAME IS NULL
04/05/31 11:48ID:74MMxq7Sキャラ 萌え度
--------------------------
A 4
B 7
C 10
から
萌え度が5未満と5以上で
あぼーん と キターに分けて
キャラ イケてる
--------------------------
A あぼーん
B キター
C キター
というビューを作りたいのですが教えてください。
0254NAME IS NULL
04/05/31 12:34ID:???最低でもDBとバージョン言ってくれなきゃダメじゃないか。
0255NAME IS NULL
04/05/31 13:13ID:???CREATE VIEW view1 AS SELECT キャラ,CASE WHEN 萌え度>=5 THEN 'キター' ELSE 'あぼーん' END AS イケてる FROM デジコ;
0256NAME IS NULL
04/05/31 16:06ID:???ありがとうございます。
SQLではなく、抽出後プログラム上での
細工で何とかせい、との事でしょうか?
定番の書き方でもあるんかいなと
思っていたのですが・・・
0257NAME IS NULL
04/05/31 22:13ID:???>日付のみ並んだ一時的なテーブルを作って
>外部結合すればよいのかな?と思うのですが・・・
しろよ
でNVL使えばおわりだろ
0258NAME IS NULL
04/06/02 04:50ID:7Ib8/agG質問なのですが
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 NULL
04/06/02 09:18ID:???標準偏差を用いても、その例に挙げたテーブルのニンジンの場合だと、
結局20000円(?)のニンジンも除外できないと思うが。
中位数を求めてそれを中心とした基準値範囲(中位数の50%〜200%等)で抽出した行の平均値(avg)を
出すってのはどうだろうか。
例えのニンジンの場合だと全体行が偶数なので、150と200の中間数175が中位数で、
その50%(87.5)から200%(350)までに収まる行の平均値を出すといった感じ。
で、中位数を求めるSQLを書こうと思ったのだが、これはこれで面倒だな。
検索するなり書籍を漁るなりして調べてください。ちょっと考えたけどダメだった...orz
0260258
04/06/02 09:52ID:7Ib8/agGあるよと教えていただいて今までcgiで同じようなものを作って管理してたのですが
流石にデータ量が多くなってくるとキツイのでsqlへの移行をしようとしました。
やっぱり書籍読むのがいいですかね・・
月の小遣いが3000円なもので、できれば最初のうちはネットだけで済ませたいと
思い、mysql総合スレのテンプレサイトを読み漁っていたのですがアホには
むずかしいようです。
今から立ち読みしてきます。
0261NAME IS NULL
04/06/02 10:37ID:7Xm0LIwh既存の仕様書もないテーブル構造をリバース(という表現は不適切かもしれませんが)するときに、
テーブル間のリレーション関係が、一対多か多対一か多対多か、という判断をするには、
どのような見方をすればいいんでしょうか?
0262259
04/06/02 10:43ID:???反復切断法ってのを理解していないが、
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;
上位の最小値と下位の最大値を出したところ。これの平均を取れば中位数となる。
と、アイテム別の抽出はまだ行っていないので、このままだと全データの中位数にしかならん。
0263259
04/06/02 13:58ID:???収まっている値の平均値を一発で出すSQLを書いてみたが、なんじゃこりゃーって感じになったぞw
PostgreSQLのEXPLAINでクエリープランを表示すると66行で実行コストもとんでもねぇ値。
まだ無駄が残っていそうな感じでじっくり見直せばもう少しマシになるかもしれんが、
とても実用範囲に収まりそうにねぇな。
0264NAME IS NULL
04/06/02 16:43ID:???カテゴリー
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 NULL
04/06/02 17:54ID:???FROM エントリー LEFT JOIN カテゴリー ON エントリー.category = カテゴリー.category
WHERE カテゴリー.name = "ルート1"
ORDER BY postedOn
こんなんでいいのか…電波受信しきれないorz
0266258
04/06/02 18:33ID:???遅レスすいません。PC関連書籍いっぱい置いてある店に行って立ち読みして
帰ってくるのは半日がかりなもので。
レスありがとうございます。
やっぱりmysqlから該当データを取り出してperl側で処理させる方がいいのかな。
今はローカルだけどネット越しに複数箇所からmysqlに問い合わせがあった場合
結果だけを返すのに比べて転送量が結構凄いことにならないかなぁと考えた為
mysql側で処理しようと思いました。
若しくは、ネット越しにcgiに問い合わせをかけてcgiの内部処理として
mysqlを呼び出してデータ取り出してcgiで処理して結果を返すってのも
ありですかねぇ。
これから中位数を求める計算式とsqlのコードに再度取り組んで見ます。
#データベースのプログラムっていうのかコードって言うのか、
#ほかの言語と違ってなんかとっつきにくいですねぇ。
0267264
04/06/02 18:56ID:???済みません言葉がたりませんでした。各カテゴリーは親カテゴリ(parentId)
を持っていて、木構造になっているのです。
>>264の例だと
ルート1
┗枝1
┗葉1
┗葉2
┗枝2
ルート2
┗枝3
┗葉3
になっているということです。
やりたいのは、任意のカテゴリ*以下*に所属する全てのエントリー
つまりカテゴリ0001(ルート1)なら
「0001(ルート1)、0003(枝1)、0005(葉1)、0006(葉2)」のいずれかを
categoryカラムに持つエントリーを全て取得したいということです。
0268NAME IS NULL
04/06/02 20:04ID:???A. ルート1自身
B. parentIDが A な物
C. parentIDが B な物
をUNIONで結んで、それとエントリーを結びつければ。
0269264
04/06/02 20:28ID:???>>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 NULL
04/06/02 20:54ID:???Oracleなら正にその為に作られた様な階層問合せという構文があり
ますが、他のRDBMSであまり聞かないので需要があまりないという
事でしょうねぇ。
データ構造自体が再帰的な構造になっているので何等かの形で再帰
的な処理を行なわざるを得ないでしょう。
0271259
04/06/02 21:04ID:???中位数から平均値を求めるのでよければ、ご参考に。
中位数をもとめる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 NULL
04/06/02 21:24ID:???とりあえず最初のアイデアに戻って標準偏差の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とかの場合、量が多いのだから例外
とはしないのか、逆に量が極端に多いから例外とするのか。
0273272
04/06/03 00:09ID:???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 NULL
04/06/03 00:37ID:???標準偏差を用いて外れ値を検出する場合はたしかに標準偏差自体が
外れ値の影響を受けてしまうのでうまくないが、四分位範囲を用いた
方法なら外れ値の影響を受けにくい。
0275272
04/06/03 01:41ID:???ただ、その手の順序に依存した処理というのは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 NULL
04/06/03 10:12ID:???レコードを1000件だけ削除したい場合、下記のような
SQLで良いんでしょうか?
うまく実行されていないような感じで・・・
delete
from A
where Time
in(
select
top 1000
Time
from A
where Time <= '2004/06/08'
よろしくお願いします。
)
0277NAME IS NULL
04/06/03 13:41ID:???[Time]に重複がある場合は、千件以上削除されるね。
0278NAME IS NULL
04/06/03 21:41ID:???カーソル使いましょう。
0279276
04/06/04 16:06ID:???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 NULL
04/06/04 16:39ID:???任意のidが分かっている状態で、
そのidの前のidと次のidを得るsql文を作る事は可能でしょうか?
並び方はidの昇順、降順ではなく別のカラムでorder byされているものとします。
出来ればmysql3.23で動作するsql文を教えて下さい。
宜しくお願いします。
0281NAME IS NULL
04/06/04 16:52ID:???ORDER BY ID DESC
で取った最初の1件。
0282NAME IS NULL
04/06/04 17:46ID:???SELECT * FROM table1 ORDER BY num;
id | num
--+----
C | 10
E | 20
D | 30
B | 40
A | 50
で、idにDを指定したら EDBを抽出するという意味かな?
つーか、サンプルテーブルと期待する結果ぐらい書けよ。
0283249
04/06/06 17:02ID:IlRX9Yvv2つのテーブルの結合はうまくいきました。
ありがとうございます。
同様に空白日付を埋めたいのですが、今回は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 NULL
04/06/06 17:57ID:???0285NAME IS NULL
04/06/06 18:05ID:???括弧要るのか?
全部取っ払ってみれ。
0286249
04/06/06 18:29ID:IlRX9Yvv>284
そんなつもりじゃ無いです。
晒すネタは多い方が良いかと・・・
>284
>括弧要るのか?
はずすとエラーしました。
文法的におかしく無ければ
あきらめるしかないのか・・・
キチンとしたRDBじゃないとだめなのかなぁ
0287280
04/06/07 09:11ID:???その方法だとIDの昇順、降順になってしまいます。
>>282
失礼しました。
おっしゃるとおりです。
idにDを指定したらEとBを得たいのですが、方法が分かりません。
0288NAME IS NULL
04/06/07 09:45ID:???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 NULL
04/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 NULL
04/06/07 10:48ID:???WHERE キャラ NOT IN ('D','E',....);
0291NAME IS NULL
04/06/07 16:19ID:???頼むから正規化しろよ
0292280
04/06/07 16:21ID:???ありがとうございます!
すごく複雑ですね。
mysql3.23ではVIEW、サブクエリ、トリガは使えないので
別の方法で乗り切るしかなさそうです。
ありがとうございました。
0293NAME IS NULL
04/06/07 18:08ID:nSfxM7N+0294NAME IS NULL
04/06/07 21:45ID:???> REDOログ がごみ箱に・・・・
なったんか?
ならんのか?
はいらんのか?
まさか....恋したのか?(w
逝っている事が判りません、誰か通訳出来る方いらっしゃいませんか?
(助けたくても助けられないじゃん!)
0295NAME IS NULL
04/06/07 21:49ID:???やっぱガゴミ?
0296NAME IS NULL
04/06/07 23:07ID:???INSERT文の中でSELECT文を使い、他のテーブルにあるデータを登録したいのですが、
SELECT文のCASEの部分でコンパイルエラーになってしまいます。
エラーの内容は「記号CASEが見つかりました。」という感じです。
INSERT文中のSELECTではCASEを使えないのでしょうか?
0297NAME IS NULL
04/06/08 02:13ID:pFkODj97一本のSQLでサブクエリで検索した結果によって
update内容を変えたりできるでしょうか?
あるテーブルを検索して値がAならCにBならDにupdateするとか。
0298NAME IS NULL
04/06/08 07:24ID:???できる。
0299297
04/06/08 13:28ID:pFkODj97どうすればいいでしょうか?
0300NAME IS NULL
04/06/08 13:45ID:???普通、質問者が例えと希望する結果を出すもんだ。
>>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 NULL
04/06/08 17:15ID:LsPNiv6wREDOログがごみ箱に入ってしまってました。どうしてごみ箱に入っていたのかがわかりません。
なにかの以上で入るのでしょうか?
どなたか同じ現象を起こした方いらっしゃいませんか。
0302NAME IS NULL
04/06/08 20:17ID:???削除{した|された}から入ってるんだろ?それも「ゴミ箱を使って削除」だから、
エクスプローラ経由で(手動で)削除したかなんかだろうな。
プログラムで kill していたりバッチで del してもゴミ箱には入らないからな。
システムログ見てログインしている奴さがして聞いてみるべし。
まさか「ログオンしっぱなしの鯖」なんちゅうんじゃないだろな?
0303296
04/06/08 21:52ID:???お願いします。
0304NAME IS NULL
04/06/09 05:48ID:???せめて例となるSQLくらい書け。
0305NAME IS NULL
04/06/09 05:50ID:???つか、ストアドと言っているが、8iまでは 'CASE' なんて
キーワードはPL/SQLには予約されていない。9iからだ。
それと、それがINSERT...SELECT構文で使えるかどうかはまた別。
0306NAME IS NULL
04/06/09 08:29ID:???何がしたいのかわからんが、
とりあえず勘でDECODEを使えと言ってみる。
0307296
04/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は使えないのでしょうか?
0309NAME IS NULL
04/06/10 14:04ID:???しらべろや
0310NAME IS NULL
04/06/10 23:44ID:???たしかCASE文が使えたのは、バージョン8.1.6から
だったように記憶しておるです
0311NAME IS NULL
04/06/12 22:56ID:???書くとエラーが出てしまいます。
0312NAME IS NULL
04/06/13 11:30ID:???PL/SQL≒Oracle方言
0313NAME IS NULL
04/06/13 17:39ID:???0314NAME IS NULL
04/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 NULL
04/06/14 16:05ID:???0316NAME IS NULL
04/06/14 18:01ID:???SELECT id FROM 計上先 WHERE NOT EXISTS (SELECT * FROM 見積 WHERE id=計上先.id);
#計上先テーブルが正規化されてないのが気になるが。まぁガンガレ。
0317NAME IS NULL
04/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 NULL
04/06/14 18:26ID:???カラムの型がワカランのだが、INTEGERなどの数値型で、1か0だけなら、
SELECT sum(flag1),sum(flag2),sum(flag3) FROM table;
でいけると思うが。ダメかな。
0319NAME IS NULL
04/06/14 18:31ID:???SELECT (SELECT COUNT(*) FROM table WHERE flag1=1),(SELECT COUNT(*) FROM table WHERE flag2=1),(SELECT COUNT(*) FROM table WHERE flag3=1);
とするのが、汎用的な解か?
0321NAME IS NULL
04/06/14 19:43ID:???CHARでも自動変換されない?
どっちにしても
SELECT sum(flag1 = 1),...
とかで十分な気がする。
0323NAME IS NULL
04/06/15 17:48ID:anO/9QVt>>316で回答されている
SELECT id FROM 計上先 WHERE NOT EXISTS (SELECT * FROM 見積 WHERE id=計上先.id);
の*をidにした方が速くなったりしますか?
0324NAME IS NULL
04/06/15 18:30ID:???いまどきのRDBMならかわらんだろ。
行があるかどうかだけ確認していると思われ。
パーサのことを考えると下手にカラム名を書くより*の方が
楽なような気もする。
それよりか、安易に(NOT) INを使って次のようなSQLを
書かないことに気をつけたほうがよかね。
SELECT id FROM 計上先 WHERE id NOT IN (SELECT id FROM 見積);
0325NAME IS NULL
04/06/15 18:49ID:???どうもです。
0326NAME IS NULL
04/06/16 08:19ID:???*の方が速いらしい。
ttp://www.geocities.jp/mickindex/database/db_optimize.html
0327NAME IS NULL
04/06/18 01:03ID:???単なるEmacs信者じゃん。
「何だか知らないけど使うな」とかそんなんあるし…
0328NAME IS NULL
04/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 NULL
04/06/18 23:35ID:ECpKGwAuPL/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 NULL
04/06/19 00:50ID:???できます。
0331NAME IS NULL
04/06/19 01:05ID:+pGZo/Skやってみます。
0332NAME IS NULL
04/06/19 01:44ID:???サブクエリにする理由が不明
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 NULL
04/06/19 15:49ID:???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 NULL
04/06/19 15:53ID:???ありがとうございますです
おかげでなんとか今日中に仕上げられそうです
0336NAME IS NULL
04/06/20 00:23ID:1HFExj/5SELECT id FROM 計上先 WHERE NOT EXISTS (SELECT * FROM 見積 WHERE id=計上先.id);
上記2つのSQLって結果が同じになるのですよね?
何故NOT INを使わない方がいいのでしょうか?
0337NAME IS NULL
04/06/20 01:12ID:???上は基本的にテーブル順スキャンする。
下は見積.idにインデックスが張られていればインデックススキャンする。
(NOT)IN(サブクエリ)の形式はほとんど(NOT)EXISTS(相関サブクエリ)に
置き換えられるので、EXISTSを使った方が速い。
0338NAME IS NULL
04/06/20 03:40ID:???SELECT id FROM 計上先 WHERE NOT EXISTS (SELECT * FROM 見積 WHERE id=計上先.id);
in句の場合はidを指定(?)していますが、EXISTSだとidを指定していませんよね。SELECT *だし。
なのになんでEXISTSでidが条件となっているように出来るんでしょうか?
インデックス張っているからでしょうか?
0339NAME IS NULL
04/06/20 08:23ID:I55AKty9インストールの初めでユーザーアカウントがログイン出来ずに失敗してしまいます。
WindowsXPのユーザーアカウント作成方法はWindows2000とかと異なるのでしょうか?
WindowsXPにSQL7.0をインストールされた方、ご教授願います。
よろしくお願いします。
0340NAME IS NULL
04/06/20 08:41ID:???MSDEで十分だろ
0341NAME IS NULL
04/06/20 09:44ID:???インデックスが働いているのはサブクエリの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 NULL
04/06/20 09:46ID:I55AKty9答えられないから?
0343NAME IS NULL
04/06/20 10:48ID:???0344NAME IS NULL
04/06/20 17:22ID:I55AKty9もちろん持ってるし別で使ってます。
今回は7.0の環境が特別に必要なので。
0345NAME IS NULL
04/06/20 18:08ID:???その「特別に必要」の理由を教えてけろ
0346NAME IS NULL
04/06/20 19:18ID:???WHEREよりINの方が早いと教わって、今の所、EXISTS述語というのを使ったことが(見たことも)なかったので、
良く分からなかったのですが、丁寧にありがとうございました。
0347NAME IS NULL
04/06/20 19:47ID:???おそらく、現在稼動中のSQL Server 7.0 相当の環境を開発機の
中に作ろうとしてるのでは無いかと。
しかし、MSDE7ってWindowsXPで動作保障されているのかなぁ。。
0348NAME IS NULL
04/06/20 20:14ID:???動作対象に入ってる
http://www.microsoft.com/japan/sql/evaluation/sysreqs/70.mspx
気になるのはXPのほうがSP2だということかな。
SP1でも試したほうがいいと思う
0349NAME IS NULL
04/06/20 21:14ID:???DEならXPでもいいのか。サンクス
0350NAME IS NULL
04/06/20 21:16ID:???0351NAME IS NULL
04/06/22 11:03ID:1HWKGmgTinsert into するにはどう書けばいいの?
0352NAME IS NULL
04/06/22 14:20ID:???テーブルA | テーブルB
―――――――――――――――
ABC100 | ABC103
DEF100 | ABC104
ABC101 | ABC100
ABC102 | DEF100
ABC102 | ABC101
DEF102 | ABC102
―――――――――――――――
の様なテーブルから
ABC100
ABC101
ABC102
ABC103
ABC104
の様なレコードを取得したいのですが
SQL文がわかりません。
宜しくお願いします。
0353NAME IS NULL
04/06/22 14:28ID:???テーブルAとテーブルBって...?
別々のテーブルなのか? それともカラム名なのか?
抽出条件はABCから始まっている行なのか?
単発SQLより、DBの基礎をやり直した方がいいんじゃね。
0354NAME IS NULL
04/06/22 14:39ID:???テーブルA [CODE]| テーブルB [CODE]
―――――――――――――――
ABC100 | ABC103
DEF100 | ABC104
ABC101 | ABC100
ABC102 | DEF100
ABC102 | ABC101
DEF102 | ABC102
―――――――――――――――
すみません。
テーブルは別々です。
抽出条件が、[CODE]がABCから始まっている重複しない
レコードです。
お願いします。
0355NAME IS NULL
04/06/22 14:45ID:???SELECT code FROM tableA WHERE code LIKE 'ABC%' UNION SELECT code FROM tableB WHERE code LIKE 'ABC%';
0356NAME IS NULL
04/06/22 14:52ID:???できました。
ありがとうございました。
0357NAME IS NULL
04/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 NULL
04/06/23 16:38ID:???FULL OUTER JOINは使えなかったっけ?
しかし、どうでもいいけどイタいテーブルだな…。
0359NAME IS NULL
04/06/24 07:57ID:???おまけに、このパターンは聞きっぱなし厨のようだ。
0360NAME IS NULL
04/06/24 10:30ID:V3l4tOLh詳細サンプルを書くのは難しいので部分的に抜き出します。
で、後で何とか考えてくっつけてみます。
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 NULL
04/06/24 13:10ID:???これでいいのかな?
select * from TEST as T1 where 日付=(select max(日付) from TEST group by 番号 having 番号=T1.番号);
0362361
04/06/24 13:21ID:???重複したときはどういう結果がほしいんかな?
0363NAME IS NULL
04/06/24 13:40ID:???重複はありえないって事で良いかもしれません。
それと>>361が実行できないのですが
0364NAME IS NULL
04/06/24 13:42ID:???0365NAME IS NULL
04/06/24 16:58ID:???テーブルをサブクエリーに置き換えたいのですが凄く長いのです。
ここのテーブルをサブクエリーにしたい場合 こっち側も同じ様にサブクエリー
↓ を書くしかないのでしょうか
↓ ↓
select * from TEST as T1 where 日付=(select max(日付) from TEST group by 番号 having 番号=T1.番号);
修正が面倒になるし処理に無駄が出そうなのですがどうなのでしょう?
0366361
04/06/24 19:58ID:???某MLで似たような質問が出てましたが、
単純に重複するサブクエリを簡略化するような回答は無いですね。(今のところ)
俺も知りたいところだ。
サブクエリが不変ならViewを使う手もある。処理そのものは変わらんけど。
んで、まぁ勝手な想像なんだけど、重複や繰り返しのサブクエリがある場合に、
その処理毎にそのサブクエリを処理するんじゃなくて、内部的に保持して
使いまわすことにより高速化を図るように各DBベンダーががんばってんじゃ
ないかなぁ。
実際PostgreSQLはサブクエリまわりで高速化されているし。
0367NAME IS NULL
04/06/25 01:44ID:hn02u0GOmytable
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 NULL
04/06/25 08:30ID:???ありがとう御座います。
処理自体はうまく実行できてるのでこれで行きます。
どうもです。
0369NAME IS NULL
04/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 NULL
04/06/25 11:15ID:???0371NAME IS NULL
04/06/25 13:12ID:???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 NULL
04/06/25 13:19ID:???0373NAME IS NULL
04/06/25 13:27ID:???やっぱそーか。ってか、そうだよなぁ。
ついつい、M$の特殊仕様と疑ってしまう。
0374NAME IS NULL
04/06/25 13:43ID:PSV9Ft8u某会議室で検索したのだけどログがサーバーエラー出て見れません・・・
0375NAME IS NULL
04/06/25 13:48ID:???0376NAME IS NULL
04/06/25 13:52ID:???0377369
04/06/25 13:55ID:IMVNNnLTありがとうございます。でもじつは
今2つのデータテーブル(フィールドはどちらも前述のId、Name、Address、Tel)を1つにまとめたいと考えていて、
そこで問題なのがおたがいのIDが重複している可能性があるので、一度両方のデータセットを取得して、
IDの衝突がないことを確認してその時点でのクエリ(rs配列にあるValue)をInsertしていく・・
という方法を考えています。こういう場合は、他にもっといい方法があるのでしょうか?
本をいろいろ探してみても変数をSQL文に代入する例は殆どありません。でもこういうケースって多いと思うのですが・・?
みなさんはどう解決してるのですか?お願いいたします。
0378NAME IS NULL
04/06/25 14:11ID:???ttp://www.ken3.org/cgi-bin/test/test027-2.asp
0379NAME IS NULL
04/06/25 14:52ID:???全てのフィールドが重複してれば片方のみってのなら、
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 NULL
04/06/25 15:55ID:???data_a
-------------
aaaiii
aaakk
bbbcc
aaacc
のようなテーブルがあった場合に、フィールド「data_a」から、頭3桁が「aaa」の
データを取りだすということなんですけど、良い方法はありますでしょうか?
宜しくお願いします。
0381NAME IS NULL
04/06/25 16:02ID:???SELECT data_a FROM field WHERE data_a LIKE aaa%;
もしくは
SELECT data_a FROM field WHERE data_a LIKE aaa*;
0382NAME IS NULL
04/06/25 16:03ID:???ありがとうございました!
0383NAME IS NULL
04/06/25 16:03ID:???SELECT * FROM table WHERE data_a LIKE 'aaa%';
0384380
04/06/25 16:09ID:???>>380のようなテーブルの中から、頭から3桁目だけを比較したいのですが、
良い方法があったら教えて下さい。
教えて君ですみません。
0385NAME IS NULL
04/06/25 16:17ID:???WHERE data_a LIKE '__a%';
0386NAME IS NULL
04/06/25 16:24ID:???ありがとうございます。
大変助かりました。
0387NAME IS NULL
04/07/01 16:59ID:oNKFG8TBまず注文テーブルに下記のようなデータが入ってるとします。
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 NULL
04/07/01 17:33ID:???0389NAME IS NULL
04/07/01 18:02ID:???select * from table
where 部品番号 & 注文日 in (
SELECT 部品番号 & Max(注文日) AS 式1
FROM table
group by 部品番号
)
access2002で確認した。
0390NAME IS NULL
04/07/01 18:48ID:cbRg6fOS教えてください。
0391NAME IS NULL
04/07/01 19:24ID:???0392NAME IS NULL
04/07/01 21:44ID:???様々な解がありそうですが?
>>388さんのやり方以外でもUNION句とWHERE条件の絞込みで楽勝っぽい。
GROUP BYとMAXやTOPとDISTINCTでもいけそうだよ!!
0393NAME IS NULL
04/07/01 23:28ID:ifmWvhvc(注文テーブル)
受注番号 受注日 商品番号 個数 顧客番号
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 NULL
04/07/01 23:32ID:???で、そうやって仕事を丸投げして
お前は金をもらうわけだ
0395NAME IS NULL
04/07/02 00:00ID:???その程度のSQLが書けないようだとDBなんて弄るメリット無いだろ。
0396NAME IS NULL
04/07/02 00:48ID:???いつも思うんだが
この手の問題があると真っ先に ... in ( select max(...) from ... ) な
レスがつくんだが、これってどっかで流行ってんのか?
0397NAME IS NULL
04/07/02 01:20ID:???答えてる人が毎回おなじとか
>>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 NULL
04/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 NULL
04/07/02 07:29ID:???0400NAME IS NULL
04/07/02 15:23ID:???----------+---------+-------
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 NULL
04/07/02 18:11ID:???0402 ' → ''
04/07/02 21:25ID:???sanitary belt 生理帯.
sanitary engineer 衛生技師; 配管工; 〔米〕 〔婉曲〕 ごみ清掃[収集]員.
sanitary engineering 衛生工事[工学].
sanitary landfill 地下埋め込み式ごみ処理(法・場).
sanitary napkin 〔米〕,
sanitary towel 〔英〕 生理用ナプキン.
0403likeの中で使うなら他にも必要
04/07/02 22:47ID:???0404NAME IS NULL
04/07/03 21:43ID:???0405oraora
04/07/05 01:32ID:RTzQYzWC�A後発 select for update nowait
だと�Aはエラーが返されるけど、
�Aでロックをかけようとしたとき、
既にロックをかけている�@をエラーにする
オプションってないの?
0406NAME IS NULL
04/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 NULL
04/07/05 07:30ID:???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 NULL
04/07/06 00:25ID:???ありがとうございました。
0409NAME IS NULL
04/07/06 10:29ID:???----------
1,100
2,200
3,1000
.
.
というようなテーブルから単純にselectで抽出した不特定の行数を数えるのはsqlで
可能ですか?それとも外部処理ですか?
ふと疑問に思い質問します。
当方趣味でsqliteを使い気象観測データのようなものをデータベースで利用中。
0410NAME IS NULL
04/07/06 10:48ID:???select count(*) from table;
ということじゃないのか?
0411NAME IS NULL
04/07/06 10:52ID:???行数カウントならCOUNTでいけるのでわ。
0412NAME IS NULL
04/07/06 11:47ID:???SQLの結果をperlで受けて配列の要素数を数えれば事足りましたが、もしや
SQLで処理ができるかもしれない、と思い考え中でした!
0413NAME IS NULL
04/07/06 18:44ID:10rxnk3A値が1,2,3と入ってる列を
1,3,2という順番に並び替えしたいんですが
どうやればいいでしょうか?
1,2,3とか3,2,1ならOrderByでいけるんですが〜
0414413
04/07/06 18:48ID:10rxnk3ANO 受注日 商品番号 個数 顧客番号
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 NULL
04/07/06 19:09ID:???order by 個数 ってこと?
0416NAME IS NULL
04/07/06 19:13ID:???なぜ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;
0417413
04/07/06 22:34ID:10rxnk3Aそうなのよ、ただ単純になのよー
システムの都合上、意味はない順番になってしまったらしくて
Replace関数とか使ってもむりっぽいよねー
何かいい手ないかなー
0418NAME IS NULL
04/07/06 22:37ID:???そーゆー時こそ、PG側でなんとかすんだろーがー
0419NAME IS NULL
04/07/06 23:34ID:???そもそも、ORDER BY 句をつけない限り、抽出される順番は保障されていないはず。
基本的には見つけた順なので、内部の通し番号(rowidとかoid)順になるのだろうけど、
これとて、DBによってはUPDATEなどで変わるものと変わらないものがあるし、
DBメンテやアナライズでかわるものもある。
0420NAME IS NULL
04/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 NULL
04/07/06 23:39ID:???SELECT * FROM table ORDER BY COALESCE(列A,列B);
0422NAME IS NULL
04/07/07 00:00ID:???汎用関数であっさりできるんですね
調べ方が足りなかったようです
精進します
0423NAME IS NULL
04/07/07 00:03ID:???where句に関数はイヤだけどね
0424NAME IS NULL
04/07/07 08:42ID:???並べ方に規則性が無いのなら
規則を作ってやる必要がある。
列を追加して、並べ替え専用の列でも作ったら?
設計を見直した方がいいような気もするけど。。。
0425NAME IS NULL
04/07/08 03:30ID:t5U4zZXHこれおねがいします。
ttp://v.isp.2ch.net/up/23ab1028188e.JPG
Oracleです
0426NAME IS NULL
04/07/08 04:13ID:???0427NAME IS NULL
04/07/08 08:03ID:???ありがとうございます!たすかりました
0428NAME IS NULL
04/07/10 23:36ID:+YSVeqKQテーブルAに列a,b,cがあって、a,bが重複してる行を
削除したいんですけど、SQLではどしたらよいのでしょうか。
0429NAME IS NULL
04/07/11 00:09ID:???0430NAME IS NULL
04/07/11 00:25ID:V6myGrYpテーブルA
aa bb cc
aa bb dd
aa yy zz
のとき、
aa bb cc
xx yy zz
にしたいんですけど。DB2です。
0431NAME IS NULL
04/07/11 00:27ID:V6myGrYpすみません。質問がダメダメでした。
テーブルA
aa bb cc
aa bb dd
aa yy zz
のとき、
aa bb cc
aa yy zz
にしたいんですけど。DB2です。
0432NAME IS NULL
04/07/11 01:11ID:???aa bb cc が残って、
aa bb dd を残さない理由は?
ORDER BY 句も使わずに単純に先に出てきた方を残すのか?
どっちゃにしろ面倒だが。
0433NAME IS NULL
04/07/11 01:42ID:p5TFt5ON面倒ですか〜。
0434NAME IS NULL
04/07/11 01:58ID:yVwQ3n9P何とかして下さい。
0435NAME IS NULL
04/07/11 04:48ID:???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 NULL
04/07/15 09:35ID:i+QgLaVI例
SELECT 項目1, 項目2, 項目3 FROM T1
union all
SELECT 項目1, 項目2, 項目3 FROM T1 where 項目2 = 3
上と下の「項目1」の値で同じものがある場合、
下側の「項目2」の値を上側の「項目2」と
同じ値にするにはどうすれば良いでしょうか?
0438NAME IS NULL
04/07/15 09:46ID:???例えが悪いのか、その条件だと項目1がuniqueであるべきなので
必然的に、項目1が同じ場合は項目2も同じはずなんだが。
0439NAME IS NULL
04/07/15 10:22ID:/sT/J1jd1 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 NULL
04/07/15 11:01ID:???0441437
04/07/15 11:25ID:???例をなるべく簡素にしようと思ったんですが例が悪かったかもしれません
「項目1」はユニークじゃ無いんですが別の列と組み合わせると
ユニークって事になってます。
実際にはunionの上下とも検索条件は日付で下の方は上の1ヵ月後です。
で、上下の検索結果を結合したいんです。
日付違いで同じ「項目1」があれば下の「項目2」を上の「項目2」に変換したいんです。
0442NAME IS NULL
04/07/15 13:50ID:???いまいちワカラン。とりあえず盲目的に書くが、
同じテーブルを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 NULL
04/07/15 13:57ID:/sT/J1jd氏ね
0444NAME IS NULL
04/07/15 14:02ID:???逆切れするまえに、>>442のような自己結合を覚えればいい。
0445おっくん
04/07/15 14:13ID:43wxXaSZもきゅ
0447NAME IS NULL
04/07/15 18:35ID:???ttp://pc5.2ch.net/test/read.cgi/db/1069324950/
0448NAME IS NULL
04/07/16 21:43ID:???"01","02","茨城","つくば"
・・・(略)
"12","01","東京","足立区"
"12","02","東京","荒川区"
↑みたいなデータがあったときに、
"01","99"
↑キーの二つ目の'99'はデータベースに存在しない
という検索キーから
"茨城",""
↑ブランク、またはnull
を一回のselectで取得するSQL教えてください。
もちろん、二回select発行するより早い奴で。
0449NAME IS NULL
04/07/16 22:11ID:???0450NAME IS NULL
04/07/17 00:35ID:???そういう腐れテーブルを設計するなら、
"01","99","茨城",""
って行も足しとけ。
0451NAME IS NULL
04/07/17 00:42ID:???データを正規化することから始めろ
0452NAME IS NULL
04/07/17 01:31ID:???私が設計したわけじゃなくて、今そこで動いてるマスタテーブルがこ・・ゴフッ
0453NAME IS NULL
04/07/17 02:19ID:???正規化されていないテーブルを出しといて、
>もちろん、二回select発行するより早い奴で。
と聞くのは、厚かましい。
2回発行するのが許されるのならそーしとけ。
0454NAME IS NULL
04/07/17 02:29ID:???0455NAME IS NULL
04/07/17 22:32ID:???サブクエリ使っていいなら。
0456NAME IS NULL
04/07/17 23:04ID:???あんたが悪いわけじゃないみたいだからさ
0457NAME IS NULL
04/07/18 00:31ID:???いや、「もちろん、二回select発行するより早い奴で。」という
ど厚かましい要求がガンだと思う。
0458NAME IS NULL
04/07/18 01:21ID:???わかるわかる。
でもな、そんなにカリカリしてたら
ハゲ板の世話になる事になるよ。
0459NAME IS NULL
04/07/18 22:33ID:???ここでいうスケジュールとは
「内容(文字列)」、「開始日時(日時型)」、「終了日時(日時型)」
が1セットになったもので、これをレコードとして登録します。
こういった情報を登録しておいて
・レコードを追加する際にダブルブッキングのチェック
・今の時間に一致するスケジュール情報の検索
・今から指定時間以内に開始日時になるスケジュール情報の検索
をSQL文で簡単に取得するにはどうすればよいでしょうか?
DBに慣れていないもので、全レコードを取り出してチェックするしか
方法が思い浮かびません・・・。
0460NAME IS NULL
04/07/19 00:14ID:???ダブルブッキングチェックはOVERLAPS述語をつかうけど、
MySQLで使えるのかな? それ以前に、CHECK制約で無理ぽ?
Ruleかトリガ、もしくは先にチェックしてからINSERTかな。
下の2行はBETWEEN述語を用いれば簡単に出来る。
0461459
04/07/19 00:21ID:???http://dev.mysql.com/doc/mysql/ja/Functions_that_test_spatial_relationships_between_geometries.html
BETWEENを使った場合、
>・今の時間に一致するスケジュール情報の検索
は簡単に出来そうですが、
>・今から指定時間以内に開始日時になるスケジュール情報の検索
はどのようにしますか?
0462NAME IS NULL
04/07/19 00:25ID:???WHERE 開始時間 BETWEEN now() AND now()+interval'指定時間';
0464NAME IS NULL
04/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別々スレ62
04/07/20 12:17ID:???文字列の場合、
・char
・varchar
・text
の違いがわかりません(><)
誰か教えてください。特に、charとtextの違い。
やっぱり、textの方がメモリを食うんですか?
0466464
04/07/20 12:20ID:???EXTRACT(YEAR_MONTH FROM DATE)
で年月のgroup byが出来ましたので解決しました。
0467NAME IS NULL
04/07/20 12:22ID:???0468NAME IS NULL
04/07/20 12:43ID:???とうとう来たかw
ほとんどネタにしかとれんが、本当にわからないならなぜマニュアルを読まないんだ。
http://www.postgresql.jp/document/pg74doc/html/datatype-character.html
PostgreSQLの場合は日本語などマルチバイト文字でも一字は一字としてカウントするので、
内部的(バイト数)には全て可変長で対処しているような気がする。
マニュアルには性能に関する差異はないとあるが、
char = text+空白パッド+文字数制限
varchar = text+文字数制限
だろうから、挿入や更新の際はtextが一番高速のような気がする。
0469NAME IS NULL
04/07/20 12:59ID:???http://www.postgresql.jp/document/pg743doc/html/datatype-character.html
0470459
04/07/20 15:47ID:???マニュアルには記載がありますが、「未実装」と書かれていました。
http://www.mysql.jp/mysql/Manual/4.1.1/html-split/manual_10.html#SEC723
ダブルブッキングのチェックはどうすればよろしいでしょうか?
0471NAME IS NULL
04/07/20 16:15ID:???思考を停止しちゃったか?
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別々スレ62
04/07/20 22:03ID:???マジレスありがとうございます(><)
感動です。やっと、このスレで成仏できます。(><)
今、>>468のマニュアルを読んでみました。
textは文字列の長さに制限がありません。
だから、すごいメモリ食うんじゃないかな?と思ったんです。
登録する予定ものが文字数が不確定なので、
多めにvarcharでとったの方がいいのかな?とか思っていたんですが・・・。
あるサイトで「PostgreSQLではtextが一番早いで!」って書いてあったから、
varchar使うか、text使うか迷っていたんです(><)
でも、>>468さんのおかげでtextを使うことにしました。
これで、成仏できます。
ありがとう>>468さん (><)
0473NAME IS NULL
04/07/21 23:47ID:???いい方法ないでしょうか。
ダミーで項目を揃えても、2つのクエリーをそれぞれSELECT文で
もう一括りしてからUNIONでくっつけようとしてもダメでした。
>>464
SELECT SUBSTR(日付,1,7),SUM(数),SUM(円) GROUP BY SUBSTR(日付,1,7)
PostgreSQLです。
0474NAME IS NULL
04/07/22 00:11ID:???普通にできそうな事のように思えるのだが、
例えのテーブルと希望する結果を挙げてみれ
0475NAME IS NULL
04/07/22 00:14ID:???とかってできるだろ?
0476473
04/07/22 00:20ID:???テーブル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
0478NAME IS NULL
04/07/22 00:45ID:???結果の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;
0480NAME IS NULL
04/07/23 09:49ID:???これで、String型のデータ(YYYY-MM-DD HH:MM:SSの形式で入ってる)を
TIMESTAMPに変更しようとしたら、エラーが出たのですが、どこがおかしい
のでしょうか?
0481NAME IS NULL
04/07/23 20:16ID:???timestamp 型の値は日付データではありません。
中身は単なる一意キーです。
0482NAME IS NULL
04/07/23 21:39ID:???SQLServerのTIMESTAMPはユニークになるけど、
レコードの内容を更新するとTIMESTAMPも変わってしまうから
キーには出来ないよ。
0483NAME IS NULL
04/07/23 22:21ID:???ごめんなさい。
0484NAME IS NULL
04/07/25 22:47ID:???オラクルのTO_CHAR句をSQLserverで代替するのはどうやればいいのですか?
手持ちの本や、ネットで調べたのですがのってなくて・・・
やりたいことは、100000とあるデータにカンマをつけるだけです。
0485NAME IS NULL
04/07/26 10:30ID:???一発では出来ないので
CASTでCHARかVARCHARにしてから
WHILEループを書くしかないんじゃないかな
0486NAME IS NULL
04/07/26 11:37ID:???有難うございます。
0487NAME IS NULL
04/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 NULL
04/07/26 15:01ID:???それは無理。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 NULL
04/07/26 15:06ID:???ゴメソ 1行目を訂正
×SELECT code
○SELECT 取引先コード
0490487
04/07/26 15:15ID:J5YziJL0おー 有難うございます。
自分で四苦八苦した結果 下記のようなきたない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
0491487
04/07/26 15:16ID:J5YziJL0すべて消えてる・・・ 見づらくてすみません。
0492NAME IS NULL
04/07/26 17:02ID:KcwHZUve0493NAME IS NULL
04/07/26 18:03ID:???0494459
04/07/26 22:57ID:???ダブルブッキングのチェックはできるようになりましたが、複数のユーザーから
ほぼ同時に予約処理が行われた場合、タイミング次第でダブルブッキングして
しまうようなレコードが追加されてしまうことはありませんか?
MySQLはマルチスレッドだと本に書かれていましたが、排他処理を行うことは
できるのでしょうか?
0495NAME IS NULL
04/07/26 23:20ID:???テーブルをロックする。
ttp://dev.mysql.com/doc/mysql/ja/LOCK_TABLES.html
ダブルブッキングチェックをする。
問題がなければ新しい予定を挿入する。
ロック解除。
0496NAME IS NULL
04/07/27 09:05ID:MnORfm0Zおしえて。
0497NAME IS NULL
04/07/30 09:09ID:Gc8sLY6cサイズ未指定で作成したBLOBカラムなんかの実データのサイズが知りたいんですが。
分からないんであれば、サイズを保持するカラム足してテーブルコンバートしなきゃならなくなっちゃうYO!
(Firebird1.5でつ)
0498NAME IS NULL
04/07/30 11:49ID:???Firebirdはしらんが、length(BLOBカラム) じゃダメなんか?
0499NAME IS NULL
04/07/30 15:07ID:???だと駄目みたい。
0500NAME IS NULL
04/07/31 00:18ID:???カーソル同士をJOINってできますか?
0501NAME IS NULL
04/07/31 01:01ID:???0502NAME IS NULL
04/08/03 17:19ID:wblkt8JnALTER TABLE Table_A MODIFY Field_A char(10)
を SQLServer用に 書くとしたらどのような命令をすればいいのでしょうか?
上記はORACLE専用だったみたいで・・・
0503NAME IS NULL
04/08/03 17:28ID:???正しい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はわかります。 でもそれ以外はなぜエラーなんでしょう?
0504503
04/08/03 17:30ID:???0505NAME IS NULL
04/08/04 04:32ID:???()の位置
Dの(COL1,COL2) だとSELECTの書式エラー。
(COL1),(COL2)と表記すると動くはず。
0507NAME IS NULL
04/08/04 17:15ID:???+-------+--------------------+
|user_id| INT AUTO_INCREMENT |
+-------+--------------------+
| name | CHAR(20) |
+-------+--------------------+
上記のようなテーブルがあります。
user_idを指定せずにINSERTした場合、自動的に
値が割り振られますが、Perlなどから利用する場合、
レコードに実際に割り当てられたuser_idの値を
取り出すにはどうすればよいでしょうか?
0508NAME IS NULL
04/08/04 17:29ID:???SQL Server : IDENT_CURRENTなど
0509507
04/08/04 17:34ID:???どうやって実装されているのか分からないので、ちょっと心配なのですが。
0510NAME IS NULL
04/08/04 17:39ID:???ALTER TABLE Table_A ALTER COLUMN Field_A char(10)
だが、6.5 以降でないと使えないとか、いろいろ制約あるぞ。
0511NAME IS NULL
04/08/04 17:49ID:???共用するような造りにしていなければ大丈夫。
0512NAME IS NULL
04/08/06 09:12ID:???日付を四捨五入する使い方があるみたいですけど、
これの法則が、あいまいにしかわかりません。
4日なら切り捨て?5日以上なら繰り上げ?
いろいろ調べたのですけど・・・・
混乱するばかり・・
0513512
04/08/06 11:04ID:???次のSQL文を実行した時に、戻される値を、(A)〜(E)の中から選んで下さい。
SQL> SELECT ROUND(SYSDATE,'MON') FROM DUAL;
↑これの答えが
0514NAME IS NULL
04/08/06 11:24ID:???BEETWEEN句を使って、TIMESTAMP型のカラムが now() より n時間以内 の
レコードを取り出そうとしていますがうまくいきません。
TIMESTAMP型とnow()の戻り値の型は比較できないのでしょうか?
0515NAME IS NULL
04/08/06 12:15ID:???BEETWEEN???
BETWEENは a BETWEEN x AND y の場合 x<y じゃないとダメなのかも。
a BETWEEN now() - interval'1 hour' AND now();
でどぉっすか?
0516514
04/08/06 12:55ID:???「SELECT date from access_log」の結果は「20040805174512」でしたが、
「SELECT date - interval 0 hour from access_log;」とやると
「2004-08-05 17:45:12」となりました。
0517514
04/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 NULL
04/08/06 14:49ID:???day(now()-interval 1day)
かな? MySQLは使ってなくて書式に間違いがあるかもしれんが。
0519NAME IS NULL
04/08/06 15:59ID:???SQL リファレンスに各書式での丸め条件載ってるが……
例題だと12が返ってくるんじゃなかったかな?
0520512
04/08/06 16:14ID:???すみません、オラクルのSQL リファレンスって売ってるんですか?
初歩的なことですみません。
オラクルマスター問題集と、黒本しかてもとにありません。
0521NAME IS NULL
04/08/06 19:00ID:???んで ID 交付してもらってログインすりゃ、全マニュアル PDF で落とし放題だ。
つーか問題集にそれくらい書いてないんか……
0522NAME IS NULL
04/08/06 19:05ID:???OTN Standard とか OTN Professional の有償サービスにはいくなよ(藁
ページ上部の「お客様情報」ってとこから無料で新規ID登録できっから。
0523NAME IS NULL
04/08/10 22:07ID:???取得したいのですが、なるべくならサブクエリを切りたくありません。
プログラム中で色々とSQLの編集を行うので、複雑にしたくないのです。
小計1・2のエイリアスを参照できないか、と試してみたものの、
一度のSELECTでは無理なようでした。
良い方法はないでしょうか?
環境はOracle9.2です。
0524NAME IS NULL
04/08/10 22:08ID:AX2MPVIQ0525NAME IS NULL
04/08/11 13:37ID:???0526NAME IS NULL
04/08/12 14:52ID:SCIrm9Kg1 | 1 | ああああ
1 | 2 | いいい
1 | 4 | ううう
1 | 9 | 5555
というデータを
id | no | data
1 | 1 | ああああ
1 | 2 | いいい
1 | 3 | ううう
1 | 4 | 5555
と言った感じで連番にするにはどうしたらいいでしょうか?
0527NAME IS NULL
04/08/12 15:17ID:???SELECT id,(SELECT COUNT(*) FROM table AS T2 WHERE T1.no>=T2.no),data FROM table AS T1;
0528NAME IS NULL
04/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 NULL
04/08/12 17:12ID:???0530528
04/08/12 17:15ID:9vICwHsMDISTINCTとか使ってみたけど、IDを重複せずに出力したけど、
それを元にIDごとの order by created limit 1 をしたいけどできない・・
0531528
04/08/12 17:18ID:9vICwHsM0532NAME IS NULL
04/08/12 21:58ID:???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 NULL
04/08/13 14:08ID:3JyVgucqID | 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 NULL
04/08/13 20:24ID:E/G7H9dMgr| 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 NULL
04/08/13 20:27ID:???0536NAME IS NULL
04/08/13 20:45ID:???GROUP BY t3.gr
HAVING COUNT(t3.gr)=(SELECT COUNT(*) from t4)
Accessだとこんなんで行けるけど
0537534
04/08/13 22:01ID:???ありがとう!助かりました。Postgresでもいけました。
本当になるほど、ですね。半紙に筆で書いて飾っておきます。
無理だと思ってました。もっと精進してここで回答者に
なれるようにがんばります。
0538NAME IS NULL
04/08/16 21:10ID:???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 NULL
04/08/16 21:15ID:???0540NAME IS NULL
04/08/16 21:36ID:???SELECT count(DISTINCT field_A) FROM table_A;
0541NAME IS NULL
04/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になります。
0542538
04/08/17 10:38ID:???0543541
04/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 NULL
04/08/17 13:03ID:???pageの文字数が全て同じで、書式が一桁の数字+',html'で統一されているのであれば、
SELECT * FROM text WHERE page < '2,html';
でいいんじゃね。
0545NAME IS NULL
04/08/17 13:10ID:???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
0546541
04/08/17 13:22ID:???544さん
残念ながら文字数は決まってないので時間で見るしかないんですよー。
545さん
ご回答ありがとうございます。
でも、試してみたのですがエラーになりました。
ERROR: Relation "a" does not exist
肝心なことを言い忘れたのですが、DBはPostgresです。
0548544
04/08/17 14:03ID:???逝ってきまつ。
0549541
04/08/17 14:35ID:???545さんありがとう。
僕もここで答えられるようなスキルになりたいので544さんのお気持ちは全然うれしいです。
0550541
04/08/17 17:57ID:???SQLをもう少し勉強したいのですが、なかなか良い書籍が見つからずに困っています。
何か良い書籍などございましたら教えてください。
オススメの書籍とかありますか?
0551NAME IS NULL
04/08/17 18:38ID:???ttp://www.1point.jp/~book_2ch/computer/db.html
0552NAME IS NULL
04/08/18 20:10ID:???001 | 山田 | 東京
002 | 鈴木 | 千葉
003 | 斉藤 | 埼玉
こんなテーブルがあり、code=003の斉藤さんのレコードを
主キーのcodeだけ000にして、nameとaddressを同じテーブルに
コピーするためには、どんなSQL文を書けばいいでしょうか?
0553NAME IS NULL
04/08/18 20:14ID:???0554NAME IS NULL
04/08/19 21:52ID:cL69zpwQとしたときに、参考書では、
セレクトした行が誰かによってロックされていたときに、制御が
すぐもどされます、と記述があります。
で、この場合、SELECTで取れてくるべきデータは当然取れてくれるんですよね?
0555NAME IS NULL
04/08/19 21:53ID:cL69zpwQIDが69だー。
0556NAME IS NULL
04/08/19 23:45ID:XDjDY+ON先輩に聞くなんちゃらっていう本。
常々気にしていた「結合と副問い合わせの違い」っていうのがオビに
載ってたの見て買っちゃった。当たり前の記述も多いけど、かゆいと
ころに手が届くQ&A多い。おすすめ。
0557NAME IS NULL
04/08/22 02:41ID:ClvP/KPvSQL最高!!
0558NAME IS NULL
04/08/22 07:15ID:???0559NAME IS NULL
04/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 NULL
04/08/24 17:44ID:???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 NULL
04/08/24 17:56ID:???select *
from テーブル
where 列名1='14'
order by
case 列名2
when '320' then -列名3
else 列名3
end
0562NAME IS NULL
04/08/24 17:57ID:???サンクスコ
結局別々にやっちゃいました。
0563NAME IS NULL
04/08/25 00:30ID:???0564NAME IS NULL
04/08/25 01:16ID:???0565NAME IS NULL
04/08/25 11:04ID:???0566NAME IS NULL
04/08/25 14:42ID:???table1
aaa date
でテーブルを作り、
select * from table1
where aaa between 20040801
and 20040831
で問い合わせてもオケですかね?
0567NAME IS NULL
04/08/26 01:34ID:???質問はSQLでおねがいします
0569NAME IS NULL
04/08/26 10:40ID:???0570NAME IS NULL
04/08/26 13:05ID:???Number:570 at SQL質疑応答スレ
core dumped.
0571NAME IS NULL
04/08/26 19:43ID:???>>566 Oracle は知りませんが・・・。通るとしても実装依存なので、
暇なら '2004-08-01' と編集したほうがいいんじゃないかと思います。
'
0572NAME IS NULL
04/08/26 19:44ID:???あ、失敗してしまいました。。引用符の中の引用符をエスケープし忘れました。
'
0573NAME IS NULL
04/08/27 10:59ID:???なるほど
アリガトンゴザイマスタ
SQL+からは>>566でselect文実行できて
プログラム側からだとエラーになっていたので、悩んでました
アリガトンゴザイマスタ
0575NAME IS NULL
04/08/27 20:52ID:???>>567は無視でよろしく。
ネタはこっち
SELECT * に続けて何か書け!
http://pc5.2ch.net/test/read.cgi/db/1058307199/
0576NAME IS NULL
04/08/30 00:54ID:AKKr2SCF書き方って出来ませんでしたっけ。
Accessではたしか出来たはずなんですけど、DelphiからAccessMDBだとダメみたいで。
何か書き方が違うのかな
0577NAME IS NULL
04/08/30 01:03ID:???0579NAME IS NULL
04/08/30 05:51ID:muvL5GtlテーブルAの得意先コードから得意先マスタテーブルの得意先名を得るんですが、
テーブルAの得意先コードがNULLだった場合は、
テーブルBの得意先コードから得意先マスタテーブルの得意先名を得る
こういう場合ってどういう風に書けばいいのか教えて下さい
0580NAME IS NULL
04/08/30 06:48ID:???なんか肝心なところが抜けてないか?
テーブルAとBの関係がワカラン。
何をもってテーブルAやBの得意先コードを抽出しているのか?
0581580
04/08/30 06:52ID:???SELECT * FROM
(SELECT 得意先コード FROM テーブルA UNION SELECT 得意先コード FROM テーブルB) AS S1
JOIN 得意先マスター USING (得意先コード);
0582NAME IS NULL
04/08/31 01:18ID:???SORT BY と書き間違えてしまいます。何か良い薬はありませんか?
0583NAME IS NULL
04/08/31 01:45ID:???0584NAME IS NULL
04/08/31 01:50ID:???0585NAME IS NULL
04/08/31 03:58ID:???0586NAME IS NULL
04/08/31 13:09ID:???0587NAME IS NULL
04/09/05 12:05ID:yqxWT8Tvテーブル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 NULL
04/09/05 13:10ID:???3つとも同じじゃないかな?感だけど。
0589NAME IS NULL
04/09/05 15:28ID:???0590NAME IS NULL
04/09/05 16:38ID:???0591587
04/09/05 17:07ID:???レスどうもです。
確かに、タイム計れば結果がわかりますね。失礼しました。
で、何故こんな事を聞くかというと、
いろんなサイトや文献を見ると、
やれ、大きいテーブルはFROM句の前がいいとか後がいいとか、
Where句は上から順に絞り込むとか、位置は関係ないとか、
極論すればオプティマイザが賢いかアホか、等...
どれが正解なのかわからなかったものですから。
あと、明示的したい場合はJOINでするようにします。
ところで、JOINではなく、例題のようにWhere句で等結合を
させた場合、A、B、Cの交差表はどの時点で作られるのですか?
A,B,Cの交差表を作ってからWhereの絞込みを行うのか、
先にWhereの絞込みで各テーブルの仮想結果セットが作られてから
結合するのですか?
これはRDBMSによって違う?
教えて君で申し訳ないです。
0592NAME IS NULL
04/09/05 20:50ID:???その日の気分によっても違う。
気になるなら実際にアクセスプランを見てみれば良い。
それから、joinで結合順序が固定されるというのも、一部のDBMS
特有の動作だったりする。普遍的なルールじゃない。
0593NAME IS NULL
04/09/05 20:51ID:???いまどきのRDBMSならオプチマイザが判断してくれるので、
>>587程度の例ならどれも同じ。
結合に用いるカラム(今回の例だとid)がユニークであるのかどうなど
統計情報によって結合順が変わってくる。
C.idがユニークなら、AかBのテーブルを読んでからC.idをインデックス
スキャンした方が速い。
逆にC.idの重複が多い場合は先にCを読んでA,Bを入れ子ループするか、
A,Bを先に結合した表とCをそれぞれソートしてからマージ結合するに
なると思う。
どのような順序で結合するかはRDBMSやマシンスペック(メモリ量など)
によっても変わってくると思う。
0594NAME IS NULL
04/09/06 10:28ID:???あまりきれいなやり方ではないが、
A,B,Cのテーブルを結合するときに、
A.id=B.id
,B.id=C.id
,A.id=C.id
のように、結合条件を全て指定してやると
その中で一番効率のよい結合条件で結合してくれる。
0595NAME IS NULL
04/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 NULL
04/09/06 12:45ID:???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);
ところで、オラクラーってこんなやつばっかか?
0597596
04/09/06 12:46ID:???AND NOT EXISTS (SELECT * FROM tbl_c WHERE cbid=tbl_b.bid);
0598NAME IS NULL
04/09/07 01:36ID:XZ/CGetQ使いかたを知っている方お願いしますm<_ _)m
0599NAME IS NULL
04/09/07 05:45ID:???試したら出来たけど、Accessって恐ろしいな
0600NAME IS NULL
04/09/07 11:45ID:WU8jHQSW例えばこんな感じで数値に変換できないレコードを無視したい。
insert into gaiku select to_number(gaikuno,'99990') from gaiku_tmp;
もっと複雑な物なので、除外するのが面倒なんです。
0601NAME IS NULL
04/09/07 15:58ID:???何かどっかで読んだようなきいたような話なんですけど
WHERE (条件A OR 条件B) AND (条件C OR 条件D)
みたいな場合、カッコでくくったことによる優先順位って、ちゃんとつけてくれるんですか。
それともカッコなんか無視されて
WHERE 条件A OR (条件B AND 条件C) OR 条件D
みたいな解釈をされちゃう可能性があるんですか。
ちらっと実験してみたところ、カッコによる優先順位はちゃんとつけてくれるように見えるんですけど。
心配なので確認したいなと。
0602NAME IS NULL
04/09/07 16:36ID:???そうは思わないか?
0603601
04/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 とかになったらもうやってられないなと思いまして。
いや、大丈夫ならいいんです。
お騒がせしてごめんなさい
0604598
04/09/07 18:16ID:cJghFX6x0605NAME IS NULL
04/09/07 18:17ID:JHskel+HInsert into TABLEA
Select * From TABLEA Where ID=1
では値が重複してしまいます。
ただ、ID以外の項目が変動しても修正しなくて良いよう、
Select 2 AS ID, ... From TABLEA とはしたくありません。
この場合、方法はあるのでしょうか?
よろしくお願いします。
0606NAME IS NULL
04/09/07 19:16ID:???それを確認するために、ちゃんと単体テストをやってスキーリしなされ。
つーか普通するだろ?
0607NAME IS NULL
04/09/07 20:30ID:???どうしてもと言われればテンポラリテーブル作るかも。
0608NAME IS NULL
04/09/07 20:35ID:gSoaBm+0カラム名に日本語を使用するのは邪道でしょうか?
カラム名に日本語を使用するメリット、デメリットを教えて下さい。
お願いしますm(_ _)m
0609NAME IS NULL
04/09/07 20:49ID:???・プログラムやSQLを書く時にいちいちIMEを操作するのはウザイ。
・全角、半角を間違えたり、"へ"や"ぺ"を平仮名と片仮名間違えたり
すると泣ける。
0610NAME IS NULL
04/09/07 21:20ID:MD7CjKHk結合の方法なのですが、どれが一番効率がいいでしょうか?
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
またパフォーマンスに大きな違いがあるのでしょうか?
0611605
04/09/07 21:38ID:JHskel+HSQL1本では・・・できないものでしょうか(汗
なにせ項目が多いものでテンポラリ作ってInsertするとメモリが・・・
すみません
0612NAME IS NULL
04/09/07 21:50ID:???0613NAME IS NULL
04/09/07 21:58ID:???RULEを定義すれば出来るんじゃないか。
0614NAME IS NULL
04/09/07 21:59ID:???効率以前にそんなSQLあんのか?どんなRDBMS?
0615NAME IS NULL
04/09/08 01:06ID:???基本的に列名には名詞や固有名詞を使う頻度が多くなるから
漢字のみで構成される機会がおおいですよね。
で、漢字の場合はある程度の略称で記述してあっても
わかりやすいです。ヘタな英単語で表記するなら、漢字か、
ローマ字読みで。
別にNAME如きにNAMAEまでするのはどうかと思いますが、
出資法上限利率とか利息制限法上限利率とか
完済時戻し利息とかを
無理やり英単語にされると混乱するので。それならいっそ、
"A"とか"B"とかにして、定義付けしてもらった方がよっぽどマシ。
まぁ、メリットデメリットあるでしょうから、好みに合う方を
使えばよろしいのでは?
0616NAME IS NULL
04/09/08 02:17ID:???まぁまぁ、そうカッカなさらずに。
文法間違いは脳内オプティマイザで処理してあげましょうや。
>610
1番と2番は結果は同じですが、
3番目は違います(外部結合。あと文法に誤りがありますよ)
まず、そこは理解していますか?
で、1番と2番のパフォーマンスの違いですが、そもそも
2番の省略形が1番です(どちらも交差結合を経て等結合)
RDBMSによっては、両者を明確に違うものとして考えて処理する
やつがおるかも知れませんが、まぁ、一緒でしょう。
なので、パフォーマンスは一緒のはずです。
気になるなら使用しているRDBMSの実行計画を確認してください。
0617616
04/09/08 02:29ID:???616に書き込んだ後で気づきましたが
ひょっとしてLeft JoinではなくInner Joinを書きたかったの?
0618NAME IS NULL
04/09/08 14:39ID:???insert into TABLEA ( ID, ... )
select 2, ... from TABLEA where ID=1
じゃあ駄目って理由がよくわからん。
... の部分がとっても多くて面倒ってこと?
常に ID に下駄を履かせてよく、かつ履かせた下駄に重複する ID はもともと存在しない、なら、
insert into TABLEA
select ID+1, ... from TABLEA
とかでいけそうだが。
0619NAME IS NULL
04/09/08 15:07ID:???> で、1番と2番のパフォーマンスの違いですが、そもそも
> 2番の省略形が1番です(どちらも交差結合を経て等結合)
文法的にはそうだけど、実際には交差結合を行わずに等結合でしょ。
3番目がINNER JOINの書き間違いなら3つとも実行効率は同じで、
違うとしたらパーサに掛かる時間ぐらいなものかな。
測定しても誤差程度でしか差は無いだろうけど。
SQLの書き方によって効率(速度)が変わる例も確かにあるが、
相関サブクエリでループしているときとかで、単純な結合なら
オプチマイザが結合順序とその結合方法を判断してくれますよ。
0621NAME IS NULL
04/09/10 00:55ID:ULGRyzE5そのトランザクション処理の中にはInsert文やUpdate文が数十個書いてあります。
BEGIN TRANSACTIONでトランザクション処理を開始しているのですが、
同時に数十人がアクセスしたときにデッドロックがおこってしまいます。
BEGIN TRANSACTIONをしていたら、一人の人がその中に入ると、
他の人は待ち状態にならないのでしょうか?
0622NAME IS NULL
04/09/10 01:27ID:???待ち状態があまりにも長いとデッドロックになったりするものなんですか?
0623NAME IS NULL
04/09/10 01:41ID:???時間切れ投了となります。
0624NAME IS NULL
04/09/10 01:51ID:???待ち時間が長すぎて、SQLサーバがデッドロックと間違えたということはありえるんですかね?
0625NAME IS NULL
04/09/10 20:05:34ID:B+rMfOQH可能でしょうか?
例)VB
Redim str(0 TO 100) As String
↓
??
0626NAME IS NULL
04/09/10 23:01:09ID:???0627NAME IS NULL
04/09/11 09:53:42ID:???0628NAME IS NULL
04/09/11 14:13:51ID:???0629NAME IS NULL
04/09/11 14:19:20ID:???0630NAME IS NULL
04/09/11 15:17:50ID:???> 他の人は待ち状態にならないのでしょうか?
なりません。待たせても構わない(並列度が低くても良い)のであれば、begin transaction の直後に、
そのトランザクション内で使用するすべてのテーブルに排他ロックをかければいいです。
select top 0 '' from TABLE_A (XLOCK), TABLE_B (XLOCK), TABLE_C (XLOCK) ...
このようにすれば、他の人は待ち状態になりデッドロックは発生しません。
0631NAME IS NULL
04/09/12 01:37:17ID:Nc5WKefOトランザクションの意味ないんじゃ・・・。テーブルをトランザクション中にさわられたら。
一つにストアドで20個ほどのテーブルを更新する時ってみんなどうしてるんですか?
全てのテーブルにロックをかけてるの?かけないとデッドロックなんてすぐに起こるんじゃ?
0632NAME IS NULL
04/09/12 05:11:07ID:???トランザクションの目的は排他ではなく原子性だよ?
実際には並列度が極端に落ちるのを嫌って、適切なロック粒度・ロック順というのを考えるんだけど。
> そのトランザクション処理の中にはInsert文やUpdate文が数十個書いてあります。
これだけの情報じゃどうしようもないな。SERIALIZABLE分離レベルで完全排他しとけば
とりあえずデッドロックは起こらない、としか言いようがない。
0633NAME IS NULL
04/09/12 10:22:29ID:???なるほど。トランザクション処理は何人かで重なると待ちが入るとばかり思ってました。
だから、デッドロックなど起こるわけ無いのにと悩んでいました。
今、1つのストアドで数十個、中で同じテーブルを何度もInsertかけたり
してややこしいのでロック順とか考えるのは大変そうです。
一度、SERIALIZABLEでロックして試してみます。
0634NAME IS NULL
04/09/12 15:50:03ID:???参考になるかどうわからんけど
http://www.atmarkit.co.jp/fnetwork/rensai/sql28/sql1.html
0635NAME IS NULL
04/09/12 17:52:04ID:???select SUM(price),name
from customer
group by name
とし、その結果を順位付けしてやりたいのです。
サブクエリでは集計関数が使えず、RANKもROW_NUMBERも
つかえないので困っています。よろしくお願いします。
0636NAME IS NULL
04/09/12 19:08:27ID:???SQL Serverは使ったこと無いけど、サブクエリで集計関数が使えないってのは本当か?
なんかの間違いじゃないのか?
0637635
04/09/12 19:21:03ID:???うーん間違いですかね。環境が手元にないのでエラーメッセージがうろ覚えなんですが、
'サブクエリ内ではHAVINGなどの句を使えません'みたいなエラーが出たんです。
ちなみに集計関数が使えたらどうされますか。
0638NAME IS NULL
04/09/12 19:45:54ID:???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 NULL
04/09/12 20:22:37ID:???MDBって複数項目を問い合わせデータでUpdateすることってできないんですか?
--
ex.
update hoge1Mst set
(Koumoku1, Koumoku2) = (select Koumoku1, Koumoku2 from hoge2Mst)
where Koumoku3 = '001';
--
0640NAME IS NULL
04/09/12 20:59:57ID:???「SERIALIZABLEトランザクション分離レベルは一番分離レベルが高いトランザクションタイプで、
ほかの同じオブジェクトを利用するトランザクションが並行して実行されるのを防止します。」
なんて平然と間違ったこと書いてるな。こういうので、>>621 みたいに勘違いする被害者が出るわけか。
ロック互換性の表も BooksOnline の間違いがそのまま載っているし…。
0641NAME IS NULL
04/09/12 21:55:52ID:???何が間違ってるんですか?
0643NAME IS NULL
04/09/13 17:30:47ID:???もう解決済みかもしれんけど、LIKE演算子で値が0〜9だけで構成されてる奴を拾ってINSERTするとか。
かなり重くなりそうだが。
0644NAME IS NULL
04/09/14 20:22:48ID:Ilhknr43UPDATE対象のテーブルを未作成で、エラーとなるように実行したとき、
SQL*PLUSにエラーメッセージが20行程度出力されたあと、
改行が無限に出力され、操作できなくなります。
(ほっておくとずっと改行されます)
同じUPDATE文を、ただのSQLスクリプトとして作成した場合は、それぞれ
エラーメッセージが正しく返ってくるのですが。
エラーメッセージのバッファかなにかがあふれているのでしょうか?
対処法をご存じの方いらっしゃらないでしょうか。
0645NAME IS NULL
04/09/22 13:59:41ID:???+----------------+-------+---------+
|レコード通し番号| 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 NULL
04/09/22 14:46:32ID:???0647NAME IS NULL
04/09/22 16:50:53ID:puHGPQqJSelect文で出力するRowの数を指定するにはどうしたらいいのでしょうか?
超初心者質問ですいません。
0648NAME IS NULL
04/09/22 21:37:09ID:???updateしたいレコードのID値を一度Selectで取ってきてから
updateするときにそのIDを指定する。
MySQLがサブクエリ使用可能なバージョンならサブクエリで書いてもいい
0649NAME IS NULL
04/09/23 00:28:53ID:???その構文使えるの、MySQL 4.0 以降じゃなかったっけ。
MySQL のバージョンは?
0650NAME IS NULL
04/09/23 13:50:26ID:xu7mwazl中の数値ってプログラム上の変数に設定とか参照とかするにはどうすれば
いいのでしょうか。
a=データベースの値
みたいプルグラムを組みたいんですけど。
SELECT文で戻り値とかとれるのかな?
ご教授よろしくお願いいたします。
0651NAME IS NULL
04/09/23 21:35:16ID:???0652NAME IS NULL
04/10/04 13:16:32ID:???初歩的なことかもしれませんがよろしくお願いします。
二つのテーブルから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 NULL
04/10/04 17:13:41ID:???MySQLで使えるかどうか判りませんが、
SELECT * FROM uesr_list WHERE NOT EXISTS
(SELECT * FROM vote WHERE ユーザ通し番号=1 AND uesr_list.ユーザ通し番号=指名先ユーザ番号);
0654652
04/10/04 17:41:24ID:???0655NAME IS NULL
04/10/04 17:46:47ID:???0656NAME IS NULL
04/10/04 18:14:52ID:???ン? HAVING...
0657NAME IS NULL
04/10/07 15:12:39ID:???それとも小文字?
どうでもいいような事ですが結構大文字小文字は他人のソース見るときに気になりますよね・・・。
私は小文字ですけど大文字の方が多いのかなぁ。
0658NAME IS NULL
04/10/07 15:55:02ID:???「プログラマのためのSQL」も含め、手元にあるDB本は
予約語(SELECT WHERE BEGIN INTEGER ....)や標準関数(MAX SUM COUNT)等は
大文字で、テーブル名やカラム名は小文字になっているので、俺もそうしている。
「プログラマのためのSQL」の場合、テーブル名の頭文字は大文字。
SELECT T1.column1,SUM(column2) FROM Table AS T1 GROUP BY column1;
こんな感じです。
0659NAME IS NULL
04/10/07 17:50:35ID:???小文字の方が都合の良い事が多い。
印刷物が大文字なのはただの例。
0660NAME IS NULL
04/10/07 20:52:21ID:???ただし今のプロジェクトの規約では全て大文字…わかりづれえ
0661NAME IS NULL
04/10/08 06:31:06ID:???別にnot in でもいいかと
プログラムやってる人は小文字のが都合がいいでしょうね
0662NAME IS NULL
04/10/08 08:57:16ID:???0663NAME IS NULL
04/10/08 13:50:08ID:???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 NULL
04/10/10 18:02:37ID:tjm3ZlIxSQLでローカルのファイル(d:\temp\test)をDBに書く方法を教えてください。
DBは MS SQL Server2000、接続はODBCです。
書き込み先は image型を設定しました。
ローカルのファイルはバイナリだったり、テキストだったり不定です。
ファイルサイズは1MB程度で、最大値の制限等はとりあえず考慮不要です。
0665NAME IS NULL
04/10/12 00:20:53ID:RyKiJxetODBCでできるかは知りませんが、ADOならできます。
次のURLのSample2が参考になると思います。
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q258038
0666NAME IS NULL
04/10/12 02:33:59ID:???0667NAME IS NULL
04/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 NULL
04/10/14 16:19:08ID:???SELECT id,name,NULL,timestamp FROM Table1 UNION SELECT id,name1,name2,timestamp FROM Table2 ORDER BY timestamp DESC;
0669NAME IS NULL
04/10/14 16:20:35ID:???UNION じゃなくて、 UNION ALL の方がよかったかも。
0670NAME IS NULL
04/10/14 16:23:37ID:???UNION (SELECT * FROM テーブル2)
ORDER BY timestamp DESC
0672NAME IS NULL
04/10/14 21:47:11ID:IzZvBEH7mysql+vb+MyODBC
の環境ですが、
住所録を作ってみると、
漢数字"十"だけが見事に文字化けしています。
文字はsjisに設定しています。
対処方法がお分かりになる方がいましたら、ご教示いただけませんでしょうか?
よろしくお願いいたします。
0673NAME IS NULL
04/10/14 21:58:13ID:???所謂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 NULL
04/10/14 21:58:24ID:???0675NAME IS NULL
04/10/14 22:05:40ID:IzZvBEH7早速のご回答、
どうもありがとうございました。
何とかがんばってみます。
0676NAME IS NULL
04/10/15 01:36:18ID:kuiDTThnある変数を渡すとします。
その変数の値によって、ORDER BY句に指定する項目を変えたいのです。
SQLServerの場合は動的に場合わけをして、最後にExecuteをしていました。
オラクルではどうするのですか?
0677NAME IS NULL
04/10/15 01:53:45ID:???PL/SQLはプログラミング言語なんだから分岐くらい好きなだけ書け。
0678NAME IS NULL
04/10/15 05:52:18ID:???0679NAME IS NULL
04/10/16 00:32:52ID:???dbの中にどんなテーブルがあるか調べる方法はあるのでしょうか?
自分で作ったものなら、構成が分かっているので
SQL書けますが、他人が作ったdbで仕様書も何も無い場合
どうすればいいのかと。
0680NAME IS NULL
04/10/16 00:54:20ID:???0681NAME IS NULL
04/10/16 00:59:49ID:???おお、見られました。
どうもです
0682NAME IS NULL
04/10/16 02:07:08ID:???0683NAME IS NULL
04/10/16 18:14:42ID:???0684NAME IS NULL
04/10/16 18:14:52ID:1kpG5WKg0685NAME IS NULL
04/10/16 20:43:00ID:???ttp://www.bodaijyu.co.jp/table.htm
0686NAME IS NULL
04/10/16 22:35:53ID:iqfQyweG(例)SELECT 番号 from テーブル group by 日付 これは駄目。。。
その理由は分かるのですが、group by によってグループ化されたそれぞれのグループを構成するレコード
がなんなのかをスマートに知る方法で悩んでいます。
良い知恵ないすか??
0687NAME IS NULL
04/10/16 23:05:05ID:JtOmyvAq通らなくなりました。
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 NULL
04/10/16 23:08:25ID:???LEFT OUTER JOIN とか使えば実現できるよ。
0689NAME IS NULL
04/10/16 23:42:01ID:dYJGDROU意味がワカラン。
0690NAME IS NULL
04/10/17 00:58:55ID:???日付→番号のFDがあれば、SQL99ならエラー出ないよ。
0691NAME IS NULL
04/10/17 02:25:15ID:???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 NULL
04/10/17 13:16:17ID:AJ0SRVDPアドバイスありがとうございました!
まだSQLの経験が浅いため
「LEFT OUTER JOIN」や「RIGHT JOIN」の使い方からまだ、よくわかっていません。
これからの使い方から勉強してます。
ほんとに助かりました。
0693692
04/10/17 21:53:01ID:???「これらの使い方から、勉強してみます。」
と、書いたつもりが・・・
0694NAME IS NULL
04/10/19 10:13:49ID:???テーブル名が違うだけで
まったく同じ構造のテーブルA,Bがあるのですが、
AのレコードとBのレコードを比較して
不一致なレコードのみを表示するSQL教えてもらえませんか?
Oracle9iです。
0695NAME IS NULL
04/10/19 10:54:14ID:???SELECT 片方.何か FROM 片方 WHERE NOT EXISTS
(SELECT もう片方.何か FROM もう片方 WHERE もう片方.何か = 片方.何か)
0697NAME IS NULL
04/10/19 11:57:18ID:???0698NAME IS NULL
04/10/19 12:26:45ID:???0699694
04/10/19 14:01:50ID:???テーブルA、Bがあって
select * where A != B
じゃあだめか・・・・・
0700NAME IS NULL
04/10/19 14:19:08ID:???Oracleでつかえるかどうかしらんが、
SELECT * FROM TableA EXCEPT SELECT * FROM TableB;
0701NAME IS NULL
04/10/19 15:01:58ID:???(select * from A minus select * from B) UNION ALL (select * from B minus select * from A);
0702700
04/10/19 15:07:19ID:???(SELECT * FROM TableA EXCEPT SELECT * FROM TableB) UNION ALL (SELECT * FROM TableB EXCEPT SELECT * FROM TableA);
0703NAME IS NULL
04/10/20 00:15:45ID:???どのカラムが異なっても駄目、なんてレベルだったら、いっそバルクアウトしてテキストで
比較しろ。その方が速いと思うぞ。
0704667
04/10/20 19:06:24ID:wWckF4JtSELECT 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 NULL
04/10/20 19:13:23ID:???UNION してからWHEREする方がWHERE句が一つで済むかもしれないが、
個別の方が等速か高速だろう。だから、それでいいんじゃないかな。
それより、重複を許可もしくは重複が起こらない状態ならUNION ALLの
方が高速です。
0706704
04/10/20 19:21:21ID:???有難うございます。
やっぱり、個別の方が速いんですね。
ちなみに、個別ではなく
一つの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 NULL
04/10/20 19:27:06ID:???一つで書いても最近の製品ならオプチマイザが判断して
個別に抽出してからUNION結合してくれると思うけどね。
略して書くけど、こんな感じ。
SELECT * FROM (SELECT * FROM A UNION ALL SELECT * FROM B) WHERE timestamp>='2004-02-01' ORDER BY timestamp DESC;
0709NAME IS NULL
04/10/21 15:25:59ID:jhDm5sXOid | 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 NULL
04/10/21 15:31:26ID:???1|AA|20040804|1000
ってすれば簡単だよ?
0711NAME IS NULL
04/10/21 15:35:01ID:???でもいいけど
0712709
04/10/21 15:35:50ID:jhDm5sXOごめんなさい。よく分からないです・・・
select id,name,min(created) from このテーブル group by id,name
ってやると望む結果が出ないので困っています・・・
0713709
04/10/21 15:39:50ID:jhDm5sXOごめんなさい。説明不足です。
別に1000が取り出したいのではなく、createdはtimestampなので、
各ID毎の一番毎の古い時間のidが取得したいのです。
なので AA だと 00:20:00 より 00:10:00 みたいな感じです。
なので AA だと id 1 BB は 3 CC は 6が取得したいんですよ。
0714NAME IS NULL
04/10/21 15:42:27ID:???WHERE dateformat(created,'HH:MM') = '00:10'
WHERE format(created,'hh:m') = '00:10'
0715709
04/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を取得したいです。
0716709
04/10/21 15:50:57ID:jhDm5sXOSELECT name,min(created) FROM このテーブル GROUP BY name ORDER BY min;
これでnameと時間は取得できますが、ここにidを追加したときにできません。
0717NAME IS NULL
04/10/21 15:51:56ID:???where tablea.created =
(select min(created) from table tableb where tableb.name = tablea.name)
出ででるかな?
0718709
04/10/21 15:57:42ID:jhDm5sXOすみませんだめです・・・
0719709
04/10/21 16:05:03ID:jhDm5sXOselect id,name from table A where A.created = (select min(B.created) from table B where B.name = A.name);
みなさんありがとう。
0720NAME IS NULL
04/10/21 16:05:19ID:???(SELECT name, min(created) AS created FROM tbl1 GROUP BY name) v1 ON tbl1.name=v1.name AND tbl1.created=v1.created
0721709
04/10/21 16:26:43ID:jhDm5sXOありがとうございます。explainしたらこっちの方が早かったのでこれを使います。
ありがとう。
0722720
04/10/21 16:36:27ID:???0723709
04/10/21 16:39:39ID:jhDm5sXOえええ!せっかくできたと思ったら・・・
どう違うんですかね?
0724720
04/10/21 17:06:29ID:???0725NAME IS NULL
04/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 NULL
04/10/21 17:52:22ID:???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;
0728NAME IS NULL
04/10/21 18:04:43ID:???0729725
04/10/22 00:28:32ID:???ありがとん。>>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 NULL
04/10/22 20:11:49ID:???フロントエンドをAccessで作ってADOで接続し、DBはMSDEを使っています。
ある検索条件で持ってきたレコードセットを一発か二発程度でカンマ区切りの
テキストファイルに出力する方法はないでしょうか?
以前はSELECT * INTOをcn.Executeでテーブルを作成して、それを作成した
テーブルをDocmd.TransferTextで出力していたのですが、ソースを改善したら
オブジェクト''オブジェクトテーブル名が見えません''が見えません
というエラーが出てしまいます。
どなたか検索した結果をコマンド等で出力する方法を御教授ください。
0731NAME IS NULL
04/10/22 20:48:43ID:???0732NAME IS NULL
04/10/22 22:10:23ID:???やっぱりDTSかBCPですか。。。。了解しました。
サンクスです。
0733NAME IS NULL
04/10/25 16:50:48ID:nPS1O3VQ1から10、(1,2,3,4,5,6,7,8,9,10)
2から7(2,3,4,5,6,7)というような任意の連番を取得するSQLはありませんでしょうか?
DBはSQLServer2000です。よろしくお願いいたします。
0734NAME IS NULL
04/10/25 17:00:59ID:???0735NAME IS NULL
04/10/25 17:07:16ID:???不勉強で申し訳ありませんが、Loopでテーブルを結合するということですか?
それともT-SQLを使用するということでしょうか?
ヘルプを引いてみたのですが、いまいちピンとくる項目に該当しません。
0736NAME IS NULL
04/10/25 17:11:23ID:???ナシの方向でお願いいたします…
0737NAME IS NULL
04/10/25 17:16:51ID:???それ以前に、そんなものが何のために必要なのかわからんが。
0738NAME IS NULL
04/10/25 17:19:42ID:???ActiveReportにデータを渡すのに、
社内の標準の都合でSELECT文にて渡さなくてはいけないので…
やはりテーブルを作るしか手がありませんでしょうか。
0739NAME IS NULL
04/10/25 18:08:18ID:???1:MySQLの文字コードを確認したい
2:デフォルトの文字コードを変えたい
よろしくおねがいします。
0740NAME IS NULL
04/10/25 19:35:08ID:???スレ違い
ヒント mysqladmin
0741NAME IS NULL
04/10/25 19:40:02ID:???1:確認すればいいでしょう。
2:変えればいいでしょう。
0742NAME IS NULL
04/10/25 20:01:11ID:???と思ったけど、SQLじゃないからスレ違いだ。
0743NAME IS NULL
04/10/26 01:10:11ID:???要件がよくわからんのだが
between 1 and 10 で済むような話ではないの?
0744NAME IS NULL
04/10/26 02:26:27ID:???SQL文ってDML、DDL、DCLとか分類されるじゃないですか。で、
SELECT文なんですが、これってDML文に含まれるんですか?
なんか、文献によって入るのと入らないのがあるんですが、
正確な定義としてはどうなんでしょう?
0745NAME IS NULL
04/10/26 02:49:12ID:???0746NAME IS NULL
04/10/26 14:01:43ID:???DML= Data Manipulation Language
DDL= Data Definition Language
DCL= Data Control Language
でつ。
0747NAME IS NULL
04/10/26 14:04:02ID:???0748NAME IS NULL
04/10/26 15:39:17ID:???どうしてもというなら
select 1
union
select 2
...
SQLServer2000でできるかは知らないけど。
0749NAME IS NULL
04/10/26 16:01:29ID:???ボラクルだけは、入らない。
一般的には(その他のDBMSでは)DMLに含まれる。
0750NAME IS NULL
04/10/26 16:24:37ID:???それ、やってみましたが、0〜999とかやると重くて… OTL
他のアプローチ(VBのコード、ActiveReport等)で出来ないか少し考えてみます。
0751NAME IS NULL
04/10/26 16:30:59ID:???0752NAME IS NULL
04/10/26 17:21:32ID:???PL/SQLで質問です。
いまAKKOというテーブルがあります。
このAKKOというテーブルのコピー
を毎日2時にAKKOn(n=1〜10、nはサイクリックにする:10を超えると1にもどす)
という名前のテーブルを作成したいのです。
この要件を満たすPL/SQLを教えてください。
PL/SQLについて詳しく解説しているサイトが無くて・・・
0753NAME IS NULL
04/10/26 17:28:16ID:???動きに関係ないし、実務で特に使い分けたりもしないので、気にするな。
試験を受ける気でいるのなら、その試験を受けるDBの説明書読め。
0754NAME IS NULL
04/10/26 17:29:39ID:???0755NAME IS NULL
04/10/26 22:08:19ID:+RDPVwiRselect * from emp upcase(name)=upcase('HOGE');
とかやったらインデックス使えないし。なんか常套手段ってないスか?
0756NAME IS NULL
04/10/27 00:01:02ID:???検索方法はそれでいいと思うけど、インデックスを使いたいなら
関数インデックスを作る。
0758NAME IS NULL
04/10/27 01:43:12ID:r+P4i5sVそういうバッチ処理は、スクリプトで書いた方が
簡単だと思うが。
あえて書くなら、こんなの書いて、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 NULL
04/10/27 02:41:47ID:4CD+cdaIここで、updateコマンドで、5を足したいのですが可能でしょうか?
SUM()を使えば出来そうな気がするのですが、マニュアル読むかぎり
列どうしでないと出来ないっぽいのですが、出来る方法ありましたら
是非、ご伝授頂きたいと思います。宜しくお願い致します。
0760NAME IS NULL
04/10/27 02:52:12ID:???P = P + 5
0761NAME IS NULL
04/10/27 02:54:04ID:???UPDATE テーブル名 SET P=P+5 WHERE 何とかかんとか=ほにゃらら とかすればいいのでは・・・
0762761
04/10/27 02:54:26ID:???0763759
04/10/27 03:00:58ID:???なるほど!SUM()とか使わなくとも出来たんですね。ありがとうございました!
今、ご飯食べてるので、終わったら試してみます!
0764NAME IS NULL
04/10/27 20:27:51ID:4CD+cdaI2004-11-25
な日付があって、残り日数を出したい(上記日付から現在の日付を引く)んですが、
SQLで出来ますでしょうか?たとえば、後、30日なら30でいう形です。
0765NAME IS NULL
04/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 NULL
04/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 NULL
04/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 NULL
04/10/27 21:56:56ID:???SELECT dstamp-CURRENT_DATE FROM m_d;
0769NAME IS NULL
04/10/27 22:20:24ID:vcMuSB+s最も一般的と思われる方法をを教えて頂けませんでしょうか。
0770764
04/10/27 22:24:20ID:4CD+cdaIありがとうございました。これで出来るんですね。。。知らなかった。。。
とても勉強になりました。
select dayofyear(dstamp - current_date) from m_d;
なんて、トンチンカンなSQL書いてしまって、エラー出て悩みまくっていました。
本当にありがとうございました。
0771770
04/10/27 22:51:12ID:4CD+cdaI月が変わると全然違う日付が帰って来てしまうようです。
mysql> insert into m_d values('2005-06-01');
mysql> select dstamp - current_date from m_d;
9574
また、何か見落としているんでしょうか。。。
0772770
04/10/27 23:11:00ID:???が出来ました。どうもお手数お掛け致しました。
select to_days(dstamp) - to_days(current_date) from m_d;
0773NAME IS NULL
04/11/01 12:07:21ID:2Tw1B6rMINSERT や UPDATEで、'を含んだ文字列は、どのようにSQL文を書いたらいいのでしょうか。
例えば
INSERT INTO SAMPLE (ID, WORD) VALUES (1, 'Let's GO!');
と、Let's GO!を登録したいのですが…
0774NAME IS NULL
04/11/01 13:02:34ID:???DBによってそれぞれエスケープさせる文字があると思うが、
多くの場合は\で可能かな?
INSERT INTO SAMPLE (ID, WORD) VALUES (1, 'Let\'s GO!');
0776NAME IS NULL
04/11/01 20:11:42ID:???シングルクォートを二つ並べる処理系もある
INSERT INTO SAMPLE (ID, WORD) VALUES (1, 'Let''s GO!');
0777NAME IS NULL
04/11/01 20:13:17ID:???0778NAME IS NULL
04/11/01 20:50:27ID:???0779NAME IS NULL
04/11/01 21:25:45ID:???0780NAME IS NULL
04/11/01 21:42:42ID:???0781NAME IS NULL
04/11/01 21:42:55ID:???0782NAME IS NULL
04/11/01 21:46:16ID:???シングルクォートの方が標準なのか。へぇ〜
0783NAME IS NULL
04/11/01 21:51:37ID:???0784NAME IS NULL
04/11/01 22:20:49ID:???(+)とかな(w
0785NAME IS NULL
04/11/01 22:22:01ID:???どっちでもいい。
多分、Oracle互換のためにクオートも実装してるんではないかと。
0786NAME IS NULL
04/11/01 22:42:36ID:???それ激しく便利なんだよな
left joinとか書くよりも直感的でわかりやすいと思うんだよ
0787NAME IS NULL
04/11/02 11:58:33ID:PlFI4bf504/01/01 04/08/05
04/02/10 04/10/10
04/10/20 00/00/00
上のようなデータから、登録日と変更日の両方合わせての最大値を
取得したいのですが。(上の場合だと「04/10/20」)
0788NAME IS NULL
04/11/02 12:12:54ID:wFpwwGCM一秒でも速くしないとならんのですが
下の書き方で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 NULL
04/11/02 12:44:58ID:Y8T1Y7g6TOP関数でやってるんですが次の50件はどうやってますか?
(SQLServer2000)
0790NAME IS NULL
04/11/02 12:52:17ID:???いろいろ方法があると思うけど、インデックスがうまく機能するのなら、
SELECT MAX(max_date) FROM
(SELECT MAX(登録日) AS max_date FROM Table
UNION
SELECT MAX(変更日) AS max_date FROM Table);
が速いかな? SQLはあっているけど、速度的にどうかは自信なし。
>>788
関数インデックスを作成して1に1票。
つか、実行して計測すればわかるんじゃないの?
0791789
04/11/02 16:47:24ID:???0792NAME IS NULL
04/11/02 16:56:19ID:???0793NAME IS NULL
04/11/02 17:01:27ID:???OFFSETとLIMITってないのか?
標準的にはカーソルを使う。
0794789
04/11/02 17:07:00ID:???さんくす!調べて見ます->OFFSETとLIMIT
>標準的にはカーソルを使う。
カーソルということは、ADOだったらレコードセットをぐるぐるまわす
ということですか?
0795NAME IS NULL
04/11/02 17:29:26ID:???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 NULL
04/11/02 17:38:15ID:???スレ・板違いだったらスマソ。
0797789
04/11/02 17:54:04ID:???レスさんくす!
>SQLサーバにはOFFSET,LIMITは無かったような・
調べた結果ありませんでした
提示のSQL理解してみます
0798NAME IS NULL
04/11/02 23:11:57ID:???ここでもOKだと思うけど、MSSQLスレのほうがいいかも。
MS SQL Server 総合スレ2
http://pc5.2ch.net/test/read.cgi/db/1093012583/
0799NAME IS NULL
04/11/03 00:42:32ID:gKJQUjH30800NAME IS NULL
04/11/03 00:57:28ID:gKJQUjH3http://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 NULL
04/11/03 02:27:45ID:y6dEl/yNネットワークのプロ募集ちゃうんか?
0802NAME IS NULL
04/11/03 12:25:00ID:???神が沢山降臨希望のようですので、現在間に合う状況になりそうです。
本体の方も止めてください。本当にありがとうございました。
また必要情報などがありましたらオフィシャルWebサイトにアップしますのでご支援よろしくお願いします。
-- まさたか@川口? 2004-11-03 (水) 10:06:32 New!
0803NAME IS NULL
04/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 NULL
04/11/03 22:00:09ID:???table B
3,B
4,B
5,B
でした。
0805NAME IS NULL
04/11/04 00:40:43ID:???tableA.A, tableB.B from tableA
full outer join tableB
on tableA.id = tableB.id
order by idd
0806NAME IS NULL
04/11/04 00:41:17ID:???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で動くかどうかは知らん。
0807806
04/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 NULL
04/11/04 02:17:50ID:???レス有難うございました。
>>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;
テストテーブルでは軽すぎて速度は測定出来ませんでしたが、本データベースで試して見て速度が速い方を使うことにします。
0809806
04/11/04 05:12:59ID:???俺が書いたSQLはターゲットリストのサブクエリが1行のみ返す状態でないとエラーが発生するので、
貴方が書いたSQLの方が安全かも。
各テーブルにおいてidがUNIQUEであり、インデックスが張られていてインデックス検索が有用なら、
俺が書いた方が高速だと思う。処理系や他の条件によっては変わるだろうけど。
0810806
04/11/04 06:28:10ID:???808の方が速かった。
そんなことより、FULL JOIN が使えるのなら、
SELECT * FROM Table_a FULL JOIN Table_b USING(id);
で済むし、一番速そうなんだけどw
0813NAME IS NULL
04/11/05 19:04:20ID:st/1ZvTx----------+---------------------
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));
こんな感じでいろいろ試してみました
0815NAME IS NULL
04/11/05 20:45:57ID:???0816えせ壊人
04/11/05 22:03:57ID:eQUK2KFnextractと同等と説明されてるが
date_partだと>>813の構文でも上手くいったと思う
今 確認できる環境がないけど試してみ
0817NAME IS NULL
04/11/06 00:33:23ID:???ttp://www.postgresql.jp/document/pg721doc/user/functions-datetime.html
'EXTRACT'は'DATE_PART'と同じ
EXTRACTで無理な事はDATE_PARTでも無理
0818NAME IS NULL
04/11/06 11:33:32ID:???じゃなくて、816さんは構文の違いを指摘してるんでしょ?
extract()とdate_part()は機能は同じだけど、カンマか"FROM"か
という違いがある、と。
あとあまり古いドキュメントのURLを貼らないでね。
0819NAME IS NULL
04/11/07 01:50:37ID:???001 鈴木
001 佐藤
002 山田
ってデータが入ってるとき
SQLで抽出すると
syozoku namae
001 鈴木
佐藤
002 山田
のように表示させたい場合ってどのようにしたらいいでしょうか?
DBはOracle9iです。お願いします。
0820NAME IS NULL
04/11/07 02:34:23ID:???0821NAME IS NULL
04/11/07 02:38:34ID:???副言語でそのまま取り出して、主言語で加工。
0822NAME IS NULL
04/11/07 04:38:18ID:???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 NULL
04/11/07 18:06:43ID:???0824NAME IS NULL
04/11/07 19:58:57ID:???0825NAME IS NULL
04/11/07 22:06:58ID:xiv90rCfItaliano?
Portugese?
0826NAME IS NULL
04/11/07 23:43:13ID:???開発用に使うだけなら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 NULL
04/11/09 15:51:14ID:???このテーブルから、『各部門ごとの、一番最近に処理された金額を取得』したいんですが、
とりあえず思いつくのは
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 NULL
04/11/09 19:57:21ID:???書いてある通りで、同僚さんのSQLの方が意味をストレートに汲み取れる
と思うのだが。
どう書くかは、索引を意識したり、実行計画を意識したりってのが
未だ無理なら、他人に分かり易いように書けば?
でも、dup row になりそうな悪寒。
0829NAME IS NULL
04/11/09 20:30:32ID:PvmqmfFE0830NAME IS NULL
04/11/09 20:33:35ID:???いや、もう定型だから後者のように書くけど、ぱっと見でどっちが咄嗟に理解
出来るかといえば前者な漏れ orz
でもこれってコスト的には前者の方が低くない?
>827
藻舞の同僚の方がSQL出来そうなんで、とりあえず同僚に聞け。
まずはそれからだ。聞く事を恥と考えるな。
0831NAME IS NULL
04/11/09 21:50:12ID:???というものだと思います。
http://www.postgresql.jp/document/current/html/sql-expressions.html#SQL-SYNTAX-SCALAR-SUBQUERIES
で、FROM句に書く方はtable subquery。
0832NAME IS NULL
04/11/09 22:29:22ID:???セミコロンが含まれる文字列を検索する場合、
SELECT * FROM テーブル名 WHERE フィールド名 like '%;%'
↑これでよいの?
どうも、全検索になってしまうんですが。
(Firebird1.5を使ってます)
0833NAME IS NULL
04/11/10 00:06:07ID:???FB知らんが、セミコロンの前にエスケープ記号を入れたらいいんじゃね?
0834832
04/11/10 13:02:20ID:???レス、サンクス。
セミコロンのエスケープ記号って、一般的には
何になるのですか?
とりあえず、
1.SELECT * FROM テーブル名 WHERE フィールド名 like '%#;%' ESCAPE '#'
2.SELECT * FROM テーブル名 WHERE フィールド名 like '%\;%'
3.SELECT * FROM テーブル名 WHERE フィールド名 like '%;;%'
を試したところ、1.、2.はヒットせず。
3.だけが、うまくヒットしました。これで良いんですか?
0835NAME IS NULL
04/11/10 15:02:46ID:/ScPk9xzExcel2000のVBAでADOを使ってAccessのデータベースを
読み込もう(Excelのシートにテーブルを展開しよう)としています。
テーブル名が"GROUP"と言うデータベースを読み込むとき、
cmd.CommandText = "SELECT * FROM GROUP"
Set recset = cmd.Execute
とすると
「FROM句の構文エラー」と言われてしまいます。
他のテーブル名のデータベースは読み込めるのですが、
この場合どうすればいいのでしょうか。
ご教示お願いいたします。
ちなみに
cmd.CommandText = "SELECT * FROM 'GROUP'"
としてもだめでした。(「クエリの句が不完全です」)
0836NAME IS NULL
04/11/10 15:35:19ID:???0837S
04/11/10 15:48:35ID:???ある値より大きい値求めて、それを昇順で並べ替え、
その最初のデータと同じデータを求めるにはどうすればいいんですか。
0838NAME IS NULL
04/11/10 15:53:42ID:???0839NAME IS NULL
04/11/10 16:18:28ID:???(1) DELETE FROM TABLE
(2) DELETE TABLE
SQL界の主流はどっちですか?
僕は(1)じゃないと落ち着かないんですが、先輩(♀)が(2)な人で対立してます。
0840NAME IS NULL
04/11/10 16:32:46ID:???夜にとことん話し合え。
全裸で。
0843NAME IS NULL
04/11/10 16:42:39ID:???SELECT * FROM 女 WHERE 年齢 BETWEEN 10 AND 15
0844NAME IS NULL
04/11/10 16:47:11ID:69SzujgL必要な部分だけ取り出せよ。
SELECT オパーイ FROM 女 WHERE 年齢 BETWEEN 18 AND 25
0845NAME IS NULL
04/11/10 16:52:39ID:???URL
--------------------------- ------------ ------
ttp://www.kiyosan.co.jp/php4/search_categ.php?id=105
0846NAME IS NULL
04/11/10 16:55:40ID:???>>843の*はアナルだろ
0847NAME IS NULL
04/11/11 04:41:54ID:???動けばいいだろ。
どっちでもいいよ。
そんなことでもめる暇あったら、もめてる分だけ速く納品しろ。
0848NAME IS NULL
04/11/11 09:04:20ID:???0849NAME IS NULL
04/11/11 09:35:27ID:???納品なんて、期日よりも早くても遅くても駄目なのが普通なんですが?
0851NAME IS NULL
04/11/11 12:58:28ID:???納期よりも、FROMをきっかけに
どうやって、先輩を口説き落とすかが
問題だと思います。
0852NAME IS NULL
04/11/11 13:07:12ID:???先輩・・・実は僕・・・INSERTの仕方もわからないんですっ
と
0853NAME IS NULL
04/11/11 13:35:32ID:G1Y3gPo/いいけど、ついでにUPDATEも教えてあげるわね。
#数ヵ月後に住民票のUPDATEイベント発生・・・
0854NAME IS NULL
04/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 NULL
04/11/11 22:58:53ID:???>>803-810
0856NAME IS NULL
04/11/11 23:09:43ID:???すいません、ログを見ずに質問してしまいました。
非常に助かりました、ありがとうございます。
0857856
04/11/11 23:19:29ID:???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 NULL
04/11/11 23:41:43ID:???FULL JOIN を使わない方法が知りたいのじゃなかったのか?
FULL JOINなら単純に
SELECT * FROM A FULL JOIN B USING(code);
で済むと思うが。
OUTER JOIN 系を一切使わないなら >>807
0859NAME IS NULL
04/11/11 23:54:52ID:???0860NAME IS NULL
04/11/12 07:57:33ID:???selet 商品コード, sum(金額A), sum(金額B) from (select 商品コード, 金額A, 0 as 金額B from 商品テーブルA union select 商品コード, 0, 金額B from 商品テーブルB) T group by 商品コード
とか言うのも思いついた。
0861NAME IS NULL
04/11/12 17:57:04ID:???0862NAME IS NULL
04/11/12 19:32:12ID:???Union (not All) だと Inner Join 部分が 2重になっちゃう。
0863名無しさん
04/11/12 20:48:21ID:???逆だろ
UNION ALL だと INNER JOIN で返るのと同じ行が重複するが、
ただの UNION (ALL を付けない UNION) なら重複部分は1行
しか返されない。
0864NAME IS NULL
04/11/13 00:13:50ID:???もし、
テーブルAが
商品テーブルA
商品コード 金額A
AAA 1000
AAA 150
BBB 900
DDD 2000
とかなら狂うね。
まあ、商品コードが重複するかしないかが
明記されていないので分からないが。
>>860のやり方が妥当だろうか。
ゼロの部分をNULLにして数値項目をTO_CHARしないと
駄目だろうけど。
0865NAME IS NULL
04/11/14 00:47:07ID:V5M6q6HiDATE型の要素を表示する際に、
日付を表示しない方法を考えています。
具体的にはDATE型でフォーマットされているテーブルに、
2004-11という「西暦-月」のみを挿入し、
表示した際に日付を出さないということです。
ちなみに、データ出力時(SELECT文)に日付を出さないという条件をつけるのはダメです。
自分で考えてみた
TO_DATE('2004-11','YYYY-MM')
という文では、データ出力時に日付まで表示されてしまいます。
何か良い方法はありませんでしょうか。
0866NAME IS NULL
04/11/14 01:09:08ID:???0867NAME IS NULL
04/11/14 05:42:36ID:gZNduTNd日付はダミーで入れといて、
SELECT TO_CHAR(カラム名,'YYYY-MM') FROM テーブル名;
でどうですか?
0868NAME IS NULL
04/11/14 06:02:16ID:???0869NAME IS NULL
04/11/14 06:22:32ID:XwWBrCKZそれ以外だったら to_char()
0870NAME IS NULL
04/11/14 12:03:02ID:+I1IWcq/Firebirdなのですが。
0871NAME IS NULL
04/11/14 12:03:55ID:???DATE型で定義されている以上無理じゃない?
DATE型で有る以上ダミーの日のデータは必要だし
ダミーでも日付が有ればそのままだとそれが出てきてしまう。
それが嫌ならDATE型をやめるしかないな。
year型とtinyint型で年と月のカラムを作成してそこに突っ込んでいくか
int型で西暦0年1月からの経過月数を保存しておくか(2004-10なら2004*12+10-1#一発で計算する方方有るかも)
いっそのこと文字列型としてそのまま保存しちゃうか。
0872865
04/11/14 15:14:06ID:???SELECT * FROM xxxxxx で出力しなければいけないので、
その方法は使えないのです。
>>868・867
本気初心者なんで、変な回答してるかもしれませんが・・・
ORACLE SQL*Plus使ってます。
TO_CHARは・・・DATE型っていう指定があるのでダメっぽいです。
>>871
DATE型の指定がくせ者ですよね・・・。
みなさん、色々ありがとうございます。
まだ解決していませんが、もう少しがんばってみようと思います。
0873NAME IS NULL
04/11/14 15:41:19ID:???0874NAME IS NULL
04/11/14 16:03:47ID:???なんじゃその規約
野糞未満じゃねーか
0875NAME IS NULL
04/11/14 16:04:31ID:???select * from (SELECT TO_CHAR(カラム名,'YYYY-MM') FROM テーブル名)
0876NAME IS NULL
04/11/14 16:40:18ID:???0877NAME IS NULL
04/11/14 16:41:50ID:???昔、糞えせの下でPGしてたとき、そんな規約があったな
つーか、200カラム以上あってSELECT文にカラム名(長い&日本語)書くとバグると思うから止めてねって何よ orz
0878NAME IS NULL
04/11/14 18:11:59ID:3xr8bqJJORACLE SQL*Plus っていうのじゃできないかな?
0879NAME IS NULL
04/11/14 18:17:24ID:???オレは int4 を使っている。
扱った経験があるのは YEN だけだけど。
0880NAME IS NULL
04/11/15 00:39:51ID:bZZx79pgビュー作ってそれを select * するんじゃ駄目なのか?
(select * する時点でダメダメだが)
というか、その DATE 型の要素を表示するのは、なんなんだ?
そちら側で加工して出力するんじゃ駄目なの?
0881NAME IS NULL
04/11/15 09:07:49ID:???update tableA
set a = (select aa from tableY)
b = (select bb from tableY)
where c = 1
aとbの副問合せがtableYの同じ行でaとbをセットしてくれるか心配なんですが。。。
0882881
04/11/15 09:09:33ID:???0883881
04/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 NULL
04/11/15 11:35:02ID:???set a = Y.aa, b = Y.bb
from tableA as A, tableY as Y
where c = 1 and A.d=Y.d
0886NAME IS NULL
04/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 NULL
04/11/15 15:36:28ID:???SELECT * FROM Aだとさほど時間がかからないというのは、
1件目のデータが出てくるまでの時間がかからないということでは?
10万件全部出せばやっぱり5秒以上かかるんじゃないですかね。
ようするに両方ともシーケンススキャンやってるけど、
1件目が返ってくる時間だけみれば全件出力の方が速く見えるのでは。
0888886
04/11/15 15:51:22ID:???見た目の問題と言う事でしょうか。
ただ、質問の仕方が悪かったせいもありますが
『何故条件1つ加えただけでタイムアウトするほど処理が遅くなるのか?』
という所が疑問だったりします。スイマセン。_| ̄|○
0889NAME IS NULL
04/11/15 15:55:00ID:???しか指定してなけりゃ、全件検索になりはしないか?
0890886
04/11/15 15:59:44ID:???例ですが、コード、枝番コード、明細番号、連番、更新年月と言った感じで5つ主キー設定されているようです。
『 WHERE コード = '0001'』 とだけ付け加えた場合で。
0891NAME IS NULL
04/11/15 16:05:12ID:???無効じゃないかと。
0893NAME IS NULL
04/11/15 16:31:32ID:???もはやどうにもならないと思われ。
0894NAME IS NULL
04/11/15 17:25:20ID:???だから、「単純な条件一つ」に適合するインデックスがないから、全件スキャンしとるだけだろうが。
せめて show plan くらいしてみろよ……
0895886
04/11/15 17:51:40ID:???0896NAME IS NULL
04/11/19 02:37:52ID:zEwlut0ulimit でSQLで制限かけて数件取得するのってメモリやパフォーマンスに
大きな違いはありますか?
0897NAME IS NULL
04/11/20 00:44:50ID:???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 NULL
04/11/20 01:09:41ID:???0899NAME IS NULL
04/11/20 01:10:09ID:???0900NAME IS NULL
04/11/20 18:40:19ID:qbgr6YW3あるかどうかを調べるためのSQLを教えてください。
できるだけ高速のを
0901NAME IS NULL
04/11/20 18:48:26ID:???exist()
0902NAME IS NULL
04/11/20 20:04:02ID:???UNIXの場合でいい?
find (DBのデータがあるパス) (調べたいデータをそれなりのバイナリに変換した値)
0903NAME IS NULL
04/11/21 09:35:34ID:???肝心のスピードが遅いから、ネタとしてもつまらんな。
0904NAME IS NULL
04/11/21 12:46:48ID:???で値が返ってくるかどうか
0905NAME IS NULL
04/11/21 19:00:27ID:???0906NAME IS NULL
04/11/21 19:31:37ID:???「where hoge='ほにゃらら'」だけで返ってくる件数が膨大な場合、
確かにrownumを指定することで早く戻ってくるようにはなる
0907NAME IS NULL
04/11/21 21:24:17ID:???0908NAME IS NULL
04/11/21 22:11:40ID:???アホか
0909NAME IS NULL
04/11/21 22:11:46ID:???0910NAME IS NULL
04/11/21 22:12:23ID:???知ってる知識を言ってみたかっただけじゃないの?
0911NAME IS NULL
04/11/22 03:19:49ID:Cdqu3I2P0912NAME IS NULL
04/11/22 03:21:19ID:Cdqu3I2P0913NAME IS NULL
04/11/23 11:55:35ID:jlWg8Xtzid|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 NULL
04/11/23 13:03:00ID:???SELECT (SELECT MAX(id) FROM table WHERE data=T1.data),data FROM table AS T1 GROUP BY data;
0915NAME IS NULL
04/11/23 13:06:32ID:???0916NAME IS NULL
04/11/23 15:14:08ID:jlWg8Xtzgroup byで最初に出てくるものが使われると言う保障がある稼動は和紙欄。
0917NAME IS NULL
04/11/23 20:18:02ID:???0918NAME IS NULL
04/11/23 21:18:37ID:???なんでgoogleやYahoo!の入力欄に同じようなこと書いてボタン押せば
わかることを掲示板で聞くのか理解に苦しむ。
0919NAME IS NULL
04/11/23 22:08:23ID:???0920NAME IS NULL
04/11/23 22:17:17ID:???0921NAME IS NULL
04/11/23 22:21:19ID:???たしか4.1ってマルチバイト対応がイマイチだから本番サーバに誰も使ってないんじゃ?
MySQL5はシラネ
0922NAME IS NULL
04/11/24 00:44:03ID:???バージョン書いてない方が悪い
0923ichigo
04/11/24 13:10:03ID:???今日の日付以降のデータの中で、1番小さい日付のデータを取得するSQL
を教えてください。
環境はVB.net2003です。
よろしくお願いします
0924NAME IS NULL
04/11/24 14:33:46ID:???0925ichigo
04/11/24 16:56:58ID:???説明不足でした。
今このようにしてるんですけど今日以前のデータが取得されてしまうんですが
どうすればいいのですか。
sql = "SELECT * FROM tblSchedule " & _
"WHERE fldDate=(SELECT MIN(fldDate) FROM tblSchedule " & _
"WHERE fldDate>=" & Format(Now(), "yyyy/MM/dd") & ") " & _
"ORDER BY fldTime;"
0926NAME IS NULL
04/11/24 17:16:01ID:???0927NAME IS NULL
04/11/25 22:21:24ID:GJuNQxbVtrun(変数)でもすべし。
0928NAME IS NULL
04/11/26 03:05:02ID:???>>926が正しい。
日付をクォートで囲ってないので 2004/11/25 ≒ 7.29 になってしまう。
0929ichigo
04/11/26 15:10:00ID:???日付を#で囲ったらできました。
0930なみ
04/11/27 01:21:20ID:tK3UBASDoracleのサービス関連でお聞きしたいことがありますが、
こちらの掲示板でよろしいでしょうか?
0931なみ
04/11/27 01:29:53ID:tK3UBASDそちらに書き込みしました。
お邪魔しました。
0932なみ
04/11/27 02:13:03ID:tK3UBASD0933NAME IS NULL
04/11/27 08:58:55ID:???0934NAME IS NULL
04/11/29 10:13:45ID:N6q3BKcM商品コード、更新日が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 NULL
04/11/29 10:46:23ID:???それじゃ年が更新したりしたらメチャクチャに・・・
0936NAME IS NULL
04/11/29 11:11:42ID:???まぎらわしくてスミマセン。
ちなみに商品コード、価格共にintです。
0937ラブ@らぶねっと
04/11/29 11:13:32ID:2WZTOsEEFROM 商品マスタ
GROUP BY 商品コード
この問い合わせで、各アイテムの最終更新日が拾えます。
それに価格を付き合わせれば目的の抽出ができますよね。
0938NAME IS NULL
04/11/29 12:18:06ID:???なるほど
サブクエリって事ですよね?
なんとなくイメージできました。
試してみます。
ありがトン
0939NAME IS NULL
04/12/01 23:21:09ID:???第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 NULL
04/12/01 23:22:30ID:???幅が崩れました
正規化後のテーブルは
ID data_no data
001 1 あ
001 2 い
002 1 か
002 2 き
です。
0941NAME IS NULL
04/12/01 23:39:13ID:???(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 NULL
04/12/01 23:46:16ID:???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 NULL
04/12/02 15:12:28ID:???そのレコードの値としてソートしたいのですが、
…わかりづらいですね_| ̄|○ 申し訳ない。つまり
| a b c
--+----------------
い| 1 2 3 (3が最大)
ろ| 0 0 4 (4が最大)
は| 4 5 6 (6が最大)
の時、い<ろ<は と並ばせたいのですが、どのようにすれば良いでしょうか?
RDBMS は DB2 を用いています。
ORDER BY で弄っているのですが、思うような結果が得られないでいます…
0944NAME IS NULL
04/12/02 18:31:56ID:???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 NULL
04/12/02 19:15:51ID:???なるほど。やはりどうしても泥臭くはなってしまうのですね…
ありがとうございます。ちょっと触ろうとしたのですがさくっと扱えなかったので
DB2 のリファレンスと格闘してみます(Oracle の記述はネットやらにそこそこあったのですが...)
0946NAME IS NULL
04/12/02 21:15:06ID:???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
試してないのでもし通らなかったらスマン。
0947sage
04/12/05 23:12:57ID:QODHCzZH日付データの新しいほうのデータを取得したいのですが
商品A | 商品B | 商品A登録日 | 商品B登録日
***** **** 2004/12/01 2004/11/01
↓ 抽出結果
商品A | 商品B | 商品最新登録日
***** **** 2004/12/01
ご教授願います。
0948NAME IS NULL
04/12/05 23:14:27ID:???スマソ
0949NAME IS NULL
04/12/05 23:17:31ID:???SELECT 商品A , 商品B , CASE WHEN 商品A登録日 > 商品B登録日 THEN 商品A登録日 ELSE 商品B登録日 FROM Table;
0950949
04/12/05 23:18:14ID:???SELECT 商品A , 商品B , CASE WHEN 商品A登録日 > 商品B登録日 THEN 商品A登録日 ELSE 商品B登録日 END FROM Table;
0951NAME IS NULL
04/12/06 21:08:14ID:???0952NAME IS NULL
04/12/06 21:09:29ID:???上は間違えです、すいません。
0953NAME IS NULL
04/12/06 21:10:49ID:???上は間違えです、すいません。
0954NAME IS NULL
04/12/06 21:10:16ID:???上は間違えです、すいません。
0955NAME IS NULL
04/12/07 20:32:59ID:???お埋めします
0956NAME IS NULL
04/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 NULL
04/12/08 01:06:25ID:???テーブルをリネームする必要があるという設計が間違ってる予感。
何でリネームするのさ?
普通なら select * into hoge from hoge_tmp とかでデータを写すものだと思う。
データを写した後のhoge_tmpはtrancateするなりdropするなりすればいい。
0958NAME IS NULL
04/12/08 01:20:22ID:???ロックとかデータの整合性とかの点で、RDB使う意味無くなる。
0959956
04/12/08 01:49:46ID:???ありがとうございます.
以下のように改めました.
$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 NULL
04/12/11 16:18:37ID:???恋人スキーマが空っぽなので埋めてください
0961SQL初心者
04/12/11 17:14:31ID:bTxzaHjt例
5000 ÷ 6 = 833.333333 → 833.34にする方法
お願いします
0962NAME IS NULL
04/12/12 03:07:34ID:???round((5000/6)+0.009,2) とかじゃだめなの?
0963NAME IS NULL
04/12/13 10:07:31ID:iwUEodU90964NAME IS NULL
04/12/13 11:54:28ID:???ttp://e-words.jp/w/SQL.html
0965NAME IS NULL
04/12/13 19:05:09ID:???じゃない。
0966NAME IS NULL
04/12/13 22:14:37ID:???table hogeがからっぽな瞬間があるよ。
0967NAME IS NULL
04/12/14 01:24:49ID:4jo5gRvJ|国語成績 | 数学成績| |国語成績 | 数学成績|
|80 | 70 | |60 | 55 |
結果としてこの表を出したいんです
さらに名前という列を追加して名前を入れたいんです。
|名前 | 国語成績|数学成績|
|山下 | 80 | 70 |
|井上 | 60 | 55 |
0968NAME IS NULL
04/12/14 01:25:53ID:4jo5gRvJ|国語成績 | 数学成績| |国語成績 | 数学成績|
|80 | 70 | |60 | 55 |
結果としてこの表を出したいんです
さらに名前という列を追加して名前を入れたいんです。
|名前 | 国語成績|数学成績|
|山下 | 80 | 70 |
|井上 | 60 | 55 |
0969NAME IS NULL
04/12/14 01:36:31ID:4jo5gRvJお願いします
0970NAME IS NULL
04/12/14 01:48:20ID:???0971968
04/12/14 02:04:53ID:4jo5gRvJfrom (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 NULL
04/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。
0973968
04/12/14 04:16:16ID:8peVtg2kサンクス
できました
0974NAME IS NULL
04/12/14 15:09:46ID:gYkAsbc2皆さんは、SQLの仕様に不満はありませんか。
0975NAME IS NULL
04/12/14 15:18:36ID:???0976NAME IS NULL
04/12/14 15:24:49ID:???:-)
0977NAME IS NULL
04/12/14 15:42:57ID:???悪いのが難点なのだが。Prologとは仲良しなのかね?
0978NAME IS NULL
04/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 NULL
04/12/14 16:23:58ID:gYkAsbc2Prolog、バックエンドにRDBMSを配置しC言語インターフェイスで繋ぐ
というのが一般的なようです。Prologのデータベースに見つからない時
ORACLEから探すというような使い方をすることもあります。
ただ、私はProlog以前はSQLが専門だったので平気なのですが、
一般にPrologプログラマからはSQLの仕様は評判が悪い。副照会の
辺りに批判が集中するようです。一方、Prologは集約に弱い。
それから、全解探索機構がかえって仇となって、すべてシーケンシャル
サーチになってしまう。いくらオンメモリーでも100万件を超えると
やはり大変です。そんなことでSQLをPrologに変換するのは簡単ですが、
Prologコードを解析して最適なSQL文を生成するのは案外むずかしい。
それで、Prologを書けば、勝手にそれに対応するSQLが生成されて、
自由自在に行き来すると云うわけにはなかなかいきません。
0980NAME IS NULL
04/12/14 19:33:16ID:qbSzLZblカラムのUNIQUE指定を外す構文を教えてください。
0981NAME IS NULL
04/12/14 19:56:47ID:???0982NAME IS NULL
04/12/14 20:53:06ID:???( ´ー`) < シラネーヨ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
0983NAME IS NULL
04/12/14 22:59:30ID:???なつかしー
0984NAME IS NULL
04/12/15 00:37:20ID:???こいつ最近見ないと思ったら、久々の登場だな。
0985NAME IS NULL
04/12/15 10:09:25ID:???本当に初歩的な質問&多少すれ違いで申し訳ないんですが・・・
データベースを管理するためのシステム(ソフトウェア)がDBMSで
DBMSを定義、操作する言語がSQLですよね?
で、DBMSにはOracle、フリーのFirebirdなどがあり
SQL言語にはPostgreQL、MySQLがあるって考えで合ってますか?
また、現在は只のSQLって言語は使用されてるんですか?
0986NAME IS NULL
04/12/15 11:05:07ID:???>データベースを管理するためのシステム(ソフトウェア)がDBMSで
>DBMSを定義、操作する言語がSQLですよね?
は、まぁそれでいいとして、
>で、DBMSにはOracle、フリーのFirebirdなどがあり
>SQL言語にはPostgreQL、MySQLがあるって考えで合ってますか?
は、禿しく勘違い。そこに上げたのは全てDBMSの製品名で、
それぞれに国際標準規格(ISO-SQL)±αのSQLが載っている。
0987NAME IS NULL
04/12/15 16:54:26ID:???0988NAME IS NULL
04/12/15 16:59:46ID:MM590eEuSELECT (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 NULL
04/12/15 18:17:20ID:???SELECT DISTINCT A.name,B.keyword FROM A JOIN B USING(id);
でいいのか? なんか、それ以前に(ry
0990NAME IS NULL
04/12/15 19:51:58ID:wKX08Pae部署毎の売上合計金額を、降順に表示したく
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.他の方法で実現する方法
を教えていただけないでしょうか。
よろしくお願いします。
0991990
04/12/15 19:53:52ID:wKX08Pae正しくは
SELECT ORDER.SECTION, Sum(ORDER.ACCOUNT)
FROM ORDER
GROUP BY ORDER.SECTION
ORDER BY Sum(ORDER.ACCOUNT) DESC;
です。
どなたかよろしくお願いします。
0992NAME IS NULL
04/12/15 19:57:17ID:???SELECT ORDER.SECTION, Sum(ORDER.ACCOUNT) AS Total
FROM ORDER
GROUP BY ORDER.SECTION
ORDER BY Total DESC;
で、どぉ。
0993NAME IS NULL
04/12/15 20:51:01ID:???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 NULL
04/12/15 21:20:04ID:PR2HhgMtSQL質疑応答スレ Part 2
http://pc5.2ch.net/test/read.cgi/db/1103113155/
0995NAME IS NULL
04/12/15 22:30:48ID:???ご指摘どもです。現在はDELETEを使っています。
http://dev.mysql.com/doc/mysql/ja/Implicit_commit.html
を参考にしました。
0996NAME IS NULL
04/12/16 02:17:36ID:???まあいいけどさ。
0997NAME IS NULL
04/12/16 03:45:18ID:???次スレでいきなりレプリケーションみたいなネタが着てるけど、
このスレは、ストアド類もなしに出来ればベンダーに依存しない
純粋なSQLネタがいいな。
質問者が元のテーブル等と、期待する結果のサンプルを出して、
答える人がSQLだけを考えるみたいな。
0998991
04/12/16 09:54:11ID:OCa5514Y>>992
試した結果、「(ORDER BYにある)○○(列名)なんて知らない。」
と言われてしまいました。
>>993
アドバイスの通り、ビューで対応したく思います。
お二方、みなさん、アドバイスありがとうございました。
0999NAME IS NULL
04/12/16 11:56:17ID:???1000NAME IS NULL
04/12/16 11:56:37ID:???10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。