【帰ってきた】SQL質疑応答スレ 4問目at DB
【帰ってきた】SQL質疑応答スレ 4問目 - 暇つぶし2ch2:NAME IS NULL
07/04/14 21:28:32
で、全スレ>989宛。
995辺りので989~992の機能は満たしとらんか?
もしくは、意図が掴みかねる993のカキコ内容が要求仕様上重要なん?


3:989
07/04/14 22:05:01 vEBJlPWj
>>2
ああ、そうですね、それは無視してください。



4:989
07/04/15 10:59:08
>>995
とりあえず、これで試してみます。
ありがとうございました。

5:NAME IS NULL
07/04/15 13:04:44 mKPpVVQg
質問一件お願いします。

以下のような単純なテーブルがあり、
valueの大きい上位3件のレコードを取得したいです。

【テーブルhoge】
name | value
a | 10
b | 30
c | 40
d | 5
e | 2
(以下大量のレコード)

【得たい結果】
c | 40
b | 30
a | 10

現在limitを用いて
select * from hoge order by value desc limit 0, 3;
としているのですが、速度が悲惨に遅いです。

何かいい方法はないでしょうか?

6:NAME IS NULL
07/04/15 19:39:54 8Gbsm4yF
mysqlについて質問です。
トランザクション可能なテーブルを利用した場合
通常のテーブルパフォーマンスとの差はどれくらいになるのでしょうか?

7:NAME IS NULL
07/04/15 20:10:18 afmYW8Mb
MySQL5.0での質問です。

testテーブルに、datetimeとtest_txtというフィールドがあります。
PHPにて、「INSERT test SET datetime='2005/10/10'」を実行すると、
MySQLエラーで「Field 'test_txt' doesn't have a default value」
と返ってきます。
「test_txt」は何も入れないで追加したいのですが、
何か設定の変更などが必要なのでしょうか?
それともいちいち「text=''」のように入れないといけないのでしょうか?

8:7
07/04/15 20:14:46 afmYW8Mb
my.iniの
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
をコメントアウトすることで解決しました。
ですが、これは何を意味しているのでしょうか?

9:NAME IS NULL
07/04/15 21:10:59
>>7
エラーの内容をきちんと書いて質問するのはよい傾向。

あとはそのエラーをまず、よく読んで見ること。

> Field 'test_txt' doesn't have a default value
⇒ 分野'テスト_txt'には、デフォルト値がありません。

これでもわからないなら、まずデータベースについてもう少し
勉強することを薦める。

10:NAME IS NULL
07/04/15 21:46:28
MySQLって専用スレないんだな

11:NAME IS NULL
07/04/15 23:06:14
スレリンク(db板)l50
じゃ駄目なん?

12:NAME IS NULL
07/04/16 16:20:00
col1 col2      col3
 1  2007/04/16 9
 1  2007/04/15 8
 1  2007/04/14 7
 2  2007/04/14 6
 2  2007/04/16 5
 2  2007/04/15 4
 3  2007/04/15 3
 3  2007/01/14 2
 3  2007/04/16 1

主キー(col1,col2)

上のようなテーブルから、col1毎にcol2が一番大きいcol3を得たいのですがSQL書けずに困っています
よろしくお願いします。

13:412
07/04/16 16:20:57
書き忘れですが、MySQL4,0xなので副問い合わせが出来ません・・・


14:NAME IS NULL
07/04/16 17:10:32
あげさせてもらいます

15:NAME IS NULL
07/04/16 20:21:59
SELECT COL3
FROM TABLE
LIMIT 0,1
GROUP BY COL1, COL3
ORDER BY COL2 DESC


16:NAME IS NULL
07/04/16 22:57:56
質問です。次のような表が二つあります。

表1
コード    コード名   種類名
 1      果物      区分コード
2       野菜      区分コード
10       あり      割引コード
20       なし      割引コード

 
表2
名前      区分コード  割引コード
りんご      1       10
トマト        2        20
きゅうり       2       10
ぶどう       1       20


これを

名前     区分コード  種別   割引 割引有無
りんご     1       果物    10    あり
トマト      2       野菜     20    なし
きゅうり       2     野菜    10    あり
ぶどう      1       果物   20    なし

のような表にしたいのです。
UNIONを用いて式を書きたいのですがうまくいきません。
何か良い方法がないでしょうか?




17:NAME IS NULL
07/04/16 23:04:04
訂正します

名前     区分コード  種別   割引コード 割引有無
りんご     1       果物      10    あり
トマト      2         野菜     20    なし
きゅうり      2        野菜    10    あり
ぶどう      1         果物   20    なし



18:NAME IS NULL
07/04/16 23:34:22
>>16
表1を二つに分ける。
既にその糞設計が所与のものならViewを使って別の表に見せかける。

19:NAME IS NULL
07/04/17 00:18:52
>>16

select 名前,表2.区分コード,区分.コード名 as 種別,表2.割引コード,割引.コード名 as 割引有無
from 表2,
(select コード,コード名
from 表1
where 種類名='区分コード') as 区分,
(select コード,コード名
from 表1
where 種類名='割引コード') as 割引
where 表2.区分コード=区分.区分コード
and 表2.割引コード=割引.割引コード


20:16
07/04/17 21:52:34
>>19

ありがとうございました!
おかげで助かりました。

21:NAME IS NULL
07/04/18 15:33:04 doDz5ry0
日付、キー、の二つのフィールドがあるテーブルがあります。
キーごとに、過去の日付のレコード件数を取得したいのですが
どのようなSQLを書けばいいでしょうか。

日付      キー
2007/01/01   1
2007/01/01   2
2007/01/02   1
2007/01/03   1



日付      キー    カウント
2007/01/01   1     0
2007/01/01   2     0
2007/01/02   1     1
2007/01/03   1     2


22:NAME IS NULL
07/04/18 16:10:51
そのカウントはどこから出てきたんだ。

23:NAME IS NULL
07/04/18 17:50:43 doDz5ry0
>>22
>キーごとに、過去の日付のレコード件数を取得したいのですが
これです。
4行目のカウント「2」は、キーが1で、
日付が2007/01/03未満のデータの件数(1行目と2行目)を数えています。

24:NAME IS NULL
07/04/18 18:15:36
SQL Server 2005で質問です。

以下のような「TableA」「TableB」があって
[TableA]
col1 col2 col3
------------------------
01  AAAA 1
02  AAAA 1
03  BBBB 2
04  CCCC 3
05  DDDD 4

[TableB]
col1 col2
-------------
AAAA 1
BBBB 2
CCCC 3
DDDD 4

TableAにだけ存在する行を取得するとき
以下のSQLで取得できますが

select col2 from TableA
except
select col1 from TableB

[結果]
col1 col2
-------------
AAAA 1

この内容からではTableAのcol1が01なのか02なのかが分かりません。
このような場合には差集合は使えませんか。
また差集合を使わない場合、他に良い方法はありますか。


25:NAME IS NULL
07/04/18 18:38:19
24です。
SQLが間違ってました。

select col2,col3 from TableA
except
select col1,col2 from TableB

です。
よろしくお願いします。


26:NAME IS NULL
07/04/18 21:53:21
>>24
01を持って来たいのか02を持って来たいのかはオマエが決めなきゃならん。

27:NAME IS NULL
07/04/18 22:29:57
文字
a
a
a
b
c
c


文字 個数
a 3
b 1
c 2

とするsql文を教えてください

28:NAME IS NULL
07/04/18 22:33:58
count
group by

29:NAME IS NULL
07/04/18 22:44:30
ぐぐったらでてきました
どうもです>>28

30:NAME IS NULL
07/04/18 23:08:59
>>24
スカラ副問合せが出来るDBMSなら

SELECT A.日付,A.キー
,(SELECT COUNT(*) FROM TBL B
 WHERE B.キー = A.キー
 AND B.日付 < A.日付
) カウント
FROM TBL A
ORDER BY A.日付,A.キー

31:NAME IS NULL
07/04/18 23:11:44
上は、>>24ではなく、>>21でした。

32:NAME IS NULL
07/04/19 07:07:17
>>24
select col1,col2,col3
from TableA a
where not exists(
select *
from TableB b
where a.col2=b.col1 and a.col3=b.col2
)


33:21
07/04/19 12:48:54
>>30
動きました!!ありがとうございます。

34:NAME IS NULL
07/04/19 16:25:37
>>33
01  AAAA 1 
02  AAAA 1 
のどっちか一件残すとなると>>.32だと両方消えるのでまずいのだが、
それでよかったのか?

35:NAME IS NULL
07/04/19 18:00:13
ファンクションとプロシージャはどう使い分けるのですか?
違いがない様な気がして聞きました。

36:NAME IS NULL
07/04/19 18:08:27
>>35
一般的にファンクションは更新が出来ない。
標準化は進んでないから例外はあると思うけどね。

37:NAME IS NULL
07/04/19 20:21:08 iuRHnTpA
>>26
すいません。01、02はどちらが取れても構いません。

>>32
>>34さんも指摘してくれているように
それだと01、02が両方消えるんですよね。

やっぱり、ストアドか何かでコントロールブレイクするしかないですかね。


38:NAME IS NULL
07/04/19 21:36:49
t1 t2 t3 の3つのテーブルを結合したaとbをそれぞれ作って
select したいんですがうまくいきません

イメージ的にはこんな感じです

select a.name, b.name
+from t1
|  join t2 a
|    on t1.id = a.id_1
|  join t3
|    on a.id_1 = t3.id
+
|  join t2 b
|    on t1.id = b.id_2
|  join t3
+    on b.id_2 = t3.id
where t1.id = 1

よろしくお願いします

39:38
07/04/19 22:27:27
血を吐きそうになりながらも自己解決できました~……
いやーSQLは奥が深い!

よかったら
オススメのSQL(mysql)の参考書・テクニック本とか教えてください

40:NAME IS NULL
07/04/20 00:12:08
>>39
俺も知りたかったので教えてください

41:38
07/04/20 16:02:06
select b.name, d.name
+from t1
| join t2 a
| on t1.id = a.id_1
| join t3 b
| on a.id_1 = b.id
+
| join t2 c
| on t1.id = c.id_2
| join t3 d
+ on c.id_2 = d.id
where t1.id = 1

t1.id = a.id_1 = b.id -> b.name
t1.id = c.id_2 = d.id -> d.name

みたいな感じ?
実際のSQLのほうは結果がだぶったりするんだけど
DISTINCTで無理やり消した みたいな……

まぁなんとか動けば 理解はあとからついてくるし

42:NAME IS NULL
07/04/20 21:10:41
なるほど、難しい・・・
どうもです>>38

43:NAME IS NULL
07/04/20 21:59:36
[TableA]
date      col  
------------------------
2007/04/20  10
2007/04/19  20
2007/04/18  30
2007/04/17  40
2007/04/16  50
2007/04/15  60
2007/04/14  70

[TableB]
date      col 移動平均 
------------------------
2007/04/20  10  30
2007/04/19  20  40
2007/04/18  30  50
2007/04/17  40  55
2007/04/16  50  60
2007/04/15  60  65
2007/04/14  70  70

TableAからTableBを作成するSQLを教えてください
dateが自身を含めて4日前までのcolの平均を求めたいです

44:NAME IS NULL
07/04/20 23:48:07
>>43
SELECT c.data,c.col,SUM(c.col2)/COUNT(*) FROM
(SELECT * FROM (SELECT * FROM tablea)a CROSS JOIN (SELECT data AS data2,col AS col2 FROM tablea)b ORDER BY a.data DESC,b.data2 DESC)c
WHERE c.data >= c.data2 AND c.data2 > c.data - 5
GROUP BY c.data,c.col ORDER BY c.data DESC

dataとcolでキーなの?なんか違和感が・・・。

45:NAME IS NULL
07/04/21 00:13:27
sqlの問題を自宅のパソコンで勉強したいのですが、
初心者でも分かりやすく勉強できるサイトや無料ソフトは
ないでしょうか?あれば教えてください。よろしくおねがいします。

46:NAME IS NULL
07/04/21 00:55:38
>>43

SELECT a.date,a.col
,(SELECT AVG(b.col) FROM TableA b
 WHERE b.date BETWEEN a.date - 4 AND a.date
) 移動平均
FROM TableA a
ORDER BY a.date DESC

もしくは

