SQL質疑応答スレ 13問目

このエントリーをはてなブックマークに追加
935NAME IS NULL:2013/05/28(火) 01:08:13.15 ID:???
>>933
アスペ?社会で苦労してない?
936NAME IS NULL:2013/05/28(火) 03:29:59.07 ID:???
>>935
この程度のことも分からずにプログラマやっていけてる?
体裁は良くないが、聞きたいことと内容は明確だろ。
937NAME IS NULL:2013/05/28(火) 03:30:47.95 ID:pJTxBQZ+
>>936
何を言ってるんだお前は
938NAME IS NULL:2013/05/28(火) 10:43:35.48 ID:???
アンカー間違ってるのか読む場所間違ってるのか区別付かんなw
939NAME IS NULL:2013/05/28(火) 13:25:42.53 ID:???
こういうの、ウィンドウ関数できれいに書けたりするのかな?
あれが独自拡張なのか標準SQLにあるものなのかわかんないけど

>>936が安価ミスなのか、安価の先を見誤ったか、はたまた別かわからなくてもやっとする
プログラマならバグ直してください
940NAME IS NULL:2013/05/28(火) 14:37:31.84 ID:/5K6eTVe!
>>939
窓関数はSQL2003から標準だけれどもどのRDBMSでも実装されているかは微妙。
無難にSQL92の範囲で書くなら>>928みたいなサブクエリーを使う書き方になる。

でも確かに窓関数使うとスッキリ書ける。

SELECT score, address FROM T
ORDER BY MIN(score) OVER (PARTITION BY address), address, score
941NAME IS NULL:2013/05/28(火) 14:43:05.32 ID:???
>>940
SQL2003からなのね。ありがとです。
すごいすっきりしてるし直感的だ、やっぱ使えるようにしとかないと。重ね重ねどもでした
942NAME IS NULL:2013/05/29(水) 02:10:40.00 ID:???
再帰構造のテーブルをSQLで辿る事は可能でしょうか?

id parent value
1 null aaa
2 1 bbb
3 2 ccc
4 3 ddd
5 2 eee

このようなテーブルで4の親を辿って最初にid in (1,2)を満たすvalue(bbb)を探したいです。
DBはpostgresql9.3betaです。
943NAME IS NULL:2013/05/29(水) 05:43:04.35 ID:???
944NAME IS NULL:2013/05/30(木) 18:21:17.05 ID:zDo8DD4s
DB: oracle10g

テーブルにprimary key 制約(以下pk制約)を作成すると、
pk制約と同じ名前のunique indexが作られます。

このunique indexの名前をpk制約作成時に指定することは出来ますか?
作成後にalter indexで変更できることは確認済みです。

alter table TableA add constraint PK_CONST primary key (...);

select * from user_constraints where table_name = 'TableA';
select * from user_indexes where table_name = 'TableA';
pk制約、indexともに'PK_CONST'の名前になっている。
945NAME IS NULL:2013/05/30(木) 19:19:25.31 ID:???
>>944
マニュアル読め。
すぐわかるよ。
946NAME IS NULL:2013/05/30(木) 19:20:33.87 ID:???
create table TableA (COLNAME number constraint PK_CONST primary key);
947NAME IS NULL:2013/05/30(木) 20:37:33.32 ID:???
制約名とインデックス名を違う名前にしたいという話なら
unique indexを先に作れば
 primary key using index インデックス名
でできるにはできるけど
948NAME IS NULL:2013/05/31(金) 14:07:44.38 ID:???
>>945-947
ありがとうございました。
(1) create table
(2) create unique index
(3) alter table add constraint primary key using index
の順番で意図したことが実現出来ました。
949NAME IS NULL:2013/05/31(金) 14:12:47.69 ID:???
一応、下記の方法でも可能でした。
DDLが分かれている方が都合が良かったので採用してません。

create table aaa (
a int,
constraint pk_const primary key (a)
using index (create unique index index_const on aaa(a))
);
950NAME IS NULL:2013/06/07(金) 17:32:29.57 ID:yGnvQyXR
可能な限り、DB依存になるような構文を書きたくないんだけど
DB依存構文検出チェッカーみたいなのって、世の中にある?
951NAME IS NULL:2013/06/07(金) 19:10:38.63 ID:???
OracleならALTER SESSION SET FLAGGERでチェックできるけど他は知らない
http://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_2013.htm#SQLRF53054
952NAME IS NULL:2013/06/09(日) 13:39:06.60 ID:DY/9Y4Gb
MySQLについての質問です。