SELECT a.date,a.col,AVG(b.col) 移動平均
FROM TableA a,TableA b
WHERE b.date BETWEEN a.date - 4 AND a.date
GROUP BY a.date,a.col
ORDER BY a.date DESC

47:NAME IS NULL
07/04/21 01:07:01
>>24
select col1,col2,col3
from TableA
where (col2,col3)in(
select col2,col3
from TableA
minus
select col1,col2
from TableB
)


48:NAME IS NULL
07/04/21 01:18:42
>>43
select a1.date,a1.col,sum(a2.col)/count(*)
from TableA a1,TableB a2
group by a1.date,a1.col
having a2.date between a1.date-3 and a1.date


49:NAME IS NULL
07/04/21 12:36:56
学校でSQLの勉強してて自宅でも学習したいけどSQL Serverっていくらぐらいなの?

50:NAME IS NULL
07/04/21 14:16:02
ただ、のやつもあるだろ。

51:NAME IS NULL
07/04/21 15:23:46
>>49
Microsoft SQL Server 2005 Developer Edition 日本語版
税抜  6,800円

SQL Server 2005 Enterprise Edition 180日間 限定評価版
URLリンク(www.microsoft.com)
無料

52:43
07/04/21 15:24:26
>>44 >>46 >>48

素晴らしいです。皆さんのおかげで無事動きました

>>44
主キーはdateだけですが何か変ですか

53:NAME IS NULL
07/04/21 22:35:33
>>51
サンクスです
半年も無料で使えるんだ、だったらフリーにすればいいのにね
とりあえず、今のところは無料のソフト入れて勉強したいと思います
サンクスです

54:NAME IS NULL
07/04/22 00:12:30
まともに運用する時のライセンス代が馬鹿高いから試用期間も長いんだろ

55:NAME IS NULL
07/04/22 00:39:18
一方ORACLEは無料で期間無制限

56:NAME IS NULL
07/04/22 03:37:57 p/CIzjLQ
質問させてください
=の逆は!=ですがlikeの逆は何でしょうか?
!likeだとエラーになりました…

57:NAME IS NULL
07/04/22 04:11:06
not like

58:NAME IS NULL
07/04/22 08:47:03
データベースのSQLの勉強初めて疑問があるけど、なんでACCSEとか入力するだけのソフト使わないの?
わざわざ、言語で生成するメリットって自由性?自分の思ったような形にできること?
まだ、初期段階で高度なことはしてないから気づかないだけかもしれないけど

59:NAME IS NULL
07/04/22 11:17:50
日本語でおk

60:NAME IS NULL
07/04/22 13:50:40
最初からツールを使うのと、基礎が分かった上で便利なツールを使うのとでは全く違うっしょ。
それに、何らかのプログラムからSQLを叩く時にAccessなんかは使えないし。

61:NAME IS NULL
07/04/22 13:56:32
>>58の言うACCESSとは、SQL*Plusやmysqlコマンドなんかも含むと予想
んで、「わざわざ、言語で生成する」とは、>>60でいう「何らかのプログラムからSQLを叩く」と予想

という意味でレスすると、SQL"だけ"勉強するのに「わざわざ、言語で生成する」メリットは特に無い

62:60
07/04/22 14:25:42
>61
自分は、SQL文の手打ち(コピペでもいいけどさ)のことだと認識した。


63:NAME IS NULL
07/04/22 22:14:47
>>58
1.データベースの内容をある視点からみたいなー、と思う。
2.必要なSQLが頭に湧く。
3.「頭の中身を吐き出せるプラグが欲しい」と思いながら
 ぺしぺしとテキストエディタへそのSQLを吐き出す。
4.カットアンドペーストでSQL*PlusやらCSEに貼り付けて実行。

・・・大概こんなもんで用が片付くから、わざわざテーブル間の関連付けが
どうとかACCESS使って定義するまでもないからでないかい?
そらユーザーの人に便利につかってもらう為、フォームやらなんやらもいると
なってくると話は違うけども。


64:NAME IS NULL
07/04/22 23:10:25
> わざわざテーブル間の関連付けがどうとかACCESS使って定義するまでもないからでないかい?

意味わからん。

テーブル間の関連付けがどっかに定義されてるとでも思い込んでるのか?

それても、制約条件のことを勘違いしているのか?

65:5
07/04/23 00:24:30 vffmtpA6
>>5です。

どなたか教えていただけないでしょうか。
ググルにもググリようがありませんし、過去ログはdat落ちして見れません。

お願いします。

66:NAME IS NULL
07/04/23 02:57:07
>>65
ソート済みのテーブルを別に作って定期的に更新すりゃいんじゃね?
ってSQL初学者が言ってますよ。

67:NAME IS NULL
07/04/23 04:11:40
>>65
valueに非ユニークな索引をつける。

68:NAME IS NULL
07/04/23 07:57:05
>>5
DBも書かないような奴はスルーされて当然

とあえて釣られてみる

69:5
07/04/23 08:26:36 vffmtpA6
>>5です。
みなさんありがとうございます。

>>68
すみません、すっかり抜けていましたmysqlの4.12です。

>>66
テーブルを作ってみました。
驚くほど早くなりました!

>>67
インデックスを作ってみました。
こちらも驚くほど早くなりました!

取り急ぎ問題解決しましたが、
なんというか、SQL一発で解決できる問題ではなかったのでしょうか?
みなさんはどんな対処が一般的なのでしょうか。

70:NAME IS NULL
07/04/23 08:50:27
>>69
つか、パフォーマンスチューニングのためには
何をしなきゃならんのか、もうちょっと勉強汁

71:NAME IS NULL
07/04/23 09:31:02
>>58
自動でハナクソをほじる機械があれば一見便利そうに思うが
実際は自分の指でほじった方がずっといい。
それと同じ感覚。

72:NAME IS NULL
07/04/23 18:44:22
>>64
いや、単に普段使うSQLが複数テーブルが絡む物ばかりなもんで、
テーブル1つだけの問い合わせについては失念しとった。
深読みさせてすまん。


73:NAME IS NULL
07/04/23 21:12:24
>>72
余計意味わからん。

> 単に普段使うSQLが複数テーブルが絡む物ばかりなもんで、

そんな奴が >>64 に書いてることを理解できないわけないと思うが...。

74:NAME IS NULL
07/04/23 23:18:50
mysqlでランキングカラムを作るにはどうしたらいいですか?


75:NAME IS NULL
07/04/23 23:52:08
>>73
すまん、そう返されると、そもそもの突っ込み意図が読み取れんとしか
言えん。

元々>>63では「テーブルのJOIN」位の意味合いでテーブル間の関連付けと
書いたんだ。要は複数テーブル使った問い合わせをACCESSで作るにしても、
テーブルやらクエリーやらの画面上の箱(正式名称忘れた)同士の列を線で
結んでやって、その結合一本一本にINNERやらLEFTやらの定義を付与するよな?。

その一連の作業を、ちまちまちまちまマウス操作でやるのは面倒なんじゃっ、
という事を言いたかっただけなんだ...。頭に完成形のSQLがある時は特に。


76:NAME IS NULL
07/04/24 00:10:42
>>58
Access使うし便利だよ
でもJavaで作ったソフトが売れないと儲からないの

77:NAME IS NULL
07/04/24 00:12:40
エディタでコピペとかするぐらいなら Access で SQL を直接入力すればいいだけだろ。

> 頭に完成形のSQLがある時は特に。

78:NAME IS NULL
07/04/24 00:20:54
アクセスで使えるSQLなんてMySQLより制限されてるんだよ

79:NAME IS NULL
07/04/24 00:44:53
>>77
直接SQL入力していいんなら、そもそもAccess使う意味薄くね?。
SQL内の予約語とか強調表示してくれんし。

というかこれまでの話は、大元>>58

「データベースのSQLの勉強初めて疑問があるけど、なんでACCSEとか入力するだけのソフト使わないの?」

「ツール生成によらないSQLのベタ書きがなんでいるの?」(俺解釈)

の質問に対しての「こんな理由(=うちには後者の方が楽)があるぞ」
レスだしな。


80:NAME IS NULL
07/04/24 03:15:16
> データベースのSQLの勉強初めて疑問があるけど、なんでACCSEとか入力するだけのソフト使わないの?

Accessの勉強ってならわかるが、SQLの勉強にはなっていないような気がする

81:NAME IS NULL
07/04/24 09:24:30
>>74
自己結合


82:NAME IS NULL
07/04/24 09:35:44
>>78
Accessつ~か、JETの方が
MySQLより柔軟なSQL書けるだろ。


83:NAME IS NULL
07/04/24 21:55:43
バージョンによるだろ。

つーか、最新版ならどっちでもあまり不自由しないだろ。

84:NAME IS NULL
07/04/29 15:20:39 GU/EYy4+

はじめまして。

降順で重複非表示をさせたいのですがうまくいきません。




テーブル test1

ID pref

1 北海道
2 青森
3 福島
4 北海道
5 秋田
6 岩手
7 北海道
8 青森
9 秋田
10 福島


期待する表示は

福島
秋田
青森
北海道
岩手

なんですが。

SELECT distinct pref from test1 order by id desc;
のように
distinctとorder by を使ってみたのですが駄目でした。


SQLで一発で抽出する表記するのは無理があるんでしょうか?




85:NAME IS NULL
07/04/29 16:01:23
distinctだとそれぞれの県名にどのIDが対応するのか分からないんじゃないの

prefでGROUP BYしてMIN(ID)で降順にするとか

86:NAME IS NULL
07/04/29 18:04:23
max(id)だろ

87:NAME IS NULL
07/04/30 00:17:58 LY2aGMZK
処理系の明記必須はテンプレに含むべきだと感じる今日この頃。

>>84
■汎用
SELECT *
FROM
(
SELECT pref, id
FROM test1
INTERSECT
SELECT pref, MAX(id)
FROM test1
GROUP BY pref
)
AS test2
ORDER BY id DESC

■postgresql限定
SELECT DISTINCT ON (id) id,pref
FROM test1
ORDER BY id DESC

でいけるはず。汎用の方は実行速度が微妙かもだ。


88:NAME IS NULL
07/04/30 00:24:24
あ゛、postgresql限定がまずい...。
SELECT *
FROM
(
SELECT DISTINCT ON (pref) pref,id
FROM test1
ORDER BY pref,id DESC
)
AS test2
ORDER BY id DESC


89:NAME IS NULL
07/04/30 00:30:26
つーか汎用も
SELECT *
FROM
(
SELECT pref, MAX(id) AS id
FROM test1
GROUP BY pref
)
AS test2
ORDER BY id DESC
こんなんでいいよなぁ。ごたごた書いてスマン。


90:NAME IS NULL
07/04/30 01:11:05
出題に回答するスレでもないんでしょ?
いきなり答えまで書いちゃうよりも適当にヒントやるぐらいのがいいんでないの

91:NAME IS NULL
07/04/30 01:32:30
スタンスもルールも個々人が好きなようにで良いだろ

92:NAME IS NULL
07/04/30 03:58:25 HNTwEPb8
これを読み解けと言われたのですが、助けてもらえないでしょうか。

SELECT ITEM_ID, A.ITEM_NAME, A.MAIN_CATEGORY, A.SUB_CATEGORY, A.QUANTITY, A.POINT, A.RANKER
FROM
( SELECT ITEM_ID, A.ITEM_NAME, A.MAIN_CATEGORY, A.SUB_CATEGORY, A.QUANTITY,
A.POINT, RANK()OVER(ORDER BY POINT ASC) AS RANKER
FROM
( SELECT A.ITEM_ID, A.ITEM_NAME, A.MAIN_CATEGORY,
A.SUB_CATEGORY, A.QUANTITY, A.POINT
FROM
( SELECT B.ITEM_ID, B.ITEM_NAME, B.MAIN_CATEGORY, B.SUB_CATEGORY,
A.QUANTITY, C.URIAGE,
TRUNC((SELECT A.QUANTITY / DECODE(C.URIAGE,0,-1,C.URIAGE) FROM DUAL),2) AS POINT
FROM ( SELECT
ITEM_ID, SUM(QUANTITY) AS QUANTITY
FROM ZAIKO_TABLE
GROUP BY ITEM_ID
) A,
STORE_ITEM_MASTER B,
( SELECT A.ITEM_ID AS ITEM_ID, DECODE(B.URIAGE,NULL,0,B.URIAGE) AS URIAGE
FROM
STORE_ITEM_MASTER A
LEFT OUTER JOIN
( SELECT COM_CODE, SUM(SALES_NUM) AS URIAGE
FROM ORDER_TABLE
WHERE SALES_DATE >= (select add_months(sysdate, -1) from dual) AND
SALES_DATE <= SYSDATE
GROUP BY COM_CODE
ORDER BY URIAGE DESC
) B ON A.ITEM_ID = B.COM_CODE
ORDER BY ITEM_ID
) C WHERE B.ITEM_ID = A.ITEM_ID and A.ITEM_ID = C.ITEM_ID
ORDER BY ITEM_ID
) A WHERE A.POINT > 0
) A
) A
WHERE RANKER <= 3