highscoreというテーブルに、id, scoreという2つのカラムがあります。
idのインデックスはPRIMARYです。

POSTでidとscoreの値が送られてきたとき、
そのidが既に登録されている場合、送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し、
送られてきたidがまだテーブルに存在しなければ、新規レコードとしてINSERTしたいのですが、
条件分岐の部分でどのようなSQLを書けばよいのか検討がつきません。

何かヒントをいただければ幸いです。よろしくお願いします。
953NAME IS NULL:2013/06/09(日) 13:44:44.36 ID:???
SQLじゃなくてストアドでやる話。
954NAME IS NULL:2013/06/09(日) 13:53:35.12 ID:???
そんなたいそうなもんじゃなかろう。
やり方は色々思いつくけど、SQL文を2つ発行するのが初心者向けかな。
955NAME IS NULL:2013/06/09(日) 14:08:34.74 ID:???
SQL二つ発行するのは、本来なら分離レベルとかロック制御とか考慮しないといかん
最近のDBMSなら1文で出来るやつもあるから、MySQLで使えるかどうか調べてみたら
upsertとか、mergeとか言われてるやつな
956NAME IS NULL:2013/06/09(日) 14:12:44.99 ID:???
957NAME IS NULL:2013/06/09(日) 14:54:03.65 ID:???
>>952
idが 1 で、入れようとしている score が 9999 の場合

INSERT INTO highscore (id, score) VALUES (1,9999)
ON DUPLICATE KEY UPDATE score = IF(score<9999, 9999, score);

でできると思います。

存在しない id ならそのまま INSERT、存在する id ならば IF で
DBの score より大きければその値を、同じか小さければ元の値でUPDATE。
ちょっとスマートじゃないね。
958952:2013/06/09(日) 17:45:07.54 ID:???
御回答いただいた皆様大変ありがとうございました。
>>957さんの方法で実装できました。
scoreが更新されていなくてもUPDATEするのが無駄に思えますが、
とりあえずこれで運用してみます。
ストアドプロシージャについても調べてみます。
ありがとうございました。
959NAME IS NULL:2013/06/13(木) 04:44:36.45 ID:gtAIlzh6
質問させてください

アマゾンとかでよくある商品の評価ポイントを集計するクエリを作りたいです
アマゾンと少し違うのは、商品そのものの評価ポイントではなく、
商品を登録した出品者くくりでの、「その出品者が出品した全ての商品の評価ポイント」の平均値をとることです

まとめると、
・特定の出品者の出品した商品の評価ポイントの平均値をとる
・同時に、レビューの件数をとる
・判明してるキーはt_prof.keyのみです

テーブルは以下の通り。

レビューtable =t_review
===============================
reviewId -- int(11) :プライマリキー、auto_increment
workId -- int(11) :商品のID
userId -- int(11) :出品者のID
point -- tinyInt(1):評価ポイント(1〜5)

出品者プロフィールtable =t_prof
===============================
userId -- int(11) :プライマリキー、auto_increment
namae -- text :出品者の名前
key -- int(3):キー。ユニーク

どんなクエリを書いたらいいんでしょうか
すみません、よろしくお願いします
960NAME IS NULL:2013/06/13(木) 06:28:46.99 ID:???
1回の出品に対する評価は何回?
複数のの出品者が「同じ商品」を複数個出品することがある?
「判明しているキー」に「プライマリーキー」が含まれていないが?

「サンプルデータ」と「欲しい結果」を出してくれ
961NAME IS NULL:2013/06/13(木) 07:49:21.31 ID:???
これだけなら、出品者IDでgroup byしてavgとcountでよくないか?
962NAME IS NULL:2013/06/13(木) 12:35:34.28 ID:???
where userId = (select userId from t_prof where key = 判明しているキー)
963NAME IS NULL:2013/06/13(木) 14:54:41.42 ID:???
select p.namae,avg(r.point),count(r.point) from t_review r,t_prof p where r.userid=p.userid group by r.userid;
こんなんでどお?
964NAME IS NULL:2013/06/13(木) 16:31:55.01 ID:???
動かしてないけど、p.namaeがgroup byにないってエラーがでそう。
mysqlだったらどれかひとつが勝手に選ばれるという話だったかも
965NAME IS NULL:2013/06/13(木) 17:04:47.70 ID:???
>>959
t_prof.keyは何に対してユニークなんだ