93:NAME IS NULL
07/04/30 04:33:45
>>89
select pref
from test1
group by pref
order by max(id) desc
/


94:NAME IS NULL
07/04/30 05:06:53
>>92
>これを読み解けと言われたのですが、助けてもらえないでしょうか。
具体的に何を求めているのかが、見えてこないのですが、
SQL自体は、各テーブル名、カラム名を普通に解釈すると、
在庫数に対する売上げ個数の比率が多い上位3商品の情報を
求めるSQLかと思います。

95:NAME IS NULL
07/04/30 05:14:10
>>92
とりあえず無駄なorder byがたくさんあるのは読み解いた。
意味があるのはrank() overの部分だけ。
サブクエリを全部Viewにしてみてひとつずつ何やってるか考えてみろ。

96:84です。
07/04/30 13:29:07 J6a1E/oV

みなさん、ありがとうでがんす。
とても勉強になりました。

来週、職場に戻りましたら、早速試したいと思います。


97:NAME IS NULL
07/05/01 12:25:11 E0G15yAt
データベースの検索に関して、

A列とB列の値を加算して、その上で、少なくともA列の値が1以上である、
というような条件の下、最大の値をとるような行を求める場合には、
どのようなSQLを発行すればよろしいでしょうか?

よろしくお願いします。

98:NAME IS NULL
07/05/01 12:29:41 DXF7CsXb
>>97
何が最大?
A + BがMAXってことかいな?

だとしたら
SELECT MAX(A + B) FROM TABLE1 WHERE A >= 1;
でいいんじゃね?


99:NAME IS NULL
07/05/01 12:33:27
>>97
なあ、少しは自分で考えたのか?

100:NAME IS NULL
07/05/01 12:35:24
>>98

返信ありがとうございます。

イメージとしては、

SELECT * FROM TABLE1 WHERE 先頭出現頻度 > 0 AND MAX(先頭出現頻度 + 隣接度)

といった感じで、

name p1 p2
hoge 1 2
hoke 2 4

といったデータがあったとき、 p1 と p2 を加算して最大のもので、
そのうち、少なくとも p1 が 1 以上である行の name を取得したいと考えています。




101:NAME IS NULL
07/05/01 13:40:28
>>100
前提が既におかしい希ガス。

少なくとも p1 が 1 以上と言っておきながら
WHERE句に「先頭出現頻度 > 0」ってのはおかしいだろ。

WHERE句の額面通りに受け取るなら
「p1 が 0よりおおきい」で無いといけない。
条件の文言が正しいなら
「先頭出現頻度 >= 1」が正しい。

それはともかく、
例えば、SELECT TOP nが使えるなら、
SELECT TOP 1 
  a.NAME,
  MAX(a.P1 + a.P2) as MAXVAL
FROM
  TBL a
WHERE a.P1 >= 1
GROUP BY a.NAME
ORDER BY MAXVAL DESC;

なんてのでも取得可能だと思われ。


102:NAME IS NULL
07/05/01 20:38:12 E0G15yAt
>>101

教えていただいたコードを参考に、以下のように SQL を発行しました。
(WordRanking と 俺 は二つの異なるテーブルです)

SELECT TOP 1 WordRanking.AAA, MAX(WordRanking.BBB+俺.CCC) AS MAXVAL
FROM WordRanking INNER JOIN 俺 ON WordRanking.AAA=俺.AAA
WHERE WordRanking.BBB>=1
GROUP BY WordRanking.AAA
ORDER BY MAXVAL DESC;

上記のコードは OleDbCommand によって実行しているのですが、どうにもエラーが発生します。
Access 上では正しく実行されているように感じられるのですが、どこか誤っている箇所がありますでしょうか?


103:NAME IS NULL
07/05/01 20:51:51
だからさぁ、エラーがでるって言うなら、そのエラーメッセージぐらい書けや、このカス・厨房

104:NAME IS NULL
07/05/01 20:57:59 E0G15yAt
>>103

申し訳ありません。
エラーメッセージはデータベースを扱う環境に依存するものであると考えたため、
SQL の構文の正当性の確認には必要が無いと思い、添えておりませんでした。

エラーメッセージ(例外)は以下の通りです。

「1つ以上の必要なパラメータの値が設定されていません。」
(Visual Studio.NET2003, Access2003)


105:NAME IS NULL
07/05/01 21:53:34
>>104
SQLの構文としてはこれでいいかどうかを確認したい、ってことかい?
Accessで実行したら結果が返ってくるんだから問題はないんだろうな。
エラーメッセージでぐぐるなり、ADO.NETのスレとかで聞くなりしてみては。

で、SQLで個人的に気になることを言わしてもらうと
最大値をとる行が複数ある場合を考慮しなくてもいいのか、ってのと
あと、そのSQLってわざわざGROUP BYする必要あるのか?
こんなんでいいと思うが。

SELECT TOP 1 WITH TIES WordRanking.AAA, (WordRanking.BBB+俺.CCC) AS A
FROM WordRanking INNER JOIN 俺 ON WordRanking.AAA=俺.AAA
WHERE WordRanking.BBB>=1
ORDER BY A DESC;

106:NAME IS NULL
07/05/01 22:52:23
>>104
俺の薄っぺらい知識で推測するに
>ORDER BY MAXVAL DESC;
を↓に変えろってことじゃないだろうか
ORDER BY MAX(WordRanking.BBB+俺.CCC) DESC;


107:NAME IS NULL
07/05/02 10:02:48
そいつぁ薄すぎる

108:NAME IS NULL
07/05/02 10:55:19
>>106
あ、昨日の晩の俺がいる。
便乗質問なんだが、例えばSQLイメージで
SELECT 血液型,count(*) AS 人数
FROM 日本人
GROUP BY 血液型
ORDER BY 人数
という構文(ORDER句に集約値につけた名前を直使用)は
大概のDBへの問い合わせに使えるのだろうか?
(>>104とは関係なく一般的な話として)
いや確かpostgresqlでは駄目だったんだこの構文。


109:NAME IS NULL
07/05/02 11:00:40
>>108
バージョンいくつ?

110:NAME IS NULL
07/05/02 12:06:42
>>109
確か7.2.1?(最後の桁が自信無い)
以前そういったことがあったんで、とりあえずGROUPとORDERを
 SELECT * FROM(集約式)AS 結果 ORDER BY 人数
こんな風に分離して逃げた覚えがあるんだ。


111:NAME IS NULL
07/05/02 12:12:42
7.xは今動作環境ないなあ
8.1.4ではとりあえず、それ使えてます

112:NAME IS NULL
07/05/02 13:03:51
>>112
お、8.1.4ではいけると。なら俺の知識が古いだけか...。


113:NAME IS NULL
07/05/02 15:14:18
7.4でもいける。
7.2でも使えてたような気がするんだがなぁ。

114:NAME IS NULL
07/05/02 15:57:33
7.2以降とそれより前は大きく違うからな、7.1以前ならありうる気がしないでもない

115:NAME IS NULL
07/05/02 16:15:11 M2WxE7YV
>>105
>>106

返信、どうもありがとうございます。

>>105 によって示されたコードに
>>106 が示した箇所を修正したところ、見事に動作しました。

とても助かりました。
どうもありがとうございました。

116:NAME IS NULL
07/05/02 18:03:09
>>108
7.1.2があったから試してみたけど、いけたよ。
order by 2
も試したけど、これもちゃんとソートされた。


117:NAME IS NULL
07/05/02 19:07:26
>>111 >>113 >>116
なら俺の記憶はなんか別の件をねじまげてしまったんだな。嘘言ってスマン。
連休明けに7.2.1(多分)の開発環境で自分でも試してみるよ。


118:NAME IS NULL
07/05/02 19:15:59
今日の日付 2007-05-02

SELECT end, start
FROM hyou
WHERE date >= now()
ORDER BY date;

end      start
2007-05-02 0
2007-05-02 0
2007-05-02 0
2007-05-03 0
2007-05-04 2007-04-29 ←
2007-05-07 0
2007-05-08 2007-05-03

これを下のように表示したいのですが、
どうSQLを組めばいいんでしょうか・・?

end      start
2007-05-02 0
2007-05-02 0
2007-05-02 0
2007-05-04 2007-04-29 ←
2007-05-03 0
2007-05-07 0
2007-05-08 2007-05-03

「start」の日付から「end」の日付の間に、今日の日付が含まれていれば
「end列に今日の日付の含まれる行」の次の行に該当するものを表示しようとしています。

119:NAME IS NULL
07/05/02 20:15:12
すみません、自己解決しました。

IF( end >= now( )
AND start <= now( )
AND start <> '0000-00-00', DATE_FORMAT( now( ) , '%Y-%m-%d' ) , date ) AS bit
ORDER BY bit

120:NAME IS NULL
07/05/02 20:22:18
失礼・・・「"end列に今日の日付の含まれる行"の次の行に該当するものを表示」が出来ないorz

121:NAME IS NULL
07/05/02 20:28:54
>>120
order by bit,end,start
ってすればいいんじゃにか?

122:NAME IS NULL
07/05/02 21:06:56
>>121
なるほど。。ORDER BYで複数指定した際の考え方がいまいち分かっていませんでしたorz
その構文で期待通りの表が得られました。ありがとうございます。

123:NAME IS NULL
07/05/08 00:52:25 YXJfMvSq
sqlについての質問です。

Aテーブル
no | date
a | 2007/10/11
b | 2006/2/3
c | 2006/4/2

Bテーブル
no | date | value
a | 2004/10/3 | 24
b | 2005/2/1 | 30
c | 2008/10/11 | 13

のようなテーブルがある時、AとBのテーブルをleftjoinでnoをキーにして結合、
そして、AとBの同じnoでもdateの値が大きい方を取得、最後にその値でソートをかけたいのですが、
どのようなsqlを発行すればいいでしょうか?

欲しい結果
no | date | value
c | 2008/10/11 | 13
a | 2007/10/11 | 24
b | 2006/2/3 | 30






124:NAME IS NULL
07/05/08 02:59:26
>>123
SELECT no,CASE WHEN A.date>B.date THEN A.date ELSE B.date END AS date,B.value
FROM A LEFT JOIN B USING(no) ORDER BY date;

125:NAME IS NULL
07/05/08 13:54:02
すんまそん。。

正規化して外部キーが沢山あるテーブルAにinsertする場合、
各情報をそれぞれの各テーブルにinsertしていき、そのidをテーブルAに外部キーとして
記録する、とゆー以外に

なにか特殊なステートメントとかで、テーブルAに対するSQL一発で、全部済んじゃう
なんていう虫のいい方法ってあるのでそうか。。

よろしくおながいします。m(_ _)m

126:NAME IS NULL
07/05/08 14:59:14
ストアド

127:125
07/05/08 16:05:56
>>126

>ある表 (テーブル) の内容を編集して別の表に格納する大量データの更新処理などを
>データベースエンジン内部で処理プログラムを実行し、入出力 (I/O) のほとんどを
>データベース内部で完結することにより、クライアント側とのデータ通信による
>オーバヘッドを削減することでバッチ処理性能を向上させる「ストアドプロシージャ」が考え出された。
URLリンク(ja.wikipedia.org)

定型処理を登録しておくっていう感じでしょうか。これなら出来そうですね。
でも、、、、SQLiteを使う予定なので、非対応でした。。orz

一応やりようはあるってことが分かってスッキリしますた。
どうもありがとーでしたー。

128:NAME IS NULL
07/05/08 17:12:12
状況がよくわからないんだけど、トリガじゃだめなの?

129:NAME IS NULL
07/05/08 17:14:35
トリガでストアドを実行することになるだろうね

130:NAME IS NULL
07/05/08 17:19:05
ってSQLiteの話か。
DELETEやUPDATEのカスケードはできるだろうけど、INSERTはどうなる?

131:123
07/05/08 18:53:56
>>124
できました。
ありがとうございますた。

132:NAME IS NULL
07/05/10 08:44:19
TIMESTAMP型の質問ですが、TIMESTAMP型に対して演算を行うと、表示するとき時間が表示されなくなってしまいます。
何故このように表示されるのか、解説をお願い致します。

SELECT
   SYSTIMESTAMP AS A
    SYSTIMESTAMP - 1/1440 AS B
FROM
   DUAL;


以下、実行結果

A
--------------
2007/05/10 08:33:05.385

B
--------------
2007/05/10

133:NAME IS NULL
07/05/10 09:39:19
>>132
DUALを使ってるからOracleのtimestamp型かな?
計算結果がDATE型に化けてる感じだね。
TO_CHARで時分秒まで書式指定してみては。

134:NAME IS NULL
07/05/10 09:42:20
>>133
ありがとうございます。
試してみます。

135:NAME IS NULL
07/05/10 09:53:41
>>134
その問い合わせでVIEWを作ってみると
AはTIMESTAMP型になるが、BはDATE型になる。
>>133の回答が正しいと思われ。


136:133
07/05/10 12:42:06
>>133
>>135
試してみました。
DATA型になっているようです。
TIMESTAMP型のまま計算はできないのでしょうか?

SELECT
  to_char(SYSTIMESTAMP - 1/1440,'yyyy-mm-dd hh24:mi:ss:ff'),
FROM
  DUAL;

行2でエラーが発生しました。:
ORA-01821: date format not recognized

137:NAME IS NULL
07/05/10 13:01:34
>>136
DATE型に対してミリ秒まで書式指定してるからでないの?

SELECT
 SYSTIMESTAMP AS A,
 TO_CHAR(SYSTIMESTAMP - 1/1440,'YYYY/MM/DD HH24:MI:SS') AS B
FROM DUAL;
ならエラーでないし。

どうしてもTIMESTAMP型にしたいなら
SELECT
 SYSTIMESTAMP AS A,
 TO_TIMESTAMP_TZ(TO_CHAR(SYSTIMESTAMP - 1/1440,'YYYY/MM/DD HH24:MI:SS'),'YYYY/MM/DD HH24:MI:SS') AS B
FROM DUAL;
みたいにしなきゃならんと思われ。


138:133
07/05/10 13:34:58
>>137
たぶんそれです。
ありがとうございます。
早速試してみます。

139:NAME IS NULL
07/05/10 14:51:42
ワキガ…それは、科学技術が発達した現代において、未だ解決手段を
      見出せない不治の病…

ワキガ…それは、人と人を分かつ人種差別の根源。ワキガこそが
     人々を争わせ、血と涙を流させる…

ワキガ…それは、夢ある若者を絶望させ、悪心を植えつける悪の源泉

ワキガ…それは、悪徳業者の儲け口。悪をのさばらせる恰好のエデン

ワキガは全てを破壊し、再生を妨害する。ワキガがある限り、この世は平和にならない。
こんにちまで、私達人間はワキガに対する対抗手段を持ち得なかった。
だが、2007年の五月。ついにワキガを撲滅するための手段が見つかった!
その名は「軽石療法」
軽石でワキを擦ることで、ワキガは消滅するのだ!なんと単純な治療法だろうか。
しかし疑ってはいけない。相対性理論も画期的だがシンプルだったではないか。
そう、画期的なものはシンプルなのだ。シンプルでなければいけないのだ。
つまり軽石療法こそが、ワキガを消滅させるための唯一の方法なのだ。

軽石療法について詳しく知りたければいますぐここへ行くことをお勧めする。
※わきが※ワキ擦り治療法※腋臭※
スレリンク(diet板)

君の人生に明るい光がさすことを約束しよう。さあ来たれ悩める民たちよ。


140:nobodyさん
07/05/10 17:36:02 7Nf664PD
欠番を埋めるSQLを作成しています。
テーブル名 TEST_TB

C_ID C_NAME
C00001 A
C00002 B
C00004 D
C00005 E
C00006 F

C00003を取得するSQLが書けません。
ご教授よろしくお願いいたします。

141:NAME IS NULL
07/05/10 17:56:47
>>140
C_IDの桁数は6桁固定で後ろ5桁が数字でOK?

しかし1桁目が文字でゼロ詰めされてるから、
文字列操作がめんどくさいなwww

select MIN(to_number(SUBSTR(C_ID,2)) + 1) AS TARGET from TEST_TB
WHERE (to_number(SUBSTR(C_ID,2)) + 1) NOT IN (select to_number(SUBSTR(C_ID,2)) from TEST_TB)

Oracleならこれで3が戻るはずから、
戻り値をC00003にするようガンガレwww


142:NAME IS NULL
07/05/10 21:28:29
Webサービス(PHP)で使うユーザとグループをSQLで管理しようと考えています。
ユーザが複数のグループに所属できるようにしたいのですが、
ユーザとグループそれぞれのテーブルの良い関連づけの仕方が思いつきません。

・ユーザのテーブルに所属グループを記す配列を付ける
・グループのテーブルに所属メンバーを記す配列を付ける
初めは以上の2通りのやり方を考えたのですが、SQLには配列が無いことに気付きました。

配列を実現するために、ユーザ(あるいはグループ)ごとに配列の代わりになるテーブルを作成するか、
カンマ区切りの数値を文字列として保存して配列のように使うか、
今はその二つの方法だけが思いつき、どちらが最適か悩んでいます。

SQLでの一般的な実現方法がありましたら、ご教授願います。

143:NAME IS NULL
07/05/10 22:47:08
>>142
ユーザー表、グループ表、ユーザー・グループ対照表

144:nobodyさん
07/05/11 10:19:09 5xTIeHlP
>>141
ありがとうございました。
ただ、mysqlだったのでto_numberは使えませんでした。

145:NAME IS NULL
07/05/11 10:23:05
>>144
だったら最初からRDBMS名を挙げとけwww

MySQL4.1のリファレンス見ると
CASTかCONVERTが存在するから、それ使え。


146:NAME IS NULL
07/05/11 10:23:43
>>144
あと、SUBSTRは、SUBSTRINGな。

147:NAME IS NULL
07/05/11 15:27:23
お舞ら一般的な考え方を教えてください。
あるテーブルにUINTのフィールドがあったとします。
それはテーブルでユニークではなく、同じ値を複数のレコードがもちえるとします。

ここである操作に対して新しいレコードを作製しそのフィールドにそれまで使われてない値をいれたいんですが、この使われてない値を高速に持ってくる方法ってあるんでしょうか?