評価はNULLはあり得るのかとかその場合は評価件数に加えるのかとか
いろいろ詰まってないところがあるが

select t_prof.userId,count(*),avg(point)
from t_review join t_prof on t_review.userId=t_prof .userId
where t_prof.key=判明してるキー
group by t_prof.userId

とかで良いんじゃね
966NAME IS NULL:2013/06/14(金) 00:54:00.66 ID:???
始めたばかりでググりましたがよくわかりません

結果がなしなのを0で返したいのです
T-sql
select @test=data from db where 除外内容

宣言済のtestに0か数字を入れたいのです
967NAME IS NULL:2013/06/14(金) 07:01:35.51 ID:???
sumなりで返せばいいだろ。
968NAME IS NULL:2013/06/14(金) 14:56:51.65 ID:???
>>966
SQLの話から外れるけど、ホスト言語側で大概、結果のレコード数を返す
関数が用意されているから、それで見るのが比較的常套だと思うけど。
それをサブクエリーにして、レコード数を集めたりしているのであれば
count()を使えばいいんじゃないかね。
969NAME IS NULL:2013/06/14(金) 15:13:06.98 ID:???
>>966
ISNULL関数使え
つか特定DBの話はそこで聞け
>>967
SUMは対象が全てNULLならNULL返す
>>968
あれレコード数見てるんじゃないぞ
970959:2013/06/14(金) 23:24:15.62 ID:???
>>960-965
ありがとうございます
COUNTやAVGの使い方を復讐しつつそれぞれ参考にさせていただきます
971NAME IS NULL:2013/06/15(土) 00:36:10.01 ID:???
復讐は何も生まないよ
972NAME IS NULL:2013/06/15(土) 00:40:31.73 ID:???
Revengeコマンド、作る?
973NAME IS NULL:2013/06/15(土) 01:16:17.07 ID:???
Living Well Is The Best Revenge
974NAME IS NULL:2013/06/15(土) 16:04:10.91 ID:FktO2NAp
どなたかお願いいたします。
私初心者で「ゼロから始めるデータベースSQL」という本で勉強をしています。付属のソフトをインストールしてパスワードを入れて書いてある通りにやってるんですが最初のテーブルを作るところでエラーが出てしまい困ってます。

Create table shohin;

と入れると
";"またはその近辺でエラーと出ます。

これはなぜでしょうか。

よろしくお願いします。
975NAME IS NULL:2013/06/15(土) 16:15:53.30 ID:FktO2NAp
すみません。

中身何も入れてないからか!?と思い、書いてある通りに入れたら、

プライマリキーはテーブル"shohin"に暗黙的なインデックス"shohin_pkey"を作成します

と出たのですが、これはテーブルを作成できたんでしょうか
976NAME IS NULL:2013/06/15(土) 16:19:55.22 ID:FktO2NAp
ごめんなさい。

できてるみたいです

日本語でおKって話ですよね

初心者すぎました

すみません!
977NAME IS NULL:2013/06/15(土) 18:44:48.32 ID:???
書いてる通りにやってないだろ。
978NAME IS NULL:2013/06/15(土) 20:07:55.82 ID:???
初心者に素直さを期待してはいけない
979NAME IS NULL:2013/06/16(日) 15:16:09.35 ID:???
本当の初心者は、めんどくさそうな手順は後からやろうと飛ばすものだ。
980NAME IS NULL:2013/06/16(日) 15:20:19.75 ID:???
問題は飛ばしたことをすっかり忘れることだなw
981NAME IS NULL:2013/06/16(日) 15:21:55.25 ID:uKsaBYgK
中身何も入れてないってどういうこっちゃ?
データベース作ってないのにテーブル作ろうとしたのかこいつ
982NAME IS NULL:2013/06/16(日) 17:11:49.11 ID:???
> Create table shohin;
って書いてるだろうw
983NAME IS NULL:2013/06/16(日) 19:27:33.70 ID:???
>>981
カラム定義
列は後回しにして、とりあえずテーブルを作ってみようって思ったのかも。
984NAME IS NULL
斬新な発想だな。
プロには想像もつかない。