インクリメントしていってもいいんですが、レコードが削除されて使われなくなった値とか出てきます。その値も無駄にすることなく使いたいのです。
ひとつ考えたのはインクリメントしていって上限までいったら歯抜けをつめなおして関連テーブルの値を更新するものです。
もしも使われてない値を高速に持ってくることができるならそうした処理をする必要がないので、何か手段があれば教えてくださいエロイ人(´・ω・`)

148:NAME IS NULL
07/05/11 15:42:13
>>147
UNSIGNED INTなら、
URLリンク(www.yel.m-net.ne.jp)
をまんまパクればいいと思うが?

SELECT MIN(UINTの列名+1) AS 欠番 FROM テーブル
   WHERE UINTの列名+1 NOT IN (SELECT UINTの列名 FROM テーブル)

で取れるんじゃね?


149:NAME IS NULL
07/05/11 18:14:51
さんくすです。パフォーマンス見て検討してみます。

150:NAME IS NULL
07/05/11 19:49:42
UINTって約43億?
設計上INSERTとDELETEが非常に多く繰り返されてしまうのかもしれないけど、
それでも実レコードが数百万とか数千万にまで膨れ上がると、
>>148では遅くなるだろうな。(ハードも含めたシステムによるけど)

DBによるが、NOT IN より NOT EXISTSで相関クエリにした方が速そう。
でも結局、1度はテーブル全て読み込むことになってしまう。

ULONGを使うと事実上インクリメントしても一巡することはありえねぇーってなら
その方が速いんじゃね。

151:NAME IS NULL
07/05/11 23:54:19 m7WrnMvu
DESC って何の略?ORDER BYで使うDESC。

152:NAME IS NULL
07/05/12 00:34:43 o1KON6CY
descend

153:NAME IS NULL
07/05/12 01:15:06
>>142
俺もあるシステム作ったときに同じようなことで迷った

結局、「ユーザーとグループの対照テーブル」に
「ユーザー列」+「所属するグループのキー」をカンマ区切りの文字列で格納して
JSPで分割しながら判定するようにしたけど、遅いし、無数に増えるグループだといつかカラムの容量超えるしで
結局所属できるグループ数と全体の最大グループ量に制限設けるしかなかったんだよな

よくありそうな話だし、DB設計者なら何かもっとよいDB設計がでてくるのかもね

154:NAME IS NULL
07/05/12 02:20:53
「ユーザーとグループの対照テーブル」に
ユーザーID, グループIDを追加していくだけじゃダメなんですか?

155:NAME IS NULL
07/05/12 09:21:13
>>153
俺も、最初 DB 使い始めの頃は同じような考え方してたよ。

一般的な正解は >>143, >>154 の言う通りで

[ユーザ表]
id
名前
...

[グループ表]
id
名前
...

[ユーザ・グループ対照表]
ユーザid
グループid

のようにして、ユーザをグループに所属させる時は [ユーザ・グループ対照表] に
ユーザid と グループid の対を挿入していく。

ある名前のユーザが所属するグループ名一覧が欲しい時は、

SELECT "ユーザ表"."名前", "グループ表"."名前"
FROM "ユーザ・グループ対照表", "グループ表", "ユーザ表"
WHERE ( "ユーザ・グループ対照表"."グループid" = "グループ表"."id"
AND "ユーザ・グループ対照表"."ユーザid" = "ユーザ表"."id" )
AND ( ( "ユーザ表"."名前" = 'いいいい' ) )

のようにする。(OpenOffice.org の Base の例)

三つものテーブルにアクセスしないといけないし、[ユーザ・グループ対照表] は
結構行数も大きくなるので、なんか非効率な感じがするけど、インデックスとか
ちゃんと設定しておけば大丈夫。

凄くよくある話だし、データベースの基本だから「データベース 正規化」とかで
ぐぐって色々見てみるといい。わかってみるとそんなに難しい概念じゃないよ。

156:NAME IS NULL
07/05/12 15:52:24
なるほど、そういうことか
何か意味もなく「ユーザ・グループ対照表」のユーザーIDもしくはグループIDを一意にしないとって考えにとらわれてた

DB周りはあまり触らないのだけど、スッキリしたし勉強になったよ。ありがとう

157:NAME IS NULL
07/05/13 11:18:16 CvhZCYzt
質問です。
データベースをとある条件で検索した多量の結果のうち、
項目の範囲を指定して、その範囲内だけのデータを取得するにはどうすれば良いのでしょうか?
例を挙げると、検索系のシステムで、最初の20件・・次の20件・・最後の20件、というアレです。

よくありそうな処理ですが、これの解説をされているサイト等、私には見つけることが出来ませんでした。
くだらない質問かもしれませんが、ご存知の方いらっしゃいましたらご教授くださいませ。

158:NAME IS NULL
07/05/13 11:20:40
MySQL ならLimit SQLServerだったらTOP(だったか?) etc

159:NAME IS NULL
07/05/13 11:21:18
>>157
limit offset構文が使えるなら、それで。
使えないなら別の方法でwww

多分にRDBMSの方言が出てくるから、
手前の使ってるDB名晒せ。


160:NAME IS NULL
07/05/13 11:42:43 rmiwhMVe
Oracleで重いUPDATEをいくつか書いたスクリプトを流そうと考えています。

UPDATE tbl1 set a=1;
UPDATE tbl1 set b=2;

Object Browserかsql/plusで流す予定ですが、途中経過を出力させたいのです。
例) "UPDATE tbl1が終了しました"
どのようなSQLを書けば宜しいでしょうか?教えて下さい。

161:NAME IS NULL
07/05/13 11:54:01
dbms_output使っても経過情報を
リアルタイムには出力できなかったと思うので、
SQLを実行するスクリプト側で1本目のSQL終了時に
標準出力にECHOさせるようにするしかない。



162:NAME IS NULL
07/05/13 11:54:21
スクリプトの中に外部プロシージャー呼び出せばいいのでは。

163:NAME IS NULL
07/05/13 11:58:16
>>158-159
標準のSQLではなく、データベースサーバによる拡張的に存在していたのですね!
使用しているのはMySQLなので、Limitを使ってみたいと思います。
これは非常に為になりました。どうもありがとうございました!

164:160
07/05/13 11:59:43 rmiwhMVe
更新情報をリアルタイム出力する必要はないです。
1個目のSQLが終わって2個目のSQLが開始されたことだけわかればOK。
ずっと放置して固まっていたというのが怖い。

>>161>>162
それを調べるのにキーワードとなる単語はありますか?
もう少し詳しく教えて頂けると助かります。

165:NAME IS NULL
07/05/13 12:04:25
>>164
「Oracle EXTPROC」
とか
「Oracle 外部プロシージャ」
とかだろうなwww

標準出力にECHOするだけの外部プロシージャなら、
CでもJavaでも簡単に書けるし。


>>162
外部プロシージャでECHOさせる発送はなかったわ、俺。


166:160
07/05/13 14:06:49 rmiwhMVe
何とかなりそうです。ありがとう。

167:162
07/05/13 18:35:24
>>165
ちなみにDB2/400とかだと経過情報をリアルタイムに見れるな。

普通(?)のDB2UDBがソレっぽい事できなくて驚いたので、
ちょろっと悩んだ時期があった。

最近は前もって「5分くらいかかるから気にスンナ」ってメッセージ最初に
出すようにしたけどな。w

168:NAME IS NULL
07/05/14 15:46:02 o9PHUJbI
次のように社員番号と枝番で一意であるが、枝番がNullを許容する場合、
社員番号と枝番で一意であることをどのように示すのでしょうか?
主キーはなしで、社員番号と枝番を複合して、
ユニーク制約(ユニークインデックス)とすべきでしょうか?

社員番号  枝番
123  1
123  2
123  Null

169:NAME IS NULL
07/05/14 15:49:37
>>168
枝番にNULLが来るなら
UNIQUE制約しかないと思うよ。


170:NAME IS NULL
07/05/14 16:04:54
枝番0を新設するほうが簡単な気がする

171:NAME IS NULL
07/05/14 22:02:25
俺もそう思う。

172:NAME IS NULL
07/05/14 22:29:41
>>168
ふつう、nullにuniqueは効かないから(123,null)が複数エントリできてしまうよ。
MS-SQLServerは違うみたいだけど。

173:NAME IS NULL
07/05/15 13:07:51
a_tb (
date,
b_id
)

b_tb (
id,
url
)

とゆー二つのテーブルから、b_id同士をつなげて、重複しない最新の5件のurlを表示したいのです。そこで...

select DISTINCT date(a_tb.date), b_tb.url FROM a_tb, b_tb
WHERE a_tb.b_id = b_tb.id ORDER BY a_tb.date DESC LIMIT 5;

としたのですが、重複排除の集約方向が、dateの古いレコードの方に集約されてしまって、こまっています。。

つまり、a_tbに

2007-5-15 13:05:00, 5
2007-5-15 10:05:00, 5

とあると、下のレコードに集約されてしまって、上のレコードがあることが、
最新の5件の中に含まれないのです。。orz

お知恵を拝借したいです。。よろしくおながいします。

174:NAME IS NULL
07/05/15 14:59:41
>>173
>date(a_tb.date)
どのDBMSを使っているか知らないが、
date() というのが時分秒を切り捨てる関数なんじゃないのかい?

175:NAME IS NULL
07/05/15 15:48:09
>>174
>どのDBMSを使っているか知らないが、
スマソ。SQLite 3でつ。

>date()というのが時分秒を切り捨てる関数なんじゃないのかい?
yes。日付だけになるので、同じ日の同じURLの重複を排除すると言う感じになっておりますです。
そうしないと分秒が影響して、DISTINCTする意味が無くなってしまう気がするので。。

もしかして、、、ORDER BYで時間含めてソートしていても、
DISTINCTで日付だけでソートされた時に、ORDER BYのソートは全く関係なくなってしまうのでしょうか?
そんな気がしてきました。。

とすると、最新の5件に重複するURLが含まれないようにするには、SQLだけでは難しいのかな。。むー

もうちょと考えてきます。どうもありがとうございましたー。

176:NAME IS NULL
07/05/15 17:19:09
SELECT DATE(a_tb.date), b_tb.url FROM a_tb, b_tb
WHERE a_tb.b_id = b_tb.id GROUP BY DATE(a_tb.date)
ORDER BY 1 DESC

こんなんじゃだめか?実行すらしていないが。
これじゃダメならサブクエリ使うといい

177:176
07/05/15 17:19:50
ごめ、忘れてくれ

178:147
07/05/15 18:09:58
たびたびすいません。
またIDのつけ方で悩んでるのですが、次のような方法はありですか?
UINTなどをIDとする。
IDはオートもしくは手動でインクリメントさせる。
IDが上限まできたら、すでに削除されたレコードがあるとして0から連番になるように更新する。その際関連するテーブルのID値も更新する。
つめた後のIDの最大値+1を次のIDのシードとする。



・・・こんな処理が必要なのか?だんだん疑問になってきた。皆さんID値ってどうされてるんでしょう?

179:NAME IS NULL
07/05/15 20:07:24
>>178
普通にシーケンスつかって取得してるけどwww


180:NAME IS NULL
07/05/15 23:46:12
>>178
> IDが上限まできたら

普通は、来ないようにする。

どの DBMS 使ってるのか知らんけど、最近の奴なら ID を 64bit にできるから、
よほど特殊なデータでない限りラップしたりしない。

181:NAME IS NULL
07/05/16 07:08:42
>>178
32bitのIDを使い切る場合は、
1秒に10 IDずつ新規IDを発行すれば1日864000 IDで13年半ほどもつ。
64bit使い切ろうと思ったら、
1日4294967295(32bit相当分) IDを消費するために1秒49710 ID程度の新規発行が必要で
これでも11734883年ほどもつ。

まあなんだ頑張れ・・


182:NAME IS NULL
07/05/16 16:40:18 shmAdjsQ
tbl_area
*************
area_id
-------------


tbl_shop_area
*************
area_id(FK)
shop_id(FK)
-------------

tbl_shop
*************
shop_id
-------------

という主キーを持つ三つのテーブルがあってもうすでにある程度DATAが入ってます。
shopテーブルが持つエリアの数は1つなので、tbl_shopにarea_idカラムを作って
tbl_shop_areaから対応するshop_idを持つarea_idを、そのカラムに流し込みたいのですがどうすればよいのでしょうか?

ALTER TABLE tbl_shop ADD COLUMN area_id INTEGER;
ALTER TABLE tbl_shop ADD FOREIGN KEY(area_id) REFERENCES tbl_area (area_id) ON UPDATE CASCADE ON DELETE SET NULL;
とカラムは作ったのですが、流し込むところで躓いてます。

UPDATE tbl_shop SET tbl_shop.area_id = tbl_shop_area.area_id WHERE tbl_shop.shop_id = (SELECT tbl_shop_area.shop_id FROM tbl_shop_are);
とやってみたのですが
ERROR: missing FROM-clause entry for table "tbl_shop_area"
といわれたので
UPDATE tbl_shop SET tbl_shop.area_id = tbl_shop_area.area_id FROM tbl_shop_area WHERE tbl_shop.shop_id = (SELECT tbl_shop_area.shop_id FROM tbl_shop_are);
とかしてみましたけど根本的にちがうっぽくてうまくいきません。

複数行のUPDATEはできないのでしょうか?
なんかスクリプト使わないと無理なのかな?

SQLでいける書き方あったらお願いいたします。


183:182
07/05/16 16:41:32
ちなみにpostgreSQL8.1.8です

184:182
07/05/16 16:59:25
UPDATE t_shop SET area_no = (SELECT area_no FROM t_rel_shop_area WHERE t_shop.shop_no = t_rel_shop_area.shop_no);
でできました。(微妙にカラム名違うけど気にしないでください)

お騒がせしました。

185:NAME IS NULL
07/05/17 10:48:10 EjOsYkVC
おせわになってます
timestampが保存されているカラムから現在までの時間を取得したいのですが
age(add_date)
を使うと、例えば
3 mons 24 days 10:00:01.22559
という型で帰ってきてしまって、PHPなどで使うときに
"3 mons 24 days 10:00:01.22559"というテキストになって
計算に使うのが面倒なのですが、
秒数や何日、見たいな形で取得することはできないのでしょうか?

お願いいたします。


186:185
07/05/17 10:50:07 EjOsYkVC
DBの種類書くの忘れました
postgresqlです。

187:NAME IS NULL
07/05/17 12:14:51
varcharの長さを短くしておくメリットって( ´Д`)なにか?あるんでしょうか?
なければすべてvarchar(Max)とかしておけばいいのかと思ったのですが

188:NAME IS NULL
07/05/17 12:35:23
>>185
extract(epoch from age(d))
とかでどうかなあ。
この辺よく変わるからバージョンによるかも。

189:NAME IS NULL
07/05/17 15:26:41
>>187
その長さ以上の文字列が入っちゃだめなときとか。。

190:NAME IS NULL
07/05/17 15:48:36
>>189 そういう制限ないときはMaxでいいとですか?

191:NAME IS NULL
07/05/17 17:44:34
>>190
DBMSによるかのう。
無制限の可変長文字列はラージオブジェクト扱いだったりでいろいろ制限があるものが多い。
varchar(max)とか言ってるからMSSQL2005かな?
旧バージョンのtext型と違い制限は少なくなってるけどまだ何かあったはず。


192:NAME IS NULL
07/05/17 17:49:13
>>191 
いわれてるとおりMSSQL2005です。
なるほど。あえて8000文字までとMaxで分けてるからには実装で違いありそうですね。
通常のvarcharのサイズの長短でも影響あるのか調べて見ます。

193:NAME IS NULL
07/05/17 19:37:37 wTPpdrT0
oracleで日本語の半角、全角を区別しないで検索する方法ってありますか?

194:NAME IS NULL
07/05/17 20:27:31
>>187
ストアドプロシージャやユーザ定義関数内でvarchar(max)な変数が
使えなかった気がする。

なので、そういうので値いじろうとすると面倒になる。


195:NAME IS NULL
07/05/19 21:45:20
【女性客拉致・強姦】 被害女性「男が4人ほどいた」と証言…ステーキ店「ペッパーランチ」店長・店員の他に共犯者か★35
スレリンク(newsplus板)

ペッパーランチという大手ステーキ屋の店長達が、食事中の女性客を店内で拉致・レイプした。
店の制服・名札を着けたまま犯行に及んでいることから、レイプ後に被害者を殺す予定だった可能性が高い。
ところが報道はほとんどされず、インサイダー取引の可能性大。
同社の隠蔽工作、google対策等怪しいが、一週間経っても新情報無し。

31スレ消化 = 3万1000カキコ
関連スレレス数おおよそ 1万
ロムが これの5倍にあたる15万人?
約20万人のネラーが興味を示してます。

2chからの現段階での波及効果
○アマゾンにて一瀬邦夫社長の著者本の評に罵詈雑言
○ミクシーなどでペッパーランチアルバイトがまさかの暴言。これに対して総攻撃
○wikiのペッパーランチが書き換え合戦によりほぼ機能停止
○ペッパーフードサービスHPがポートを意図的に閉鎖
○携帯チェーンメール展開中
○ペッパーランチはてなダイアリーにて「女性客が一人で食べに行くと、逆に店員に食べられてしまうという」記載
○Yahoo グルメ、株式掲示板にてペッパーランチ炎上
○監禁場所の特定(2chスクープ)
○ペッパーフードサービスHPに掲載された謝罪文の誤字脱字に「バカじゃねーのwww」と指摘レス相次ぐ
これら繰り返される訂正レスにペッパーフードサービスは反応。合計七回もの謝罪文を訂正
(執行部は2chを見てるのは間違いないと確信)
○ファミリーマートがペッパーフードサービスとの共同商品に大して「事件の重大性」を理由に
共同開発中止を通達
○有志のブロガーさん達が、報道を抑制しているマスコミに代わって自分のブログでこの事件をエントリー開始

ペッパーランチからの攻撃
○2ch内での工作員を送り込む(煽動失敗、2chによって完全制圧される)


196:NAME IS NULL
07/05/20 00:37:47
logテーブルがあって
 user_id(int)
 run_time(timestamp)
これを
 ・5/19 20時 2回 ・5/19 21時 0回
 ・5/19 22時 1回 ・5/19 23時 4回
みたいな感じで 1ページに1ヶ月分表示しているんですが
発行クエリが 31日×24時間=744回 発生するんで非常に重いんです……

なにか1回だけのSQLで744行返ってくる書き方あれば教えてください
DBはmysqlです


現在使っている方法
select count(*) from log
where uid=ユーザid and date_format(run_time, '%Y-%m-%d-%H)'=?
?は for $i (1..31){for $j(0..23){年-月-$i-$j}}



197:NAME IS NULL
07/05/20 02:10:08
select date_format(run_time, '%Y-%m-%d-%H'),count(*) from log
where uid=ユーザid
group by date_format(run_time, '%Y-%m-%d-%H')

198:NAME IS NULL
07/05/20 09:12:26
>>197
こういう SQL 見てて select のところの date_format() と group by
のところの date_format() に同じ内容を書かないといけないのが、なんか嫌。

select date_format(run_time, '%Y-%m-%d-%H') as DateHour, ...
group by DateHour

のようにすればよさげなんだけど、なんか駄目な理由でもあるんだろうか?

date_format(run_time, '%Y-%m-%d-%H') ぐらいならまだ許容範囲だけど、
case を使ったような長い式を書く時に特にそう思う。

199:NAME IS NULL
07/05/20 10:50:36
>>198
GROUP BY や WHERE は SELECTリストを見てるんじゃなくて、
FROM句を見てるから。つーか、SELECTのところよりGROUP BY句の方が先に処理されてる。
逆にORDER BYはSELECTリストに無いとエラーになる。こちらはカーソルだからね。

とは言うものの、今のPostgreSQLのGROUP BYはORDER BYと同じように扱えたりする。
エイリアスで指定可能はもちろんのこと、
SELECT date_format(run_time, '%Y-%m-%d-%H'),count(*) FROM log
WHERE uid=ユーザid GROUP BY 1;
んでも桶。まぁ、パーサが融通利かせれば如何様にでもなるんだろうけど。


200:196
07/05/21 00:05:37
>197
ありがとうございます
countが0だと返らないのはなんかアレなんですが
まぁプログラム側で処理すればいいですね

>198
ただでさえ分かりにくいから できるだけ簡潔に書きたいですね

>199
ホリデープログラマーは気にする必要なさそうですね

ありがとうございました。またよろしくです

201:NAME IS NULL
07/05/21 06:01:43 HJQ5A+AS
mysqlを勉強していますが、わからないことがありましたので、質問させていただきます

Tbl_player

id name posi
1 三浦 FW
2 柳沢 FW
3 中村 MF
5 中田 MF
7 小野 MF

こういったテーブルがあったとして、
最後のレコードのnameを抽出したい場合、Where句にはどのような抽出条件を書いたらいいのでしょうか。

SELECT name
FROM Tbl_player
WHERE ??


202:NAME IS NULL
07/05/21 07:11:12
>>201
何をもって「最後のレコード」とするのが不明だが、idが一番大きい物を選ぶなら、
WHERE id = (SELECT max(id) FROM Tbl_player);
サブクエリが使えないMySQLだったら、idで降順に並べ替えて1行目。


203:NAME IS NULL
07/05/21 21:07:36
select name from Tbl_player order by id desc limit 1

204:NAME IS NULL
07/05/23 16:23:31
MySQL 4.1 以降ならサブクエリ可。

205:NAME IS NULL
07/05/23 16:25:44
だからサブクエリが使えないMySQLだったらって書いてるんだろ
使えるMySQLもあるからわざわざ書き足してる

206:NAME IS NULL
07/05/23 22:39:25
>>202, >>204
> サブクエリが使えないMySQLだったら

「全ての MySQL はサブクエリが使えない」と解釈することも可能。

特に >>202 だけ読むと、サブクエリを使う例の後に書いてるので、
多くの人は「全ての MySQL はサブクエリが使えない (と >>202
思っている)」と解釈すると思う。

「サブクエリの使えないバージョン (の MySQL) なら」と書けば
意図がより明確になる。

そもそも、>>202 でわざわざサブクエリ使う意味がないし。

207:202
07/05/23 23:16:06
最初に断っとくが、>>205は俺じゃないからな。

>>206
確かに「バージョン」と書けばよかったが、>>201はMySQLを勉強...と断っているので、
「全てのMySQLはサブクエリが使えない」とはとらんだろう。少なくとも元質の人は。

個(最大値)を選択するのに、ベンダーに依存するLIMITクエリは、このスレ的に面白くないじゃん。

208:NAME IS NULL
07/05/23 23:30:25
そもそもMySQLでサブクエリ使えるようになったって誰でも知ってることだろ……

209:NAME IS NULL
07/05/24 11:15:02
うちの仕事先は3.23さ……orz

210:NAME IS NULL
07/05/24 20:51:30
仕事で使ってるDBなんて、そう頻繁にバージョンアップするもんでもないけどな

211:NAME IS NULL
07/05/24 22:57:09
>>210
運用してるDBはそうだな。
開発用ならあっちこっちにいろんなバージョンのDBが
あることの方が多いだろwww


212:NAME IS NULL
07/05/26 10:24:17 4biNP+cn
select
  a, b, c
from 
  tbl
where
  b = "hoge" and
  c = (select max(c) from tbl where b = "hoge")

c が大きいレコードが新しいレコードだとします。
bが"hoge"の中で一番新しいレコードを取得するのに、こういうsqlを考えたのですが、こういう書き方って普通でしょうか?

213:NAME IS NULL
07/05/26 11:39:50
having c=max(c)

214:NAME IS NULL
07/05/26 21:06:17
冠詞(The, A)を読み飛ばしてソートするSQL文をご教授くださいm(__)m

データ
The piano
A doll
the song
songs

実行結果
A doll
The piano
the song
songs


215:NAME IS NULL
07/05/26 21:08:49
冠詞(The, A)を読み飛ばしてソートするSQL文をご教授くださいm(__)m

table 'rooms'

column 'object'

songs
The piano
A doll
the song

実行結果
A doll
The piano
the song
songs


216:NAME IS NULL
07/05/26 21:33:43
Replace みたいな関数があれば、それで消してからソート、で OK

217:NAME IS NULL
07/05/26 22:35:58
>>207
> ベンダーに依存するLIMITクエリは、

> >>201はMySQLを勉強...と断っているので、

もしかして馬鹿?

218:NAME IS NULL
07/05/26 22:40:48
終わった話題を蒸し返すバカ

219:NAME IS NULL
07/05/26 23:38:42
あっ、悪い。

蒸し返されると困る人がまだいたんですね。

220:NAME IS NULL
07/05/26 23:58:31
その二つは別問題だろうが、
行間を端折らずに全て説明しなきゃわかんないのかね。
ひょっとして生粋の日本人かな。

221:NAME IS NULL
07/05/27 01:22:12
MySQLスレに行かずにわざわざここで聞いてるくらいだから

222:NAME IS NULL
07/05/27 04:14:25
MySQLスレは初心者が質問できる雰囲気では無いからなあ。

223:NAME IS NULL
07/05/27 09:38:17
>>220
> 行間を端折らずに全て説明しなきゃわかんないのかね。

へ~、ちゃんと説明できるんだ。

じゃあ説明してみてよ。

224:NAME IS NULL
07/05/27 10:34:52
なんかうるさいのがいるな。
ここは汎用のSQLの質疑応答がメインだから、
特定の処理系にこだわることはないし、方言に気を使う場所だ。
質問者がたまたま環境を指定したからって、それでしか使えない方法を
教えなくちゃいけないなんてことはない。

225:NAME IS NULL
07/05/27 10:52:01
粘着しているのは一人だけだから放っておけよ。ただのキチガイみたいだし。

226:NAME IS NULL
07/05/27 14:20:26 Hm1mP6ts
シーケンス番号がプライマリにあるテーブルで
Insert時にSQLで1ずつシーケンス番号をカウントアップさせようとしています。

Insertの際にシーケンス番号の部分に
select max(シーケンス番号) +1 のように値を指定しようかと思っていますが
1つのtransaction内で複数回Insertしようとした際に
max(シーケンス番号)が2回目以降Isolationによって
どのように変わるか教えてください。

Identityとか使えればよいのですが
パッチ作業が頻繁に発生し、バルクイン、アウトを行うのですが
これによりシーケンス番号が変更されると聞いているため
Identityを使用できません。
(そもそもIdentityのあるテーブルでバルクイン、アウトをやらないものなのでしょうか?)

シーケンス番号に順序性等は必要ないのですが
バルクイン、アウトを行うためだけに、このようなことをしようとしています。

定石等があれば教えてください。





227:NAME IS NULL
07/05/27 14:39:15
そのDBMSには独立したsequenceオブジェクトはないのかい?普通はそれを使う。


228:NAME IS NULL
07/05/27 15:10:09
>>224
> 質問者がたまたま環境を指定したからって、それでしか使えない方法を
> 教えなくちゃいけないなんてことはない。

いや、俺もそんなことは問題視してないよ。

ただサブクエリ云々の言い訳として「>>201はMySQLを勉強...と断っているので、」と
言う理由あげときながら、同じレスで「ベンダーに依存するLIMITクエリは」なんて書
く奴はアフォじゃね? って思っただけ。

見事に証明してくれてありがとう。(w

229:NAME IS NULL
07/05/27 16:08:41 Hm1mP6ts
>>227

Identityでもsequenceでも同じことじゃん

230:NAME IS NULL
07/05/27 17:17:42
違うだろ
identity列はsequenceが自動採番される列のこと。


231:NAME IS NULL
07/05/27 17:43:59
>>226
なんか矛盾してねぇ?

順序性等は必要ないのですが
バルクイン、アウトを行うためだけに、このようなことをしようとしています。
これによりシーケンス番号が変更されると聞いているため
Identityを使用できません



232:NAME IS NULL
07/05/27 18:08:58 Hm1mP6ts
>>231

説明足らずでした
履歴を持つテーブルなのでプライマリーキー的にもうひとつ、かぶらない値が必要なのです。

通常履歴も管理するテーブルの場合、このように採番系のカラムをもつのは一般的ではないのでしょうか?

233:NAME IS NULL
07/05/27 19:29:25
>>216
THX!!ありがとうございました。

234:NAME IS NULL
07/05/28 02:17:14 trwQ1/5+
インデックスについて質問
カラムA、カラムBの複合インデックスをもっている時
WHERE カラムA = ○○
で検索した場合、インデックスは使われる?

235:NAME IS NULL
07/05/28 06:47:51
>>234
使われない

236:NAME IS NULL
07/05/28 10:04:31
>>234
普通は使われるはずだが、心配ならプランを確認。

237:NAME IS NULL
07/05/28 10:36:09
>>234
RDBMSのオプティマイザの実装に依存する。

RBOだと使われる可能性は高いと思うし、
SQLにオプティマイザヒントなんかを埋め込むことで、
特定のRDBMSならINDEXを使うようし向けることは出来る。
・・・が、すべてのRDBMSで必ず使われる保証は無いと思う。

CBOだったらいくら適切にINDEXが作成してあっても、
TABLE FULL SCANの方が低コストと判断されたら
全表走査することもある。

238:NAME IS NULL
07/05/28 10:45:46
>>232
トランザクションがロールバックしようがコミットしようが、
単純に重複しなけりゃOKって用途であれば、
俺はOracleならシーケンス使う。
他のRDBMSで自動採番系の機能が有ればそっち優先で使う。


239:NAME IS NULL
07/05/28 15:52:21
(SQL Server2005)
伝票の情報を保存するような以下のテーブルで
(伝票コード , 得意先コード , 取引区分 , 金額)
取引区分が 1 , 2 , 3 , 4 しか入らない場合
インデックス(Non-Clusterd)をつけるのは無駄なのかな?
select/Insertの比率9:1とします
Insertする時にreal分割が発生すると取引区分=1 のレコード全部にロック(ラッチ)かかる?

1.ないよりマシ
2.選択性が低いので意味なし
3.さらにロック、ラッチの観点から逆効果


240:NAME IS NULL
07/05/28 20:41:18
試しにやってみればいいじゃねーか。
不思議な質問だ。

241:NAME IS NULL
07/05/29 17:58:14
めんどいじゃん。

242:NAME IS NULL
07/05/29 18:22:52
答えるほうもめんどいわw

243:NAME IS NULL
07/05/29 18:27:29
三択まで用意してやったんだぜ?サクッと答えられる奴いないの?

244:239
07/05/29 18:38:08
お前らどんだけだよ!にわかは氏ね!

245:NAME IS NULL
07/05/29 19:11:39
試しにやってみればいいじゃねーか。
不思議な人だ。

246:NAME IS NULL
07/05/29 19:34:01
>>239
「データが極端に少ない」 or 「データが大量にある」なら、
カーディナリティ低いINDEXにどれだけ意味がある?

実際は自分が想定するデータ件数で実験して判断しろよwww


247:NAME IS NULL
07/05/29 20:13:50
>>226
>Identityとか使えればよいのですが 
>パッチ作業が頻繁に発生し、バルクイン、アウトを行うのですが 
>これによりシーケンス番号が変更されると聞いているため 
>Identityを使用できません。 
sql serverのことだったら
bcp in の時に -E オプションをつければシーケンス番号は変わらないぞよ。

248:NAME IS NULL
07/05/29 23:16:27
通常タイムスタンプは同じ値でも幅があるから一意として使えない(1秒間に複数更新があった場合)。
けれど、SQLServerのTIMESTAMPは

行が更新されるたびに更新
される、データベース内で
一意なバイナリ形式の番号。
データを追加または変更
した日時とは関係ありま
せん。
以下はTUMESTAMP の
シノニムです。
ROWVERSION

だそうだ。更新されれば自動的に値が変わる。
自明だけど、反復読み取りのチェックに使える。

249:NAME IS NULL
07/05/29 23:19:57
>>226
履歴を作る場合等、データによって同じ数値のカウンタが複数出る時は、行識別のidentifierと更に追加でカウンタ含む複合uniqueキーを使う。
例えば、
取引 id  カウンタ(defalt:0 0は最新データを意)
A  123
注)取引とカウンタで複合unique
という表Aをつくる。ここでは、取引:Aとid:123をinsert済
次に、
取引 id  コンスタント
A      0
注)id:unique,取引とコンスタントで複合unique
と取引名とid:nullとコンスタント:0のみの表Bを作りselect,insert:可 update,delete:拒否とする。
表Aをselectする場合、表Bより取引&idのwhereでコンスタントを探し該当する値がなければid=nullのときのコンスタントを選ぶ。
更新は、表Bに対し取引A,id,コンスタント+1を行う(これが履歴となる)。
仮に、+1処理させないルール無視のクライアント処理がきた場合、複合キーがぶつかってはじかれる(アプリに計算させてもACIDのために制限をかけている)。
idと複合uniqueのコンビネーションで反復読み取りのはざまに更新した場合の判別がやりやすくなる。(全カラム比較の必要なし)

このようにすれば、
>select max(シーケンス番号) +1 のように値を指定しようかと思っていますが
>1つのtransaction内で複数回Insertしようとした際に
>max(シーケンス番号)が2回目以降Isolationによって
>どのように変わるか教えてください。

のMRUの履歴max+1をidentifierとしてカウントアップさせるのではなくACIDを保持したまま安全にアプリに変数として持たせられる。
後、トリガー使う方法もあるけど(考え方としてはやりやすいけど)、選択の余地が無いのでバッチ等処理が重くなる。
この辺、前処理後処理含めてcobolのcallインターフェースは融通効くんだけどねえ、なにせRDBというかSQL・・(ry


250:NAME IS NULL
07/05/29 23:33:50
あと履歴のレプリカ作って元表と全カラムjoinしてやれば、
たちまち履歴が更新削除禁止になるなんてこともできるぜ
(連鎖更新、連鎖削除禁止)

251:NAME IS NULL
07/05/30 07:44:06
>>248
SQL Server2005ですがTimestamp列で楽観的ロックをやってます


252:NAME IS NULL
07/05/30 19:16:42 PlndNA/w
SQL Server2005を使用しています。
例えば500行ヒットして先頭から50行取得するSELECT文で
SELECT TOP 50 カラムA FROM T WHERE ~ としていたのですが
このヒット数の500も一緒に取得するにはどうしたらいいのでしょうか。

試しにSELECT TOP 50 COUNT(*) カラムA FROM T WHERE ~
としてみましたがCOUNTにはやっぱり50が入ってきます。

ただ50行全部にCOUNT値があるのでこういう場合は
切り分けて考えた方がいいのか悩んでいます。




253:NAME IS NULL
07/05/30 20:58:08
いつもロムっていましたが質問させてください。

a表
得意先コード 売上区分 売上金額  売上日
1       10    1000    2007/04/15
1       10    500     2007/05/02
2       30    2100    2007/04/28
2       13    2500    2007/05/01
3       14    3100    2007/04/10
3       25    3900    2007/04/18
4       31    4500    2007/05/15

b表
得意先コード 得意先名
1       佐藤
2       青木
3       田中
4       佐々木

c表
得意先コード 限度金額
1       10000
2       5000
3       20000
4       30000

上記3つの表から
a表の得意先コードごとに売上月で分かれた下記の様な集計表を作成したいのですが
途中でつまずいてしまいました。
どのようなSQL文を書いたら良いのか教えていただけないでしょうか。
RDBMSはOracle9.2を使用しています。
よろしくお願いします。

得意先コード 得意先名 合計売上金額 前月売上金額 今月売上金額 限度金額
1       佐藤   1500     1000     500      10000
2       青木   4600     2100     2500     5000
3       田中   7000     7000     0       20000
4       佐々木  4500     0       4500     30000


254:NAME IS NULL
07/05/30 21:00:34
>>252
select ごにょごにょ into #temp from table_a where ごにょごにょ (500行分)

select top 50 ごにょごにょ, count = (select count(*) from #temp) from #temp

もしくは .NETなら
select top 50 ごにょ from table_a where ごにょ
select count(*) from table_a where ごにょ
で dataadapter.fill(dataset) とすれば
dataset.table(0) に1つ目, table(1)に2つ目が入る


255:NAME IS NULL
07/05/30 21:07:45
>>253
けっこう面倒そうだけど
合計売上額は先々月のデータとかあったら足していいのけ?

まずa表から月別の売上作ってみたら?

256:NAME IS NULL
07/05/30 21:20:47 Mj0ff4uQ
>>255
さっそくありがとうございます。
先月までの累積金額と今月分のを集計したいので足して集計させたいです。

a表から先月までの分と今月分のを作成するのはできると思います。

select 得意先コード, sum(売上金額) as 売上金額
from a表
where 売上日 < '2007/05/01' ←ここを変えて2回処理します
group by 得意先コード;

先月までの分と今月分とb表、c表を結合するには(+)とか使えばいいのでしょうか。
よろしくお願いします。

257:NAME IS NULL
07/05/30 21:45:04
>>256
>ここを変えて2回処理します
月別でグループ化して一時表作ったら1回で済むんじゃ?

select 得意先コード, 年月 = cast( replace(売上日,'/','') as int)
,sum(売上金額) as 売上金額
into #temp from a表
where 売上日 < '2007/05/01' 
group by 得意先コード , cast( replace(売上日,'/','') as int)

累積
select 得意先コード , 累積 = sum(売上金額) from #temp group by 得意先コード

先月
select 得意先コード , 累積 = 売上金額 from #temp where 年月 = 200704

今月
select 得意先コード , 累積 = 売上金額 from #temp where 年月 = 200705

ここまで出来たらあとはjoinするだけ
ああ最初のcastはoracleでは使えないかもしれないから変えてね

258:NAME IS NULL
07/06/02 13:34:23

id   name_col
1    name_1
2    name_2
3    name_3
4    name_4
5    name_5

name_col の name_ を title_ に置換して

id   name_col
1    title_1
2    title_2
3    title_3
4    title_4
5    title_5

とするにはどうすればいいですか?

259:NAME IS NULL
07/06/02 16:46:18
replace(name_col,'name_','title_')

260:NAME IS NULL
07/06/02 18:52:09 F7i5c8na
すんません

GROUP BY と COUNT(*)を使ったクエリで
COUNT(*)が 0 になる場合も 0 を出力してもらう方法ってありませんか?


261:NAME IS NULL
07/06/02 19:28:25
col1
----
A
B
D
B

っていうテーブルがあったとして、

col1 count(*)
---- --------
A   1
B   2
C   0
D   1
E   0
・・・
Z   0

にして欲しいってこと?

無理だろ。

262:NAME IS NULL
07/06/02 19:49:43
A-Zだけじゃないでしょ
全ての文字列の組み合わせで、0件の出力しなくちゃ

263:NAME IS NULL
07/06/02 20:03:01
集計キーのマスタを用意すれば
外部結合とcoalesceで実現出来ると思う

264:NAME IS NULL
07/06/03 01:50:06
>261
そうそう
まぁ普通に無理っすね……

>263
別テーブルと結合って考えたんですけど
めんどくさいっすね……

--
ありがとうございました


265:NAME IS NULL
07/06/03 16:50:29 mw/dDSFg

Postgreでmemberの住所(address)が埼玉、群馬の女子(f)の人数を調べようと思うのですが
どのようなSQLを書いたらよいでしょう?

結果は
-------------
埼玉 50
群馬 30
-------------
のように表示させたいのですが、

select address ,count(*) from member where (address = '埼玉' or address '群馬') and (sex = 'f');

ではダメですか?

266:NAME IS NULL
07/06/03 17:25:20
>>265
group by

267:NAME IS NULL
07/06/04 18:37:01
>>257

257様 お力添えありがとうございます。
お教えいただいた方法で色々試してみました。
(1)と(2)で一時表(c表)を作成し(3)でd表に集計しようと考えてみましたが、
(3)のSQLを実行すると「ORA-00979 GROUP BYの式ではありません」とエラーとなってしまいます。
どのようなSQLを組んで良いのか…もう一度皆様のお力を貸していただけないでしょうか。
よろしくお願いします。


(1)
insert into c表
select 得意先コード,sum(売上金額) as 売上金額4,sum(0) as 売上金額5
from a表
where 売上日 <= '2007/04/30'
having sum(売上金額) != 0
gropu by 得意先コード

(2)
insert into c表
select 得意先コード,sum(0) as 売上金額4,sum(売上金額) as 売上金額5
from a表
where 売上日 > '2007/04/30'
having sum(売上金額) != 0
gropu by 得意先コード

(3)
insert into d表
select d表.得意先コード,b表.得意先名,c表.限度金額,sum(d表.売上金額4) as 売上金額4,
sum(d表.売上金額5) as 売上金額5
from b表,c表,d表
where d表.得意先コード = b表.得意先コード (+)
and d表.得意先コード = c表.得意先コード (+)
group by d表.得意先コード


268:NAME IS NULL
07/06/04 18:41:38
>>267


申し訳ありません。
間違ったSQLを貼り付けてしまいました。
こちらが実行したSQLです。

(1)
insert into d表
select 得意先コード,sum(売上金額) as 売上金額4,sum(0) as 売上金額5
from a表
where 売上日 <= '2007/04/30'
having sum(売上金額) != 0
gropu by 得意先コード

(2)
insert into d表
select 得意先コード,sum(0) as 売上金額4,sum(売上金額) as 売上金額5
from a表
where 売上日 > '2007/04/30'
having sum(売上金額) != 0
gropu by 得意先コード

(3)
insert into e表
select d表.得意先コード,b表.得意先名,c表.限度金額,sum(d表.売上金額4) as 売上金額4,
sum(d表.売上金額5) as 売上金額5
from b表,c表,d表
where d表.得意先コード = b表.得意先コード (+)
and d表.得意先コード = c表.得意先コード (+)
group by d表.得意先コード


269:NAME IS NULL
07/06/04 19:59:56
最近の Oracle は GROUP BY の前に HAVING 使えるのか?
まぁ普通に逆に書いてると予想。

270:NAME IS NULL
07/06/04 20:24:35
>>269

ありがとうございます。
(1)と(2)を単独に実行しても正常に通りますが、
ご指摘のとおりHAVINGの使い方をGROUP BYの後に書くよう改めます。

(3)ですが3つの表から1つにまとめたいのですが、
皆さんならどのように書かれますか?


271:NAME IS NULL
07/06/04 20:43:46
>>270
あんま読んでないけど
group by d表.得意先コード,b表.得意先名,c表.限度金額
じゃないのけ?

272:NAME IS NULL
07/06/04 20:59:54
>>271

271様
お教えいただいたとおり修正しましたら動きました!!
ありがとうございました。
まだまだ勉強不足だと痛感しています…。


273:NAME IS NULL
07/06/05 01:28:00
以下のようなテーブルがあって、ある指定された1つ以上のタグ全て含むfavorite_idを選択したいです。
例)SQLとC++が指定されたら、1と3が返ってくる
以下のようなSQLを考えたのですが、もっと良い書き方とか定番の書き方があれば教えてください。
SQLite使ってます。

SELECT favorite_id FROM fav_tag, tag
WHERE fav_tag.tag_id = tag.tag_id
  AND (tag.text = 'SQL' OR tag.text = 'C++')
GROUP BY fav_tag.favorite_id
HAVING COUNT(fav_tag.favorite_id) = 2;


テーブル名:fav_tag
favorite_id    tag_id
====================
1            3
1            4
1            6
1            7
2            13
2            15
2            21
3            3
3            4
3            13
4            4
5            31

・・・

テーブル名:tag
tag_id    text
====================
3        SQL
4        C++
6        HTTP
7        JAVA
13       DB
・・・

274:NAME IS NULL
07/06/05 01:43:56 PQi92ZZ4
どなたかご知見がありましたらご教授ください。

現在下記のような、selectした結果をそのまま
insertするsqlを組んでいるのですが、SQL内に計算式が含まれる為か
かなり処理速度が遅い状態です。
実際はinsert項目はもっと大量にあり、
かつ選択条件もキーだけではなく
like条件も含むやや複雑なものを使用しています。


INSERT INTO 表4
SELECT
ROUND(SUM(C.商品1単価 * B.商品の重量) / SUM(B.商品の重量),3),
ROUND(SUM(C.商品2単価 * B.商品の重量) / SUM(B.商品の重量),3),
ROUND(SUM(C.商品3単価 * B.商品の重量) / SUM(B.商品の重量),3),
ROUND(SUM(C.商品4単価 * B.商品の重量) / SUM(B.商品の重量),3),

ROUND(SUM(C.商品5単価 * B.商品の重量) / SUM(B.商品の重量),3) +
ROUND(SUM(C.商品6単価 * B.商品の重量) / SUM(B.商品の重量),3),

SUM(B.商品の重量)

FROM 表A,表B,表C

WHERE

A.キー1 = B.キー1 AND
B.キー2 = C.キー2 AND
(A.対象期間 >= '2006/04/01' AND A.対象期間 <= '2007/03/31')

この場合、一気に処理をしようとしないで、
カーソルで1行づつそれぞれの単価及び重量を取得して
どんどん足しこむ計算をプログラム内で用意し、集計した結果をinsertしたほうが
処理的にやはり早いのでしょうか?

もしくは各表毎に検索処理自体も分けて
検索も極力キーのみを使用するようにしたほうが
結果として早くなるのでしょうか?

insert対象が3000件ほどあるのですが
登録に1時間以上かかっております・・・。

275:NAME IS NULL
07/06/05 05:23:15
>>274
それはもう実行計画見ろとしかいいようがないな


276:NAME IS NULL
07/06/05 11:31:24
>>273
ほとんど変わんないけどちょっと手直し (入力データ流し込みやすいように)
SELECT favorite_id FROM fav_tag INNER JOIN tag using(tag_id)
WHERE tag.text IN ('SQL','C++')
GROUP BY favorite_id
HAVING COUNT(*) = (SELECT COUNT(*) FROM tag WHERE tag.text IN ('SQL','C++'))


それと相関サブクエリ使うやり方
SELECT DISTINCT favorite_id FROM fav_tag fav1
WHERE NOT EXISTS
(SELECT tag.tag_id FROM tag WHERE tag.text IN ('SQL','C++')
EXCEPT SELECT fav2.tag_id FROM fav_tag fav2
WHERE fav2.favorite_id = fav1.favorite_id);

どっちがパフォーマンス良いかは知らないので
実験して好きな方使ってくれ。

参考
URLリンク(codezine.jp)


277:273
07/06/06 00:56:27
>>276
まだSQLに慣れてないので、別のやり方を挙げて頂けたのは勉強になり助かります。
ありがとうございました。

278:NAME IS NULL
07/06/06 23:08:37 GDaT0Jkl

学年 学籍番号 点数
1    0001    60
1    0002    80
2    0003    90
2    0004    20

このような表からそれぞれの学年ごとに、A(80~100点の人数)、
B(70~80点の人数) C(60~70点の人数) D(0~60点の人数)を
表にするにはどうしたらよいでしょうか?

学年 A  B  C  D
1   10  15  8  9
2   11  22  2  3
3   13  9  3  10

よろしくお願いします。

279:NAME IS NULL
07/06/07 01:40:24
>>278
SELECT 学年,
SUM(CASE WHEN 点数>=80 THEN 1 ELSE 0 END) AS A,
SUM(CASE WHEN 点数>=70 AND 点数<80 THEN 1 ELSE 0 END) AS B,
SUM(CASE WHEN 点数>=60 AND 点数<70 THEN 1 ELSE 0 END) AS C,
SUM(CASE WHEN 点数<60 THEN 1 ELSE 0 END) AS D
FROM 表 GROUP BY 学年;

280:NAME IS NULL
07/06/07 21:05:56
order by 学年 asc

をつけといた方がいいかも。

281:NAME IS NULL
07/06/08 02:10:35 oKxpcUps
SQLの勉強をしたいのですが無料で軽いフリーソフトがありましたら教えてください

282:NAME IS NULL
07/06/08 04:28:57
byteaで画像データを格納したいとき、画像のパスを指定して保存、は可能ですか?


283:NAME IS NULL
07/06/08 07:00:28
>>281
MySQL
SQL Server ExpressEdition


284:NAME IS NULL
07/06/08 10:14:01
SQLite
PostgreSQL

285:NAME IS NULL
07/06/08 10:20:40
>>281
FireBird


286:NAME IS NULL
07/06/08 13:49:30 4l/ZZkFv
SQLプログラマーの先輩様に質問があります
現在私は日本電子専門学校(情報処理科1年)で先週初めてSQLServer の授業が行われたのですがプログラムを作る際考え方がわからなくて困っています(ノ_<。)
隣にいる同級生はスラスラ解いているのに自分は教科書見て探している間に時間が過ぎてる毎日です
俺はこんな風に勉強して上手くなった 式の組合せはこう考えればいいよってことがありましたら教えてください(^人^;)

287:NAME IS NULL
07/06/08 15:02:07
DBに接続するアプリの作り方がわからないのか、SQLの書き方がわからないのかどっち?

288:NAME IS NULL
07/06/08 15:14:58
>>286
何をどうして良いのか分からないんだったら、
目的の物を得るためには
どういう順番で何をしなければならないかを
考える癖をつけた方が良いよ。

やらなければならないことを
ナンバリングしながら箇条書きにしていくだけでも、
基本的なロジックは組み上がるからね。


289:NAME IS NULL
07/06/08 15:27:09
あと、特に理由がなければ個人を特定されかねない情報は出すべきではないと思う。
エレクトロンの花とか言われるぞ。

290:NAME IS NULL
07/06/08 23:35:26
>>282
可能だろ。

君が「指定されたパスから画像を読み込んで、データベースに食わせる」ことができるなら。

291:NAME IS NULL
07/06/11 14:52:31 DdlgA2BI
+----------+--------+
|  DATE   | GENDER |
+----------+--------+
|2007-06-01 |  M    |
+----------+--------+
|2007-06-01 |  F    |
+----------+--------+
|2007-06-01 |  M    |
+----------+--------+
|2007-06-02 |  F    |
+----------+--------+

TOUROKUというテーブルに上記データがあるとして、
以下のように、日付毎の合計件数とMまたはFそれぞれの件数を同時に求めたいです。

+----------+------+--------+--------+
|  DATE   |COUNT|COUNT(M)|COUNT(F)|
+----------+------+--------+--------+
|2007-06-01 |  3  |   2   |   1   |
+----------+------+--------+--------+
|2007-06-02 |  1  |   0   |   1   |
+----------+------+--------+--------+

日付毎の合計を求めるだけなら
SELECT
DATE(CREATED) AS DATE,
COUNT(*) AS COUNT
FROM TOUROKU
GROUP BY DATE
;
として求められることがわかりましたが、
MとFを同時に求める方法がわかりません。
教えてください。MySQL4.2です。

292:291
07/06/11 14:53:30 DdlgA2BI
あ、ごめんなさい。
自分でわかったSQLは
日付毎の合計を求めるだけなら
SELECT
DATE,
COUNT(*) AS COUNT
FROM TOUROKU
GROUP BY DATE
;
でした

293:NAME IS NULL
07/06/11 15:10:29
>>291
SELECT date, count(*) AS COUNT,
(SELECT count(*) FROM Touroku WHERE gender='M' AND date=T0.date) AS COUNT_M,
(SELECT count(*) FROM Touroku WHERE gender='F' AND date=T0.date) AS COUNT_F
FROM Touroku AS T0 GROUP BY date;

294:291
07/06/11 15:18:34
>>293
ありがとうございます、できました!
なるほどこれがサブクエリーってやつなんですね。
勉強になりました。ありがとうございました。

295:NAME IS NULL
07/06/11 19:49:09 u6t10WUz
C#でOracleに接続してSQLの構文を書いてるのですが、ListBoxの選択されたアイテム
をWhereで抽出したいのですが、どのように書いてみたらいいですかね?

296:NAME IS NULL
07/06/11 20:11:18
>>295
in

297:NAME IS NULL
07/06/11 23:55:58
>>279
できました。
ありがとうございました。

298:295
07/06/12 16:12:20 pwv6P776
inを使って構文を書いたのですが、上手くいかず・・・具体的にどんな感じに
書いたらいいでしょうか?

299:NAME IS NULL
07/06/12 16:28:08
うまくいかなかった時のSQLを書いてよ

WHERE xxx IN (1,2,3,4,5)

とか

300:295
07/06/12 17:10:51 pwv6P776
WHERE xxx IN(' + listbox + ')
このような形で書いたのですが、上手くいかず。。。

301:NAME IS NULL
07/06/12 17:33:31
>>300
listboxの中身をちゃんと展開して、
>>299みたいなカンマ区切りの文字列にしろよ。


302:295
07/06/12 17:40:22 pwv6P776
listboxの中身を展開ってどうやればいいんですか?

303:NAME IS NULL
07/06/12 18:42:35
いや、最初っからSQLの話じゃなくてC#の話じゃねぇの。
聞くスレ間違っているよ。

SelectionModeがOneなら、
this.listBox1.SelectedItemで取り出せるんだから、
それをDbParameterかなにかで突っ込めばいいだろ。
マルチならthis.listBox1.SelectedItemsを展開連結なり何なりと。

>>300のやり方を見ると

WHERE xxx = ’" + listBox1.SelectedItem.ToString() + "'";
としたいのか。それでもいいが、
普通はDbParameter経由で押し込むべきだろう。

なんにせ、板違いのスレ違い。

304:NAME IS NULL
07/06/13 01:14:47
oracle 9

テーブル4つを共通キーで外部結合し、
他の項目をとってきてデータ出力したいが その際件数が合わない
おおよそこんな形

select t1.key1, t2.item1, t3.item1,t4.item1
from t1,t2,t3,t4
where t2.key1 = t1.key1
and t3.key1 = t1.key1
and t4.key1 = t1.key1

これだとキー以外の項目の組み合わせ分件数が膨れて出てくる
SQLで楽に以下のように出せる方法あるでしょうか?
(pl/sql等が妥当なのか?)

t1.key1, t2.item1 t3.item1 t4.item1
1 1 1 1
2 2
3
2 1 1 1
2 2
3
3 1
4 1

※テーブルの定義
table colum
t1 key1
t2 key1,item1
t3 key1,item1
t4 key1,item1



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch