【帰ってきた】SQL質疑応答スレ

このエントリーをはてなブックマークに追加
1NAME IS NULL
お待たせ!
夏休みの宿題に間に合うかな?
2NAME IS NULL:2005/08/16(火) 20:04:13 ID:???
お、帰ってきたか
3NAME IS NULL:2005/08/17(水) 17:30:28 ID:QQOPOPnl
華麗に3ゲト
4NAME IS NULL:2005/08/17(水) 19:08:57 ID:???
おっ、やっぱいいな。
密かにWikiを用意していたんだけど、
他のネタに使っちゃった。
5NAME IS NULL:2005/08/17(水) 21:49:19 ID:???
過去ログ
SQL質疑応答スレ Part 2
http://pc8.2ch.net/test/read.cgi/db/1103113155/
SQL質疑応答スレ
http://pc8.2ch.net/test/read.cgi/db/1056973582/
6NAME IS NULL:2005/08/18(木) 00:23:02 ID:???
教えて下さい。
データを削除する方法として、論理削除と物理削除があると思いますが、
どちらが一般的なのでしょうか?
自分は今まで物理削除しかしていませんでしたが、最近仕事で一緒にやっている人間が
論理削除派なのです。
理由はトラぶった時に対応できるからだそうですが、実際にはどちらが良いのでしょうか?
また論理削除の場合、物理削除や復活機能は付ける物でしょうか?
何卒教えて下さい。
7NAME IS NULL:2005/08/18(木) 05:06:12 ID:???
>>6
ADO.NETともSQLともは関係ない話だな。マルチすなw
8NAME IS NULL:2005/08/31(水) 12:07:07 ID:x9q05yEX
楽しかった夏休みも今日で終わり。宿題は終わった?
9NAME IS NULL:2005/09/12(月) 19:37:02 ID:TCUcyoY2
あるテーブルのプライマリキーであるIDが例えば 7, 2, 5, 4, 3, 1, 2 の
七つの行をこの順番通りに一発で取得したいのですが、そんなことは
可能でしょうか?

where id in (7, 2, 5, 4, 3, 1, 2) では順番は保証されないですよね。

ちなみにDBはPostgreSQL 8.0です。
10NAME IS NULL:2005/09/12(月) 19:54:57 ID:???
>>9
RDBでは格納順のような物理的な並び順というのは保障されない。
格納順や表示順を格納するフィールドを作ってそれでOrder Byするしかない。
どうしてもやりたければ、テスト確認はしてないがこんな感じか
select id, a, b, 1 as 表示順 form where id in (7) union all
select id, a, b, 2 as 表示順 form where id in (2) union all
select id, a, b, 3 as 表示順 form where id in (5) union all
select id, a, b, 4 as 表示順 form where id in (4) union all
select id, a, b, 5 as 表示順 form where id in (3) union all
select id, a, b, 6 as 表示順 form where id in (1) union all
select id, a, b, 7 as 表示順 form where id in (2)
order by 表示順
11NAME IS NULL:2005/09/12(月) 20:10:24 ID:???
初めまして。
Paradox使用でのSQLについての初歩的な質問です。

他サイトでの説明が理解できないぐらいのレベルなのですが
どうか御教授よろしくお願いいたします。

select A.管理番号,A.設置年度,B.布設年度
from A,B,C
where (B.作業番号 = C.作業番号 and B.手順番号 = C.起点番号)
and (A.作業番号 = C.作業番号 and A.起点番号 = C管路.起点番号)
and (B.布設年度 like '%S%')


B.布設年度は「S58、H08」などで書かれています。
A.設置年度は「1999」などの西暦で入力されています。

B.布設年度を西暦に変換し、尚且つA.設置年度と合っているかどうかを調べたいのです。

以下の文はAccessでのSQLの文です。

and (substring (B.布設年度,2,1) <> '0')
and ((A.設置年度)<>(substring(B.布設年度,2)+1925))

上記2行のAccessの文はそのままParadoxに持っていく事が出来ません。

どのように変更したらよいでしょうか?

皆様よろしくお願いいたします!
129:2005/09/12(月) 20:41:49 ID:???
>>10
ありがとう。
13NAME IS NULL:2005/09/13(火) 12:16:53 ID:Ey+pKjIi
>>9
select * from テーブル
order by
case ID
when 7 then 1
when 2 then 2
when 5 then 3
when 4 then 4
when 3 then 5
when 1 then 6
when 2 then 7
else 8 end;

oracleSQLパズル
http://oraclesqlpuzzle.hp.infoseek.co.jp/5-25.html
14NAME IS NULL:2005/09/13(火) 17:13:40 ID:???
>>13
重複する2の扱いで難易度アップだ。単なるtypoかもしれないけどね。
15NAME IS NULL:2005/09/13(火) 18:08:26 ID:Ey+pKjIi
>>14
select * from テーブル
where id in (7,2,5,4,3,1,2)
order by
case ID
when 7 then 1
when 2 then case 重複する2のソートの優先条件 when 2
      else 3
when 5 then 4
when 4 then 5
when 3 then 6
when 1 then 7
else 8 end;

oracleSQLパズル
http://oraclesqlpuzzle.hp.infoseek.co.jp/5-25.html
16NAME IS NULL:2005/09/14(水) 10:41:05 ID:???
A_ID, B_ID
0001, 0100
0002, 0102
0003, 0105
0004, 0105
0005, 0105
0006, 0107

こんな感じのテーブルがあるときに、B_IDのみdistinctがかかったような結果
(上記の場合、A_IDが 0001, 0002, 0003, 0006)
が欲しいんですが、そういった問い合わせはどうすればいいんでしょうか。
17NAME IS NULL:2005/09/14(水) 11:43:38 ID:Y33JtPdi
>>16
同一のB_IDの中で、最小のA_IDという条件をwhere句に使う

これの応用(自己結合になっただけ)
http://oraclesqlpuzzle.hp.infoseek.co.jp/5-11.html
http://oraclesqlpuzzle.hp.infoseek.co.jp/5-22.html
18NAME IS NULL:2005/09/14(水) 13:22:31 ID:rn335wAJ
select
(case 年 when 1999 then 売上 end),
(case 年 when 2000 then 売上 end),
(case 年 when 2001 then 売上 end)
from 年間売上

というように、
行方向のデータを列方向に入れ替えたいのですが、
"1999" "2000" "2001" の値を動的に変えたい場合は
どのように書いたら?
19NAME IS NULL:2005/09/14(水) 13:40:49 ID:???
マルチ&回答済み


【まだまだ】Microsoft Access クエリ3【使える】
http://pc8.2ch.net/test/read.cgi/db/1120779000/197

197 名前:NAME IS NULL[] 投稿日:2005/09/14(水) 13:19:30 ID:rn335wAJ
select (case 年 when 1999 then 売上 end),
(case 年 when 2000 then 売上 end),
(case 年 when 2001 then 売上 end)
from 年間売上

というように、
行方向のデータを列方向に入れ替えたいのですが、
"1999" "2000" "2001" の値を動的に変えたい場合は
どのように書いたら?
20NAME IS NULL:2005/09/14(水) 14:50:35 ID:???
>>17
サンクス

select * from TABLE
where A_ID in
(select min(A_ID) from TABLE group by B_ID)

こんな感じでできました

21NAME IS NULL:2005/09/14(水) 17:54:55 ID:???
この場合

select min(A_ID),B_ID from table group by B_ID order by 1

でも同じ結果が得られると思うけど。
22NAME IS NULL:2005/09/14(水) 18:48:58 ID:qFo7wpdd
科目(科目コード、科目名、単位数)の表を定義するSQL文を記せ。
ここで科目コードは3けた、科目名は漢字で15桁以内の可変長、単位数は整数とする。

という問題があるんですが、

CREATE TABLE 科目(
  科目コード CHAR(3) NOT NULL,
  科目名   NCHAR VARYING(15),
  単位数   CHAR

これあってるでしょうか?多分違うと思うんですが…
どなたかご教授お願いします。
23NAME IS NULL:2005/09/14(水) 18:58:54 ID:???
24NAME IS NULL:2005/09/14(水) 19:06:34 ID:???
>>23
日本語力無くてすいません
つーかそういうレスいらないんで
答え合ってるか見てほしいんですけど
25NAME IS NULL:2005/09/14(水) 19:12:16 ID:A03+/ogp
質問させてください

SELECT * FROM XXX WHERE 条件 ORDER BY 特定行

こんな感じのSELECT文で取得データ数を指定することは出来るでしょうか?
あっても最大200個までのデータを取りたい場合とかはどうすればいいのでしょうか?
26NAME IS NULL:2005/09/14(水) 19:16:01 ID:???
自己解決しました。すみません。
27NAME IS NULL:2005/09/17(土) 23:41:15 ID:???
検索結果の頭に
1,a1,a2,a3
2,b1,b2,bc
のように、SQL 分で番号を追加することはできますか?
28NAME IS NULL:2005/09/17(土) 23:47:39 ID:???
>検索結果の頭
>SQL 分で番号

頭って何だどっち方向だ
SQL分って何だ特殊な時間か

ただの連番(行番号)ならDBMSによる
2927:2005/09/18(日) 01:00:44 ID:???
行番号です。
SQL Server です。
30NAME IS NULL:2005/09/18(日) 02:38:47 ID:???
3127:2005/09/18(日) 04:01:07 ID:???
ありがとう
32NAME IS NULL:2005/09/19(月) 22:09:47 ID:???
データベースインストールしたけど
登録するデータがありません。
本を見ながら田中とか鈴木とかいれるのも飽きました。
33NAME IS NULL:2005/09/19(月) 22:18:48 ID:???
アンインストールすればいいんでね?
34NAME IS NULL:2005/09/20(火) 00:45:35 ID:???
>>33
鋭いですね。
35NAME IS NULL:2005/09/21(水) 11:25:56 ID:???
id  timestamp
------------------------------
18  2005-09-20 18:25:41.109
18  2005-09-20 15:11:54.953
19  2005-09-19 23:02:23.39
19  2005-09-19 23:02:17.781
18  2005-09-19 22:47:21.546
18  2005-09-19 22:47:20.656
13  2005-09-19 22:45:05.453
14  2005-09-19 22:45:02.031
13  2005-09-19 22:45:02.015
17  2005-09-19 22:04:29.39
15  2005-09-19 22:04:29.359
17  2005-09-19 22:04:22.609
15  2005-09-19 22:04:22.50

このようなテーブルがある時に、同一idの中で最も新しい日付の付いた id を
新しい順に取り出したいのですが、どうすればいいのでしょうか?
欲しい結果は上記例の場合、以下です。宜しくお願いいたします。

id  timestamp
------------------------------
18  2005-09-20 18:25:41.109
19  2005-09-19 23:02:23.39
13  2005-09-19 22:45:05.453
14  2005-09-19 22:45:02.031
17  2005-09-19 22:04:29.39
15  2005-09-19 22:04:29.359
36NAME IS NULL:2005/09/21(水) 13:04:25 ID:???
SELECT ID,MAX(時間) xx FROM テーブル
GROUP BY ID
ORDER BY xx(列の別名)

これが通らないなら、上記SQLをFROMに突っ込んで。
SELECT ID,xx FROM (上のSQL)
ORDER BY xx
37NAME IS NULL:2005/09/21(水) 14:35:55 ID:o3S3CaJt
id  code
----------
10  1
10  3
10  4
20  1
30  1
40  1
40  3
50  1
50  2
50  3
60  1
60  2
60  3
60  4
70  2
80  3
80  4
90  3
90  4

上記の様なテーブルでcodeを1・2・3・4全て含む
idを取り出すにはどうしたらよいでしょうか

id
--
60
38NAME IS NULL:2005/09/21(水) 14:47:03 ID:???
DBMSの違いはわからないからORACLE風

SELECT ID FROM (
SELECT ID,DECODE(CODE,'1',1,0) CODE1,DECODE(CODE,'2',1,0) ・・・ FROM そのテーブル
)
WHERE CODE1 = 1 AND CODE2 = 1 AND CODE3 = 1 AND CODE4 = 1
3937:2005/09/21(水) 15:36:54 ID:???
>>38
折角質問にお答え頂いたところ
申し訳無いのですが、当方Oracle未経験で
現在使っているDBもPostgreSQLなのです…

再度の質問になりますが上記のSQLを
PostgreSQLに直して使うにはどうしたらよいでしょうか
40NAME IS NULL:2005/09/21(水) 16:09:06 ID:EVbwtLR8
decodeって、if x then a elseif ・・・ else なので。
case式とかかな?
4135:2005/09/21(水) 17:10:16 ID:???
>>36
サンクス。いけました。すばらしい。
42NAME IS NULL:2005/09/21(水) 17:17:35 ID:???
>>41
つうか、入門書を買うか、入門Webページをブックマークに突っ込め。
43NAME IS NULL:2005/09/21(水) 18:11:24 ID:???
>>37
select id from (
select id,
case code when 1 then 1 else 0 end as code1,
case code when 2 then 1 else 0 end as code2,
case code when 3 then 1 else 0 end as code3,
case code when 4 then 1 else 0 end as code4
from topix37
) as ex_topix37
group by id
having sum(code1)>0 and sum(code2)>0 and sum(code3)>0 and sum(code4)>0

>>35もそうだがデータの持ち方を間違ってる。可能ならテーブル構造を見直すか、
不可能ならSQLではなくてプログラムロジックで処理したほうが早いことがある。
44NAME IS NULL:2005/09/22(木) 06:40:05 ID:???
SELECT id
FROM テーブル
WHERE code in (1,2,3,4)
GROUP BY id
HAVING count(*)=4
45NAME IS NULL:2005/09/22(木) 11:17:19 ID:/gIUfeom
46NAME IS NULL:2005/09/22(木) 13:06:28 ID:???
>>37
id と code で重複を許すかどうかで変わってくる。
id + code でユニークなら>>44。重複があるなら>>43>>45だねえ。
47NAME IS NULL:2005/09/22(木) 17:49:46 ID:BHXwIJyW
JET(Access2000) で、

親テーブル(主キー: id)
id | 名前
--+-----
1 | hoge
2 | foo

子テーブル(主キー: id, 好物 外部キー:id -> 親テーブル.id)
id | 好物
--+-----
1 | パン
1 | ハム
1 | 目玉焼き
2 | ごはん
2 | ハム
2 | 目玉焼き
2 | 黒酢

といった表から

id | 名前 | 好物
--+----+--------------------------
1 | hoge | パン,ハム,目玉焼き
2 | foo | ごはん,ハム,目玉焼き,黒酢

という仮想表を作りたいのですが、これを SQL のみで作ることは可能でしょうか。
好物の値の種類は今後増える可能性があります。好物のオーダーは通常の昇順です。
 クロス集計クエリの結果を JOIN する方法をはじめに思いついたのですが、
これだと一列にカンマ区切りなどでまとめられないことと、項目を動的に
増やすのに * を使うため id 列が2列になってしまうのがよくありませんでした。
48NAME IS NULL:2005/09/22(木) 18:40:42 ID:???
>>47
文字列を結合するような集合関数はない。あったら便利だとは思うが、
第一正規系を崩してしまうことになるからあえて実装を避けてるのかもしれない。
idで単純に結合してプログラムでid順に読み込みながら最終の形にするのが単純で効率もいい。
それ以外では問合せ結果を結合するストアドファンクションを自作する。Access2000ならVBAで作れる。
ただこの場合idの数だけ繰り返し子テーブルにクエリが発生するので実行効率はよくない。
49NAME IS NULL:2005/09/23(金) 02:23:18 ID:???
>>42
お薦めの入門Webページを紹介して下さい。
50NAME IS NULL:2005/09/23(金) 02:41:34 ID:???
51NAME IS NULL:2005/09/23(金) 03:44:17 ID:???
>>50
お前バカだろ。
52NAME IS NULL:2005/09/24(土) 09:21:16 ID:???
>>51
沸点低いな
53NAME IS NULL:2005/09/26(月) 18:39:53 ID:4g4KCvW+
教えてください。
日付範囲の条件を付けたTABLEをLEFT JOINするにはどのようにすればよいのでしょうか?

SELECT D.顧客コード,D.顧客名,SUM(D1.売上額) AS Uriage
FROM ("顧客TABLE" D LEFT JOIN (SELECT * FROM "売上明細TABLE" WHERE 売上日付 BETWEEN '2003 4 1' and '2003 511') D1 ON D.顧客コード = D1.顧客コード )
WHERE D.在庫管理フラグ <> 1 GROUP BY D.顧客コード,D.顧客名 ORDER BY D.顧客コード

sUcdが無効とエラーが出てしまいます。
54NAME IS NULL:2005/09/26(月) 18:48:22 ID:???
DBMS何よ
55NAME IS NULL:2005/09/26(月) 18:55:09 ID:4g4KCvW+
MsSQLです

さっきの訂正でsUcdとは顧客コードのことです。
5647:2005/09/26(月) 18:57:31 ID:???
>48
ありがとうございました。Postgres なら集合関数が作れるようですが、
Access では力技しかなさそうですね…。
 ということで、以下のように解決しました。
1) 好物マスタ(ID,好物名)を作り、子テーブルと外部キー制約を作成する。
2) 好物マスタと子テーブルを左外結合し、PIVOT で好物IDを列名にして
 横に展開した "好物PIVOT" ビューを作る。
3) "好物PIVOT" ビューの展開された列を文字列結合した "好物非正規化" ビューを作る。
4) 親テーブルと "好物非正規化" ビューを結合する。

5) 好物マスタに変更があった場合、新しい好物ID を用いて "好物非正規化" ビューを
 再生成する(VBAを使用)。

 "好物非正規化" ビューは、{子テーブル主キー},1,2,3, ... といったように
子テーブルの主キーに好物IDが並ぶようなつくりになっています。
 レコード数が増えたときにどの程度の時間がかかるかまだ試験していないので、
後日親テーブル数万件程度のデータを作って検索時間を調べてみようと思います。
57NAME IS NULL:2005/09/26(月) 22:44:53 ID:???
>>55
[顧客コード]
つー話じゃねーのか?
58NAME IS NULL:2005/09/26(月) 22:53:49 ID:???
MsSQLは俺にゃ分からん。MsSQLのことはMsSQLスレで聞くのが一番だ。

Microsoft SQL Server 総合スレ3【MS SQL】
http://pc8.2ch.net/test/read.cgi/db/1123981539/
59NAME IS NULL:2005/09/26(月) 23:35:40 ID:???
>53
FROM のなかで WHERE 句使わないで普通に JOIN して、"WHERE 売上日付〜" を
"WHERE D.在庫管理フラグ 〜" のあとにつければいいんじゃないの?

>58
いやそこ MS SQL だから…
MySQL 総合 Part5
http://pc8.2ch.net/test/read.cgi/db/1121561160/
60NAME IS NULL:2005/09/26(月) 23:40:09 ID:???
>>59
55 名前:NAME IS NULL[] 投稿日:2005/09/26(月) 18:55:09 ID:4g4KCvW+
MsSQLです

さっきの訂正でsUcdとは顧客コードのことです。


M s S Q L で す




M  s
61NAME IS NULL:2005/09/27(火) 10:28:59 ID:zovrK1rh
sql*plusを使用しています
A 10
B -5
C 1
とDBがあり、そのデータを取り出した時に
正なら0 負なら1と表示したいのですが
A 10 0
B -5 1
C 1 0
可能でしょうか?うまく検索かけれないので
調べ方を教えて頂けないでしょうか?
62NAME IS NULL:2005/09/27(火) 11:29:23 ID:C3pVQHL0
テーブルへの付与権限を参照する方法を探しています。
環境はoracle8i/sqlplusです。

table name   >> abc
参照ユーザー >> user1,user2

とあった場合、abcを参照できるユーザー一覧、をコマンドで取得できるでしょうか。
また、user1が参照できるテーブルの一覧、の取得は可能でしょうか。

select分のオプションで出来るかと思ったのですが、どうにも出来ません。
方法などありましたら、教えていただけないでしょうか。
宜しくおねがいします。
63NAME IS NULL:2005/09/27(火) 11:51:43 ID:???
oracleスレ行った方が良くないか?

Oracle 総合 Session2
http://pc8.2ch.net/test/read.cgi/db/1111185428/
64NAME IS NULL:2005/09/27(火) 12:05:38 ID:???
>>61
DECODE式
>>62
V$なんとかっていうビューであるんじゃないの?

ORACLEに関しては、マニュアルが無料でDL出来るんだから、それをDLしろ。
65NAME IS NULL:2005/09/28(水) 10:16:09 ID:wKutUxf5
>>61
case式
もしくは
decode関数とsign関数
ここ参照
http://oraclesqlpuzzle.hp.infoseek.co.jp/2-2-1.html

>>62
データディクショナリビュー
66NAME IS NULL:2005/09/28(水) 11:11:53 ID:wKutUxf5
67NAME IS NULL:2005/09/29(木) 11:14:36 ID:lESN49Jz
ID PRICE
1 100
2 30
3 500
の中から最大値と最小値を
それぞれ取得は出来ますが
最大値最小値を同時に
3 500
2 30
と表示させる事ができません。
グーグルで 表 合成 等で検索しても見つかりません
うまい検索の仕方を教えて頂けないでしょうか?
sql+使用しています。宜しくお願い致します。
68NAME IS NULL:2005/09/29(木) 11:18:22 ID:m8iYeg7a
6967:2005/09/29(木) 11:27:17 ID:lESN49Jz
>68
良く分かりました。
ありがとうございました。
7067:2005/09/29(木) 15:04:04 ID:lESN49Jz
もう一つ質問させてください。
ID DATE
1 99/02/10
2 88/08/30
とありDATE型で年の99年だけを表示したいです。
検索キーワードを教えて頂けないでしょうか
71NAME IS NULL:2005/09/29(木) 15:05:00 ID:???
88年は非表示てことか?
72NAME IS NULL:2005/09/29(木) 15:05:35 ID:???
ああ、ごめん。思い切りスレごと勘違いしてたわ。忘れて。
73NAME IS NULL:2005/09/29(木) 15:18:45 ID:???
>>70
単純に1999/01/01 <= date < 2000/01/01
じゃダメなん。
もしくはdate_trunc('year',date) = '1999/01/01' とするか。
74NAME IS NULL:2005/09/29(木) 15:20:30 ID:???
そもそもSQL*PLUSはDBMSじゃないし、ORACLEでよいのでしょうか?

WHERE 日 >= 年初 AND 日 < 次の年の年初
7567:2005/09/29(木) 15:35:54 ID:lESN49Jz
>73
早いレスありがとうございます。
上下2つとも試させて頂きましたが

ORA-00933: SQLコマンドが正しく終了されていません

でした。
私は検索の仕方を知りたいです。
わがままいって申し訳ありません
7673:2005/09/29(木) 15:41:03 ID:???
>>75
Oracleつかっとらんので、細かい文法までしらんがな。
ちゃんと相応に書き直せばいいじゃん。
いったいどんなsqlを書いたんだ、試したsql晒せ。
77NAME IS NULL:2005/09/29(木) 15:41:35 ID:???
>>75
一回死んで生まれ変われば?
7867:2005/09/29(木) 15:53:29 ID:lESN49Jz
ここでは答えをストレートに
聞く方がいいのですか?失礼しました・・
select * from A
where 1999/01/01 <= date < 2000/01/01

select * from A
where date<1999/01/01
and date > 2000/01/01
79NAME IS NULL:2005/09/29(木) 15:58:04 ID:???
文字列としての日付はデフォルト書式設定によって変換できれば変換する。
で、そもそもシングルコーテーションで括られてないから文字列にもなってないし。
あと、文字列日付型変換はTO_DATE
あとは調べろ。

ついでに、IDとかDATEって予約語っぽいから絡む姪には避けたほうが。
80NAME IS NULL:2005/09/29(木) 16:01:01 ID:???
「上手な検索の仕方教えてください」じゃスレ違いだしな
8167:2005/09/29(木) 16:05:50 ID:lESN49Jz
>79
ありがとうございます。
解決できました。

また他の皆さんの好意に対して失礼な事
言ってすみませんでした
82NAME IS NULL:2005/09/29(木) 20:45:30 ID:???
  テーブルA テーブルB  
フィールド1  フィールド2    フィールド1  フィールド2
  1 001 '001 パソコン 
2 001 '002  マウス
3 003 '003  キーボード
       ↓
         テーブルC
フィールド1 フィールド2  フィールド3
1 001 パソコン
2 001 パソコン
3 003 マウス

見づらくてすいませんが、テーブルAとBを使ってテーブルCを作るSQL文を作りたいんですが、
Bの数値の中には「'」が入っているから単純に

SELECT テーブルA.フィールド1, テーブルA.フィールド2, テーブルB.フィールド2
FROM テーブルA INNER JOIN フィールドB ON テーブルA.フィールド2 = テーブルB.フィールド1

とは出来ないんで、何かいい方法はありますか?
83NAME IS NULL:2005/09/29(木) 20:54:16 ID:???
>>82
めっちゃズレてるorz
あとテーブルCの
3 003 マウス

3 003 キーボード
ですた。すいません。
84NAME IS NULL:2005/09/29(木) 21:30:25 ID:???
DBMSはなによ
85NAME IS NULL:2005/09/29(木) 21:32:53 ID:???
>>84
access 2000です。
86NAME IS NULL:2005/09/29(木) 21:49:48 ID:???
select テーブル1.フィールド1, テーブル1.フィールド2, TmpTbl.フィールド2 as フィールド3
from テーブル1 left join
(select *,right(フィールド1,3) as TmpFldfrom テーブル2) as TmpTbl
on テーブル1.フィールド2 = TmpTbl.TmpFld
87NAME IS NULL:2005/09/29(木) 22:24:01 ID:???
反応ないな。これじゃダメだったんだろうか。
88NAME IS NULL:2005/09/29(木) 22:44:01 ID:???
すいません。今試せる環境にないんで。
明日試して結果報告します。
89NAME IS NULL:2005/10/02(日) 21:04:58 ID:???
Oracleで次のような場合どのようなSQLを発行すればいいですか?

商品コード 001 管理コード 005 から
商品コード 005 管理コード 002 まで
の間で該当するものだけを取得する


90NAME IS NULL:2005/10/02(日) 21:24:41 ID:???
>>89
とりあえずコードは整数値?
と、商品コード002〜004の場合は管理コードは全てって事かな?

ベタな書き方だが、下限の商品コードをX0、管理コードをY0
上限の商品コードをX1、管理コードをY1として、

WHERE (商品コード = X0 AND 管理コード >=Y0)
OR (商品コード > X0 AND 商品コード < X1)
OR (商品コード = X1 AND 管理コード <= Y1);

必要に応じてキャスト(型変換)が必要かも。
91NAME IS NULL:2005/10/04(火) 10:41:01 ID:M8bZahSh
IDの列に1から10000までの数値を入れたいのですがいちいち手打ちにしたら大変です。クエリでなにか繰り返し処理をやる方法はあるのでしょうか。
92NAME IS NULL:2005/10/04(火) 10:54:44 ID:???
使ってるDBMSくらい書こうぜ
93NAME IS NULL:2005/10/05(水) 15:28:23 ID:R/pBqEHx
A表
id| AAA
--+-----
1 | aaa
2 | bbb

B表
id2|id| BBB
---+--+-----
1 | 1| 111
2 | 1| 222
3 | 2| 333
4 | 2| 444
5 | 2| 555

C表
id3|id2| CCC
---+--+-----
1 | 1| 123
2 | 1| 234
3 | 2| 345
4 | 2| 456
5 | 3| 567

上記のような3つのテーブルから、
A表のidを持つB表のデータのうち、1件目のid2を持つC表の情報が欲しいのですが
どんなSQLを書いたらよいかわかりません。

結果としては、

id|id2|id3| CCC
--+---+--+-----
1 | 1| 1| 123
1 | 1| 2| 234
2 | 3| 5| 567

こんな感じです。
B表のidをgroup byしてしまうと、各idでグループ化したうちの最後のid2をもってきてしまいます。
ご教授よろしくお願いします。
DBMSはMySQLです。
94NAME IS NULL:2005/10/05(水) 15:45:44 ID:???
9593:2005/10/05(水) 16:27:22 ID:R/pBqEHx
>>94
ご教示ありがとうございました。
96NAME IS NULL:2005/10/05(水) 16:27:25 ID:???
>>93
1件目のid2がどういう順序の元での1件目かワカランのだが、
一番小さなid2をということなら、min(id2)でどぉ?

サブクエリに対応したMySQLかどうか知らんが、例えばこんな感じ。
SELECT id, id2, id3, ccc FROM
(SELECT id,min(id2) AS id2 FROM a JOIN b USING(id) GROUP BY id)AS T1
JOIN c USING(id2);
97NAME IS NULL:2005/10/05(水) 16:32:01 ID:mXvyy2I3
9893:2005/10/05(水) 17:42:35 ID:???
>>96-97
ありがとうございます。
あれこれ手直しして、SQLは組むことができました(脳内で)
で、サブクエリの中身と、それ以外での実行は可能だったんですが
組み合わせて実行すると・・・・

MySQL3.23…○| ̄|_
サブクエリ未対応・・・・・

どうしたらいいんでしょうか?
99NAME IS NULL:2005/10/05(水) 17:47:06 ID:7ZhDZrog
SQLのコマンド入力を途中でキャンセルする方法を教えてください。
Ctrl+ZしたらSQLまで終わってしまいました。
100NAME IS NULL:2005/10/05(水) 18:30:29 ID:mXvyy2I3
101NAME IS NULL:2005/10/05(水) 20:07:57 ID:???
>>98
ヒント:バージョンアップ
102NAME IS NULL:2005/10/05(水) 22:57:36 ID:???
reca decimal(5)
のレコード長はいくらですか?

reca decimal(5)
recb decimal(5)
と記述された時のの合計のレコード長はいくらですか?

あと、DATE のレコード長は10であってますでしょうか?
103NAME IS NULL:2005/10/06(木) 09:06:22 ID:???
予約状況を検索するシステムを作っています。

名前|日付|1|2|3|4|5|6|7|8|9|
----+----+-+-+-+-+-+-+-+-+-+
AAAA|1006|1|1|1|0|0|0|0|0|0|

名前|日付|1|2|3|4|5|6|7|8|9|
----+----+-+-+-+-+-+-+-+-+-+
BBBB|1006|0|0|0|0|1|1|1|0|0|

1〜9は予約時間帯です。
同じ日に2人が予約を入れているとき、
予約状況として

|日付|1|2|3|4|5|6|7|8|9|
+----+-+-+-+-+-+-+-+-+-+
|1006|1|1|1|0|1|1|1|0|0|

を返すようなSQLを書くことは可能でしょうか?
104NAME IS NULL:2005/10/06(木) 09:15:00 ID:???
>>103
グループ化して集計
105103:2005/10/06(木) 09:58:08 ID:???
>>104

select 日付、sum(1),sum(2),sum(3),sum(4),sum(5)… from tableA group by 日付 having 日付 = 今日

でいけました。ありがとうございます。
106103:2005/10/06(木) 10:03:17 ID:???
あ、sumだと集計だから2になることもありえるんですね。
プログラムの仕様上、1か0しか入ってこないのでmaxでも良さそうですね。

いずれにしても1以上なら予約済みってことでいけそうです。ありがとうございました。
107NAME IS NULL:2005/10/06(木) 11:14:01 ID:evieqYdL
初歩的な質問ですみません。
postgreSQLで、int型のものを、text型に変更したいのですがどうもうまく行きません。
changeまたはmodifyを使えばできると聞いたんですが、エラーになってしまいます。
バージョンはpsql 7.4.8です。
よろしくお願いします。
108NAME IS NULL:2005/10/06(木) 11:45:35 ID:???
>>107
ポスグレのことはさっぱり分からんが、エラーになる記述を書いておいた方が回答来やすくなるんじゃないか?
109NAME IS NULL:2005/10/06(木) 13:14:25 ID:???
>>107
テーブルの定義済みint型カラムをtext型に変えるのは無理だったと思う。
SELECT int_column::text , ... INTO New_Table FROM Old_Table;
てな感じで、型変換しつつ新しいテーブルを作って、古いテーブルを削除して
新しいテーブルをリネームするとかやってた。
110NAME IS NULL:2005/10/06(木) 13:48:30 ID:evieqYdL
>>108
ありがとうございます。エラーになる記述を書くべきでしたね。
alter table table_name modify colum_name text;
alter table table_name change colum_name text;
この2つを試してみました。すると、両方とも
syntax error at or near "change" at character 20
このエラーが出ました。

>>109
回答ありがとうございます。やはり無理ですか。。。
となると、列を削除して新しく追加しようかと思うんですが、
>>109さんのやり方を見ていると、列と列の間に列を追加することも
できないんでしょうか?

どうも検索してもうまくヒットしないので、申し訳ありませんがご教授お願いします。
111NAME IS NULL:2005/10/06(木) 15:09:26 ID:???
行き詰ってしまったので質問させていただきます。
mysplとphpを使った簡単なクイズのサイトを作りたいと考えております
現在、問題ID、問題文、5択なので選択肢5つ、解答とフィールドを作っており
htmlのサイト上でそれらを呼び出し ラジオボランで正確な答えをチェックして
当たりかどうか判別してやる という所まではいけたのですが困った事が起きてしまいました。
現在では1つのページに問題が1問しか表示してないのですが、
一度に何問も表示させ判定したいと考えております。
問題だけをを沢山表示させることは可能なんですが、それぞれの問題に答えをチェックする
ラジオボタンの表示にすごく困っております。

問題文は追加できるようになっており、現在存在する最後のID番号から+1した所に
追加されます。

すごく分かりにくい説明かもしれませんが どなたか分かる方おられましたら
よろしくお願いいたします。
112NAME IS NULL:2005/10/06(木) 15:24:23 ID:???
>>111
誤爆?PHP板で聞いてみれば?
113109:2005/10/06(木) 15:44:17 ID:???
>>110
>>94

単純に列の追加ならALTER TABLE ADD new_column ... でいいと思うが、
あえて列の順序を決めたいとなれば
SELECT old_column1 , NULL AS new_column ,old_column INTO New_Table FROM ....
かな。

と、型変更の書式は
ALTER TALBE Table ALTER column TYPE new_type
じゃなかったケ。でも、int->textは無理だったと思う。
114NAME IS NULL:2005/10/06(木) 15:58:20 ID:evieqYdL
>>113
ご回答ありがとうございます!!
非常に助かりました!
早速試してみます!
ちなみに、隣の席の詳しそうな人に質問したところ、
AFTER....でもできるって言われたんですが、postgreSQLでは無理ですよね?
調べてみてもそのようなものは見当たらなかったのでできないだろと思うんですが。。
115109:2005/10/06(木) 15:58:48 ID:???
ちょっと質問の意図を読み違えた。
列と列の間に新しい列の追加も_だったはず。

ttp://www.postgresql.jp/document/
ttp://www.postgresql.jp/document/pg746doc/html/sql-altertable.html
116NAME IS NULL:2005/10/06(木) 16:05:44 ID:evieqYdL
>>115
ぬおおおご丁寧にありがとうございます!
_かどうかわかっただけでも、無駄な時間を使わずにすみました!
本当にありがとうございます!!
>>109さんの方法を試してみようと思います。
本当にありがとうございました。
117NAME IS NULL:2005/10/06(木) 22:40:55 ID:sJfB65q0
postgreSQLです。質問させてください。
現在↓のようなSQL文があるのですが、3行目のch=?の「?」は何を意味するんですか?

select id from article
whereheadline_start < current_timestamp
and ch=?
and ch2!='notice' order by pubtime desc limit 5
118NAME IS NULL:2005/10/06(木) 23:50:32 ID:???
そもそも実表の列の並び順に意味はあるのか?
119NAME IS NULL:2005/10/07(金) 09:57:11 ID:???
元質問のような場合は意味ないが、性能を求める場合には意味が出る。
クラスタ化されたIndexでDBMSによってデータの取得順が保証される場合にソート不要になるとか。
120NAME IS NULL:2005/10/07(金) 10:04:00 ID:???
で、結局117の「?」は何なのだ?
121NAME IS NULL:2005/10/07(金) 10:55:32 ID:???
さぁ
122NAME IS NULL:2005/10/07(金) 12:59:18 ID:???
プログラム内であればパラメータクエリのパラメータの可能性。
そうじゃなければ・・・書いたときに考え事してたんでしょ?
123NAME IS NULL:2005/10/07(金) 19:24:49 ID:???
オレもホスト言語のパラメータだと思う。
ひょっとしてユーザ定義の演算子だったり。
124NAME IS NULL:2005/10/12(水) 17:15:36 ID:xuezRbdp
?は、文字化けか、javaのプリペアドステートメントだと思われ
125NAME IS NULL:2005/10/12(水) 23:39:38 ID:???
>117
アプリケーションから似たりよったりのSQLを大量に発行する場合の定石。
SQLをキャッシュして?の部分だけ入れ替えてつかいまわすわけ。
100〜10000回連続で試し投げしてみ?
レスポンスぜんぜんいいから。
126NAME IS NULL:2005/10/13(木) 15:11:06 ID:???
PreparedStatementね。
127NAME IS NULL:2005/10/13(木) 16:19:48 ID:fh/hG6tg
┓°リ∧°了├~ス〒―├乂冫├

128NAME IS NULL:2005/10/15(土) 00:56:50 ID:tIcXe7xh
existsとinの違いがわかりません・・。existsで偽の場合、値を何も返さないということはただ条件にあったものを抽出してるだけだと思ってしまうんですが・・。inと何が違うんでしょうか?お願いします。
129NAME IS NULL:2005/10/15(土) 11:54:51 ID:???
>>128
結果は一緒。
130NAME IS NULL:2005/10/15(土) 12:14:31 ID:My+8kmaa
>>128
結果は一緒ということは、違うところはどんなところなんでしょうか?お願いします
131NAME IS NULL:2005/10/15(土) 12:21:39 ID:???
質問全部丸投げかよ……。
existsはbooleanで返ってくるから項目そのもの返してくるinよりデータ量少なくてウマーって事じゃないの?
132NAME IS NULL:2005/10/15(土) 12:24:26 ID:My+8kmaa
>>131
なるほど、わかりました。ありがとうございました
133NAME IS NULL:2005/10/15(土) 13:01:45 ID:r/3g3H4p
existsは、副検索文を書いて、その副検索文の結果一行以上の結果リストが作成されると正になります。
IN は In の前にある列名等の値が、In の数値リストや検索結果の値の中と一致すると正になります。
In を使用する場合に、数値リストや再帰なしの副問い合わせで比較するINの値が
確定して、数値の数が一定以上になるとハッシュテーブルにしてくれるDBも
あるようです。最適化により、同じ結果になってしまうかも知れませんが、きちんと
作り手の意思を示しておいたほうが、オプティマイザのバージョンに振り回されることが
なく、美しいと思います。
134NAME IS NULL:2005/10/15(土) 13:25:52 ID:bnb8MZCS
INは3値論理でEXISTSは2値論理
135NAME IS NULL:2005/10/15(土) 13:26:32 ID:???
なるほど、わかりました。ありがとうございました
136NAME IS NULL:2005/10/15(土) 14:09:33 ID:My+8kmaa
>>133‐124
初級シスアドの知識範囲内なのでそこまで詳しくやらなくても大丈夫ですがなんとなくわかりました。ありがとうございました
137NAME IS NULL:2005/10/16(日) 22:01:11 ID:GZI0E0IQ
MSDBでテーブルを作ろうとしたのですが、vrchar型を指定した列に文字列を入力しようとすると、
「式や変数はいいけど列名はやめて」というようなメッセージが出ます。
integer型になってしまっているということなのでしょうか?
文字列を入力するにはどうすればよいのでしょうか、どなたかご教授ください。
138NAME IS NULL:2005/10/16(日) 22:13:10 ID:???
139NAME IS NULL:2005/10/17(月) 03:09:54 ID:wyL2n/Pf
SQL全くの初心者ですがどんな形式のファイルならSQLコマンドでデータを抽出できるんでしょうか?
CSV形式とかのデータじゃだめですか?
140NAME IS NULL:2005/10/17(月) 04:42:25 ID:???
>>139
Windowsなら ODBCテキストドライバでCSVファイルに直接クエリーを発行できるが、
単純な読み込み以上のことをするとひどくパフォーマンスが悪い。
CSVファイルからデータベースにデータを取り込むのはたいていどれもできるから一度取り込んでからクエリーすればいい。
141NAME IS NULL:2005/10/17(月) 20:04:54 ID:???
SELECT
 A.単価 * A.税 AS 税込単価
 税込単価 * A.数量 AS 金額
FROM A
なんでSQLってこういうの駄目なの?
142NAME IS NULL:2005/10/17(月) 20:08:14 ID:???
DBMS次第なんじゃねーの?
143NAME IS NULL:2005/10/19(水) 23:02:08 ID:???
Aテーブルに同じフィールドを持ったcsvをd, e, f, g と4つのフィールドを比べて
1つでも違っていたら、insertするというSQLをつくりたいのですが、
これは、ストアドになるのでしょうか?
データはだいたい5万件くらいあります。
サーバーはSQLサーバーになります。
宜しくお願い致します。
144NAME IS NULL:2005/10/20(木) 01:38:09 ID:???
>>143
最近Oracleで似たようなことをやった。
そのときはこんな方法。

1. Aと同一構造のwork_Aを作成
2. work_Aへデータをロード
3. 次のSQLを実行

insert into A
select * from work_A W
where not exits (
select * from A
where A.d = W.d
and A.e = W.e
and A.f = W.f
and A.g = W.g)

4. work_tblを削除
145NAME IS NULL:2005/10/20(木) 11:40:31 ID:2aNV0QkE
>>144
ありがとうございます。

とりあえず同一構造のテーブルをつくったのですが、このカンマで区切ってあるcsvをどうやってインポートするのでしょうか?
なにか、簡単な方法はありませんか?
146NAME IS NULL:2005/10/20(木) 11:51:27 ID:uShZCwun
>>145
SQL鯖だよな?
bcp あるいは DTS をBooksOnlineで調べるがよろし
147NAME IS NULL:2005/10/20(木) 16:11:58 ID:2aNV0QkE
>146
ありがとうございます。
無事、DTSにてインポートできました!
148NAME IS NULL:2005/10/22(土) 01:56:04 ID:???
SQLserver2000で
CODE,A,B,C
0001,5,1,4
0002,4,2,5
0003,7,4,2
これを
CODE,D
0001,10
0002,11
0003,13
としたいんですけどUNIONで上手くいきません…

(以下のようになってしまいます)
CODE,D
0001,5
0001,1
0001,4
0002,4
0002,2
0002,5
0003,7
0003,4
0003,2

どーか上手くいく方法教えて下さい
149NAME IS NULL:2005/10/22(土) 02:00:29 ID:???
>>148
SELECT code,a+b+c as d From Table;
150148:2005/10/22(土) 09:26:57 ID:???
>>149
ありがとうございます。

そうでした、全く簡単な構文でした
複数テーブルじゃないからUNION必要ありませんね…orz
直前の処理に似たような奴でUNIONやってたせいか頭がうねってました
151NAME IS NULL:2005/10/23(日) 22:39:42 ID:lgBsRQ6h
1つ目のSQLでテーブルから1,2を取得
2つ目のSQLで1と同じテーブルから条件だけを変えて2,9,12を取得
この二つのSQLをドッキングさせて
取得結果として
1
2
2
9
12
みたいにしたのですがどうすればいいのでしょうか?
UNIONにしたら2がひとつしかでないのですが
152NAME IS NULL:2005/10/23(日) 22:51:05 ID:???
何故失敗したSQLを書かないのか
153NAME IS NULL:2005/10/23(日) 23:19:22 ID:lgBsRQ6h
>>152
SELECT AAA FROM TEBLE WHERE BBB='1'
UNION
SELECT AAA FROM TEBLE WHERE BBB='2'

上記のSQLが1,2
下記のSQLが2,9,12
が取得されます
UNIONで結合したら1,2,9,12になってしまいます
154NAME IS NULL:2005/10/23(日) 23:39:39 ID:???
「union all」
それ以前に「手ぶれ」はどうにかしてくれ。
155NAME IS NULL:2005/10/23(日) 23:46:23 ID:???
TEBLE
156NAME IS NULL:2005/10/24(月) 20:02:58 ID:???
SQLServerなのですが、テーブルのフィールドの順番をSQL文で変更することは可能でしょうか?
素人質問かもしれませんがご指導いただけたら光栄です。
157NAME IS NULL:2005/10/24(月) 20:12:31 ID:???
質問の意味が理解できない。

select fild01,fild02,....を

select fild02,fild01,....とかこんなの?
158156:2005/10/24(月) 21:09:18 ID:???
>>157
記述足らずで申し訳ありません。
テーブルで定義されているカラムの順番(colid)をalter table等のSQLで変更したいのです。
Accessのadpでなら可能なのですが・・
159NAME IS NULL:2005/10/25(火) 01:12:21 ID:???
adpで出来たならトレースしてみれば分かる。

力ワザだったような
160NAME IS NULL:2005/10/25(火) 01:13:15 ID:???
select * into #tmp from HOGE
drop table HOGE
create table HOGE 順番入れ替えたカラム定義
insert into HOGE select 入れ替えた順番考慮したカラムリスト from #tmp
161NAME IS NULL:2005/10/25(火) 10:55:41 ID:30Ub9SpH
質問です。

日付 ユーザ 試験の種類 ポイント
-----------------------------------
2005/10/01 AAA a 44
2005/10/02 AAA a 25
2005/10/01 BBB b 48
2005/10/02 CCC c 22
2005/10/03 CCC d 7

このような試験結果を記録したテーブルがあって、これをユーザと試験の種類ごとに
最新の日付の結果のみ取得したいのです。下のような結果を期待しています。

2005/10/02 AAA a 25
2005/10/01 BBB b 48
2005/10/02 CCC c 22
2005/10/03 CCC d 7

ユーザごとに最新に日付のポイントということであれば(試験の種類がない)、WHERE NOT EXISTSとかを
使って取得できるんですが、これはどうしても分かりません。やり方はあるでしょうか。。。
162NAME IS NULL:2005/10/25(火) 12:10:56 ID:???
あります
・グループ化
・サブクエリ
163156 ◆I0QEgHZMnU :2005/10/25(火) 12:46:06 ID:???
>>159,160
レス有難うございます。記載していただいた内容でやってみます。
164161:2005/10/25(火) 22:25:24 ID:30Ub9SpH
ずっと考えてましたが解りませんでした…orz

ユーザと試験の種類、MAX(日付)でグループ化したレコードの値と一致するものだけを
元のテーブルデータから取得すればいいと思ったのですが、グループ化するまではできても
一致するものを取得ができません。

どなたか、ご教授お願いします。
165NAME IS NULL:2005/10/25(火) 22:30:26 ID:???
>>164
ttp://www.tt.rim.or.jp/~rudyard/torii009.html

グループ化したクエリを元にleftjoin
166161:2005/10/25(火) 22:41:17 ID:???
うう、日本語の誤りまで指摘いただきお恥ずかしい限りです…。

LEFT JOIN でやってみようと思った矢先だったのですが、そもそも普通に
結合しただけでできてしまいました。SQLの基礎から出直して来いと言われ
そうですが、こんな結果になりました。LEFT JOINを使わないと特定の条件で
抜けてしまったりしますでしょうか。
---
select * from 試験テーブル a,
(
select ユーザ, 試験, max(日付) as 日付 from 試験テーブル
group by ユーザ, 試験
) b
where a.ユーザ = b.ユーザ
and a.試験 = b.試験
and a.日付 = b.日付

とにもかくにも、ご返答くださった方々ありがとうございました。
167NAME IS NULL:2005/10/25(火) 23:02:04 ID:???
DBMS何?
168NAME IS NULL:2005/10/25(火) 23:37:26 ID:???
>161
ナゼにWHERE NOT EXISTS?
WHERE EXISTSでできるじゃん…。
HAVING句を使うべし。
169NAME IS NULL:2005/10/26(水) 16:11:42 ID:ZKXavSbD
このストアドを実行すると以下のようなエラーになります。
どこがいけないのでしょうか?
サーバー : メッセージ 156、レベル 15、状態 1、プロシージャ usp_BZipInsertTable、行 4
キーワード 'BEGIN' 付近に正しくない構文があります。

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[usp_BZipInsertTable]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE usp_BZipInsertTable
GO

CREATE PROCEDURE usp_BZipInsertTable

BEGIN
BEGIN TRANSACTION

INSERT INTO B_Zip
SELECT * FROM work_B_Zip W
WHERE NOT EXISTS(
SELECT *
FROM B_Zip
WHERE B_Zip.PublicCode = W.PublicCode
AND B_Zip.ZipOld = W.ZipOld
AND B_Zip.ZipNew = W.ZipNew
AND B_Zip.PrefKana = W.PrefKana
AND B_Zip.CityKana = W.CityKana
AND B_Zip.TownKana = W.TownKana
AND B_Zip.PrefName = W.PrefName
AND B_Zip.CityName = W.CityName
AND B_Zip.TownName = W.TownName
)
END
COMMIT TRANSACTION
GO

170NAME IS NULL:2005/10/26(水) 16:34:34 ID:???
SQL”サーバ”スレで聞けば?
ここはSQLスレです。
171NAME IS NULL:2005/10/26(水) 17:07:13 ID:???
ヘルプのCREATE PROCEDUREの項を見ろ。
172NAME IS NULL:2005/10/26(水) 17:07:58 ID:???
答えたがりがいる限り、スレ違いでも安心ですv
173NAME IS NULL:2005/10/26(水) 21:03:20 ID:???
>>168
ふつー not exists だろ。
つか逆に、なんで exists とか having なん?
174NAME IS NULL:2005/10/26(水) 21:09:51 ID:???
not existsって遅くない?
175NAME IS NULL:2005/10/26(水) 21:48:52 ID:???
集約関数使ってhavingの方が遅いだろ。
176NAME IS NULL:2005/10/26(水) 22:35:50 ID:???
集約関数をSELECT句で使うと遅いけどな
177NAME IS NULL:2005/10/26(水) 22:42:10 ID:???
>168 は多分こう言いたいと思われ
速いか遅いかは各自好きな環境で確かめてけれ
select * from 試験テーブル a
where exists
(select 1 from 試験テーブル b
where a.ユーザ = b.ユーザ
and a.試験 = b.試験
group by b.ユーザ, b.試験
having max(b.日付) = a.日付)
178NAME IS NULL:2005/10/26(水) 23:00:50 ID:???
ヘボいプランナならNestedLoopの内側でSeqScanが走ってしまうパターンだな。
179NAME IS NULL:2005/10/26(水) 23:16:47 ID:???
計画次第だけど、
Not Existsはないことを証明しないとダメだからね。
Existsは有ったらその時点で打ち切れるけど、Notは全部見ないとダメ。
180NAME IS NULL:2005/10/27(木) 00:10:40 ID:???
何か勘違いしてないかな?
not exists も「有ったらその時点で打ち切れる」んだよ。
んで、賢くないプランナは集約関数を使っちゃうと打ち切ってくれなくなるわけ。
181NAME IS NULL:2005/10/27(木) 04:06:35 ID:???
>>161
よくわからん。これじゃだめなの?

SELECT T.日付, T.ユーザ, T.試験の種類, T.ポイント
FROM tbl T
WHERE NOT EXISTS
(
SELECT * FROM tbl T2
WHERE T2.ユーザ = T.ユーザ
AND T2.試験の種類 = T.試験の種類
AND T2.日付 > T.日付
)

または

SELECT T.日付, T.ユーザ, T.試験の種類, T.ポイント
FROM tbl T
WHERE T.日付 >=
ALL (
SELECT T2.日付
FROM tbl T2
WHERE T2.ユーザ = T.ユーザ
AND T2.試験の種類 = T.試験の種類
)
182NAME IS NULL:2005/10/27(木) 09:13:28 ID:???
>>180
なーるほど。思い起こしてみれば集計関数使っていたような気がする。
勉強になったよthx
183NAME IS NULL:2005/10/28(金) 22:43:44 ID:???
SELECT 受注No,SUM(数量) ,SUM(売上)
FROM 受注テーブル 
GROUP BY 受注No 
ORDER BY 受注No

で受注テーブルに
区分
があって、
区分が「1」のものだけ SUM(数量)
したいんだけど無理でしょうか?
WHERE句に条件入れたらSUM(売上)も減ってしまいました。

184NAME IS NULL:2005/10/28(金) 22:55:37 ID:???
>>183
そりゃ当然の結果かと。
どうしてもやりたいなら、WHERE句使わないで

selectで「もし 区分が1なら 数量 違ったら 0」のSUMじゃないと
185NAME IS NULL:2005/10/28(金) 23:03:18 ID:???
>>183
SELECT 受注No,SUM(CASE WHEN 区分=1 THEN 数量 ELSE 0 END),SUM(売上)
以下同じ...
186NAME IS NULL:2005/10/28(金) 23:04:18 ID:???
>>184
ありがとうございます!
Select句で 場合分けして、SUMですね。
お力添え感謝します。
187NAME IS NULL:2005/10/28(金) 23:04:38 ID:???
ありゃ、8分遅れの大カブリ(´・ω・`)
188NAME IS NULL:2005/10/28(金) 23:06:32 ID:???
>>185
具体的にありがとうございます!
そういう発想がありませんでした。。
ホントに助かりました。
189NAME IS NULL:2005/10/29(土) 00:49:05 ID:hb6jInpd
質問です。postgresqlです。

ツリー型の掲示板を作ろうとしていまして、下記のようなテーブルを作りました。
create table "main_log" (
 "uid" int4,
 ・・・・
 "parent" int4
);
記事番号"uid"の親記事は"parent"番という感じです。そこで、ある記事の子孫だけを対照に
例えば文字列検索をする場合、子記事をSELECTしてそのまた子記事をSELECTして、と
子供がいなくなるまでアプリからSELCETし続けるのはきっと効率が悪いのだろうと思いました。

簡潔に問い合わせるにはどのようにしたらいいでしょうか。
キーワードだけでもいいので教えてください。ググっていてビューあたりが怪しいと
思いましたが、当たってないでしょうか。
190NAME IS NULL:2005/10/29(土) 01:52:35 ID:???
ずっとググっていたのですが、同じような質問がいくつかあり、いずれも
解決していないようでした。別の方法を考えることにします。
191NAME IS NULL:2005/10/29(土) 04:59:10 ID:???
192NAME IS NULL:2005/10/29(土) 05:48:18 ID:???
>>189
PostgreSQLなら connectby というストアドが用意されている。
最初からインストールされているわけじゃなく
ソースのcontrib/tablefunc/ に用意されているので、
そこでmake / make install すれば使えるようになる。

>>191
のセットモデル(Celkoは入れ子モデルといっているが)も面白い。
分類(大->小->孫)とか部品展開程度なら使ってみるのも一考。
だけど掲示板のようなどんどん追加されていくものは、
あまり向いていない希ガス。
特にPostgreSQLはUPDATEが旧行の無効化と新規挿入だから
レスがつく度に過去レスの行がUPDATEされる入れ子モデルは
頻繁にVACUUMしないときつい。
193sage:2005/10/29(土) 23:49:47 ID:ZlSB+wKn
CASE式は覚えると色々やれて便利だよ >>184

ここが参考になるかも。
http://www.geocities.jp/mickindex/database/db_case.html

184が悩んでいたのは、上記サイトの2番の使い方だね。
194sage:2005/10/30(日) 00:09:09 ID:???
>>183 の間違えでした。184さん失敬。
195NAME IS NULL:2005/10/30(日) 10:59:26 ID:???
>>191,192
ありがとうございます。セットモデルというやつはどこかのMLの過去ログでも
見かけましたが、一読しただけではちょっと理解できませんでした。初心者なので。

connectbyはオラクルのやつですね。昨日あちこちで見かけました。
postgresqlでも使えるんですね。調べてみます。

昨日あれから別の方法としてしょぼい仕組みを作ってみました。
全記事にルートまでの道のりを記録しておくようにしました。textで
-200-81-50-32-1-0-
みたいな感じで書いておいて
SELECT * FROM "log" where "tree" like '%-50-%' and comment like 'hoge'
とすると50番以下からhogeを検索みたいな。しょぼいっしょ?
パーソナルな掲示板だからいいんです。でもconnect byは使ってみます。
ありがとうございました。
196NAME IS NULL:2005/10/31(月) 23:35:24 ID:4VmPGkxj
プロシージャからファンクション内でgetdateできないのは何故?
197NAME IS NULL:2005/10/31(月) 23:40:19 ID:jzNIdK4H
以前から思っていたのですが、「hoge」って何ですか??
198NAME IS NULL:2005/10/31(月) 23:51:09 ID:???
ほげほげー
199NAME IS NULL:2005/11/01(火) 09:36:20 ID:???
200NAME IS NULL:2005/11/01(火) 18:33:04 ID:DUU3lZ/C
PostgreSQLでOracleのMergeと同等のものはないでしょうか?

主キー制約に反するかどうかのチェックをするのに
一旦SelectしたあとInsertのようなことをプログラムで実現しています。
これを1回のコネクションではできないでしょうか?
201NAME IS NULL:2005/11/01(火) 18:50:07 ID:???
PostgresSQLについて語ろう
http://pc8.2ch.net/test/read.cgi/db/1056992724/
202NAME IS NULL:2005/11/01(火) 20:22:49 ID:/Q2VjNKQ
■単価テーブル TUP
 pid=製品コード
 pup=製品単価
 start=開始日
 end=終了日

■受注テーブル TORD
 pid=製品コード
 qty=受注数

とあった場合に
製品コード、製品単価、受注数、受注金額
となる受注金額リストを作成出したいのです。

SELECT
TORD.pid AS 製品コード,
(SELECT TUP.pup FROM TUP WHERE TUP.pid=TORD.pid AND
TUP.start<=SYSDATE AND TUP.end>SYSDATE ) AS 製品単価,
TORD.qty AS 受注数,
(SELECT TUP.pup FROM TUP WHERE TUP.pid=TORD.pid AND
TUP.start<=SYSDATE AND TUP.end>SYSDATE )*TORD.qty AS 受注金額
FROM TORD,TUP

↑製品単価を2回問い合わせしないように
スマートにするにはどうしたらいいでしょうか?
203NAME IS NULL:2005/11/01(火) 21:10:35 ID:???
>>202
SELECT pid,pup,pty,pup*pty as price FROM tord JOIN tup USING(pid);
204NAME IS NULL:2005/11/01(火) 21:11:34 ID:???
普通にWHERE句で単価テーブルと受注テーブルを結合したら。
それだともろ直積が出てレコード数増えすぎるでしょ。
205NAME IS NULL:2005/11/02(水) 06:44:48 ID:???
>>204
まともな処理系なら直積のためのマッチングと平行して日付条件の絞込みもするから、
レコード数が増えすぎることは無い。
データの分布によっては何度もサブクエリーを繰り返す>>202より早いかもしれない。
もしテーブルの設計に手を加えられるなら、単価は受注時に解決しておいて受注テーブルに
受注時単価か単価IDを持たせておくとすっきりする。単純なキーで結合できるようにするべきだろう。
206203:2005/11/02(水) 11:19:20 ID:???
>>204って>>203へのレスだったのか?
日付の絞込みを端折ったけど、
SELECT pid,pup,pty,pup*pty as price FROM tord
JOIN (SELECT * FROM tup WHERE start <= SYSDATE AND end>SYSDATE)AS T1
USING(pid);
ってことで桶?。でも最近の製品なら
SELECT pid,pup,pty,pup*pty as price FROM tord JOIN tup USING(pid)
WHERE start <= SYSDATE AND end>SYSDATE;
と書くだけで、日付絞り込み後結合するようにプランナ/オプチマイザが
判断するんじゃね。
207204:2005/11/03(木) 11:28:11 ID:???
>>204>>202へのレスであって、>>203へのレスではないよ

書き込み時刻は俺のが早く表示されてるのに・・・
混乱を招いたようで。
208NAME IS NULL:2005/11/03(木) 11:36:21 ID:???
>書き込み時刻は俺のが早く表示されてるのに・・・

203 名前:NAME IS NULL[sage] 投稿日:2005/11/01(火) 21:10:35 ID:???
204 名前:NAME IS NULL[sage] 投稿日:2005/11/01(火) 21:11:34 ID:???


21:10:35
21:11:34


思い切り後じゃん
209NAME IS NULL:2005/11/06(日) 09:53:05 ID:p3ndZTAk
210NAME IS NULL:2005/11/07(月) 05:27:36 ID:kqwYN43F
5.0の日本語設定ってどうやるんですか?
@my.iniのdefault-character-setをsjisとする
→×
Amysqladmin --default-character-set=sjis
→×
もうわけわかめ
211NAME IS NULL:2005/11/07(月) 07:09:16 ID:???
何の5.0だよ
212NAME IS NULL:2005/11/08(火) 01:06:35 ID:???
まあMySQLなんだろうな。
自信は無いけど。
213NAME IS NULL:2005/11/08(火) 21:59:39 ID:LmLbG6/B
こんばんわ。sql初心者でどうやったらいいのか分かりません。
誰か教えてください。

・パラメータA = 001 ←(tableB 検索用で商品コードに対応)
・パラメータB = A ←(tableA 検索用で評価に対応)

@.パラメータAと一致したtableBの商品コードのレコードを取得。
A.@の商品コードとパラメータBを条件にtableAのレコードを取得。
B.2つのテーブル(tablA、tableB)をから、tableCを作成(登録)。

【tablA】 【tableB】
Aコード 個数  評価 商品コード 数  日付  
001  200   A    001    250   2005/09/20
001  90   C    001    300   2005/10/02
001  10    A     002    100   2005/10/01
002  50   A     001    120   2005/09/26
002  20   B     003    50   2005/10/02

【tableC】
商品コード 個数  評価 数  日付  
001    200   A 250   2005/09/20
001    200   A 120   2005/09/26
001    200   A 300   2005/10/02
001    10    A 250   2005/09/20
001    10   A 120   2005/09/26
001    10   A 300   2005/10/02


一応考えてみましたが、こんな感じでよいのでしょうか?
insert tableC
  tableA.Aコード,
  tableA.個数,
  tableA.評価,
  tableB.数,
  tableB.日付
select * from tableA
where tableA.Aコード = (select tableB.商品コード from tableB
where tableB.商品コード = パラメータA
order by tableB.商品コード,
tableB.日付)
and tableA.評価 = パラメータB
order by tableB.Aコード,
tableB.評価
;
214NAME IS NULL:2005/11/08(火) 22:03:23 ID:LmLbG6/B
>213
tableBは商品コード、数、日付です。
見づらくてスイマセン・・・。
215NAME IS NULL:2005/11/08(火) 22:35:53 ID:???
here tableA.Aコード = (select tableB.商品コード from tableB

=じゃなくてINしとけ。複数行返すだろう。
216NAME IS NULL:2005/11/08(火) 22:37:21 ID:???
INSERT INTO tableC
SELECT tableA.Aコード, tableA.個数, tableA.評価, tableB.数, tableB.日付
FROM tableA, tableB
WHERE tableA.Aコード = tableB.商品コード
  AND tableA.商品コード = '001'
  AND tableB.評価 = 'A'
217NAME IS NULL:2005/11/08(火) 22:46:37 ID:???
INSERT INTO tableC
SELECT
A.Aコード
,A.個数
,A.評価
,B.数
,B.日付
FROM
tableA A INNER JOIN tableB B
ON
A.Aコード = B.商品コード
WHERE
A.評価 = [パラメータB]
AND B.商品コード = [パラメータA]
;

んじゃ漏れはこんな幹事で
218NAME IS NULL:2005/11/08(火) 22:48:11 ID:???
スペースキエルノワスレテタorz

INSERT INTO tableC
SELECT
   A.Aコード
  ,A.個数
  ,A.評価
  ,B.数
  ,B.日付
FROM
  tableA A INNER JOIN tableB B
ON
  A.Aコード = B.商品コード
WHERE
  A.評価 = [パラメータB]
AND B.商品コード = [パラメータA]
;
219NAME IS NULL:2005/11/09(水) 13:45:28 ID:V02w1ql5
SQL文内で列名に%をつけることはできないのでしょうか?
イメージ的には
表A.列1 LIKE 表B.列1%
のようにしたいです。
表A.列1の文字列長が表B.列3よりも長く、表B.列3の前方一致で検索したいです。
220NAME IS NULL:2005/11/09(水) 13:52:35 ID:9RygzwaV
221NAME IS NULL:2005/11/09(水) 13:56:06 ID:V02w1ql5
>>220 ありがとうございます。
よく読んでやってみます。
222NAME IS NULL:2005/11/09(水) 21:08:41 ID:IMpEBTHt
>218
回答どうもありがとうございました。
解決できて助かりました。
223NAME IS NULL:2005/11/11(金) 14:49:05 ID:???
postgreを使っているのですが
select * from anken where oya = 1 and status = 0 and tantou = 0 or tantou = 1;
と書いて oyaが1でstatusも1で、tantouが0または1のものが抜き出したいのですが。
この書き方だとtantouの設定が0と1ものを全て抜き出しているようです。


どなたか複数条件の設定方法を教えてくださいませ
224NAME IS NULL:2005/11/11(金) 14:52:16 ID:???
>>223
select * from anken where oya = 1 and status = 0 and (tantou = 0 or tantou = 1);
225NAME IS NULL:2005/11/11(金) 15:03:37 ID:???
>>224
即レスありがとうございます!
カッコで優先する部分を囲ってあげればいいんですね。
助かりました
226NAME IS NULL:2005/11/12(土) 20:30:37 ID:???
優先度はANDのほうが高いから

その場合 oya1 status0 tantou0 か
tantou1のものを抜き出してることになる
227NAME IS NULL:2005/11/14(月) 02:40:30 ID:???
select * from anken where oya = 1 and status = 1 and (tantou = 0 or tantou = 1);
では?
気が付いてると思うけど念のためね。
228NAME IS NULL:2005/11/14(月) 03:17:27 ID:???
MySQLとPostgreSQLってそれぞれ何に使われてるの?
前者はオンライン上で後者はオフラインで使われていると思ってて良い?
229NAME IS NULL:2005/11/14(月) 03:20:59 ID:???
>228
概ねOKじゃね
230NAME IS NULL:2005/11/14(月) 03:34:20 ID:???
>>229
やっぱそうなんだ。よかったよかった。回答ありがとうございます
231NAME IS NULL:2005/11/14(月) 15:54:50 ID:009ncfOh
ID  │DATE   │CODE
━━━┿━━━━━┿━━━━━━
   1│2005/08/01│AAA
   2│2005/02/01│AAA
   3│2005/03/01│AAA
   4│2005/01/01│BBB
   5│2005/02/01│BBB

このようなテーブルにデータが入っていて、
CODE列でグループ化し、DATE列がMAXのDATEとIDを取得したいのですが、
(この例だと、
1,2005/08/01,AAA
5,2005/02/01,BBB
というデータを取得したいんですが)

SELECT ID, MAX(DATE) AS DATE_MAX, CODE FROM HOGE;

ID列をどのように扱えばよいのかわかりません。
SQL文一発で取得は無理なのでしょうか・・・?

できるだけスマートな方法で実現したいと考えています。
どなたかお知恵を拝借させてくださいませ。
232NAME IS NULL:2005/11/14(月) 16:13:52 ID:???
FAQ
233231:2005/11/14(月) 16:25:44 ID:???
やはり一時テーブルを使用して云々・・・?
234NAME IS NULL:2005/11/14(月) 17:46:35 ID:???
>233
概ねOKじゃね
235NAME IS NULL:2005/11/14(月) 20:57:12 ID:kOPx2ZGf
>>231
WHRER句で創刊サブクエリ
236668:2005/11/14(月) 21:11:26 ID:NETPdqFh
サーバー : メッセージ 156、レベル 15、状態 1、行 4
キーワード 'SELECT' 付近に正しくない構文があります。
サーバー : メッセージ 156、レベル 15、状態 1、行 6
キーワード 'FROM' 付近に正しくない構文があります。
サーバー : メッセージ 156、レベル 15、状態 1、行 15
キーワード 'FROM' 付近に正しくない構文があります。
サーバー : メッセージ 156、レベル 15、状態 1、行 24
キーワード 'FROM' 付近に正しくない構文があります。

このようなエラーがでているのですが、何処が悪いのでしょうか?
見よう見真似でつくったのですが、根本的に間違っているのでしょうか?

SELECT
EW.event_wedding_code
,
SELECT(
an_contents
FROM
R_User_Enquete UE
,B_Answer BA
WHERE
event_wedding_code =
) no1
,
SELECT(
an_contents
FROM
R_User_Enquete UE
,B_Answer BA
WHERE
event_wedding_code =
) no2
,
SELECT(
an_contents
FROM
R_User_Enquete UE
,B_Answer BA
WHERE
event_wedding_code =
) no3


FROM
R_User_Enquete UE,
R_User_Wedding EW
WHERE
UE.event_wedding_code = EW.event_wedding_code
AND UE.office_code = 'S0CQHFP'

237668:2005/11/14(月) 21:16:39 ID:NETPdqFh
すいません。ご相談するSQLが違っていました。
エラーの内容は以下のとおりです。
よろしくお願い致します。

サーバー : メッセージ 116、レベル 16、状態 1、行 1
EXISTS を使わないサブクエリでは、サブクエリの選択リストには、式を 1 つだけしか使えません。
サーバー : メッセージ 116、レベル 16、状態 1、行 1
EXISTS を使わないサブクエリでは、サブクエリの選択リストには、式を 1 つだけしか使えません。
サーバー : メッセージ 116、レベル 16、状態 1、行 1
EXISTS を使わないサブクエリでは、サブクエリの選択リストには、式を 1 つだけしか使えません。

SELECT
EW.event_wedding_code
,
(SELECT
BA.an_contents 回答内容
,BA.answer_id 回答ID
FROM
R_User_Enquete UE
,B_Answer BA
WHERE
UE.answer_id =BA.answer_id
AND UE.ue_date >= '2005-11-14 20:0:0'
AND UE.ue_choice_rank = 1
) no1
,
(
SELECT
BA.an_contents 回答内容
,BA.answer_id 回答ID
FROM
R_User_Enquete UE
,B_Answer BA
WHERE
UE.answer_id =BA.answer_id
AND UE.ue_date >= '2005-11-14 20:0:0'
AND UE.ue_choice_rank = 2
) no2
,
(
SELECT
BA.an_contents 回答内容
,BA.answer_id 回答ID
FROM
R_User_Enquete UE
,B_Answer BA
WHERE
UE.answer_id =BA.answer_id
AND UE.ue_date >= '2005-11-14 20:0:0'
AND UE.ue_choice_rank = 3
) no3
FROM
R_User_Enquete UE,
R_Event_Wedding EW
WHERE
UE.event_wedding_code = EW.event_wedding_code
AND UE.office_code = 'S0CQHFP'
238NAME IS NULL:2005/11/14(月) 21:18:37 ID:???
>>236
SELECT のターゲットリストにあるサブクエリはカッコで括ってみそ。
SELECT a,(SELECT b FROM t)b ...
239NAME IS NULL:2005/11/14(月) 21:23:03 ID:???
(´・ω・`)

>>237
複数のcolumnを返すサブクエリが拙いんじゃね。
ターゲットリストに書かずにJOINしなはれ。
240NAME IS NULL:2005/11/14(月) 21:24:26 ID:???
no1,2,3が複数カラムを返してるんだが
241NAME IS NULL:2005/11/14(月) 21:38:09 ID:???
>231
select * from hoge where (date, code) in
(select max(date), code from hoge group by code)
242668:2005/11/14(月) 22:24:30 ID:NETPdqFh
皆様、レスありがとうございます。
サブクエリの中の列名を1つにしてみたんですが、今度は以下のようなエラーがでました。
サーバー : メッセージ 512、レベル 16、状態 1、行 1
サブクエリは複数の値を返しました。サブクエリが = 、!= 、<、<= 、>、>= のあとに続く場合や、サブクエリが 1 つの式として使われる場合に複数の値は許可されません。

16行目というとno2のSELECTになるんですが、このエラーに意味はどういうことなのでしょうか?


SELECT
EW.event_wedding_code
,
(SELECT
BA.an_contents
FROM
R_User_Enquete UE
,B_Answer BA
WHERE
UE.answer_id =BA.answer_id
AND UE.ue_date >= '2005-11-14 20:0:0'
AND UE.ue_choice_rank = 1
)no1
,
(
SELECT
BA.an_contents
FROM
R_User_Enquete UE
,B_Answer BA
WHERE
UE.answer_id =BA.answer_id
AND UE.ue_date >= '2005-11-14 20:0:0'
AND UE.ue_choice_rank = 2
)no2
,
(
SELECT
BA.an_contents
FROM
R_User_Enquete UE
,B_Answer BA
WHERE
UE.answer_id =BA.answer_id
AND UE.ue_date >= '2005-11-14 20:0:0'
AND UE.ue_choice_rank = 3
)no3

FROM
R_User_Enquete UE,
R_Event_Wedding EW
WHERE
UE.event_wedding_code = EW.event_wedding_code
AND UE.office_code = 'S0CQHFP'
243NAME IS NULL:2005/11/14(月) 22:28:35 ID:U6dj6UD0
ANY使うんじゃね
244NAME IS NULL:2005/11/14(月) 22:31:50 ID:???
1行に複数行は収まらないでしょ?
そういうこと。
245668:2005/11/14(月) 23:05:29 ID:NETPdqFh
>>1行に複数行は収まらないでしょ?
>>そういうこと。
ありがとうございます!!
サブクエリの中に条件を追加してみたところうまくいきました。
・・と思ったら違う問題が発生してしまいました。
以下のような結果が出たのですが、同じものが3回表示されています。
できれば、1回の表示にしたいのですが、
なにか、ヒントをいただけないでしょうか?
よろしくお願い致します。


|event_wedding_code| no1 | no2 | no3
--|------------------|------|------|-----
1 | code1 | A | B | C
2 | code2 | A | B | C
3 | code3 | A | B | C

246668:2005/11/14(月) 23:05:52 ID:NETPdqFh
SELECT
EW.event_wedding_code
,
(SELECT
BA.an_contents --回答内容
FROM
R_User_Enquete UE
,B_Answer BA
WHERE
UE.answer_id =BA.answer_id
AND UE.ue_date >= '2005-11-14 22:0:0'
AND UE.ask_id = 92
AND UE.ue_choice_rank = 1
) no1
,
(
SELECT
BA.an_contents --回答内容
FROM
R_User_Enquete UE
,B_Answer BA
WHERE
UE.answer_id =BA.answer_id
AND UE.ue_date >= '2005-11-14 22:0:0'
AND UE.ask_id = 92
AND UE.ue_choice_rank = 2
) no2
,
(
SELECT
BA.an_contents-- 回答内容
FROM
R_User_Enquete UE
,B_Answer BA
WHERE
UE.answer_id =BA.answer_id
AND UE.ue_date >= '2005-11-14 22:0:0'
AND UE.ask_id = 92
AND UE.ue_choice_rank = 3
) no3
FROM
R_User_Enquete UE
,R_Event_Wedding EW
WHERE
UE.event_wedding_code = EW.event_wedding_code
AND UE.ask_id = 92--------質問ID
AND EW.ew_kind = 1--------イベント状態
AND UE.office_code = 'S0CQHFP'
AND UE.ue_date >= '2004-11-15 0:0:0'
AND UE.ue_date <= '2005-11-14 23:59:59'

247NAME IS NULL:2005/11/14(月) 23:22:06 ID:???
ヒント:どういう入力があり、どういう出力にしたいのかを書いてみる
248NAME IS NULL:2005/11/15(火) 01:16:36 ID:???
sqlのselect文で何件該当したかだけを取得する事は出来ますか?
あるqueryで何件引っかかったか知りたいのです。

ちなみにpostgreです。
249NAME IS NULL:2005/11/15(火) 01:21:26 ID:???
select count(*) from hoge;
select count(hage) from hoge;
250231 (<>668):2005/11/15(火) 09:01:23 ID:???
>241
試してみましたが、

',' 付近の WHERE 句にエラーがあります。
クエリ テキストを解析できません。

となってしまいました。
使用DBはSQLServer2000です。

なんでだろ・・・orz
251231:2005/11/15(火) 09:07:31 ID:???
>241の指摘前は

SELECT hoge.ID, T1.Date_MAX, T1.Code
FROM (SELECT MAX(Date) AS Date_MAX, Code
FROM hoge
GROUP BY Code) T1 INNER JOIN
hoge ON T1.Code = hoge.Equip AND
T1.Date_MAX = hoge.Date

ってやってたんですけどね。
結局は>241と同じことか・・・
252231:2005/11/15(火) 09:42:49 ID:???
>251
誤記がありました。

SELECT hoge.ID, T1.Date_MAX, T1.Code
FROM (
 SELECT MAX(Date) AS Date_MAX, Code
 FROM hoge
 GROUP BY Code
) T1 INNER JOIN
hoge ON T1.Code = hoge.Code AND
T1.Date_MAX = hoge.Date

です。
253NAME IS NULL:2005/11/15(火) 11:19:25 ID:???
select
  m.ID
 ,m.DATE
 ,m.CODE
from Hoge m
 inner join
  (select
    max(DATE) as MaxDate
   ,CODE
  from Hoge
  group by CODE ) sm
on
  m.DATE = sm.MaxDate
and m.CODE = sm.CODE

今回はズレてない…ハズ
全然テストしてないからミスってたらスマソ('A`)ノ
254NAME IS NULL:2005/11/15(火) 11:35:23 ID:???
SQL文書くときの一般的なインデントの付け方を解説しているサイトとかないかな?
見やすければ良いんだろうけど基本があるんだったら知りたい。
255231:2005/11/15(火) 11:39:42 ID:???
>253

結局、現在はこの方法で実装してまつ。
いろいろdクス。
256NAME IS NULL:2005/11/15(火) 11:53:31 ID:???
スマソ、レスヨクミテナカッタヨ...(´・ω・`)イッテクルワ
257241:2005/11/15(火) 20:54:13 ID:???
>250
PostgreSQLだと大丈夫でしたが、SQLServer2000だとダメでしたか。

相関サブクエリで書いてみたお。

select * from hoge x where date in
(select max(date) from hoge y where x.code = y.code)

でも、>253がわかり易くていいですね。
勉強になります。
258668:2005/11/16(水) 18:37:44 ID:SdLYCguO
SQLServerでのストアドについてはこちらでうかがってもよろしいのでしょうか?
ストアド内にてwhileでのループ文作成についてなんですが、

以下のようなストアドでSELECT内でA.NO1....とあるとおもうのですが、
これを@numRankの数だけ、A.NO(フィールド)を増やしたいのですが、
ここからどのようにつくればよろしいのでしょうか?


CREATE PROCEDURE usp_Enquete
@ask_idvarchar(10)

AS
DECLARE @strvarchar(1000)
DECLARE @numRankint
DECLARE @Counterint
BEGIN
SELECT @numRank = count(*) FROM B_Answer WHERE ask_id = @ask_id
END
SET NOCOUNT ON

SET @Counter = 1
WHILE @Counter <= @numRank
BEGIN

SET @str = '
SELECT
count(ansList.NO1) AS NumAns,
A.NO1,
A.NO2,
A.NO3
FROM
259NAME IS NULL:2005/11/16(水) 20:10:17 ID:MILZeiA1
初心者ですいません。教えてください
select mas_var_car_maker,id
from car_master
where mas_var_car_maker is not null
group by mas_var_car_maker,id
order by id
とクエリアナライザで実行すると結果として
mas_var_car_maker id
-------------------- -----------
トヨタ 1
レクサス 2
ニッサン 3
ホンダ 4
ミツビシ 5
スバル 6
マツダ 7
イスズ 8
ダイハツ 9
スズキ 10
トヨタ 11
ニッサン 12
スズキ 13
と出てきており、メーカーが重複したままとなっています。
やりたい事は、重複した「トヨタ」などのメーカーを1個だけ取得した形で、かつ、IDの昇降順にしたいのですが、うまくいきません
どこを手直しすればいいのでしょうか?
260NAME IS NULL:2005/11/16(水) 20:44:20 ID:???
1.脳みそ
2.取得したいIDをMAXかMINに絞る
3.諦める
261NAME IS NULL:2005/11/16(水) 20:51:13 ID:Dz6O/9PW
>>259

これでいかないかな?

select mas_var_car_maker,id
from car_master
WHERE id IN (SELECT max(id)
FROM car_master
WHERE mas_var_car_maker is not null
GROUP BY mas_var_car_maker)
order by id
262259:2005/11/16(水) 21:36:31 ID:???
早速の返事ありがとうございます。
悩む事1日。きょうはもうだめぽと思い帰ってきてしまったので、早速明日やってみたいと思います。
>>260
1.脳内ではバシッと決まってます
2.261さんと同じ事なのですよね?
3.2chでダメなら諦めるつもりでした

>>261
その文法に足の親指の爪を突っ込んだ程度の事はやってみたのですが、意味が分らずやめてました
そのIN(〜)の部分がselectにselectを掛けている感じになるのかな?

今までもチラッとSQL文をやっていましたが、今までは至極単純なselectだけですんでいました。
今回のは今までのようにはいかず、selectにselectをかければいいのか?と思いわけもわからず
unionしてみたりdistinctをしてみたり、結局わけがわからなくなり、泣いてました。明日めげずにがんばってみます
ありがとうございました
263NAME IS NULL:2005/11/16(水) 22:00:18 ID:Zk9jqIGD
なんか中古車サイト作ってるって感じだな。
264NAME IS NULL:2005/11/16(水) 22:00:59 ID:jZF6bBVi
何百行のINSERTを流したくないので、
一発で複数行の登録をしたいのですが、
効率の良い方法ってありますか?

SQL自体はプログラム中で文字列として生成します。

とりあえず、Oracle用に下のような方法を考えました。
DB2ならFROM DUALの代わりにVALUESでしょうか。
これよりも、良い方法をご存じだったら(あるいはこの方法がまずかったら)教えてください。

INSERT INTO XXX (A,B,C)
WHERE (
 SELECT 'A01', 'B01', '0' FROM DUAL
 UNION SELECT 'A02', 'B02', '0' FROM DUAL
 UNION ...
);
265264:2005/11/16(水) 22:02:20 ID:???
すいません、SQLで大歩危かましてました。

INSERT INTO XXX (A,B,C)
SELECT 'A01', 'B01', '0' FROM DUAL
 UNION SELECT 'A02', 'B02', '0' FROM DUAL
 UNION ...
;
266259:2005/11/16(水) 22:58:34 ID:???
>>263
はい。車に関係したソース組んでます。
ちなみに、VBとSQL-SERVERで見積もり・商品車管理・決算書の作成と印刷などのSQLは
なんとかこなしてこれました。そして4日ほど前からASP.NETに手を出し、悩んでます。
実質PGとSEっぽい事してます
そんな私はただの車屋です
267NAME IS NULL:2005/11/16(水) 23:16:14 ID:???
>>260さんの第2案を書いてみた

select
   min(ID) as minID
  ,MAS_VAR_CAR_MAKER
from
  CAR_MASTER
where
  MAS_VAR_CAR_MAKER is not Null
group by
  MAS_VAR_CAR_MAKER
order by
min(ID)
;

つーか、これって車種マスター?

>>264ゴメン良くワカランとです('A`)プログラムッテPL/SQLデスカ?
268NAME IS NULL:2005/11/16(水) 23:18:21 ID:???
>>257
お褒めに預かり光栄ディス!!(0w0)ゥェーィ
269NAME IS NULL:2005/11/16(水) 23:19:48 ID:???
>259
図書館に行けばSQL関係の本はたくさんあるので借りれるだけ借りてきて読むべし。
グループとサブクエリのサンプルSQLを熟読するだけで
>259で質問した内容がいかにヤバいかわかってくると思います。

簡単なSQLはかけるんだから読むことを強く薦めます。
局所的に覚えた知識や聞きかじった知識でSQL組んでもいいことないです。

誤解を恐れずに書くと、グループ化とサブクエリ以外の機能は、
一回読めば大体理解できるし、構文を忘れてしまっても読み返せばいける。

しかし、グループ化やサブクエリを利用した結合や
相関サブクエリ、EXISTSなどが
どういう動きをするのか理解していないと構文を覚えても無意味です。

お試しあれ。
270NAME IS NULL:2005/11/16(水) 23:24:54 ID:???
>>267
しまった、最後字下げするの忘れてたorz
ちなみに
> つーか、これって車種マスター?
って聞いたのはホントにテーブル設計これでいいのか疑問だたから…
サムクナッテキタ…モウネテモイイヨネパトラssy
271NAME IS NULL:2005/11/16(水) 23:28:47 ID:???
まずちゃんと正規化からお勉強した方が良いような希ガス
272259:2005/11/16(水) 23:30:35 ID:???
>>267
ありがとうございます。明日早速試して見ます。
一応マスターで、今考えているのが、3つのListBoxにメーカー・車名・グレードを配置し、
メーカーを複数指定したら指定した文の車名が出て、同様に複数指定した車名のグレードが出る
という形にする予定です。
今後マスターフィールドを増やし、グレードを特定する部分が車検証に乗っているのでソレを入れると
車の諸元が出るように企んでます。
273269:2005/11/16(水) 23:42:54 ID:???
>272
そのSQLは、その仕様を満足させることはないでしょう。
まあ、がんばってくださいな。
274NAME IS NULL:2005/11/17(木) 00:21:31 ID:???
>>272
車やさんなのに専門外の分野に一生懸命でなんとなく応援したくなってくる
ガンバレ
275259:2005/11/17(木) 01:03:44 ID:???
>>269
SQLにしてみたら初歩でしょうね・・
ちょっと.NETの勉強を中断して一からSQLを勉強しなおしてみます

>>270-271
今ちょっと正規化の部分をぐぐってみました。
知り合いのプログラマーから教えて貰ってた事とちょっと違うきが・・
とりあえずマスターだらけになる気がするけど、効率を考えるとバラしまくった方が
よさそうなのでもう一回見直してみます。

最終的にどんな形にしたいか伝えたほうがいいのかな?
ヤフオクのような事をweb上で行う&より車屋にも特化した仕組みを企んでます
多数のアクセスを妄想しているのでサーバーになるべく負担が無い形にはしたいです
まぁ妄想よりも今は勉強ですね・・・.NETでも手一杯なのに・・挫けそう。・゚・(ノД`)・゚・。
276NAME IS NULL:2005/11/17(木) 06:16:41 ID:gm+QOnj6
そういや既存の中古車サイトに不満があったな。
排気量で検索できるようにしておくといいよ。
税金面で排気量を気にするって結構有ると思うし。

公開して速攻クラックされそうな悪寒(w
277NAME IS NULL:2005/11/17(木) 07:59:05 ID:IPjFhHO7
車男
がんがれ
278267:2005/11/17(木) 09:13:52 ID:???
設計がまずそうなことに僅かな間に気づいてもらえたみたいだし、
前向きな姿勢があればきっとうまくいくと思うなり('A`)ノシ
279NAME IS NULL:2005/11/17(木) 09:17:17 ID:???





     映 画 化 決 定 !!!




 
280259:2005/11/17(木) 10:43:50 ID:???
おはようございます。昨日は遅くまでありがとうございました。
さっそく2案とも試してみました。
1案はトヨタが1番に来なかった(maxIDとなっているからと思います。)
2案はバッチリいきました。
よって2案を拝借したいと思います。

>>276
検索方法は2種類で考えています。
1つはおおまかにもう1つは詳細に。もちろん排気量でも検索出来るようにします。
ほかにも距離とか年式、色などの複数の組み合わせです。
クラックもあると思います。セキュリティもちょっと勉強しましたが、これが一番大変そうですね。
本職さんの苦労が創造できました。
>>277
ありがとうございます。
>>278
がんばります
>>289
('A`)
281NAME IS NULL:2005/11/17(木) 15:53:18 ID:???
車男と共にSQLを勉強できると聞いて心弾ませスキップしながらでも時々転んだりしながらも勇んでやってきた俺ですよ。
282NAME IS NULL:2005/11/17(木) 20:53:29 ID:HYrkySxu
Oracleを始めたばかりの者です。
PostgreSQLでは、 select current_timestamp + '-1 days' で
今から24時間前のタイムスタンプが取得できます。
これと同様のことをOracle 9.2でやりたいのですが、
どうしたらいいのでしょうか?

select current_timestamp + '-1' from dual では日付が
返ってきてしまい(今日だと 2005-11-16)、思い通りの
結果が得られません。

宜しくお願いいたします。
283282:2005/11/17(木) 21:05:47 ID:???
select cast((current_timestamp + '-1') as timestamp) from dual
これでいけました!!
284NAME IS NULL:2005/11/17(木) 23:18:25 ID:TyMLG6B5
データーベース関連の資格って何があるの?
285NAME IS NULL:2005/11/17(木) 23:42:25 ID:???
>>284
スレタイ800回読んでみ
286259:2005/11/17(木) 23:50:51 ID:???
コンバンワ。テーブル関係の事でもここで受け付けてるのでしょうか?
287NAME IS NULL:2005/11/17(木) 23:53:20 ID:???
288NAME IS NULL:2005/11/18(金) 01:31:56 ID:???
>>286 DDLならいいんジャマイカ
289NAME IS NULL:2005/11/18(金) 12:35:43 ID:???
select
from
where
having
group by
これだけ分かってりゃオケ。 あとは適当にやっときゃ何とかなる。
procedure等もノリで何とかなる。
290289:2005/11/18(金) 12:38:26 ID:???
そんな適当な俺から質問。
denormalizationした場合は絶対にtrigerが必要なの?
291289:2005/11/18(金) 12:41:36 ID:???
triggerね、スペルミスすまそ。
292NAME IS NULL:2005/11/18(金) 23:44:06 ID:???
よほどメリットがない限りトリガーは使わない方がいい、というのが俺の経験則。

理由1.こけたときのエラーを知りにくい
理由2.オプティマイザがSQLを最適化してくれない

他の人はトリガーについてどう思ってるんだろう? 聞いてみたいな。

非正規化したときに何でトリガーが必要になるの >>289
293NAME IS NULL:2005/11/19(土) 02:05:41 ID:???
INSERT時に複数テーブルで同期取るんだろ。
294289:2005/11/19(土) 02:10:19 ID:???
サンクス。
非正規化して2NFに反した場合トリガーでコントロールしないと
いけないと思ったもので、、、


295NAME IS NULL:2005/11/19(土) 02:39:47 ID:???
土曜の早朝まで仕事かよ。。。。乙。。。
296NAME IS NULL:2005/11/19(土) 09:30:19 ID:???
おいらもトリガーは使いたくない派。
理由1.2.は>292と一緒。
あとプラスして、たまに動いてくれない。(汗
Oracleぐらいちゃんと動いてくれると思ったのに
ごくまれに動いていないときがあったのを目にしたときには
もうトリガーは信用しないと心に決めた。
297292:2005/11/19(土) 10:10:36 ID:???
>>293

>INSERT時に複数テーブルで同期取るんだろ。

この目的だったら、INSERT発行後にソース内からSQL投げる方が安全じゃない?

>>294 (289)

>非正規化して2NFに反した場合トリガーでコントロールしないと

ソース内から投げるSQL & ビュー でカバーできないかな。
似たようなSQLをソースのあちこちから投げるのは面倒だからトリガーにまとめてしまえ、
という発想は自然だけど、でもSQLまとめるなら、プロシージャでもいいわけだし、プロシージャなら確実にエラー拾えるし、>>296 のように動かないということもないし。

とにかく、クリティカルな処理にトリガー使うのは、個人的には恐怖を感じる。
298NAME IS NULL:2005/11/19(土) 14:08:04 ID:PeviD3/v
CGI+PostGresの環境で
CGIにSQLを組み込みたいのですが、どうすれよいのでしょうか?

参考になるサイトなどがありましたら教えてください。
299NAME IS NULL:2005/11/19(土) 14:45:54 ID:???
>>298
スレタイ800回読んでみ
300259:2005/11/20(日) 20:18:55 ID:???
こんばんわ。
新しくDBを設計しなおし、やりなおしたのですが、またもやSQLが思うように動きません。

ALTER PROCEDURE insert_mas_car_name
@p_car_maker varchar(20), --メーカー名(例として「トヨタ」)
@p_car_new_name varchar(20), --登録したい車名(この場合は"")
@p_car_old_name varchar(20), --更新したい元の車名(例として「クラウン」)
@p_car_maker_id int --0
AS
SELECT @p_car_maker_id = id
FROM mas_car_maker
WHERE (mas_car_var_maker = @p_car_maker)
if @@rowcount < 1
     INSERT INTO mas_car_name
(mas_car_var_name, mas_car_maker)
     VALUES (@p_car_new_name, @p_car_maker_id)
else
     UPDATE mas_car_name
     SET mas_car_var_name = @p_car_new_name
     WHERE (id =
   (SELECT id
FROM mas_car_name
WHERE mas_car_maker = @p_car_maker_id
AND    mas_car_var_name = @p_car_old_name))
UPDATEはうまく動くのですが、INSERTが動きません。
「@p_car_old_name」に何かを入れないと駄目のようですが、操作上を考えると何も入らない状態になります。
@p_car_old_name=""の状態でINSERTされるようにする事は無理なのでしょうか?
301NAME IS NULL:2005/11/21(月) 11:10:55 ID:ynEg+chv
>>車男
質問する時はエラーメッセージを書くように

p_car_old_nameにnot null制約がかかってるんじゃないのか?
302259:2005/11/21(月) 14:11:59 ID:???
誠に申し訳ないです。.NETのストアドプロージャを使い、「ストアドプロージャの実行」からのテスト結果です。

dbo."insert_mas_car_name" を実行中 ( @p_car_maker = トヨタ, @p_car_new_name = クラウン, @p_car_old_name = <DEFAULT>, @p_car_maker_id = 1 ).
プロシージャ 'insert_mas_car_name' にはパラメータ '@p_car_old_name' を指定してください。
該当する行はありません。
(0 行が返されました)
@RETURN_VALUE =
dbo."insert_mas_car_name" の実行が完了しました。


というエラーメッセージですが、例えば「@p_car_maker_id」は1=「トヨタ」のIDになります。
で、「@p_car_maker_id」を「0」にした場合だと2行目のメッセージは出てこない状態です。
ちなみに「@p_car_old_name = <DEFAULT>」を「@p_car_old_name = 」にすると

該当する行はありません。
結果はこれ以上ありません。
(0 行が返されました)
@RETURN_VALUE = 0
dbo."insert_mas_car_name" の実行が完了しました。
と出ます。

not null制約というのはテーブル側でしょうか?
テーブル側は「許可しない」となっていたので、「許可する」に変更しましたがだめでした。
303NAME IS NULL:2005/11/21(月) 14:22:41 ID:Q2PUrMzf
質問です

あるテーブルに、Date型フィールドとして

2005/11/20
2005/11/23

というデータを持つレコードがあるとき、
ある期間、たとえば2005/11/20から2005/11/25を
パラメータとして入力すると

2005/11/20 true
2005/11/21 false
2005/11/22 false
2005/11/23 true
2005/11/24 false
2005/11/25 false

というように、期間に存在する場合はtrue
それ以外はfalseを返すようなSQLを考えています
どういう方法がありますでしょうか?

データベースはPostgres8.0を使用しています
304NAME IS NULL:2005/11/21(月) 14:25:44 ID:???
単に
 INSERT INTO mas_car_name (mas_car_var_name, mas_car_maker)
     VALUES ('クラウン', 1)
というのは通るのか?
あと、プロシージャ定義にデフォルト引数用意していないのに
呼び出し側で使おうとしている? のはなんのつもりだ
305NAME IS NULL:2005/11/21(月) 14:42:46 ID:???
>>303
2005/11/20から2005/11/25までの行をなんらかの形で作って
case式でマッチングさせてtrueとfalseを返せばいいお

306303:2005/11/21(月) 15:33:58 ID:???
>>305
以下のような形でTEMP TABLEを作る方法を試してみます
ありがとうございます

ttp://www.drive.ne.jp/iMA/showmail.pl?pgsql-jp=20152
307259:2005/11/21(月) 17:16:58 ID:???
>>304
INSERT文の単体だと、きっちりINSERTされてます。

@p_car_maker varchar(20), --メーカー名(例として「トヨタ」)
@p_car_new_name varchar(20), --登録したい車名(この場合は"")
@p_car_old_name varchar(20), --更新したい元の車名(例として「クラウン」)
@p_car_maker_id int --0
この辺りの事でしょうか?
.NETで呼び出して各部分に値は入るようにはなっています
で、ストアドプロージャの実行時にはその都度値を入れて文法のチェックをしています。

308259:2005/11/21(月) 20:29:52 ID:???
お騒がせしました。
事故解決しそうな雰囲気が出てきました。
309NAME IS NULL:2005/11/25(金) 23:18:53 ID:nfczkiDK
カーソルを定義するときに、条件をつけて、
Aならこのカーソルを実行…FETCHしてINSERT
Bならこっちのカーソルを実行…FETCHしてINSERT

ということがしたいときどうする?
310NAME IS NULL:2005/11/26(土) 08:49:53 ID:hgVj/m1b
簡単な質問ですがお願いします。

「給料」という列の値の中で
一番数字が低い人を3人表示させるにはどうしたらいいでしょうか。
311NAME IS NULL:2005/11/26(土) 09:23:02 ID:???
>>310
処理系によって違いがある。
select 給料from xxx limit 3
select top 3 給料 from xxx
など
あと同額3位などの処理をどうするかによっていろいろ変わってくる。
具体的なことが聞きたいなら環境や条件を明記すべし。
312310:2005/11/26(土) 09:28:40 ID:hgVj/m1b
>>311
ありがとうございました!
313NAME IS NULL:2005/11/28(月) 13:18:47 ID:44DpRv4l
SQL超初心者ですが、質問させてください。
Create table test
(
one number,
two number,
three varchar2 (10),
four varchar2 (10),
)

で、testというテーブルを作りました。ここにPL/SQLで値を入れて
いきたいのですが

DECLARE
x NUMBER := 100;
i NUMBER := 12;
a char;
BEGIN
LOOP
IF &input = '1' THEN
INSERT INTO test VALUES (i, x, 'test', '&abc');
ELSE
EXIT;
END IF;
COMMIT;
END LOOP;
END;

としたら、無限ループになりました。勉強しながら作ったんで
無駄な値がありますが、それは置いておいて。
自分がやりたいのは、&inputへ入力した値が1のときに、&abcへ値を入れれる。
そして&inputが1以外のときにループを停止する、というものです。

乱文ですいませんが、どなたかわかる方お願いします。
314NAME IS NULL:2005/11/28(月) 13:23:42 ID:???
とりあえずプログラムの基礎とPL/SQLの勉強すれば?
315NAME IS NULL:2005/11/28(月) 13:27:06 ID:yH9VVTPB
>SQL超初心者ですが、質問させてください。
入門書で買ってきて中級者になれば
316NAME IS NULL:2005/12/01(木) 00:38:56 ID:V8y/6DtB
>>313
PL/SQLは、よくわからないんだけど、
T−SQLでは、
ループを抜けるには、
BREAK(ループからぬける)か、CONTINUE(今のデータは飛ばして、次のデータをFETCH)
をいれるんだよね。

ごめん、参考書、会社だ。。。
317NAME IS NULL:2005/12/01(木) 05:11:50 ID:8EgnSfPq
NO  メモ1    メモ2    メモ3
−−−−−−−−−−−−−−−−−−
001 あい__  _うえ_  _おえ_
002 お___  あ___  ____
003 かあかい  えお__  う___
004 い___  ___う  _お__
005 _あかえ  えええ_  おおかか

のテーブルを、検索語句が「あ」「え」「か」で
メモ1、メモ2、メモ3をあいまい検索して
検索語句の数が多い順に並べたいのですが、どうすればよろしいのでしょうか?

↓期待する結果()内は検索語句の出現回数

005 _あかえ  えええ_  おおかか   (8)
003 かあかい  えお__  う___   (4)
001 あい__  _うえ_  _おえ_   (3)
002 お___  あ___  ____   (1)
004 い___  ___う  _お__   (0)

SQL SERVERです。
318NAME IS NULL:2005/12/01(木) 09:00:37 ID:???
>>317
SQL Serverならマニュアルや解説本でフルテキスト検索が使えるかどうかよく検討してくれ。
ここで説明するには内容が多すぎるので説明は省く。
要件に合わないなら、語句の出現回数を数えるストアドファンクションを作りそれ順に並べ替えるなど、
いまやってる通りのことをやればよい。
319317:2005/12/01(木) 10:43:22 ID:8EgnSfPq
>>318
つまり、出来ないって事なんですか orz
ありがとうございました。
320NAME IS NULL:2005/12/01(木) 10:47:06 ID:q3yIUH/k
>>317
oracleならtranslateを使えばできる
321NAME IS NULL:2005/12/01(木) 18:30:25 ID:???
>>320
SQL SERVERです。
322NAME IS NULL:2005/12/02(金) 00:32:41 ID:npYEalDS
Webアプリでページングがある表の表示するSQLで質問どす

Orderかけた後にROWNUMで41行目から60行目の取得 みたいなこと
Oracleではインラインビューつかって出来るじゃないですか。
PostgreSQLなどではoffsetで同じコトが実現できますよね。

そんじゃSQLserverで同じことするにはどうすりゃいいの?
TOPだけじゃ何件目から〜が取得できないっすね〜
323NAME IS NULL:2005/12/02(金) 01:10:15 ID:i693pvse
あのー、
超初心者なんだけどここに質問書いていい?
324NAME IS NULL:2005/12/02(金) 02:21:18 ID:/MiT62e7
いいんじゃない??答えられることなら答えるよ。誰かが。
325NAME IS NULL:2005/12/02(金) 02:22:14 ID:???
普通のSQL文ネタならいいんじゃね。
インストールとか運用とかベンダー依存ネタなら
該当スレへ。
326NAME IS NULL:2005/12/02(金) 06:21:56 ID:???
>>322
MSSQL2005からROW_NUMBERがサポートされるが、
いまのところ先頭から不要な分を読み飛ばすしかない。
ただ、ページ替えのたびに範囲変えて毎度クエリーする手法は、
よほどデータに動きが無い場合にしか使えないから困ることは少ないと思う。
327NAME IS NULL:2005/12/02(金) 07:19:50 ID:???
MSSQLは使ったことないが、SQL標準のCURSORじゃダメなんか?
328NAME IS NULL:2005/12/02(金) 09:09:48 ID:QYxvluag
329NAME IS NULL:2005/12/02(金) 09:31:00 ID:rODeKmhf
Oracleにはインラインビューがあるからでなくて、RowNumがサポートされているからっていうことね>>322
330NAME IS NULL:2005/12/02(金) 09:31:58 ID:rODeKmhf
>>327
SELECT文一発でやりたいんだろ。
331NAME IS NULL:2005/12/02(金) 09:37:09 ID:???
>>321
oracleのtranslateに相当する関数は
sqlserverに多分あるはずだ
332NAME IS NULL:2005/12/02(金) 09:40:53 ID:???
>>322
select top (60-41+1)
* from テーブル
order by 逆順でソート

もしくは

select top 41
* from テーブル
order by
差集合
select top 60
* from テーブル
order by
333NAME IS NULL:2005/12/02(金) 09:43:36 ID:???
334323:2005/12/02(金) 12:16:49 ID:i693pvse
仕事でDBの練習する事にしたんだけど、My SQLとPostgreSQL
どっち選んだら良い?
誰かたのんます〜
335NAME IS NULL:2005/12/02(金) 12:31:32 ID:???
>>334
環境は?
オレなら、SQLの勉強なら制限の少ないPostgreSQLにするけどな
336323:2005/12/02(金) 13:23:13 ID:i693pvse
>335
ありがとさんです。
環境はOS X、G4の133なんだけどスペック足りないかなぁ。&英語は超苦手〜
金髪美女は好きなンだけと…
337NAME IS NULL:2005/12/02(金) 13:56:39 ID:LniOy+zB
WinXPProでPostgreSQL8.1とWin2KProでPostgreSQL8.0を使用しています。

質問なのですが、正しい手順(?)でのデータディレクトリの変更方法を教えていただけないでしょうか。
#試しにスタートメニューの「postgresql.confの編集」でdata_directoryに
#パス(D:\PostgreSQL\data)を設定してみたのですが起動しなくなりました。
#
#現在は、設定ファイルとレジストリから"C:\Program Files\PostgreSQL\8.1\data"を
#検索し、該当箇所を"D:\PostgreSQL\data"に置換して無理矢理dataディレクトリを
#変更しています。
338337:2005/12/02(金) 13:58:12 ID:LniOy+zB
すみません、SQL質問をPostgreSQL質問と勘違いしました。
すれ違いでしたらすみません。。。
339NAME IS NULL:2005/12/02(金) 14:26:41 ID:???
>>338
MSSQLのスレと勘違いするものは居たような気もするが、
PostgreSQLスレと勘違いするやつは初めてのような希ガス。

コンパネから管理ツール->サービスを開いてPostgreSQLの
プロパティを開けば解ると思うが、たぶん起動時のオプションで
-D "C:\Program Files\PostgreSQL\8.1\data"
が付いているのだと思う。これを削除すればpostgresql.confの
設定が反映されるはず。

うまくいかなかったら、以後はPostgreSQLのスレで聞いてみて。
340339:2005/12/02(金) 14:31:14 ID:???
スマソ。素直に
-D "D:\PostgreSQL\data"
と書き換えた方が良い。
dataディレクトリにpostgresql.confがあるんだった。
341NAME IS NULL:2005/12/02(金) 18:29:55 ID:???
>>336
スレ違いのマカは氏ね。
OpenBaseだかでも使ってな。
342338:2005/12/02(金) 19:09:20 ID:LniOy+zB
>>340
やっぱりサービスのプロパティを書き換えないとダメなのですね。
#書き換え方がわからないのでレジストリを直接書き換えましたorz

ありがとうございました。
343323:2005/12/02(金) 19:52:24 ID:23Pkqip1
>>>341
オマエが氏ね!
安保!鮹!炒らない!
344NAME IS NULL:2005/12/02(金) 20:42:44 ID:23Pkqip1
OpenBase 悪いのか?


345sage:2005/12/04(日) 00:42:59 ID:Hq0a3CZF
仕事で、SQL書くことになったんだけど、
おまいらのおすすめ書籍教えてくれ〜
346NAME IS NULL:2005/12/04(日) 02:29:54 ID:???
まずはDB依存でいいんじゃね?
DBのマヌアル見ろよ。

複数DB扱うなら普通はフレームワークで抽象化して扱うし。
で、フレームワークで速度とかで限界が出てチューニングが必要な時に改めてDBのマヌアルを見る。
347NAME IS NULL:2005/12/04(日) 16:25:54 ID:uwLPjKnj
例えば販売管理システムなどで、会員一人一人の購入履歴を保存する場合、
一つのテーブルにIDなどで区別してまとめて処理するのか
それとも新たに一人一人にテーブルを作って用意してあげるのか
どちらが良いのでしょうか?
一人一人にテーブルを作る場合、管理がやや大変になりそうな気がするのですが・・・
348NAME IS NULL:2005/12/04(日) 16:47:25 ID:???
>>347
ちょwwwwwwwwwwwwwwww 前者以外ありえないだろwwwwwwwwwww
349NAME IS NULL:2005/12/04(日) 20:24:30 ID:JImhRfZp
>>347
>一人一人にテーブルを作る場合、管理がやや大変になりそうな気がするのですが・・・
大変でしょうね。会員が追加されるたびにテーブルを作成する。しかも、
構造は一緒で名前だけ違う。リレーショナルデータベースではありませんね。


350347:2005/12/04(日) 21:42:29 ID:uwLPjKnj
>>349
なにか勘違いしてました・・・すいません
確かに膨大な行を処理できるからDBを使うんでしょうし
351NAME IS NULL:2005/12/04(日) 22:10:50 ID:???
>350
凝り固まった頭をガツンとやられた感じです。
超新鮮って感じです。
352NAME IS NULL:2005/12/05(月) 00:13:22 ID:???
SELECT * FROM 00000001,00000002,00000003.....
353NAME IS NULL:2005/12/05(月) 18:28:30 ID:???
SELECT * FROM *
354NAME IS NULL:2005/12/05(月) 18:36:32 ID:???
>>347
おもすれー
磁気カードに全部情報持たせるような感覚だね。
データベースが巨大になるから、個別に作っちゃえ(w
355NAME IS NULL:2005/12/05(月) 23:15:25 ID:???
email
----------------
[email protected]
[email protected]
[email protected]

と3レコードあるテーブルtable_aがあるとすると、

重複を取り除いた値の集合は
select email from table_a group by email;
で得られるのですが、その集合の個数(=2)を得るためにはどうすればよいですか? count(email)としてしまうと
PostgreSQL7.3.4を使っています。
356NAME IS NULL:2005/12/05(月) 23:48:38 ID:???
>>355
select email,count(email) from table_a group by email;
357NAME IS NULL:2005/12/05(月) 23:50:02 ID:???
あ、取り違えた。
select count(*) from (select email from table_a group by email)as foo;
358355:2005/12/06(火) 00:33:15 ID:???
>>357
ありがとうございます!解決しました。
359NAME IS NULL:2005/12/06(火) 22:48:19 ID:???
すみません、教えてください。
TABLE A, TABLE B, TABLE C があり、それぞれのTABLEに発生した
日付データであるdatetimeを格納しています。
例えばTABLE Aでは注文があったときに注文内容のデータとその日付が
追加されます。
ある月のレポートを表示させるために、例えば11月1日から11月30日まで
1日を1行として、その日に発生したTABLE A B Cの3つのTABLEの行数を
まとめて同じ行に表示させたいのですが、どのようにすればできるのでしょ
うか。
表にするとこのような感じです。(列の名前は例えです)

 日付   注文数(A)   B件数(B)   C件数(C)
1       123      1234      12
2       456      4567      45
  3       ・・・      ・・・      ・・・
 ・・・
360NAME IS NULL:2005/12/06(火) 23:41:50 ID:???
>>359
それはギャグで言っているのか?
361NAME IS NULL:2005/12/07(水) 00:58:55 ID:???
>>360
ギャグみたいなことを書いてしまいましたか。
つまり、できないということですね。
SQLは初歩の初歩しか知らないのですみません。
やはりちゃんと本を買って勉強することにします。
362NAME IS NULL:2005/12/07(水) 04:38:37 ID:???
>359
select * from
calender c
left outer join
(select 受注日,sum(受注数) from tbla group by 受注日) as t1
on c.date = t1.受注日
left outer join
(select 受注日,sum(受注数) from tblb group by 受注日) as t2
on c.date = t2.受注日
left outer join
(select 受注日,sum(受注数) from tblc group by 受注日) as t3
on c.date = t3.受注日
order by c.date

※あくまで、calender(営業カレンダーテーブル?)みたいのが存在する前提のSQL。
日付をぶつけることができればこんな感じでできそう。

日付をぶつけないで、full outer join すると日付順に3つを旨いこと並べられない。
なんか他に旨いアイデアは無いのかな?
363NAME IS NULL:2005/12/07(水) 06:47:45 ID:jascnQUV
たしか10gではこういう日付リストなどを
作成できる機能のSQLがあったよ
364NAME IS NULL:2005/12/07(水) 07:06:16 ID:???
朝で時間が無いから考えれないけど
「パーティション化された外部結合」
キーワードとしては 「PARTITION BY」です
365NAME IS NULL:2005/12/07(水) 09:32:35 ID:???
>>360
横レスだが、別にギャグでもないと思うが・・・。
データの分析を主とする業務の場合(データストア)、結構あることだと思うけど。
366NAME IS NULL:2005/12/07(水) 11:11:26 ID:???
>>357
select count(distinct email) from table_a
367NAME IS NULL:2005/12/07(水) 11:54:55 ID:???
>>365
日本語って難しいね
368NAME IS NULL:2005/12/07(水) 12:23:57 ID:???
まあテーブル設計がギャグっぽい
369NAME IS NULL:2005/12/07(水) 12:42:16 ID:g6FDfGeo
だから、異なる3つの事象を後で分析するのに、同一の時系列に乗せるって仕様がそこまで糞か?
もともと正規化した場合は別事象とされていたことを合わせて見たいなんてのは五万とある。
370NAME IS NULL:2005/12/07(水) 12:56:19 ID:???
joinすら知らないのがギャグってことじゃねーの?
371NAME IS NULL:2005/12/07(水) 13:02:46 ID:g6FDfGeo
>>370
このスレでそんなこと書いてどうするの?
372NAME IS NULL:2005/12/07(水) 13:05:34 ID:???
知るかボケ
373NAME IS NULL:2005/12/07(水) 17:29:22 ID:qk1TVI3M
>372
知るかボケ

だってさぁ〜 ププ〜
374NAME IS NULL:2005/12/07(水) 18:59:58 ID:???
テーブル設計スレって無いの?
375NAME IS NULL:2005/12/07(水) 20:12:01 ID:???
>>374

頼むから正規化しろよ 第二正規形
ttp://pc8.2ch.net/test/read.cgi/db/1116097001/
【恐怖】主キーがないテーブルみたことありますか?
ttp://pc8.2ch.net/test/read.cgi/db/1069324950/

俺がヲチしているのはこのぐらいかな。
他にもあるかもしれんが。
376NAME IS NULL:2005/12/07(水) 20:31:40 ID:???
FROM ((
  (SELECT 受注日 FROM tableA
   UNION SELECT 受注日 FROM tableB
   UNION SELECT 受注日 FROM tableC
  ) AS u
  LEFT JOIN tableA ON …)
  LEFT JOIN tableB ON …)
  LEFT JOIN tableC ON …
377NAME IS NULL:2005/12/07(水) 22:51:20 ID:???
>376
あっ、そうだね
GJ
378NAME IS NULL:2005/12/08(木) 11:35:48 ID:???
【より良い】データモデリング【モデルを】
http://pc8.2ch.net/test/read.cgi/db/1057509675/

姉歯DB設計
http://pc8.2ch.net/test/read.cgi/db/1133798099/
379NAME IS NULL:2005/12/08(木) 12:47:17 ID:???
すみませんお願いします。

NO JUSHO DATE
---------------------
1   A   20051201
1  B   20051202
1  C  20051203
2  D  20051204
2  E   20051205
3  F   20051206


上記テーブルをNO単位でグループ化して、
件数およびDATEが最新のJUSHOのみを取得したいのですが、
よい方法があれば教えていただけないでしょうか。
欲しい結果は以下の通りです。

NO JUSHO 件数
-------------------
1 C 3
2 E 2
3 F 1
380379:2005/12/08(木) 12:59:45 ID:???
環境はPostgreSQL8.0です
381NAME IS NULL:2005/12/08(木) 13:45:39 ID:gElLaYlp
>>379
このスレのどっかに答えはある
382NAME IS NULL:2005/12/08(木) 18:01:11 ID:V+RjvCQg
A,Bというテーブルがあったとして、
AテーブルとBテーブルを比較してある条件のデータのみ、
Aテーブルのbという項目をBテーブルのfという項目で更新したいんです。

A| a| b| c|

B| d| e|


UPDATE A SET b =
(SELSECT B.e
FROM B
WHERE A.a = B.d
AND A.b <> B.e
AND A.c IS NOT NULL
)
WHERE EXISTS
(SELECT 1
FROM B
WHERE A.a = B.d
AND A.b <> B.e
AND A.c IS NOT NULL
)

こんな感じでいけると思ったんですが、戻ってこなくなってしまいます。
ご指導、宜しくお願い致します。
383NAME IS NULL:2005/12/08(木) 18:07:21 ID:???
>>379
PostgreSQL依存の文法だが、
SELECT DISTINCT ON (no) no,jusho,(SELECT count(*) FROM tableA where tableB.no=no) FROM tableA as tableB ORDER BY no,date DESC;
384NAME IS NULL:2005/12/08(木) 18:15:05 ID:???
>>382
ある条件って?
Bテーブルのfって?

UPDATE A SET b = (SELECT f FROM B WHERE AテーブルとBテーブルを結びつける条件) WHERE ある条件
385382:2005/12/08(木) 18:30:18 ID:V+RjvCQg
>>384

解り難い上に、間違ってしまってて、すみません。

×:Bテーブルのf
○:Bテーブルのe

です。

ある条件は
A.b <> B.e
A.c IS NOT NULL
この2つの事でした。
386NAME IS NULL:2005/12/08(木) 18:50:22 ID:???
>>385
実行はしてないけど、こんな感じでUPDATE FROM でやってみたらどうでしょう?
UPDATE A SET b = B.e
FROM A JOIN B ON A.a = B.d WHERE A.b <> B.e AND A.c IS NOT NULL
387382:2005/12/08(木) 19:43:13 ID:V+RjvCQg
度々すいません。環境はOracle8iです。
388379:2005/12/08(木) 19:57:43 ID:???
>>383
ありがとうございます

自力でも↓な感じで作ってみたのですが、>>383氏のやり方の方が
全然速そうっすね。


select ddd.no,ccc.jusho,ddd.cnt
from (select no,count(*) as cnt from test_01 group by no) as ddd
inner join (select no,jusho from test_01 as bbb where
date = (select max(date) from test_01 as aaa where
bbb.no = aaa.no)) as ccc
using(no);
389NAME IS NULL:2005/12/08(木) 20:06:07 ID:???
>379
select * from
(select no, max(date) as mxd, count(*) as 件数 from t group by no) wk
join t on
wk.no = t.no
and wk.mxd = t.date
390NAME IS NULL:2005/12/08(木) 20:53:12 ID:???
>>382
>戻ってこなくなってしまいます。
エラーじゃ無いというのが怪しそうだ。最初のBとあとのBにそれぞれ別の別名をつけてみたら?
FROM B B1
FROM B B2
391NAME IS NULL:2005/12/09(金) 00:53:59 ID:???
すいません初心者なのですがお教え願いします。

AというテーブルにあるCODEという項目ががほかのBまたはCまたはDという3つのテーブルに存在するかチェックしたいんですけど。
どうやればいいですか?

   テーブルA     テーブルB     テーブルC     テーブルD
     code        code         code         code
   
1    AAA        AAA         AAA         AAA
2    BBB                    BBB 
3    CCC                    CCC         CCC
4    DDD
                      
上の例でいくと

1は存在する 
2も存在する
3も存在する
4は存在しない

初心者なので例もわかりにくいと思いますがどなたかよろしくお願いいたします。
コード削除で他のテーブルに使用してたら削除不能とし使用していなかったら
削除可能というチェックをしたいのですが悩んでおります。。(ノ_∂。)クスン
392NAME IS NULL:2005/12/09(金) 01:09:42 ID:???
>>391
存在をチェックするSQLはいろいろと書けるけど、
その前にテーブルBCDのcodeは外部キーとして
外部キー制約(参照整合性制約)を掛ければ、

> コード削除で他のテーブルに使用してたら削除不能とし使用していなかったら
> 削除可能というチェックをしたいのですが悩んでおります。。(ノ_∂。)クスン

がDB側で可能となる。
393NAME IS NULL:2005/12/09(金) 01:26:12 ID:wPvfvG6f
>392
ありがとうございます。
参照整合は知らなかったので勉強になりました。

今回の場合は私がテーブルの設定等するわけではないので
(すみませんまだ一ヶ月目のオッペケプログラマーです・・)
プログラム上でSQLをつかって存在チェックをしなければなりません。

すみませんが例をおしえてくれないでしょうか?
よろしくお願いいたします。
394NAME IS NULL:2005/12/09(金) 03:22:16 ID:???
>>393
ヒント:宿題スレ。
395NAME IS NULL:2005/12/09(金) 05:40:43 ID:???
>391

delete from テーブルA
where
テーブルA.code in
(
  select テーブルA.code from テーブルA
  where
  テーブルA.code not in
  (
    select テーブルA.code from テーブルA, テーブルB, テーブルC, テーブルD
    where
    テーブルA.code = テーブルB.code
    or
    テーブルA.code = テーブルC.code
    or
    テーブルA.code = テーブルD.code
  )
)
396NAME IS NULL:2005/12/10(土) 01:09:29 ID:tpnyWUoA
>>393
>(すみませんまだ一ヶ月目のオッペケプログラマーです・・)
>プログラム上でSQLをつかって存在チェックをしなければなりません。


私も、1ヶ月ちょいのおっぺwけぺーだよ。
お互いがんばろっ。
ちょうど、わたしもSQLやってるよ
397NAME IS NULL:2005/12/10(土) 03:36:29 ID:???
>396
質問しろや
398NAME IS NULL:2005/12/10(土) 06:02:26 ID:???
>>396
空気嫁
399NAME IS NULL:2005/12/10(土) 11:32:01 ID:0QKZ2e8J
とりあえず初級、中級レベルのクエリは書けるようになりました。
その次のステップとして、テキストファイルにアクセスしてテーブルに書き込む
ようなSPを書きたいのですが、どこから手をつければよいのでしょうか?

参考書やサイトなどがあれば教えてください。
400NAME IS NULL:2005/12/10(土) 11:35:17 ID:???
煽りを呼びそうなレスだな
401NAME IS NULL:2005/12/10(土) 11:42:47 ID:0QKZ2e8J
>>399
です

>>400
そうでしょうか。
あとはカーソルの使い方とかマスターしたいんですが、アドバイスをお願いします。
402NAME IS NULL:2005/12/10(土) 12:29:17 ID:???
>401
アドバイス: スレタイを800回読む
403259:2005/12/10(土) 18:09:59 ID:???
こんばんわ。現在あちこちと躓きながらなんとかこなしております。

スレタイを800回呼んだうえであえてお聞きしたいことがあります。
以前>>276の意見を取り入れたいと思っており、たった今排気量
検索ができるようになりました。
他にも「一般の方の意見で」こんな検索できたらいいなというご意
見がございましたら教えていただきたいと思います。
ちなみに現在の検索手法は「金額」「排気量」「車両タイプ」「メーカ
ー」「車名」「グレード」となっております。
スレ汚し誠申し訳ないですが、意見が出たので参考にしたいと思い
ますので、よろしくお願いいたします。
404NAME IS NULL:2005/12/10(土) 18:42:43 ID:???
『 S Q L 』質疑応答スレ
405NAME IS NULL:2005/12/10(土) 19:18:11 ID:???
>>403
スレタイ8万回嫁
406NAME IS NULL:2005/12/10(土) 21:57:51 ID:???
>>403 は自分で車買おうと思ったことないだろ。
407NAME IS NULL:2005/12/11(日) 01:14:56 ID:???
SQLは英語のキーワードですが
これはどこの国のデータベースでも共通ですか?
だとしたら、アメリカを敵視する国では
かなり屈辱に耐えながらの使用を余儀なくされている
ということでしょうか。
408NAME IS NULL:2005/12/11(日) 02:27:12 ID:???
はいそうですえいごはあめりかだけのものです
409NAME IS NULL:2005/12/11(日) 04:15:57 ID:???
昔予約語だけ日本語にしてくれるBASICインタープリターがあったのを思い出した。
あの会社ならきっとこういうのを作ってると思う。
問い合わせ * から 表1 条件 性別 等しい 女 かつ 年齢 より大きい 20
410NAME IS NULL:2005/12/11(日) 11:41:27 ID:JHdMgNSU
CREATE VIEW "V_DATA" (
"ID",
"CUSTOMER_NAME",
"PROJECT_NAME",
) AS
select
t_data.ID,
t_customer.customer_name,
t_project.project_name
from t_data, t_customer, t_project, t_copy_data_id
where t_data.customer_ID=t_customer.ID
and t_data.project_ID=t_project.ID
and t_data.ID in (select ID from t_copy_data_id)

あるデータのViewを上記のように作成します。
これはテーブルt_copy_data_idのIDというカラムに
t_dataの中からコピーしたいIDが入っていてこのVIEWを
見るとコピーするデータのID,顧客名,プロジェクト名がわかることになります。
普通t_copy_data_idのカラムIDの個数=V_DATAの行数ですが
IDが1個ならViewが1行、IDが2個ならViewが4行、IDが3個ならViewが9行…
というふうに個数の二乗になってしまいます。
どうすればカラムIDの個数=V_DATAの行数になるでしょうか?
お教えください。
411NAME IS NULL:2005/12/11(日) 11:58:43 ID:ZSVSQhz1
〇〇〇〇@alpha.hmc3.com
ってところから変な偽装メールが携帯にくるんだけどこのアドレス?について何か知っている人
教えてください。スレ違いですいませんが。
〇〇〇〇にはアルファベットが入ります。
412NAME IS NULL:2005/12/11(日) 11:59:50 ID:???
>>411
死ね^^
413NAME IS NULL:2005/12/11(日) 12:27:14 ID:???
t_data.ID=t_copy_data_id.ID
414410:2005/12/11(日) 13:14:13 ID:???
>>413
あぁ!
わざわざサブクエリ使わなくてもいいってことですね
どうもアリがd
415NAME IS NULL:2005/12/11(日) 13:33:45 ID:???
フロム句にあるものをわざわざサブクエリすなってことだな
416NAME IS NULL:2005/12/11(日) 23:11:15 ID:???
2つのテーブルがあって、その2つを特定のキーで結合し
そこからORを使って検索を掛けたいのですが、結果が正確に出ません。
誰か助けてください_| ̄|○
417NAME IS NULL:2005/12/11(日) 23:32:54 ID:???
まず出来なかったSQLを書けよ
418NAME IS NULL:2005/12/11(日) 23:47:46 ID:???
>>416
その情報だけで
助けられたらエスパーだよ
419NAME IS NULL:2005/12/11(日) 23:50:46 ID:???
>>416
エスパーな俺が答えてやるぜ!!



やり方間違えてる。
420NAME IS NULL:2005/12/12(月) 12:37:55 ID:???
先輩のWinXPにPostgreSQLをインスコしようとしたら
すでにチャレンジしていたらしく、WidXPのユーザアカウントでは
見えないpostgresユーザアカウントが出来上がっていたのです・・・

これって消せないんでしたっけ?
もし消せるのであれば教えてください!
421NAME IS NULL:2005/12/12(月) 12:42:55 ID:W4/ThV//
見えないユーザーアカウントの存在をどうやって知ったの?
それってエラーメッセージがてきとーいってるんじゃないのか。
422NAME IS NULL:2005/12/12(月) 13:11:24 ID:???
いや、net userで見えるのは何ですか?
あれ勘違い?

でも取り合えず追加できないのはなぜでしょう?
423NAME IS NULL:2005/12/12(月) 13:46:50 ID:???
すでにあるなら追加せず、そのまま進めればいい。
ユーザー関連はホームとプロでちょっとかわってくるかもしれんが、、
マイコンピューターの右クリック→管理からローカルユーザーとグループ、でどうか
424NAME IS NULL:2005/12/12(月) 13:52:23 ID:???
>>423
スレタイ4万回嫁
425NAME IS NULL:2005/12/12(月) 14:23:45 ID:???
おっと、PostgreSQLのスレじゃ無かったのか、勘違いした
426NAME IS NULL:2005/12/12(月) 17:10:40 ID:K+7MEGhT
すでにデータの入力がされているテーブルを複製したいのですが
Oracleでは以下のように

CREATE TABLE 2005_data_tbl AS SELECT * FROM data_tbl;

すれば出来るということは調べてわかったのですが
他の物(今回Accessを使用しています)でも結果を同じにするには
SQL文はどのように書けばいいのでしょうか?
427NAME IS NULL:2005/12/12(月) 17:37:07 ID:???
>>426
そのSQLはAccessでは通らなかったのか?
428NAME IS NULL:2005/12/12(月) 17:42:45 ID:K+7MEGhT
>>427
通りませんでした。
当たり前ですが
CREATE TABLE 2005_data_tbl(test TEXT);
は通りました。
429NAME IS NULL:2005/12/12(月) 17:51:12 ID:???
VBAでやっちゃえば?
430427:2005/12/12(月) 17:55:49 ID:???
>>428
そっか、Accessもってないんで以下も通るかどうか不明だが、
SELECT * INTO 2005_date_tbl FROM data_tbl;
だとどうよ。
431NAME IS NULL:2005/12/12(月) 18:10:25 ID:???
>>429-430
430さんの方法で複製に成功しました。
ありがとうございました。
432NAME IS NULL:2005/12/12(月) 18:23:06 ID:???
>431
Access2003だが、コピペで出来たおw
単純複製ならこっちの方が楽だね。
433NAME IS NULL:2005/12/12(月) 19:12:35 ID:???
テーブル構造を複製するのは環境依存
テーブル構造だけその環境に合わせた方法で作っておけば
データをコピーするのは標準のSQLでできる
434NAME IS NULL:2005/12/12(月) 21:41:26 ID:???
何言ってんだかわかりません
435NAME IS NULL:2005/12/13(火) 07:06:39 ID:???
>433
イボ痔が飛び出たじゃねーか!
謝れ!
436NAME IS NULL:2005/12/13(火) 09:43:13 ID:???
>>435
ところで俺は切れ痔なんだが、
ヲシュレット直撃が非常にチビシイ件について。
437NAME IS NULL:2005/12/13(火) 10:19:02 ID:???
>>436
塗り薬タイプのボラギノールはマジで効くよ。綿棒に塗ってアナルオナニーしてればいつの間にか治る。
438NAME IS NULL:2005/12/13(火) 10:41:19 ID:???
痔の話題で盛り上がっている中すみませんが、

k|v
-+-
a|1
a|2
b|1
b|1
c|3
d|4

から v が 1 と 2 を持つ k を抽出したいです。
つまり a だけが返ってほしいです。

とりあえず

select k from t1 where v=1 or v=2 group by k having count(k) = 2;

が思いつきました。が、これだと b もマッチしてしまいます ( 1 が 2 つマッチするため )。
どう書くものなんでしょう?
439NAME IS NULL:2005/12/13(火) 10:47:42 ID:???
>>437
ほほう、それは良いことを聞いた。ありがとう。
さっそく帰宅時に購入を試みることにする。

小生、以前にプリザS軟膏を所望し、試行してみたのだが、
油分を多く含んで着床性が良好な割に、治癒率が低いので使用を中止したのだ。
しかるに現在はオロナイン軟膏などを試しているのだが、これが存外に良い。
親水性が高いようで、洗浄時にもべたつかず、治癒性もそこそこに良好。

ちなみに座薬タイプだとどれも、菊紋直下の浅い患部には届きにくい気がする。
440NAME IS NULL:2005/12/13(火) 11:18:51 ID:BihONEEK
かれこれ悩んで悩んでわからないまま・・・。
postgreSQL7.4.8です。

select extract(epoch from timestamp year||'-'||month||'-1') from test_table;

これを入れると、
syntax error at or near "year" at character 37
このようなエラーがでます。

yearとmonthはカラム名で、int型です。
このSQL文、どこがおかしいんでしょうか・・・。
よろしくお願いします。
441NAME IS NULL:2005/12/13(火) 11:23:12 ID:???
||'-'||<アイシテ!!
442NAME IS NULL:2005/12/13(火) 11:23:39 ID:???
443NAME IS NULL:2005/12/13(火) 11:33:13 ID:BihONEEK
>>441
ワロス
和めました。
444438:2005/12/13(火) 11:53:46 ID:???
>>442
ありがとう。
今回のケースは重複ありなので
>>43
の方法でうまくいきました。
445NAME IS NULL:2005/12/13(火) 12:36:51 ID:???
>>440
> select extract(epoch from timestamp year||'-'||month||'-1') from test_table;

extract(epoch from timestamp型) にしなきゃならんのだけど、その書き方では
正しくキャスト出来ていないってことじゃ。

SELECT extract(epoch from CAST(year||'-'||month||'-1' AS timestamp)) FROM test_table;
SELECT extract(epoch from (year||'-'||month||'-1')::timestamp) FROM test_table;
446NAME IS NULL:2005/12/13(火) 13:09:50 ID:BihONEEK
>>445
ぬおおおおおおおお!!!
でででできました!!!!
すごいっす!ありがとうございます!!!
感激っす!
447NAME IS NULL:2005/12/13(火) 15:35:16 ID:yNQyxieU
すみません。質問させていただきます。
たとえば、prime intというフィールドだけの
テーブルがあったとして、中身は以下のようになっているとします。

1
2
3
5
7
11
13
17
19



これのx番目からy番目を抽出するSQL文はどのようなものになるのでしょうか?
448NAME IS NULL:2005/12/13(火) 15:54:30 ID:???
すみません。limitを使えばよかったんですね。
select * from ~~ limit (x-1),(y-x+1)
でいけそうです。
449NAME IS NULL:2005/12/13(火) 17:18:18 ID:ftuq8miM
つうか、中身の順番に保証は無いっていうDBの基本は理解してるか?
450NAME IS NULL:2005/12/13(火) 17:35:18 ID:???
質問です。
テーブルAとテーブルBのデータをグルーピングするにはどうしたらいいでしょうか?
451NAME IS NULL:2005/12/13(火) 18:39:12 ID:???
>450
group by
452NAME IS NULL:2005/12/13(火) 18:39:13 ID:???
どんな風ニダ
453NAME IS NULL:2005/12/13(火) 18:58:20 ID:???
せめて、テーブル構成とどのカラムをグルーピングしたいのか書けよ
454NAME IS NULL:2005/12/13(火) 19:31:33 ID:???
はい
Aというテーブルに名前、年齢があります。
Bというテーブルに名前、年齢があります。
それで、年齢をグルーピングしたいと思ってます。
よろしくおねがいします。
455NAME IS NULL:2005/12/13(火) 19:53:23 ID:???
>>454
group by
456NAME IS NULL:2005/12/13(火) 20:01:58 ID:???
>>455
どんな風に group by 使うんですか?
よろしくおねがいします。
457NAME IS NULL:2005/12/13(火) 20:04:57 ID:???
>>456
えぐり込むようにして打つべし
458NAME IS NULL:2005/12/13(火) 23:11:30 ID:???
create table [group by](名前 LONG, 年齢 IMAGE, CONSTRAINT pkey PRIMARY KEY(名前));
459NAME IS NULL:2005/12/14(水) 00:48:07 ID:???
仕様書にサマリーするって書いてるんですけど、
句は何でしたっけ?
460NAME IS NULL:2005/12/14(水) 08:23:08 ID:???
>456 >459
別にできなくてもいいやと思ってるでしょ?w
誰かがケツ拭いてくれると思ってるでしょ?w
会社に行ってさえいれば銭になると思ってるでしょ?w
そのうちできるようになると思ってるでしょ?w

ビンビン伝わってくるよw
461NAME IS NULL:2005/12/14(水) 10:21:03 ID:???
答えられない人は書き込まなくて良いですよ^^;
462454:2005/12/14(水) 10:42:33 ID:???
すみません自己解決しました
463NAME IS NULL:2005/12/14(水) 12:29:46 ID:???
>462
どう解決したのか書けや
464NAME IS NULL:2005/12/14(水) 12:33:46 ID:???
>461
答えられない人は書き込まなくて良いですよ^^;
465NAME IS NULL:2005/12/14(水) 12:44:57 ID:???
>>463
グループ化ごとき書くまでもないだろ^^;
466NAME IS NULL:2005/12/14(水) 13:19:32 ID:???
>464
答えられない人は書き込まなくて良いですよ^^;
467NAME IS NULL:2005/12/14(水) 13:19:56 ID:???
>465
答えられない人は書き込まなくて良いですよ^^;
468NAME IS NULL:2005/12/14(水) 13:28:43 ID:???
答えられない人書き込みすぎですよ><;
469NAME IS NULL:2005/12/14(水) 13:54:43 ID:???
>468
答えられない人は書き込まなくて良いですよ^^;
470NAME IS NULL:2005/12/15(木) 00:13:58 ID:???
まったりしたところ申し訳ないですが
テーブルAには列「ア,イ,ウ」があり、テーブルBには「ID,あ」があります。

ア  イ  ウ←テーブルA
--------
1  2  3
1  4  NULL


ID  ふ←テーブルB
---------
1  お寿司
2  食べ物
3  外食
4  うどん

とあるとき、テーブルAのアイウはテーブルBのIDから値をとっています。
NULLがやっかいで1つのSQL文では値がうまく取れません。どんな書き方がありますか?
↓こんな感じでデータを取得したいです
結果テーブル
-----------
お寿司  食べ物  外食
お寿司  うどん  (ここはNULLでもなんでもいい)
1つの規則としては、NULLが入る順位はウ>イ>アです。
うまく説明できない・・・_| ̄|○
471NAME IS NULL:2005/12/15(木) 00:44:10 ID:???
select B1.ふ as アふ, B2.ふ as イふ, B3.ふ as ウふ
from ((テーブルA as A LEFT JOIN テーブルB as B1 ON A.ア=B1.ID)
LEFT JOIN テーブルB as B2 ON A.イ=B2.ID)
LEFT JOIN テーブルB as B3 ON A.ウ=B3.ID;
472NAME IS NULL:2005/12/15(木) 09:52:21 ID:???
>>470
select句でスカラーサブクエリ
473NAME IS NULL:2005/12/15(木) 10:58:27 ID:???
検索キーワードに『hoge1 hoge2 ...』とあったとして、
そのキーワードを全て含むレコードを求めるには、

hoge like '%hoge1%' and hoge like '%hoge2%' and ...

みたいに書かなきゃダメですか?
もっと短くスマートにできませんかね?
474470:2005/12/15(木) 11:45:29 ID:???
できました〜!
これで大幅にソースを減らせます。
ありがとうございました。
475NAME IS NULL:2005/12/15(木) 18:12:35 ID:???
>>473
正規表現を使えるなら使うとか。
476NAME IS NULL:2005/12/15(木) 18:20:00 ID:???
>>473
それ、hogeの部分は同じってこと?
477473:2005/12/16(金) 09:40:33 ID:???
いえ、何が入るかわかりません。
スペースで区切られたキーワードを元にDBからマッチするイベントを探したいんですが...
イベントのタイトルや説明、備考が検索対象なんですよね。

つう事は、キーワードの数×検索対象の列の数だけlikeを書かなきゃダメって事になるんですかね?
478NAME IS NULL:2005/12/16(金) 09:51:52 ID:???
手書きしなきゃいいじゃん
479NAME IS NULL:2005/12/16(金) 10:21:17 ID:???
>>473
正規表現を使えばできる
oracleは先読みを使えないが
http://www.din.or.jp/~ohzaki/regex.htm#And
480NAME IS NULL:2005/12/16(金) 13:01:43 ID:KqztSrAJ
MSSQLなんだけど
小数点以下の桁を切り捨てるにはどうすれば良いの?
1234.5→1234
丸めないようにすり仕方教えてください
481NAME IS NULL:2005/12/16(金) 13:23:37 ID:???
>>479
良く読んでないのでまだ理解してないが・・・
ちょっとそこを参考に色々調べてみる。
アリガト^^
482NAME IS NULL:2005/12/16(金) 15:24:17 ID:bTCAxfTe
http://www.din.or.jp/~ohzaki/regex.htm#And

Oracleなら
RegExp_Instr(hoge,^(?=.*hoge1)(?=.*hoge2)(?=.*hoge3))

だな
先読みが使えたら実現できる
483NAME IS NULL:2005/12/16(金) 16:09:29 ID:???
>>480
round(1234.5, 0, 1)
484NAME IS NULL:2005/12/17(土) 20:09:33 ID:ulJ0EouX
トリガはどうやってデバッグするの?
485NAME IS NULL:2005/12/18(日) 17:04:15 ID:FsmsuTpb
>484
プリント文
486NAME IS NULL:2005/12/18(日) 21:10:05 ID:???
教えて下さい。
下記の様なテーブルがあります。

id|色
----------
10|赤
10|青
10|黄
20|赤
20|黄


ここから、下記の様な仮想表を作る必要がでてきました。

id|色1|色2|色3|色4|色5|
-------------------------------------------
10|赤 |青 |黄 |NULL|NULL|
20|赤 |黄 |NULL|NULL|NULL|


列方向は5固定です。
1つのidにつき、5件以上存在しないものとします(仮に存在したら、6件目以降は切り捨てても構わない)。
プログラムを使用せずに行う必要があるのですが、やり方がわからず悩んでいます。
DBMSは、SQL Serverです。
どうか、ご教授お願い致します。
487NAME IS NULL:2005/12/18(日) 21:13:40 ID:???
488NAME IS NULL:2005/12/18(日) 21:39:02 ID:???
>>486
縦を確定させる要素(例の場合はid)
横を確定させる要素(例の場合では無い)
ので横を確定させる要素が欲しいところですね

「クロス集計」のキーワードで探してみたら
参考になるHPが有ると思います
489NAME IS NULL:2005/12/18(日) 22:42:30 ID:???
>>487
ぐは。ツッコミありがとです。

>>488
ヒント、ありがとうございます。

>横を確定させる要素(例の場合では無い)
>ので横を確定させる要素が欲しいところですね

つまり、この状態から

id|色
----------
10|赤
10|青
10|黄
20|赤
20|黄


このid毎の連番が必要になってくるという事ですよね。

id|色 |連番
------------
10|赤 |1
10|青 |2
10|黄 |3
20|赤 |1
20|黄 |2


この連番、SQLでとれるのでしょうか・・・。
出来そうな気はして考えてはいるのですが、自分の頭では思いつきません・・・。

490NAME IS NULL:2005/12/18(日) 23:16:47 ID:???
ユー フィールド 作っちゃいなよ
491NAME IS NULL:2005/12/19(月) 00:05:04 ID:???
>プログラムを使用せずに行う必要
ユー 妥協しちゃいなよ
492NAME IS NULL:2005/12/19(月) 00:28:46 ID:???
力技でくっそ重そうなクエリで良けりゃ出来そうだがな。
493NAME IS NULL:2005/12/19(月) 01:08:36 ID:???
>>492
力業でもないし、全然おもくないし
よくあるテクニックの一つで、
FAQ状態のような気がする
494NAME IS NULL:2005/12/19(月) 01:28:28 ID:???
>>493
そうか?具体的にどんなだ?
495492:2005/12/19(月) 01:44:01 ID:???
>>493
俺は>>486を直接する方法ね。
496NAME IS NULL:2005/12/19(月) 03:03:34 ID:???
リレーションにLIKEを使うにはどうすればよいのでしょうか?

SELECT A,B FROM asdf, jkl
WHERE asdf.D like '%j'kl.E%';

雰囲気としてはこのようになってほしいのですが・・・
497492:2005/12/19(月) 04:21:40 ID:???
>>496
WHERE asdf.D LIKE '%'||jkl.E||'%';
498496:2005/12/19(月) 04:23:56 ID:???
>>497
どうもありがとうございます。
499NAME IS NULL:2005/12/19(月) 07:08:39 ID:???
>>489
この件に関しては、下記の感じで出るだろ(未確認)
「連番と色」おデータの入り方を保証するのは結構難しいんじゃない?
少し変わってしまうが、「色マスタ」的なモノを作成した方がええんちゃう?

select
a.id,
max(a.色1),
max(a.色2),
max(a.色3),
max(a.色4),
max(a.色5)
from (
select
id,
case when 連番=1 then 色1,
case when 連番=2 then 色2,
case when 連番=3 then 色3,
case when 連番=4 then 色4,
case when 連番=5 then 色5
from table
) a
group by a.id
500NAME IS NULL:2005/12/19(月) 10:28:53 ID:1X0MvCSs
select name from user where id in ('8',6'',14''...);

みたいなので、結果を、where id inの()の中のid順序で返すようにソートする方法ってありますか?
全部取得して、アプリ側でソートしなおすしかないでしょうか?
501NAME IS NULL:2005/12/19(月) 12:14:35 ID:???
INにしないで1個ずつ検索をUNIONALLとか。w
502NAME IS NULL:2005/12/19(月) 12:49:47 ID:???
順番,ID
というカラムを持つ一時テーブルに突っ込んで結合。
503NAME IS NULL:2005/12/19(月) 13:54:20 ID:Y1hJqnoN
504NAME IS NULL:2005/12/19(月) 17:02:37 ID:kkDnjsh8
通報&宣伝お願いします

生き物苦手板
http://c-docomo.2ch.net/test/-/cat/i                  通報先一覧→http://www.npa.go.jp/cyber/soudan/hitech-sodan.htm

動物愛護法第二十七条 
愛護動物をみだりに殺し、又は傷つけた者は、一年以下の懲役又は百万円以下の罰金に処する。
警視庁のページ http://www.keishicho.metro.tokyo.jp/seian/animal/animal.htm
505NAME IS NULL:2005/12/19(月) 17:33:40 ID:iQ1vu3Fj
初歩的な質問です。
PostgreSQL7.3 FreeBSDなんですが、
顧客購入履歴テーブルがあり、
フィールドが購入NO、商品NO、ユーザNO、購入金額(任意の金額)
とあります。
商品NOごとに、購入金額の最高値&最高値で購入したユーザNO&購入NOをSELECT
したいのですがうまくいきません。
SELECT ユーザNO,購入NO,MAX(購入金額) FROM 顧客購入履歴 GROUP BY 商品NO
だとエラーになってしまいます。
このような場合は関数を使わないとダメなのでしょうか?SELECT一回では無理でしょうか?
506NAME IS NULL:2005/12/19(月) 18:04:26 ID:???
最高金額と商品NOを取り出してそれを持った物を取り出す
ってやると

SELECT ユーザNO,商品NO,購入金額 FROM 顧客購入履歴
WHERE (購入NO,購入金額) IN
(SELECT 商品NO,max(購入金額) FROM 顧客購入履歴 GROUP BY 商品NO)

こうなるけど、こんな感じでよいのかな?
507NAME IS NULL:2005/12/19(月) 18:05:09 ID:???
マチガタ

× WHERE (購入
○ WHERE (商品
508505:2005/12/19(月) 18:50:24 ID:iQ1vu3Fj
>>506
ありがとうございます!できました。
再帰結合?みたいな感じになるようですね。勉強になります。
さらに商品ごとに購入された回数を表示してみたのですが、
下記のようなSQLになりました。
動作はするのですがもっとスマートな方法はないでしょうか?
なんだか無駄に長い気がします。

SELECT ユーザNO,商品NO,購入金額,購入回数 FROM 顧客購入履歴
LEFT OUTER JOIN (SELECT 商品NO,COUNT(購入NO) AS 購入回数 FROM 購入履歴 GROUP BY 商品NO) AS HOGE
ON 購入履歴.商品NO = HOGE.商品NO
WHERE (商品NO,購入金額) IN (SELECT 商品NO,max(購入金額) FROM 顧客購入履歴 GROUP BY 商品NO)
509NAME IS NULL:2005/12/19(月) 19:18:57 ID:???
HAVINGでmaxなのを拾ってくるのとかも
できそうな気がする。
携帯なのでここまでだが
510NAME IS NULL:2005/12/19(月) 19:28:58 ID:???
>>489
MSSQL2005だとこういう手が使える。
with c_test6 (c_id, c_color, c_rank) as
(
    select id, color, row_number() over (partition by id order by color) as rank from test6
)
select id, (select c_color from c_test6 where c_id = id and c_rank = 1) as color1
     , (select c_color from c_test6 where c_id = id and c_rank = 2) as color2
    , (select c_color from c_test6 where c_id = id and c_rank = 3) as color3
    , (select c_color from c_test6 where c_id = id and c_rank = 4) as color4
    , (select c_color from c_test6 where c_id = id and c_rank = 5) as color5
 from (select distinct id from test6) a
511NAME IS NULL:2005/12/19(月) 21:11:57 ID:jNcYoMKv
>>510
MSSQL2005かよ
貧乏人を愚弄してるな!
512NAME IS NULL:2005/12/19(月) 21:52:09 ID:???
513486:2005/12/19(月) 21:57:16 ID:???

「くっそ重そうなクエリ」となってしまったかもしれませんが、とりあえずは用件を
満たすものができました。
ちなみに SQL Serverのバージョンは2000です・・・2005、便利そうですね。

知恵を貸していただいた皆さん、ありがとうございました。

select
id,
max(color1) as 色1,
max(color2) as 色2,
max(color3) as 色3,
max(color4) as 色4,
max(color5) as 色5
from
(
select
id,
(case when orderno = 1 then color else null end) as color1,
(case when orderno = 2 then color else null end) as color2,
(case when orderno = 3 then color else null end) as color3,
(case when orderno = 4 then color else null end) as color4,
(case when orderno = 5 then color else null end) as color5
from
(
select count(*) as orderno, a.id, a.color
from tbcolor a, tbcolor b
where
convert(nvarchar, a.id) + a.color >= convert(nvarchar, b.id) + b.color and
a.id = b.id
group by a.id, a.color
) a
) b
group by id
514NAME IS NULL:2005/12/20(火) 11:44:21 ID:SNuxK27W
教えてください。

date    num hoge foo bar piyo
-------------------------------------
2002-10-12  1
2002-10-12  2
2002-10-12  3
2002-10-13  1
2002-10-13  2
2002-10-13  3
2002-10-13  4
2002-10-13  5
2002-10-15  1
2002-10-15  2
2002-10-15  3
2002-10-15  4
2002-10-16  1
2002-10-16  2
2002-10-16  3

こんな感じのテーブルがあって、hoge,foo,bar,piyoにはそれぞれ適当な値が入ってます。
で、それぞれの日付において、numが最大の行だけ全て取得したいのですが
(10/12だったらnum=3の行, 10/13→num=5, 10/15→num=4,10/16→num=3)

date と num だけだったら↓でOKなのですが
select date, max(num) from table group by date;

そのdateとnumに対応するhoge,foo,bar,piyoの取得をどうすればいいのか
教えてください。使用dbはsqlite3です。
515NAME IS NULL:2005/12/20(火) 13:00:47 ID:???
>514

>506
516514:2005/12/20(火) 14:22:31 ID:???
レスありがとうございます。既出でしたね。すいません。

select * from table where (date, num) in (select date, max(num) from table group by date);
で、こうやるとsqliteだとsyntaxエラーになるんですけど、

sqliteの場合、例えばですけど
select count(distinct hoge) from table;
っていうのがsyntaxエラーになっちゃって、
代わりに
select count(*) from (select distinct hoge from table);
ってやらなきゃならなくて

たぶん、そこらへんの関係(仕様?)でエラーになると思うんですけど、
で、代わりに、
select * from table where num in (select max(num) from table group by date order by date) group by date order by date;
だと、ぱっと見思いどおりに取得できてるような感じなんですけど、
件数が多すぎて全部チェックはしていないのですが、↑のだとsql文的にはおかしくないでしょうか?
517NAME IS NULL:2005/12/20(火) 16:05:47 ID:???
4だとサブクエリの制限はそんなにきつくないみたいだけどね
518515:2005/12/20(火) 21:24:46 ID:???
・・・
519NAME IS NULL:2005/12/21(水) 00:58:18 ID:???
>>514
SELECT * FROM TABLE A WHERE NOT EXISTS(SELECT * FROM TABLE WHERE date=A.date AND num>A.num) order by date
520514:2005/12/21(水) 16:04:28 ID:CVbNnIh0
>>519
それでできました。
が、実用にならないほど遅かったです。
521NAME IS NULL:2005/12/21(水) 21:28:20 ID:???
SELECT B.*
FROM (select date, max(num) as max_n from table group by date) AS A
INNER JOIN table AS B ON a.date=b.date AND a.num=b.max_n
522NAME IS NULL:2005/12/22(木) 00:52:26 ID:???
>>520
適切なINDEXが設定されていないんジャマイカ?
A(date,num)が必要。
523NAME IS NULL:2005/12/22(木) 00:59:41 ID:???
どういうスペックのDB鯖で遅いの?
524NAME IS NULL:2005/12/22(木) 03:31:40 ID:???
>>514
この手のテーブルは履歴を持ちたいためにこういう構造にしてるケースが多いのだが、
使うのはほとんど最新のレコードだけ。
最新のレコードのnumを常にゼロにしておけば、問い合わせの手間も効率もだいぶ省ける。
525NAME IS NULL:2005/12/22(木) 09:30:22 ID:???
つうか、別Tableで最新データを持っておくところを作っておく。
更新は履歴TableのInsertトリガーで。
526514:2005/12/22(木) 19:41:40 ID:???
皆様、いろいろとレスありがとうございます。
自分まだまだ勉強不足なんで大変参考になりました。

>>521 ではエラーで実行できませんでした。
とりあえずは create index したら、問題ない速度で取得できました。

環境は P3 550M メモリ 768M sqlite3 です。:wq

527NAME IS NULL:2005/12/24(土) 20:35:40 ID:???
Xreaとsakurのレンサバ(スタンダード)を契約しています。
http://phpspot.org/blog/archives/2005/12/scuttle.html
これの2番が理解できません。データベースのデの字も理解していません。ゼロです。

どうすればインストールできるのでしょうか?
528NAME IS NULL:2005/12/24(土) 20:45:36 ID:???
PHPとかの業者に丸投げした方がいいよ。
明らかにおまいには無理。
529NAME IS NULL:2005/12/24(土) 20:45:58 ID:???
>>527
ここで聞くのは多分すれ違いの内容だと思うから、簡単にだけ答えとくと・・・
その2つのアカウントでは好きなデータベースは作らせてもらえない。
Sakuraなら専用サーバを借りるしかない。
530NAME IS NULL:2005/12/24(土) 22:11:17 ID:???
>>529
ありがとうございました
531NAME IS NULL:2005/12/25(日) 00:46:53 ID:???
>>529
スレ違いには同意だが、
>>527の示したページを読む限りでは、少なくともxreaでも設置可能だと思うがな。
sakurは使ったこと無いからワカランがたぶん可能だろう。
好きなデータベースは作らせてもらえないけど、必要とするのはひとつだけだし、
/config.inc.phpでデータ名を指定すればいいんじゃね。
532NAME IS NULL:2005/12/27(火) 02:51:20 ID:???
>>531
重ね重ねありがとうございます。
数年後、自身のスキルが向上した時に、もう一度チャレンジしてみます。
533NAME IS NULL:2005/12/27(火) 11:06:38 ID:???
数年もかかるのか・・・
自宅の動くけど古くなっていらなくなったPCにlinuxとか入れて
いろいろインストールして試せば半年で一通りなんでもできるようになるぞ
534NAME IS NULL:2005/12/27(火) 11:53:13 ID:???
>>533
やる気がないんだから無理無理
535NAME IS NULL:2005/12/27(火) 12:51:41 ID:???
業者に丸投げして依頼した方がいいね。
536NAME IS NULL:2005/12/27(火) 15:42:24 ID:ev8Bf63q
SQLを勉強してまだ1ヶ月、
週に1〜2回のペースでサンプルとにらめっこしながらSQLと戦っています。

ID NAME
----------
1 USER_3
2 USER_2
3 USER_1
4 USER_2
5 USER_4
6 USER_1
7 USER_1

というようなレコードがあるとします。(実際にはもっと数があります)
IDはオートインクリメント、NAMEは任意のユーザ名が入ります。

ここで、特定のIDとユーザ名を指定します。
(1) 指定されたIDのレコード
(2) 同じユーザ名で、かつ、指定されたIDの前後のレコード(1つずつ)
を取得したいと思います。(最大で3つ)

例:
ID='6' NAME='USER_1' なら、3番・6番・7番を返す

この場合、どのようなSQL文を書くのがスマートでしょうか。
ソフトウェアは MySQL 3.23 です。

select * HOGE where NAME='USER_1' and ID>=6 limit 2 ;
select * HOGE where NAME='USER_1' and ID<6 limit 1 ;
というように、面倒でも2回に分けてやるしかないのでしょうか。

条件:
・レコードが見つからない場合などは考慮しない
・指定されたIDとユーザ名が違う場合も考慮しない
537NAME IS NULL:2005/12/27(火) 15:53:37 ID:RFxj046c
>>536
union allでいいんじゃね
538NAME IS NULL:2005/12/27(火) 16:07:43 ID:???
早速のレス、ありがとうございます。

http://dev.mysql.com/doc/refman/4.1/ja/union.html
>6.4.1.2. UNION 構文
>UNION は MySQL 4.0.0 で導入されました。

素直に2回呼んできます。

539NAME IS NULL:2005/12/27(火) 16:13:52 ID:???
>536
3件以上あった場合に問題になる予感。
max(ID) と min(ID) を使うといいと思う。
540NAME IS NULL:2005/12/27(火) 16:49:15 ID:pbglOAMD
掲示板のようなものを作っています。
ページに表示する範囲のアイテムの他、
ページャーにナビゲーションを表示するため、
アイテム総数が必要です。

1:まず全体をcountしてから、指定範囲をselectする(クエリ2回)
2:全体をselectし、指定範囲をfetchする(クエリ1回)

どちらかが定石なのでしょうか?
541NAME IS NULL:2005/12/27(火) 17:11:24 ID:???
>>540
DBMSも、開発言語も、使用するミドルウェアも書かずに何を求める?
542NAME IS NULL:2005/12/27(火) 17:21:56 ID:RFxj046c
1:まず全体をcountしてから、指定範囲をselectする(クエリ2回)
ファントムリードとかアンリピータブルリードがおきるが
543536:2005/12/27(火) 17:55:41 ID:ev8Bf63q
前のレコード ← 指定レコード → 次のレコード

と言うような感じで、3つのデータを並べて表示する予定でした。
(実際には、IDとNAME以外にもデータが存在します)

>>539さんもありがとうございます。
そうなると、select文が3つに増えてしまうような気がするのですが…?

544NAME IS NULL:2005/12/27(火) 18:01:09 ID:???
>>543
件数によるが、対象となるやつ全件とってきて、プログラム側で順次処理したほうがよくね?
545NAME IS NULL:2005/12/27(火) 18:20:13 ID:???
>>536
いくつかやりかたあるがMySQL3はよくわからんので書かない、でも
LIMIT で絞るときはORDER BY で順番入れとかないと期待した
答えにならないから気をつけれ
546NAME IS NULL:2005/12/27(火) 18:27:55 ID:???
*おおっと*
order by は素で抜かしてました。ヤバカッタ

プログラム側で処理してもいいのですが、Perl/CGI(≠mod_perl)なもので、
やれるところはやれるだけ、SQLで済ませたいなと思ったためです。

たぶんクエリ2回投げたほうがサーバに優しそう…。
547NAME IS NULL:2005/12/27(火) 18:32:58 ID:???
>543
select文がいくつに増えようがやりたいことできなきゃ意味ないじゃん。
544方式でやったら?

>545
ORDER BY じゃ解決しない予感。
548536:2005/12/27(火) 18:47:51 ID:???
上司と相談&テストしつつ、最適なものを選んで使うことにします。
色々ありがとうございました。
549536:2005/12/27(火) 23:22:57 ID:???
進展報告。

上司 「 やっぱこの機能なし 」
550NAME IS NULL:2005/12/27(火) 23:25:05 ID:???
ラッキーじゃん
551NAME IS NULL:2005/12/28(水) 00:21:47 ID:???
ミドルウェアはパフォーマンス稼ぐために事前にプリフェッチして、内部で順次処理してくれたりするね。
欠点はメモリ喰う。
552NAME IS NULL:2005/12/28(水) 09:16:40 ID:???
>>549
あるよねあるよね。
できたのにやっぱいらねーとか言われると凹むよね。

まぁ、おまいのは作る前で良かったな。
553NAME IS NULL:2005/12/28(水) 09:32:51 ID:???
勝手に盛り込んで、実は使えますの方が後で楽だけどね。
やっぱり使うなんて言い出しても、使えますよというだけで済むし。
後で使えない物を使えるように修正するのはかなり厳しい事が多い。ほぼ全部作り直しに成るとかね。

もちろん、勝手に盛り込んでるから、その部分のデバックが大変とか実装が大変とかのいい訳には使えない。
554NAME IS NULL:2005/12/28(水) 12:00:27 ID:NbvUIf+D
質問です。

日付    ID 数量
---------------------
2005-12-01 10 8
2005-12-01 11 3
2005-12-01 12 9
2005-12-02 10 1
2005-12-02 11 4
2005-12-02 12 7
2005-12-03 10 2
2005-12-03 11 10
2005-12-03 12 26

12/1 の ID 12 の数量 - 12/1 の ID 11 の数量 (9-3)がしたい場合

select a.数量 - b.数量 from (select 数量 from TABLE where 日付 = '2005-12-01' and ID = 12) as a,
  (select 数量 from TABLE where 日付 = '2005-12-01' and ID = 11) as b;

これで、とりあえずは大丈夫だったのですが
もっとスマートな方法があったら教えてください。
555NAME IS NULL:2005/12/28(水) 12:04:11 ID:???
そのマイナスされる側、する側を選ぶ根拠を日本語で書いてくれ。
556NAME IS NULL:2005/12/28(水) 12:07:36 ID:???
日にちごとに集計されたテーブルを作りたいなあ。
毎回計算するのはアフォらしい。
557NAME IS NULL:2005/12/28(水) 12:07:51 ID:???
>>553は良い社員ですね。
558NAME IS NULL:2005/12/28(水) 12:16:48 ID:???
>>554
Lag関数を使えばいいんじゃね
559NAME IS NULL:2005/12/28(水) 13:06:30 ID:???
>>556
普通にビュー作るんじゃだめなの?
560NAME IS NULL:2005/12/28(水) 15:02:59 ID:???
いろいろレスありがとうございます。

>マイナスされる側、する側を選ぶ根拠
これは特に法則等あるわけではなく、その時々です。
ただし、日付は必ず同じ日付どうしです。

>Lag関数を使えばいいんじゃね
sqliteですので・・・

それほど頻繁に行う処理ではなく、たまに
コマンドラインから打って確認する程度ですので
お手軽にできるのはないかなぁーと思ったまでです。

ありがとうございました。
561NAME IS NULL:2005/12/29(木) 00:57:13 ID:???
>>560
select a.日付, b.数量 - a.数量 from test2 a
join test2 b on a.日付 = b.日付 and a.ID = 11 and b.ID = 12
where a.日付 = '2005-12-01'

MSSQL2005でrank overは実装されてたけどlagはまだだった。
.. over ( partition のような統計用の問い合わせってもうANSI-SQLで規定されてるのかな?
562NAME IS NULL:2005/12/29(木) 22:38:50 ID:???
>>561
おぉ、素晴しいです。ありがとうございます。
563NAME IS NULL:2005/12/31(土) 15:36:44 ID:vxYpC2+H
右近のSQLの新機能はLAGもFIRST_VALUEも正規表現も階層問い合わせもないのか
ORACLEの数年前の機能しかないんだな
564NAME IS NULL:2005/12/31(土) 20:46:32 ID:???
MSだし、本格的に使われるのはこれからですよ。
565NAME IS NULL:2005/12/31(土) 21:57:18 ID:8smF4z+3
VisualBasic2005Expressで、MySQLって使えないんでしょうか??
566NAME IS NULL:2005/12/31(土) 22:25:10 ID:???
は?
567NAME IS NULL:2006/01/01(日) 13:46:37 ID:???
2003 ServerとSQL Serverを買ってください。
568NAME IS NULL:2006/01/01(日) 14:05:43 ID:???
>>567
自分で買えや
569NAME IS NULL:2006/01/02(月) 04:19:34 ID:/iRoSIb9
ほんとだよ。分析関数なんてOracle8iかな?くらいから使ってたのに。
もう、3年前からだよ。つか、正規表現って前からあったか??
10gになってからついたのは知ってるけど。
570NAME IS NULL:2006/01/03(火) 23:56:48 ID:jKZ5QELx
初心者な質問ですいません・・・

ID name age
------------
0 aaaa 20
1 bbbb 29
2 cccc 23

ID はオートインクリメント型です
サブクエリを使わないでIDが最大のレコードを取得する方法はありますでしょうか?
やろうとしてる事はこんな感じなんですがエラーになります・・・。
select * from table where id = max(id);

半年ROMってろといわれそうですが・・・_| ̄|○il|li
571NAME IS NULL:2006/01/04(水) 00:03:22 ID:???
そこまで知ってて何故に
select max(ID) from table;
572NAME IS NULL:2006/01/04(水) 00:19:38 ID:PgskHvVR
あ、取得したいのは最大値ではなく、最大IDのフィールド全体なんです
573NAME IS NULL:2006/01/04(水) 00:26:19 ID:4f2i8HMR
よく、流れ読んでませんが、
select *
from table
where ID in ( select max(ID) from table )
とかじゃないですか??
574NAME IS NULL:2006/01/04(水) 00:28:33 ID:4f2i8HMR
あと、
select *
from table
where ID = ( select max(ID) from table )
だと、副問い合わせが行を戻さなかったとき、エラーになるような気がします。

575NAME IS NULL:2006/01/04(水) 00:31:58 ID:???
>>572
そう言うことか
ORACLEで考えるよ
select * from table where rownum < 1 order by ID desc
576NAME IS NULL:2006/01/04(水) 00:33:31 ID:???
select * from table where rownum < 2 order by ID desc
577NAME IS NULL:2006/01/04(水) 00:35:06 ID:???
ああ、そうか。ID逆順にしてTOP1だけ取得すりゃいいのか。なるほどなるほど。
578NAME IS NULL:2006/01/04(水) 00:37:18 ID:4f2i8HMR
575>>
擬似列rownumはorder byで並べ替えが行われる前に順序付けされるので、
>select * from table where rownum < 1 order by ID desc はまずいです。
rownumを使うなら副問い合わせ使わないといけないと思います
579NAME IS NULL:2006/01/04(水) 00:41:00 ID:PgskHvVR
すいません><
Mysql version 4.0.26 なんです・・・。
サブクエリーも満足に動かなくて。oracle いいなぁ・・・。

素直に2回発行します_| ̄|○il|li
580NAME IS NULL:2006/01/04(水) 00:45:05 ID:4f2i8HMR
mysqlだったんですか、知らずに適当にレスしてしまいました。
ちなみに、Oracleでrownumを使う場合、
select * from ( select rownum, * from table order by a desc ) where rownum = 1
です。
581NAME IS NULL:2006/01/04(水) 01:00:24 ID:4f2i8HMR
もう、どうでもいいのかもしれませんが、サブクエリーがだめなら、
結合(INNER JOIN)を使って、Oracleの構文でかいますが、

select * from table a, ( select max(ID) as ID from table ) b where a.ID = b.ID

って手もあります。サブクエリーがだめなら、こっちもだめな気しますが。
582NAME IS NULL:2006/01/04(水) 01:46:35 ID:???
>>579
MySQLなら>>577さんも書いてあるけど、ORDER BY ID DESC LIMIT 0,1 でOKじゃね。
583NAME IS NULL:2006/01/04(水) 07:10:10 ID:???
>>578
書いた後に自分もそう思った(w
何故か最近SQLServerやってて...
正月ボケだな
584NAME IS NULL:2006/01/04(水) 17:24:01 ID:???
このSQLは「t_permのc1がタで始まる部分を全て抽出」であっていますでしょうか?
select * from t_perm where c1 regexp '^タ';

また、「t_permのc1がタで始まらない部分を全て抽出」という
場合はどう記述すべきでしょうか?
585NAME IS NULL:2006/01/04(水) 17:56:54 ID:???
質問させてください。
日付型[yyyy/mm/dd hh:mm:ss]から特定時間帯(例えば22:00〜翌05:00)を抽出するにはどうしたらよいでしょうか?
586NAME IS NULL:2006/01/04(水) 17:59:38 ID:???
DBMSくらい書けよ
587NAME IS NULL:2006/01/04(水) 18:14:27 ID:???
>>586
すみません。ASAです。
588NAME IS NULL:2006/01/04(水) 18:47:07 ID:6n7ZUbwc
ASAって何?
589NAME IS NULL:2006/01/04(水) 18:48:38 ID:???
谷岡ヤスジ
590NAME IS NULL:2006/01/04(水) 19:44:34 ID:???
>>587
お前は誰だよ
591NAME IS NULL:2006/01/04(水) 19:52:55 ID:???
ごめんなさい。もう一度書き直しますね。

Adaptive Server Anywhere(ASA)において
日付型[yyyy/mm/dd hh:mm:ss]から特定時間帯(例えば22:00〜翌05:00)を抽出するにはどうしたらよいでしょうか?
592NAME IS NULL:2006/01/04(水) 22:43:58 ID:s7aUH/mP
25日移動平均を求めるSQL文ってありますかね?
593NAME IS NULL:2006/01/04(水) 22:46:49 ID:???
>>592
テーブルの作りによると思うが。
まあ一々SQLでやるより、配列に取り出してオンメモリで計算したほうが。
同じデータを何度も触ることになるからね。
594NAME IS NULL:2006/01/04(水) 22:51:55 ID:???
>>593
やはりそうですか。。。
ありがとうございます。
595NAME IS NULL:2006/01/05(木) 00:34:55 ID:???
>>591
http://www.ianywhere.jp/dl/dl_prd.html
これのSQL リファレンス・マニュアル98ページあたりをみるかぎりでは、
ふつうに between '2006/01/01 22:00:00' and '2006/01/02 05:00:00'
でいけそうなきがするけどだめでした?
つーか、マニュアルあるんじゃん。
596NAME IS NULL:2006/01/05(木) 01:47:42 ID:???
>>595
レスありがとうございます。

>between '2006/01/01 22:00:00' and '2006/01/02 05:00:00'
これは使えました。

たとえば、日付を指定せずに22:00から翌日05:00:00にかけての時間帯を指定するのは次のような書き方で良いのでしょうか?
なんだか愚直すぎる気が…。

case
when
dateformat(日付,'hh:mm:ss') between '22:00:00' and '23:59:59'
or
dateformat(日付,'hh:mm:ss') between '00:00:00' and '05:00:00'
then
処理
end

データベースと名付くものをはじめて触ったので苦戦中です。
楽しいけど。
597NAME IS NULL:2006/01/05(木) 01:48:21 ID:???
株とか為替か。何度も使うなら25日平均のテーブル作ったら?
毎日数回計算して値を更新するスクリプト動かせばいいと思う。
他にもRSIとか一目均衡表とかいろいろ使うだろうし。
598595:2006/01/05(木) 01:56:09 ID:???
>>596
申し訳ない。よくみてなかった。そういうことでしたか。
datepart(hour,日付) not between '5' and '21'とか。
599NAME IS NULL:2006/01/05(木) 09:10:28 ID:lHvidXxf
移動平均を求める関数はoracleにあったはず
600596:2006/01/05(木) 09:18:07 ID:???
>>598
いえいえ、ありがとうございます。
そか、否定が使えるのか。勉強せんといかんなぁ。
601NAME IS NULL:2006/01/05(木) 10:15:51 ID:lHvidXxf
5時ジャストと
22時ジャストはどうなん?
602NAME IS NULL:2006/01/05(木) 10:23:33 ID:???
BETWEENは、<=、 >= だからなあ
含めたくなければ不等号式2つで。

PostgreSQLだと時間の足し算できるけど、他は無いのかな。
603NAME IS NULL:2006/01/05(木) 13:06:51 ID:K23g72eh
オラクルなんですが、
Aテーブルに親品番、子品番、Bテーブルに品番、品名がそれぞれあります。

たとえば、親品番が12345、子品番が33333
もしくは、親品番が67890、子品番が44444のデータを取得したいとします。

SELECT A.親品番,B1.品名,A.子品番,B2.品名
FROM A,B B1,B B2
WHERE A.親品番=B1.品番 AND
A.子品番=B2.品番 AND
(A.親品番='12345' AND
A.子品番='33333') OR
(A.親品番='67890' AND
A.子品番='44444')

というSQL文になると思うんですが、SQL PLUSで実行しても結果が返ってきません。
ちなみに、

SELECT A.親品番,B1.品名,A.子品番,B2.品名
FROM A,B B1,B B2
WHERE A.親品番=B1.品番 AND
A.子品番=B2.品番 AND
(A.親品番='12345' AND
A.子品番='33333')

だと帰ってきます。
どなたか原因教えてください。 
604NAME IS NULL:2006/01/05(木) 14:04:31 ID:???
カッコがないからじゃ?
605NAME IS NULL:2006/01/05(木) 14:07:24 ID:???
おれもOracle歴全然なんで違ったらえろいひとフォローよろすく。

SELECT
A.親品番
, B1.品名
, A.子品番
, B2.品名
FROM
A
, B B1
, B B2
WHERE
A.親品番 = B1.品番
AND A.子品番 = B2.品番
AND ((A.親品番 = '12345' AND A.子品番 = '33333') OR (A.親品番 = '67890' AND A.子品番 = '44444'))

書き方独特ですまそ...orz
606NAME IS NULL:2006/01/05(木) 14:14:04 ID:???
andとorの優先順位について調べてみ

1+1*9
の結果を考えてみ
607NAME IS NULL:2006/01/07(土) 03:35:47 ID:???
22:00-5:00ってニューヨーク市場?
608NAME IS NULL:2006/01/09(月) 09:06:36 ID:???
Oracle10gR2なのですが、特定の条件によって、抽出するレコードを取捨選択する事は可能でしょうか?

テーブルは試験区分コード、学籍番号、科目コード、点数となっていて、
2005年1学期中間、山田太郎、数学、94
2005年1学期中間、山田太郎、現国、32
2005年1学期中間、山田太郎、現国(追試)、58
2005年1学期中間、山田太郎、英語、87
2005年1学期期末、山田太郎、数学、78
2005年1学期期末、山田太郎、現国、67
2005年1学期期末、山田太郎、英語、43
2005年1学期期末、山田太郎、英語(追試)、76

実際には試験区分や学生、科目などはコードですが、こんな感じでレコードが存在します。
このデータを抽出するときに、追試のデータが存在した場合、正規の試験を抽出せずに追試のデータを出したいのです。
つまり、上記のデータの場合、山田太郎の2005年1学期中間を条件に抽出する場合、
現国で追試を受けているので、
2005年1学期中間、山田太郎、数学、94
2005年1学期中間、山田太郎、現国(追試)、58
2005年1学期中間、山田太郎、英語、87

といったデータを抽出したいのですが、可能なのでしょうか?
609NAME IS NULL:2006/01/09(月) 09:32:45 ID:???
科目コード次第じゃないの?
MAXなんかで取れば良いんじゃない
あと追試の方が点数悪かったらどうすんのYO
610608:2006/01/09(月) 09:43:39 ID:???
一応、科目コードで追試は正規試験の科目コードに1を加算した値になっています。
つまり、現国がZ100なら現国(追試)はZ101といった具合に。
しかし、科目コードをMAXで単純には取れないと思うのですが?

追試の方が点数悪かった場合ですが、まったく考慮しなくてOKです。
考慮するのは追試を受けたかどうかであり、追試を受けた場合は無条件で追試の点数を採用します。
つまり、実際にはありえないのですが、正規試験で100点を取ったのに
追試で0点なら、無条件で0点です。
611NAME IS NULL:2006/01/09(月) 09:49:51 ID:???
もっとやりやすい設計にすりゃ良かったのに……
612608:2006/01/09(月) 09:55:40 ID:???
>>611
ごもっともです。

しかしながら、私が赴任したときには既にこのテーブル構造であり、
データベースは今回バージョンアップしたみたいなのですが、
既存システムやら過去データの関係で、そのままのテーブル構造で
データ移行したようなので、何とも言えません。
613NAME IS NULL:2006/01/09(月) 10:13:39 ID:???
MAXとサブクエリ使えば一発だべ
614NAME IS NULL:2006/01/09(月) 11:00:31 ID:5shPHhyC
>>608
CASE式
615NAME IS NULL:2006/01/09(月) 11:10:50 ID:5shPHhyC
試験区分が最大の行を取得すればいい
分析関数かサブクエリでも使えばいい

ORACLESQLパズルに似たようなSQLがあるだろ
616NAME IS NULL:2006/01/09(月) 11:14:53 ID:Vki8VgXj
SQLの質問になるかわかりませんが、
カラム位置ってなんですか?
賢い皆様、教えてください
617NAME IS NULL:2006/01/09(月) 11:17:57 ID:???
オラわかんねぇだ
618NAME IS NULL:2006/01/09(月) 11:32:52 ID:5shPHhyC
SLECT*
WHERE
科目コード
iN
科目コードの先頭三文字でグループ化したなかでの最大の科目コードリスト
619NAME IS NULL:2006/01/09(月) 16:34:43 ID:wE23WMKS
年月、品名、数量
--------------
2005、品A、2000
2006、品A、3000
2005、品B、1000
2006、品B、1500

このようなデータがあって、下記のような表を作る場合、
どうやってますか?
SQL一発でもってこれる?

年月|品A|品B
-------------
2005|2000|1000
2006|3000|1500
620NAME IS NULL:2006/01/09(月) 16:38:01 ID:5shPHhyC
>>219
品物コードでDECODEかCASE式を使ってサマリ
621NAME IS NULL:2006/01/10(火) 10:54:50 ID:???
はじめまして。
-- 最近データベース(postgres)を始めたものです。
-- 大量のUPDATEを発行し返答を見ていたのですが、
-- UPDATE 1に紛れてUPDATE 0が出ていました。
-- 当てずっぽうですが、これはUPDATEのWHERE句でマッチするものがなかった、と思い、
-- 主キー(WHEREは主キーしか見ていない)が全てあるかどうかを調べることにしました。
そこで、下記のような表で、3を見つけ出すようなSQLを書きたいのです。
割り算を使うとうまくいくような気がするのですが、書き方が分かりません。
どんな風に書けばいいでしょうか?

table_1
code
---
1
2
3
4

table_2
code
---
1
2
4
622NAME IS NULL:2006/01/10(火) 11:06:27 ID:???
>>621
差集合
623NAME IS NULL:2006/01/10(火) 11:24:29 ID:ZSzgEvxU
差集合の書き方もわかんないんじゃね?
624621:2006/01/10(火) 11:45:51 ID:???
>>622
SELECT * FROM table_1 EXCEPT SELECT * FROM table_2;
コレでうまくいきました。ありがとうございます。

>>623
はい、わからなかったので、ググりました。
625NAME IS NULL:2006/01/10(火) 15:10:43 ID:CJlFymHA
以下のようなテーブルの在庫数が0以外を
select したい場合のSQLの書き方を教えてください。

品名 在庫数
A   0
B   1
C   2
626NAME IS NULL:2006/01/10(火) 15:12:42 ID:???
WHERE 在庫数<>0
627NAME IS NULL:2006/01/12(木) 14:27:17 ID:???
TRIM(hoge)
ってどういう意味があるの?
628NAME IS NULL:2006/01/12(木) 14:40:35 ID:???
629NAME IS NULL:2006/01/12(木) 14:47:50 ID:iP3LgLdS
630NAME IS NULL:2006/01/12(木) 15:09:09 ID:???
ありがとうございます
631NAME IS NULL:2006/01/13(金) 18:09:03 ID:VEBk1h9W
PostgreSQL7.3です。
以下のような構造のテーブルがあります。

NO GROUP ORDER
1   1     1
2   1     2
3   1     3
4   2     1
5   2     2

NOはシーケンスのプリマリキーで、
GROUPはグループ分け用のナンバーで、
ORDERというのは並び順なのですが、
例えばGROUP1の並び順1と2を逆にする(値を交換する)場合は、
どのようにUPDATEを行えばよいのでしょうか?
(交換時は順位を変更するレコードのNOしかわからない)
632NAME IS NULL:2006/01/13(金) 18:47:55 ID:???
plpgsql で swap 関数作るんじゃダメ?
633NAME IS NULL:2006/01/13(金) 21:42:54 ID:???
SET order=3-order
634login:Penguin:2006/01/13(金) 21:43:21 ID:???
update 3回。
1).1 -> 999
2).2 -> 1
3).999 -> 2

999はレコード上あり得ない数字や文字。
635NAME IS NULL:2006/01/14(土) 01:14:30 ID:???
>634

3回はダサいな。1回のUpdateでやれるぞ。
http://www.geocities.jp/mickindex/database/db_case.html

の4番
636631:2006/01/14(土) 02:42:12 ID:vVKmarWQ
>>632
関数に関しては勉強不足なので勉強してみます。
>>633
勉強不足で理解できません。すいません
>>634
これは自分も考えたのですが、もっと簡単にできないのかなあと思いました。
ちなみに、UPDATE時に順位を変更するレコードのプライマリキーしか
分からない場合は、selectを二回行ってさらにupdate三回行うという事になってしまいました。

>>635
おっ、ありがとうございます。
かなり近そうな情報です。
637NAME IS NULL:2006/01/14(土) 13:10:32 ID:V3H4F1gM
UPDATE
SET
KEY = CASE KEY
WHEN A THEN (SELECT Bのキー)
ELSE (SELECT Bのキー)
WHERE KEY IN (A,B)
638NAME IS NULL:2006/01/14(土) 17:16:59 ID:oOx/pn3s
Datetime型のフィールドを更新したのですが、うまくいきません。
2005年1月14日をいれるにはどうすればよろしいでしょうか?

Update R_event
Set ew_date = 2005-01-14
639257:2006/01/14(土) 23:30:33 ID:???
引き算にしか見えないが。。。
640638:2006/01/15(日) 10:15:24 ID:HxBAQqEv
マルチになってました。すいません。
'2005-01-14'と文字列にするようにアドバイスいただきました。
641639:2006/01/15(日) 15:10:32 ID:???
スマソ、257ってのは嘘だ。
別な板での番号。
642NAME IS NULL:2006/01/17(火) 02:07:53 ID:4WWcgr5p
どうしてもわかりません。教えてください。

○はPRIMARY KEY

部門(○部門番号、部門名)
従業員(○従業員番号、部門番号、氏名、住所、年齢)
商品(○部品番号、部品名)
業者(○業者番号、業者名、住所、電話番号)
供給(○部門番号、○部品番号、○業者番号、単価、数量)

1.登録されているすべての部品の供給を受けている部門の部門番号の一覧
2.全従業員が30歳以上の部門の部門番号と部門名の一覧
643NAME IS NULL:2006/01/17(火) 02:54:28 ID:???
> 商品(○部品番号、部品名)

これは 部品(○部品番号、部品名) の間違いかな?

> 1.登録されているすべての部品の供給を受けている部門の部門番号の一覧
SELECT 部門番号 FROM 部門 WHERE (SELECT count(部品番号) FROM 部品) = (SELECT count(*) FROM 供給 WHERE 部門.部門番号 = 供給.部門番号);

> 2.全従業員が30歳以上の部門の部門番号と部門名の一覧
SELECT * FROM 部門 WHERE NOT EXISTS (SELECT * FROM 従業員 WHERE 従業員.部門番号=部門.部門番号 AND 年齢 < 30);

眠いんで、質問の意図を取り違えているかもしれんが、とりあえず思いつきで。
もう少しいいSQLがあるかもしれん。特に1番目は苦しい。間違ってたらすマソ。
もう寝るZzz...
644NAME IS NULL:2006/01/17(火) 03:01:27 ID:???
1. 登録されている部品のうち、その部門に供給されていない部品がない部門
2. 29歳以下の従業員が所属せず、かつ従業員が1人以上所属する部門
645642:2006/01/17(火) 03:25:34 ID:???
>>643
私のような初心者にこんなに早くレスしてくれる人がいるなんて思ってませんでした。
ありがとうございます。
ご指摘のとおり商品は部品の間違いです。
上記の回答については現在検証中です。


>>644
視点を変えてみるのもいいかもしれません。
が、私のレベルではそれでも厳しいものがあるみたいです。
う〜ん
646NAME IS NULL:2006/01/17(火) 13:55:45 ID:???
SQL文を実行した結果の件数だけを取得する事はできませんか?
647NAME IS NULL:2006/01/17(火) 13:59:56 ID:fbrdujm0
>>646
count(*)
648NAME IS NULL:2006/01/17(火) 14:05:08 ID:???
>>646
結果の件数を何で取得したいわけ、例えば、クライアントにADOとか使ってて
それで取得するの?DBは何?
649NAME IS NULL:2006/01/17(火) 14:53:46 ID:???
>>647
SELECT count(*) FROM Hoge_table
できました♪ありがとう^^

>>648
そうです。
DBはOra10g。
件数を表示してuserにその後の動作を選択させようと思ったからなんですが。
650NAME IS NULL:2006/01/17(火) 14:59:13 ID:???
count(*)から聞いてるんじゃ先は長そうだな、、ガンガレ
651NAME IS NULL:2006/01/18(水) 02:22:43 ID:ebqLU//i
PostgreSQLで、ある項目が、ある条件で並べたときに何番目に来ているかを
調べるにはどうすればよいでしょうか?
やりたいことは、つまり、ランキング順位の取得です。
この項目は○位です、というのを、全項目を取得せずに調べたいのです。
652NAME IS NULL:2006/01/18(水) 03:22:35 ID:???
知りたい項目の値より大きいのは何個あるか
653NAME IS NULL:2006/01/18(水) 07:24:27 ID:qaHbGZoA
>>651
相関サブクエリ
654NAME IS NULL:2006/01/18(水) 09:11:05 ID:5hePtDX3
655NAME IS NULL:2006/01/18(水) 10:34:39 ID:???
>>654
おもろいな
656NAME IS NULL:2006/01/18(水) 11:22:46 ID:???
657NAME IS NULL:2006/01/18(水) 11:31:17 ID:???
>>654
ワロタョwww
658NAME IS NULL:2006/01/18(水) 14:23:29 ID:???
質問させていただきます。
PostgreSQLのセッションセーブハンドラを使用して、セッションデータをデータベースに
保存しています。
仮にそのときのデータが $_SESSION["name"] = abc とするとき、ハンドラが自動的に

| sess_data  |
--------------
|name|s:3:"abc"|

と、保存するのですが、これをSQLコマンドか、あるいはその他の方法によって、
元のデータである"abc"だけ呼び出すということはできないでしょうか?

なにぶんプログラミング初心者なもので、お見苦しい質問かもしれませんが、
なにとぞよろしくお願いします。
659NAME IS NULL:2006/01/18(水) 15:27:56 ID:/Fv5JqrR
Oracle9iで作業をしております。

テーブルAに[Code][Name]が定義されていて、
テーブルBに[ID][Code][Name][その他もろもろ・・・・・・]とあります。
テーブルAで[Name]が変更されたとき、テーブルBにもそれを一発で反映させたいのですが、どのようにしたらよいでしょう?
(テーブルAのデータを元にして、テーブルBのデータを全て更新したい。)

UPDATE テーブルB SET [Name]=
の後がさっぱりわかりません。
片っ端から書いて試してはみたんですが、混乱が深くなりなにを試したのかすらわからなくなる始末で。
どうぞよろしくお願いします。
660NAME IS NULL:2006/01/18(水) 16:23:10 ID:???
>>659
質問内容が意味不明
661NAME IS NULL:2006/01/18(水) 16:28:15 ID:???
>>659
相関サブクエリ
662NAME IS NULL:2006/01/18(水) 18:02:32 ID:???
>>658
スレ違い。
unserialize(); //PHPの関数な

663662:2006/01/18(水) 18:07:35 ID:???
スレ違いつーより板違いだた。

ついでだが、
>>659
参照操作のCASCADEあたりかな。
664NAME IS NULL:2006/01/18(水) 21:01:40 ID:lvPTbbdm
DB2で、複数行を一度にinsertしたいのですが、どうすれば良いのですか?
私はvalues(変数,変数,変数)という文字列を行数分つくり、UNIONして登録みました。
これだと、変数がNULLの時、NULL値をUNIONしてしまい、エラーとなりました。

古いシステムのレスポンス改善作業で、SQLとJAVAソース以外は触れません。
665NAME IS NULL:2006/01/18(水) 21:21:27 ID:???
INSERTは一行づつやるのが前提だからそれは無理ってもんだ。

JAVAのループの方を改善できない?
666658:2006/01/18(水) 21:40:02 ID:???
>>662
ありがとうございます。助かりました m(__)m
667NAME IS NULL:2006/01/18(水) 22:35:38 ID:???
>>664

DB2はよくわかんないけど、

insert into table (column1, column2, column3)
select 変数1, 変数2, 変数3 from dual
union all
select 変数1, 変数2, 変数3 from dual
union all
select 変数1, 変数2, 変数3 from dual
union all
select 変数1, 変数2, 変数3 from dual;

てな感じはできんのかな?
668664:2006/01/18(水) 23:10:26 ID:???
ありがとうございます。

>>665
Javaの方はもう詰めようがないですね。
単純に登録作業だけなんです。

>>667
現在自宅なので試せませんが、
DB2にはDUAL表は無いです。
ただ、ダミーテーブルは使用できると思うので、
出社したらサブクエリを早速試してみます。
669NAME IS NULL:2006/01/19(木) 01:04:35 ID:???
values をselectにするとか
670659:2006/01/19(木) 08:21:12 ID:???
>>661,663
ありがとうございます。
ちょっと調べてみます。
671638:2006/01/19(木) 16:48:06 ID:kAVU9Skp
a   b   c   d
------------------------
A   2   be   3
A   9   re   44
A   1   qa   43
B   5   yt   11
C   2   uu   39
C   7   oi   55

このようなテーブルでaが同じだったらbの値が一番大きなものだけをを
取得したいのですが、どのようにすればよろしいでしょうか?

select a, b, c, d
from X
.
.
.


672NAME IS NULL:2006/01/19(木) 16:49:54 ID:???
>>671
このスレのどっかに答えがある
673NAME IS NULL:2006/01/19(木) 18:29:08 ID:???
GROUP BY と max() を使う
他の項目も欲しいならこのスレのどっかに(ry
674NAME IS NULL:2006/01/19(木) 18:55:30 ID:???
>>668
バルクインサートとかできないのかね??
675664:2006/01/19(木) 21:09:53 ID:???
結局、元通り、UNIONの方法を使いました。
ただ、NULL値をそのままUNIONするとエラーになるのを、
CAST(NULL AS CHAR)とかするとうまくいくことがわかりました。

>>669
SELECTでも固定値だと、NULLはそのままではUNION出来ませんでした。
DB2の仕様って結構ややこしいものです。

>>674
バルクインサートはDB2では聞いたことがないです。
調べても見つからないですね・・・。
676NAME IS NULL:2006/01/20(金) 01:22:37 ID:ABTPxWh0
カラム TEL に電話番号が xxx-xxxx-xxxx みたいな感じで入ってます。
これをユーザーから入力された電話番号で検索したいのですが、ハイフン無しで入力しても検索できるようにしたいです。
たとえば TEL に 03-1234-5678 と入ってるとき、03-1234-5678 で検索できるのはもちろん 0312345678 でも検索したいのです。
そこで、次のような WHERE条件にしようと思いました。

  WHERE ( TEL = '$tel' OR xxx(TEL) = '$tel' )

質問は上記 xxx(TEL) についてでして、値からハイフンだけを削除するような処理をどのように書けばいいか、ということなのですが、
何か具合のいい方法は無いでしょうか?
DB は PostgreSQL です。
677NAME IS NULL:2006/01/20(金) 02:06:57 ID:???
>>676
replace(tel,'-','')
678677:2006/01/20(金) 02:15:21 ID:???
老婆心

$telってのはPerlかPHPの変数だと思うのだけど、
SQLに埋め込む前にそちらもハイフンを取っとけば、
WHERE replace(tel,'-','') = '$tel'
だけで済む。
また、関数インデックスを作ってインデックス検索を
行わせることも可能になる。
679676:2006/01/20(金) 03:39:17 ID:???
>>677,678
おーすばらしい!
非常に単純に実現できてよかったです!
ありがとうございます!

>>678 のアドバイスもありがとうございます。
ただ、ハイフン付きで入力された場合には、ハイフンの位置まで合ってるものしか検索しちゃまずいかなという気がするので、
>>676 のようなクエリにするか、あるいは入力にハイフンが含まれてるかどうかで SQL を作り分けるしかないかと思います。
ところで、関数インデックスなんてものがあるのですね。
貴重な情報、これまたありがとうございます。
680NAME IS NULL:2006/01/20(金) 11:41:26 ID:90pLxJZI
Oracle9iで
テーブルのキーとなっている列が何なのか知りたいのですが、
これって普通にビューか何かで取得できたりするのでしょうか?
681NAME IS NULL:2006/01/20(金) 12:00:50 ID:PQZPCefo
>>680
スレ違い
682NAME IS NULL:2006/01/20(金) 12:14:10 ID:???
>>680
INFORMATION_SCHEMA.TABLE_CONSTRAINTSでわかる。
これはANSI SQL 92で規定されてるんでスレの範囲内なんだけど、
Oracleで使えるかどうかは知らん。
683NAME IS NULL:2006/01/20(金) 13:15:21 ID:???
>>680
オラクルスレ。
http://pc8.2ch.net/test/read.cgi/db/1132407420/
書きに行くなら、マルチと思われないよう気をつけれ。
684NAME IS NULL:2006/01/20(金) 14:25:53 ID:f0GEt5Kc
あるテーブルのプライマリキーとしてInteger型を使うことはよくあると思うんだけど、
そのとき、insert していくとなると、いちいち使われてないプライマリキーを探すための
select 文とか実行しなきゃいけないよね。

これって、みんなそうやってるもんなの? それとも、なにかもっといい方法ある?
685NAME IS NULL:2006/01/20(金) 14:28:56 ID:???
>>684
auto increment とか Unique Indentifier な列を使うんでない?
686NAME IS NULL:2006/01/20(金) 14:29:30 ID:f0GEt5Kc
http://www.sqlite.org/faq.html#q1
SQLite では自動的にやってくれるらしい。ありがてえ〜
687NAME IS NULL:2006/01/20(金) 19:32:03 ID:LfAl3oMP
SQL Loaderでエラーとなったレコードがbadfileに出力されますが、
badfileの各行の先頭に、入力CSVファイルの行番号を付ける方法はありませんか?

例えば元々のCSVファイルが
1行目:a,b,c
2行目:d,e,f
3行目:g,h,i
で2行目がインポート失敗になった場合、
badfileは
1行目:2,d,e,f
となる。
688NAME IS NULL:2006/01/20(金) 19:35:23 ID:???
>>687
>683 名前: NAME IS NULL [sage] 投稿日: 2006/01/20(金) 13:15:21 ID:???
>>680
>オラクルスレ。
>つhttp://pc8.2ch.net/test/read.cgi/db/1132407420/
>書きに行くなら、マルチと思われないよう気をつけれ。
689NAME IS NULL:2006/01/20(金) 19:37:46 ID:LfAl3oMP
これはSQL自体の問題ではないのかもしれませんが、教えてください。

wshでVBScriptを動かし、
VBScriptのループ内でsqlplusを使用してinsertを繰り返し行いたいとします。

まずVBScriptの始めに
Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.Run "sqlplus aaa/bbb@dbname"
を行い、sqlplusを起動、DBコネクトを行います。
その後、sqlplusに対して、コマンド(insert文)を実行させたいのですが、
やり方がわかりません。
690NAME IS NULL:2006/01/20(金) 19:39:35 ID:???
>>689
わかってるならw
書きに行くなら、マルチと思われないy(ry
691NAME IS NULL:2006/01/20(金) 19:40:42 ID:LfAl3oMP
>>690
すいません。
ですが、カテゴリーがグレーな問題はよくあるんです。
692NAME IS NULL:2006/01/20(金) 19:42:27 ID:???
>>691
とりあえずSQLとは関係ない。VBScriptかOracleのどっちかへ行け
書きに行くなら、マルチt(ry・・
693NAME IS NULL:2006/01/21(土) 06:38:26 ID:???
>>689
手っ取り早い方法として、コマンドを記述したファイルを容易しておき、
そのファイル名をSQLPlusの引数に渡してSQLPlusを実行する。
694NAME IS NULL:2006/01/21(土) 08:36:48 ID:4J/aRi5Q
>>693
SQLLDR
695NAME IS NULL:2006/01/21(土) 08:56:38 ID:???
なんでスレ違いに答えちゃう我慢できない答えたがりがいるんだ?
696NAME IS NULL:2006/01/21(土) 09:13:11 ID:???
>>694
Insert文だけだから、SQLLDRでもいいね。実行するのがクライアント側なら
SQLPLUSがいいかもめ。
答えたがりだけど、別に答えれるなら答える。
あんま、スレ違いとかあんま気にしてない。
697NAME IS NULL:2006/01/21(土) 09:16:06 ID:???
じゃあ何でも質問スレに変えようぜ
698NAME IS NULL:2006/01/21(土) 09:20:43 ID:???
>>697
変えたければ、勝手に変えてくれ。俺は知らんけど。
699NAME IS NULL:2006/01/21(土) 17:14:51 ID:Xl6mwZUm
ハァ?
700NAME IS NULL:2006/01/24(火) 20:38:44 ID:PVMwsx9M
DBMSはMSSQ2LKです。
以下の表から
id| col1
--+-----
1 | 005
2 | 001
1 | 002
2 | 007
以下のような結果を得るにはどうすればいいですか?
id| col1
--+-----
2 | 001
2 | 007
1 | 002
1 | 005
やりたい事は「id」でグループ化して「id」「col1」の昇順でソートした後
グループは崩さずに各グループの先頭行の「col1」の昇順で並び替えたいです。
701NAME IS NULL:2006/01/24(火) 20:56:54 ID:???
ORDER BY id DESC,col1 じゃ駄目なの?
グループ化ってどういう事?
702NAME IS NULL:2006/01/24(火) 21:01:10 ID:???
>>700
なんか日本語が変な気がするのでデータだけ見て答えると、
order by id desc, col1 asc
703700:2006/01/24(火) 21:30:33 ID:PVMwsx9M
舌足らずですいません。
うまく説明できないのでデータ増やします。
以下の表から
id| col1
--+-----
1 | 005
2 | 001
1 | 002
2 | 007
3 | 003
3 | 004
以下のような結果を得るにはどうすればいいですか?
id| col1
--+-----
2 | 001
2 | 007
1 | 002
1 | 005
3 | 003
3 | 004
704NAME IS NULL:2006/01/24(火) 21:32:51 ID:???
>>703
規則性が分からない
705NAME IS NULL:2006/01/24(火) 21:41:13 ID:???
今年になってから、データベース(SQL鯖2000)を触り始めたのですが、

1 クエリとビュー
2 ユーザ定義関数とストアド
の違いって何でしょう?
特にUDFとストアドのl使い分けがよく分からない・・・

706NAME IS NULL:2006/01/24(火) 21:58:34 ID:???
>703 舌足らずは発音の問題。言葉足らずといいませい。
order by col1, id
ですむ問題?

>705 は SQL鯖スレに池
http://pc8.2ch.net/test/read.cgi/db/1123981539/l50
707NAME IS NULL:2006/01/24(火) 22:21:25 ID:???
>>705
A2 関数とプロシージャの違いだ。
708NAME IS NULL:2006/01/24(火) 22:36:18 ID:???
>>703
select id, col1 from (
select a.id, a.col1, b.col_top from table700 a
join (select id, min(col1) as col_top from table700 group by id) b
on a.id = b.id
) c order by col_top, col1 
709NAME IS NULL:2006/01/24(火) 22:56:05 ID:???
>>708
ありがとうございます。
それで行けそうなのでやってみます。
710NAME IS NULL:2006/01/24(火) 23:04:34 ID:iiwd5C2f
「TEST」ユーザに紐付くテーブルをエクスポートし、
「TEST2」ユーザに紐付くテーブルへインポートしたら
ユーザーが違うって感じのワーニングが出て
インポートできませんでした。

どうすれば、異なるユーザ間のエクスポート→インポートが
できるのでしょうか?
711NAME IS NULL:2006/01/24(火) 23:12:04 ID:???
>>710
環境依存の内容だから専用スレへ
712NAME IS NULL:2006/01/25(水) 11:27:13 ID:???
>>700
規則が分からんが
order by句でサブクエリを使えばいいんじゃね
713NAME IS NULL:2006/01/25(水) 12:16:48 ID:???
>>700
ID毎にまとめて表示させたいんじゃが、ID毎の並びはcol1の値の小さい順にって事か?
714NAME IS NULL:2006/01/25(水) 12:34:54 ID:???
>>713
なーるほど。お前頭良いな。
715NAME IS NULL:2006/01/25(水) 13:07:32 ID:???
だったら
select * from table700 a
order by (select min(b.col1)
from table700 b
where b.ID = a.ID),col1

じゃね?
716NAME IS NULL:2006/01/25(水) 15:07:50 ID:j0RfaozO
>>713
その通りです。日本語が思いつかなかったです。

>>715
それだと、例えば以下のデータにしたとき
id| col1
--+-----
1 | 005
2 | 001
1 | 002
2 | 007
3 | 003
3 | 004
4 | 001 ← 増やしました。

以下のような結果になってしまいます。
id| col1
--+-----
2 | 001
4 | 001
2 | 007
1 | 002
1 | 005
3 | 003
3 | 004
本当はこうなるのを期待しているのですが
id| col1
--+-----
2 | 001
2 | 007
4 | 001
1 | 002
1 | 005
3 | 003
3 | 004

分かったら教えて下さい。
717NAME IS NULL:2006/01/25(水) 15:16:28 ID:???
>>716
注文が多いのう
where b.ID = a.ID), col1

where b.ID = a.ID), id, col1
718NAME IS NULL:2006/01/25(水) 15:43:41 ID:???
>>717
ありがとうございます。
Order by句にサブクエリ書けるのすら知らなかったので勉強になりました。
精進します。
719NAME IS NULL:2006/01/26(木) 17:08:57 ID:???
すれ違いだったらごめん。
ソースの中からSQL文だけを抜き出すツールって無いかな?
DBのバージョンUPすることになったんだけど、
ソースの中にSQLが散っていて、クエリの検証が出来ない…orz
720NAME IS NULL:2006/01/26(木) 17:10:46 ID:???
何のソースだよ
721719:2006/01/26(木) 17:14:00 ID:???
あ、ごめん、PHPです。
722NAME IS NULL:2006/01/26(木) 17:26:27 ID:???
スレ違いだな。それ以前に俺は知らないが。
723NAME IS NULL:2006/01/27(金) 00:12:21 ID:???
echo "【".$sql."】";
724NAME IS NULL:2006/01/27(金) 10:52:08 ID:???
それ考えたけど、実行しないと出力できないじゃん

まあgrepでいいとおもうんだけどなー
725NAME IS NULL:2006/01/28(土) 01:31:42 ID:???
下記のような顧客の月度別売上データがあったときに、
その顧客の最新売上データを取得するにはどうすればよいでしょうか?

IDでグループ化して売上のMAX値を出すViewを作成して、
そのViewをテーブルにInner Joinして出すしかないのでしょうか?
View一本で出来るのでしょうか?


ID | Date | Uriage
----+-------+--------
AA | 200501 | 2000
AA | 200502 | 3000
AA | 200503 | 1000
BB | 200501 | 5000
BB | 200502 | 2500
CC | 200501 | 2000


おなじように、商品マスタの最終更新データも取り出したいのですが、
View1本で出来ないのか悩んでいます・・・
726NAME IS NULL:2006/01/28(土) 02:35:12 ID:???
厳密にはSQLではないんですが・・oracleのdecode関数で評価式を
常に真にするような方法はあるんでしょうか??
727NAME IS NULL:2006/01/28(土) 03:01:08 ID:???
>>726
decodeはほぼcaseと等価だから話題にしてもかまわないと思うけど、
評価式を常に真というくだりをもっと具体的に説明してくれ。

>>725
またかよwこのスレの1-764くらいは目をとうそうな。
728NAME IS NULL:2006/01/28(土) 12:50:20 ID:???
目を凍瘡?
729NAME IS NULL:2006/01/28(土) 12:52:15 ID:???
国語の教科書に目を通した方が良さそうだなwwwwwwwwwwwwwwwwww
730NAME IS NULL:2006/01/28(土) 17:41:42 ID:???
typoごときで喜んでもらえるとはお前らもら単純だね。
正誤表をだしとくよ。
誤)目をとうそうな。
正)目をとうそう(←なぜか変換できない)な。
731NAME IS NULL:2006/01/28(土) 20:03:26 ID:???
こういうのをtypoといって誤魔化すあたりが。
732725:2006/01/28(土) 23:36:28 ID:???
>>727
1-764まで目をとうそうとしたのですが、
731までしか確認できませんでした、私のPCがおかしいのでしょうか?
でも、>>241にあった回答を参考にしました

select * from Table where (ID,Date) in (select ID,max(date) from table group by ID)

こうですか?

ちなみにMS SQL Server 2000 でも大丈夫ですよね
来週までテストできないもので・・・
733NAME IS NULL:2006/01/29(日) 00:13:15 ID:???
>>727
selectで、'文字列'を使わずあるカラムの値は全て、常に、固定の文字列を
表示させたいんです。
734NAME IS NULL:2006/01/29(日) 00:23:31 ID:???
>>732

> 1-764まで目をとうそうとしたのですが、
> 731までしか確認できませんでした、私のPCがおかしいのでしょうか?
> でも、>>241にあった回答を参考にしました

その生真面目さに惚れた。
735NAME IS NULL:2006/01/29(日) 00:43:22 ID:???
>>732
select * from Table where (ID,Date) in (select ID,max(date) from table group by ID) 

残念MSSQLでは無理。Oracleの独自構文じゃないかな。MyとかPostgreとかはどう?
736275:2006/01/29(日) 00:59:55 ID:???
>>735
そうなんですか・・・・
MSSQLでは出来ないのでしょうか?もう少し悩んでみます
737NAME IS NULL:2006/01/29(日) 01:14:14 ID:???
>>735
PostgreSQLなら使えるが、これって独自構文になるの?
独自構文ならDISTINCT ONを使えばもっとスマートにかけるかな。

in述語でサブクエリを使うのなら、JOINさせても速度的には変わらないと思うが、
たとえexistsに書き換えてもインデックスが効かない限り似たようなもんだろ。

View1本ってのにイマイチわかんないのだけど、こんなのもありかな。
SELECT id,max(date)AS dat,(SELECT uriage FROM Table WHERE T1.id=id AND max(T1.date)=date)
FROM Table AS T1 GROUP BY ID;
738NAME IS NULL:2006/01/29(日) 06:55:23 ID:fVRFGgcX
ORACLE独自のMERGE文て、あまりサンプルとかも見ないんですが、
実業務では使われているのでしょうか?
739NAME IS NULL:2006/01/29(日) 08:34:37 ID:dA0xHFxT
>>736
相関サブクエロ
を使う
740NAME IS NULL:2006/01/29(日) 08:49:40 ID:???
>>735
テクニカルエンジニア(データベース)の参考書に

IN述語 ::= 行値構成子 [NOT] IN 副問合せ | 値式 [NOT] IN (値式コンマリスト)
行値構成子 ::= 値式 | (値式コンマリスト) | (問合せ式)
副問合せ ::= (問合せ式)

ってあるから標準SQLでもOKじゃね?
741NAME IS NULL:2006/01/29(日) 15:12:59 ID:dA0xHFxT
テクデはJISだから
742NAME IS NULL:2006/01/29(日) 19:57:51 ID:???
だからORACLE固有じゃないって
743NAME IS NULL:2006/01/30(月) 00:29:16 ID:???
まったくのあてずっぽうだけど、エントリーレベルの条件には含まれてないのかも。
ところでこんな書き方はあり?
where (a, b) in ((1, 'a'), (2,'b'))
つまり複数カラムを対象にサブクエリを使わないで in を使えるかどうかですけど。
744NAME IS NULL:2006/01/30(月) 09:22:19 ID:fHdEtPEq
すまんがだれかおしえてくれんかのう?
kurumaというテーブルがあり、
syasyu, haiki, baikyakubi
カローラ, 1500, 2005-10-28
カローラ, 1500, 2005-11-29
ティーダ, 1500, 2005-11-04
ティーダ, 1800, 2005-12-24
アクセラ, 1600, 2005-12-10
アクセラ, 1500, 2006-01-10
というデータがあるとして、
車種ごとの最新の売却日でデータをまとめるにはどうすればいい?
たとえば
カローラ, 1500, 2005-11-29
ティーダ, 1800, 2005-12-24
アクセラ, 1500, 2006-01-10
と出したいんですが。
select syasyu, haiki, baikyakubi from kuruma
group by syasyu having max(baikyakubi);
ではダメみたいで。
つかってるのはMySQL4.0系とかねやんMySQLAdminです。
簡単なことかもしれないんですが誰か助けて〜!!
745NAME IS NULL:2006/01/30(月) 09:35:33 ID:???
>>744
このスレのどこかに答えはある
746NAME IS NULL:2006/01/30(月) 10:58:51 ID:???
>>744
サブクエリを使えないんだったら
MySQLのマニュアルのどこかに答えはある
747NAME IS NULL:2006/01/30(月) 11:21:56 ID:GHCJnnU6
745,755さんレスどーもです。
>>このスレのどこかに答えはある
>>サブクエリを使えないんだったら〜
それらしきレスはあるんですがサブクエリを使うんです。
mysql4.0系なんでサブクエリつかえないんですよ。
ほんとはpostgresqlでやる予定なんですが実際のデータが
なぜかインポートできなくて(copyでcsvを入れようとすると文字コードが違うみたいなエラーが出る。)
とりあえずPCにはいってるMySQLを使ってます。
とりあえずマニュアル読んでみます。
748NAME IS NULL:2006/01/30(月) 12:03:39 ID:???
select distinct syasyu, haiki, baikyakubi from kuruma a
Left join kuruma b
on (a.baikyakubi < b.baikyakubi
and a.syasyu= b.syasyu)
where b.baikyakubi is null
749NAME IS NULL:2006/01/30(月) 12:17:07 ID:???
distinctはいらない

select syasyu, haiki, baikyakubi from kuruma a
Left join kuruma b
on (a.baikyakubi < b.baikyakubi
and a.syasyu= b.syasyu)
where b.baikyakubi is null
750NAME IS NULL :2006/01/31(火) 12:11:35 ID:???
質問なんですが今まで使えてたのに知らないjavaが・・とか
エラーが増えてきたのはバージョンアップしてないからでしょうか?

新規インスコじゃなく現状のをバージョンアップする方法を教えてください。
751NAME IS NULL:2006/01/31(火) 12:28:06 ID:???
超能力者プリーズ
752NAME IS NULL:2006/01/31(火) 12:49:21 ID:???
このスレタイでSQLに関係ない質問だと、SQLServer関連だろか・・
しかしOracleのクライアントツールがJAVAなのいは知ってるがSQL Serverは知らんからな。。
753NAME IS NULL:2006/01/31(火) 14:43:23 ID:???
データベースに総合スレがないからここをSQL-DB何でも相談室と
誤解するやつらが後を絶たない。だれか総合案内スレ立ててくれんかの。
ちなにみここはSQL言語についてのスレ。

>>750
せめて環境くらい書けば誘導はしてあげるよ。
754NAME IS NULL:2006/01/31(火) 15:04:42 ID:???
755NAME IS NULL:2006/01/31(火) 17:34:26 ID:???
>>754
タイトルがよくないよ。ネタスレにしか見えない。
756NAME IS NULL:2006/01/31(火) 18:34:20 ID:bxhHT1jk
view-source:をいれても「指定されたパスが見つかりません」と
なってソースが見れないんですけどなんででしょうか?
前は見れたのに。。。
757NAME IS NULL:2006/01/31(火) 18:43:40 ID:???
758NAME IS NULL:2006/02/01(水) 21:38:06 ID:rRb9FyVJ
asp.netとSQL_serverを使っています。
Select文でちょっとお聞きします。
テーブルに「あいう」「かきく」「たちつ」「なにぬ」というデータがあり、問題は
Likeを使い「き」と「なに」を取り出したいのです。
要するにYahooなどの検索をテーブル内でしたくのですが、うまくいきません
SELECT hoge AS [@item]
FROM hage
WHERE (oge LIKE @name)
というストアドで、「@name」の部分はどんな書式にすればいいのでしょうか?

「@name」を「'%き%') AND (oge LIKE '%なに%'」と書き換えればデータは取れるのですが
ASP側で検索する際には「あ」だけかもしれないし、「い」「つ」「き」の3種類になるかもし
れないので、@nameにぶち込む書式を教えてください。
文盲スマソ
759NAME IS NULL:2006/02/01(水) 22:17:44 ID:???
スレ違いでした。別スレで聞いてきます
760NAME IS NULL:2006/02/06(月) 14:22:47 ID:???
下記のテーブルがあるとし、test_tableのdata2,data3は
test_masterのidを外部キーとしています。
そのとき、Resultのようにtest_masterのnameを参照された
データを出力するにはどうしたらいいですか?

test_table:
data1 data2 data3
---
1 1 1
2 1 2
3 2 2

test_master:
id name
---
1 aa
2 bb
3 cc

result:
XXX XXX XXX
---
1 aa aa
2 aa bb
3 bb bb
761山崎 渉:2006/02/06(月) 15:16:52 ID:sJKJrdmI
     ∧_∧ 
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
762NAME IS NULL:2006/02/06(月) 15:43:41 ID:???
>>760
select句でサブクエリか
外部結合
763NAME IS NULL:2006/02/06(月) 15:57:25 ID:???
外部結合なら
SELECT data1, a.name, b.name FROM test_table
LEFT OUTER JOIN test_master a ON data2 = a.id
LEFT OUTER JOIN test_master b ON data3 = b.id
764760:2006/02/06(月) 16:20:04 ID:???
>>762
>>763
ありがとうございます。動きました。
サブクエリなら
select data1,a.name,test_master.name from
(select data1,name,data3 from test_table,test_master where test_table.data2=test_master.id) as a,
test_master
where data3=id
こんな感じですか?

PHPから吐いているので、できればasを使いたくないのですが、
それは無理な話でしょうか・・・。
765NAME IS NULL:2006/02/06(月) 16:28:26 ID:???
VIEWを作れば間接的だが避けられる
766760:2006/02/06(月) 16:33:20 ID:???
>>765
そうですね、どうもviewが最も適切なようです。
ちょっと頑張ってみます。

ありがとうございました。
767NAME IS NULL:2006/02/06(月) 22:30:11 ID:wuuawFti
すみません!質問です!
SQLサーバーで金額にカンマをいれて表示したいのですが、どうすれば
よいでしょうか少数点も表示したくないのですが、
ご教授おねがいします(_ _)
768NAME IS NULL:2006/02/06(月) 23:22:42 ID:???
>>767
 全 部 テ キ ス ト 型 で 保 存 し ろ
769767:2006/02/06(月) 23:48:55 ID:wuuawFti
>>768
・・・
SQL質疑応答スレの住人のスキルはこの程度か
消防並みの回答だな、自分で考えた方がましだからもういいや

770NAME IS NULL:2006/02/06(月) 23:52:50 ID:???
だってお前馬鹿なんだもん。
まず第一にスレ違いだし、
第二にカンマは書式の問題だし
第三に小数点はデータ型の問題だし
第四に>>767の頭が悪い。
771767:2006/02/07(火) 00:07:35 ID:jHoApGYS
>>770
(´,_ゝ`)プ
こじつけばっかw
772767:2006/02/07(火) 00:15:08 ID:jHoApGYS
しょうがない日本語理解できない頭のわるいお前の為に
もう少し説明してやるわw
SQLサーバーで保存されているデータ例えば1000000.000を1,000,000でSQLで
selectしたいわけなんだわ、oracleならto_char関数つかえばできるんだが、
SQLサーバー経験の無い俺は聞いているわけなんだよ、解ったかね?
普通は解るとおもうんだが。。。
773NAME IS NULL:2006/02/07(火) 02:43:50 ID:???
第三者の俺からみると
>>768が馬鹿だな。
774NAME IS NULL:2006/02/07(火) 03:00:27 ID:???
それはそうと、SQLserverにはto_char関数がないのか?
あってもよさそうだと思うのだが。
775NAME IS NULL:2006/02/07(火) 09:23:24 ID:???
SQL質疑応答スレでSQL Serverの質問するやつが絶えないな・・・
776NAME IS NULL:2006/02/07(火) 09:25:04 ID:???
で、ちょっとググったら convert() 関数というのが出てきたけど、
これは使えないの?
777NAME IS NULL:2006/02/07(火) 09:25:38 ID:???
どう見ても767が馬鹿だろ?
表示なんてSQL鯖の問題じゃないことが理解できていない時点で。
778NAME IS NULL:2006/02/07(火) 13:57:05 ID:???
declare @MnyTemp money; select @MnyTemp = 1234567;
select '\' + convert(varchar, @MnyTemp, 1)
779NAME IS NULL:2006/02/07(火) 13:59:41 ID:???
間違えた 小数以下と¥不要だった。
select left(convert(varchar, @MnyTemp, 1), len(convert(varchar, @MnyTemp, 1))- 3)
780NAME IS NULL:2006/02/07(火) 15:48:19 ID:WI5IjHuc
以下の2種類のテーブルを結合して、クレームテーブルの表示のさいに、
器具テーブルの商品名を一緒に表示したいと考えています。

クレームテーブル
クレームID, 顧客コード, 商品分類1, 商品コード1, 購入日1, 商品分類2, 商品コード2, 購入日2, 商品分類3, 商品コード3, 購入日3

器具テーブル
顧客コード, 商品分類, 商品コード, 購入日, 商品名

ほしい結果のイメージ
クレームID, 顧客コード, 商品コード1, 商品名, 商品コード2, 商品名, 商品コード3, 商品名

今使っているSQLの書き方だと結構重くなってしまいます。
うまい書き方あれば教えて下さい。

select クレーム.* , k1.商品名 as 商品名1, k2.商品名 as 商品名2, k3.商品名 as 商品名3
from クレーム
,( select クレームID, 商品名
from 器具, クレーム
where 商品コード1 = 商品コード and 商品分類1 = 商品分類 and 購入日1 = 購入日) k1
,( select クレームID, 商品名
from 器具, クレーム
where 商品コード2 = 商品コード and 商品分類2 = 商品分類 and 購入日2 = 購入日) k2
,( select クレームID, 商品名
from 器具, クレーム
where 商品コード3 = 商品コード and 商品分類3 = 商品分類 and 購入日3 = 購入日) k3
where クレーム.クレームID = k1.クレームID(+)
and クレーム.クレームID = k2.クレームID(+)
and クレーム.クレームID = k3.クレームID(+);

dbはoracleです。実際は日本語名ではないです。
781NAME IS NULL:2006/02/07(火) 17:07:05 ID:???
んー
782NAME IS NULL:2006/02/07(火) 18:44:37 ID:L8YKM3YT
数値のカンマ区切りも
だがとりあえずCASEを使えばできる
783NAME IS NULL:2006/02/07(火) 18:47:26 ID:L8YKM3YT
>>780
分析関数か
SELECT句でサブクエリ
784780:2006/02/07(火) 19:26:16 ID:WI5IjHuc
783さん
selectに副問い合わせを持って来たら、だいぶ早くなりました!
ありがとうございます
785NAME IS NULL:2006/02/07(火) 20:42:24 ID:???
>767
BooksOnlineを「金額」で検索汁
その上でConvertもしくはCast
786767:2006/02/07(火) 21:35:33 ID:jHoApGYS
>>779,785
サンクス
参考にするぜプログラムでやることも考えたけど効率考えたら
表示のみだからSQLで処理したいと思って、ソースもすっきりするし
787NAME IS NULL:2006/02/08(水) 10:20:19 ID:???
>>786
なんでSQLサーバーのスレで聞かないの?
788767:2006/02/08(水) 22:01:12 ID:???
>>786
うっせーw
SQLの問題だからSQLで聞いてんだよ
お前センスねーな
789NAME IS NULL:2006/02/08(水) 22:47:37 ID:???
思い切り環境依存だよな
790NAME IS NULL:2006/02/09(木) 03:44:15 ID:sQbsXhb8
>788
Oracle でならわかるが、SQLServer だとわからないという
SQLServer でたずねたらといわれる
SQL のもんだいだという



期待の大物ルーキーデビューwww
791NAME IS NULL:2006/02/09(木) 07:51:51 ID:???
>>790
でも、もうここで質問しちゃってるからいいじゃんと俺は思うよ。
どうせ、おまいら手当たり次第データベースのスレ見てるだろうし。
まぁ、とにかく、
>>767の「全 部 テ キ ス ト 型 で 保 存 し ろ 」はひどすぎるな。
表示するデータに型をあわせるなんて、ひどい発想だと。


792NAME IS NULL:2006/02/09(木) 08:01:13 ID:???
バカにはバカしか回答しないということだ。
なぜ>>767がわざわざ1文字ずつ空白をあけたか考えろよ。
793NAME IS NULL:2006/02/09(木) 08:52:47 ID:sQbsXhb8
よう、ルーキー!おはよう!

>791
ネタにマジレスかこわるいぞwww
794NAME IS NULL:2006/02/09(木) 10:23:54 ID:???
>>768
ってネタっぽいけどさ。
あきらかに>>768=>>770で、>>769で煽られて、ムキになって>>770
言い返してるところみると、マジだったのかなぁーなんて。
795NAME IS NULL:2006/02/09(木) 10:29:40 ID:???
まぁ、でも、からかうつもりで>>768と発言したとして、
>>770みたく、逆に相手にムキにさせられてたら、アホだよ。
796NAME IS NULL:2006/02/09(木) 13:06:36 ID:sQbsXhb8
あほばっかだなw
>770 は某逮捕者の有名な言い回しだ

ネタをネタとわからんやつは
半年ROMってろや
なっ?
797NAME IS NULL:2006/02/09(木) 13:11:17 ID:???
>>796
2ch用語がわかる2chのスーパー住人にはなりたくありません。
某逮捕者の有名な言い回しまでとかわかる、君はよほどやることなくて、
2chづけの毎日か。

798NAME IS NULL:2006/02/09(木) 13:15:47 ID:???
>>796
2chのネタや2chのルール知ってるとなんか自分すごいとか思う勘違いの人多いい
と思うが、そんな事を知ってると主張すると、暇人の2chづけの廃人を自ら証明しそうなので、
半年もROMるの遠慮しときます。
799NAME IS NULL:2006/02/09(木) 13:22:45 ID:???
ID無しって便利だな
800NAME IS NULL:2006/02/09(木) 13:25:42 ID:???
>>799
便利だと思うなら君も使ってください。
801NAME IS NULL:2006/02/09(木) 13:27:39 ID:???
よう!ルーキー!
しっかり、SQL勉強しろよw
802NAME IS NULL:2006/02/09(木) 13:35:35 ID:pH1EVzRS
>>801
ありがとうございます。しっかり、勉強します。
私はSQLの勉強しますが、あなたはパソコンの事より、社会勉強したほうがいいと思います。
803NAME IS NULL:2006/02/09(木) 13:43:31 ID:???
大漁だなw
804NAME IS NULL:2006/02/09(木) 13:47:36 ID:pH1EVzRS
>>803
大漁おめでとうございます。
805NAME IS NULL:2006/02/09(木) 13:54:36 ID:???
次スレは>>1にしっかり書いておかないとな

え、なにを?
806スーパールーキー767:2006/02/09(木) 21:22:09 ID:???
おうおう!
凄いことになってるな!
まさに俺カリスマ!
807NAME IS NULL:2006/02/09(木) 22:59:56 ID:???
>>797 >>798 >>802 >>804などなどです。
お帰りなさいスーパールーキーさん。
その間、私がスーパールーキー代理をつとめさせていただきました。
808スーパールーキー767:2006/02/09(木) 23:04:12 ID:???
>>807
池沼か?
夏にはまだはやすぎるぞw
809シャットダウン2世@初心者:2006/02/09(木) 23:12:52 ID:GeTTs/zE
つみきWebというサイトから、フリーの
Common SQL Environment
というソフトを落としてきて、使おうとしているんですが、
MySQLに接続できません。
DBMS  MySQL
ユーザ名 root
パス  root
サーバー名 ???
DB名 test
ポート番号 3306
UNIXソケット ???

???がついている所以外は絶対に間違ってないっす。
サーバー名はlocalhostだと思うんだけど・・・
UNIXソケットってなんですか?
W2k使ってるんで、いつもここは空欄にするんだけど、アプリが終了して
しまいます。なんででしょう。
810NAME IS NULL:2006/02/10(金) 09:31:03 ID:???
811NAME IS NULL:2006/02/10(金) 17:30:41 ID:vHDcCWk4
国、県、市、人数
----------------
A、AA、AAA、10
A、AA、BBB、20
A、AA、CCC、15
B、BB、DDD、10
B、BB、EEE、10

このようなテーブルで、国ごとに県の数をもともるにはどうすればいいでしょうか?
812NAME IS NULL:2006/02/10(金) 17:42:49 ID:???
select
    国
   ,count(県)
from
    テーブル
group by
    国

こぉ?
813NAME IS NULL:2006/02/10(金) 17:48:58 ID:???
オレもそれ考えたけど、県の数ってのがあいまいなんだよね。
同じ県は一つと数えるなら

SELECT 国, count(DISTINCT 県) from このようなテーブル GROUP BY (国)

かなあ
814NAME IS NULL:2006/02/10(金) 17:50:03 ID:???
>>811
例を出すなら、求めるべき回答例も書いてちょ
815812:2006/02/10(金) 18:01:13 ID:???
>>813
あー、そっちな気がする…
816811:2006/02/10(金) 18:23:49 ID:vHDcCWk4
>813

ありがと、解決。

このとき、こんな形ではもってこれるのだろうか?

国、県、市、県の個数
----------------
A、AA、AAA、3
A、AA、BBB、3
A、AA、CCC、3
B、BB、DDD、2
B、BB、EEE、2
817NAME IS NULL:2006/02/10(金) 18:42:17 ID:???
>>812 でいいんじゃん

SELECT a.国,a.県,a.市,count
FROM テーブル a,(SELECT 国,count(県) FROM テーブル GROUP BY (国)) b
WHERE a.国 = b.国
ORDER BY 国,県,市

こんな感じか、、、環境依存かわからん
818NAME IS NULL:2006/02/10(金) 19:28:51 ID:???
セレクトクでサブクエリが使えるDBなら

select 国,県,市,(select count(県) from テーブル where 国=A.国) from テーブル A
819NAME IS NULL:2006/02/10(金) 20:11:54 ID:???
>>817
Oracleで分析関数使えれば一番ベストだな。
>>818
サブクエリ使う方法でもいいけど、レコード件数めちゃ多いと、表の1レコードにつき、
サブクエリ1回走ってそりゃまた、時間かかるから、
素直に結合した方がいいかも。

select A.国, A.県, A.市, B.県の個数
from テーブル A,
( select 国, count(県) as 県の個数
from テーブル A
group by 国 ) B
where A.国 = B.国
820NAME IS NULL:2006/02/12(日) 12:32:37 ID:???
昨日MySQL入れたばっかの素人ですが、
例えば銀行みたいに多人数のアカウントを扱うような場合って

日付,入金額,云々 みたいな個人用のテーブルを人数分作るんでしょうか?
821NAME IS NULL:2006/02/12(日) 14:57:03 ID:???
すれ違いばっかりだな。
MySQLとSQLServerは馬鹿阿呆ホイホイか?
822NAME IS NULL:2006/02/12(日) 15:21:58 ID:???
>>820
作りません
823NAME IS NULL:2006/02/12(日) 19:33:00 ID:???
ごめんなさいスレ違いだったようですね
824NAME IS NULL:2006/02/12(日) 21:31:36 ID:???
ウザいから消えろよ
二度と来んな低脳。
825NAME IS NULL:2006/02/13(月) 17:23:47 ID:???
ヽ(`Д´)ノ
826NAME IS NULL:2006/02/13(月) 23:08:21 ID:???
スレ違い風味濃厚ですが、他に適切なスレがなかったため。
他にあったら誘導してください。

会社とかの管理システムを作りなおしています。
そこで、住所データを保持する必要があるのです。
今のところ下記の候補があります。
みなさんは( or 標準としては)どうしていますか?

1.住所をまるごと文字列 若しくは 番地など複数にわけて文字列
2.都道府県、市町村、町名をコード化 番地とかは文字列
3.郵便番号で引かせる 番地とかは文字列

今のところ1と3の組み合わせで、入力時には郵便番号引くけど、保存は文字列
でいこうかと迷ってるんですけど、合併やらで変更がめんどいよ、って言われて困ってます。
これまでの構成は2でした。
827NAME IS NULL:2006/02/13(月) 23:22:55 ID:???
そんなの用途によるわ。
別に1と2を併用したってかまわないつうか、2の結合=1でしょ?
だから1ってのはまず無くなる。
3が良いか悪いかは微妙。
郵便番号とそれ以外の部分を厳密にわけられるなら良いけど。
828NAME IS NULL:2006/02/13(月) 23:25:51 ID:???
2だとコスト掛かりすぎ。
829NAME IS NULL:2006/02/13(月) 23:40:47 ID:???
郵便番号ってユニークじゃないから3(のみ)は無理でしょ。
市町村+町名までをコード化してメリットが出るぐらいの規模ならいいが...
結局用途次第か。
郵便局のサイトから出される郵便番号簿だけでは合併などの変更の
自動更新はむりぽ。
830NAME IS NULL:2006/02/15(水) 19:06:56 ID:j5rQ7FPm
どなたかアイデアお持ちじゃありませんか?

■目的
以下の[入力]から[出力]を得ること

■前提
(1)環境はOracle 8.1.7(SYS_CONNECT_BY_PATHは使えない)
(2)1SQLステートメントで実行したい(ストアドプログラム、HOSTコマンドは使わない)。
(3)DDLは発行しない。

[入力]
ID CODE NAME
-- ---- ----
1 01 あ
2 01 い
3 01 う
4 02 ぱ
5 02 ぺ
6 03 ぽ

[出力]
CODE ***
---- ----------
01 あいう
02 ぱぺ
03 ぽ
831NAME IS NULL:2006/02/15(水) 21:38:01 ID:AHQPPjUE
SQL SERVER2000ですが、Oracleの「ROWNUM」に変わるものって何かありますか?
832NAME IS NULL:2006/02/15(水) 22:36:17 ID:???
>>830
ためしてないからわからんが

select code, concat(name) from 入力テーブル group by code

はどうだろ?

id 順に並べるの忘れてた。
並べたやつをサブクエリーにするなりすればいいんじゃね?

833NAME IS NULL:2006/02/16(木) 00:09:05 ID:???
>831
一時テーブル利用してIDENTITY
834NAME IS NULL:2006/02/16(木) 14:58:48 ID:32nd5bn7
PL/SQLのことについて質問なのですが、お願いしモス。

例えば

is
var_A char(20)
begin
var_A := 'EMP';
insert into var_A select ......

のようにテーブル名の所に変数を使った場合
PLS-00201: 識別子 VAR_Aを宣言してください。
と出るんですが、何がおかしいのかさっぱり判りません。
何かご存知の方がいたら教えていただけないでしょうか。

よろしくお願いします。
835NAME IS NULL:2006/02/16(木) 16:39:29 ID:???
>834
var_A char(20)
のセミコロンっていらないの?
836834:2006/02/16(木) 16:44:21 ID:???
すいません、カキコの時に書き込み忘れしただけです。

たとえば、insert into の所をコメントして

dbms_output.put_line(var_A);

でやれば、正しくコンパイル・実行できます
837NAME IS NULL:2006/02/16(木) 18:41:33 ID:???
>836
だったら insert into の行が悪いんでしょ?

>insert into var_A select ......
なのに省略してるのは宗教的理由ですか?
values 句が見えないけどいいの?
838NAME IS NULL:2006/02/16(木) 18:54:02 ID:???
insert 句自体がでしたか。
テーブル名の指定に変数でも使ったらいかんのかと
思ってしまって。
見直して来ます。
839NAME IS NULL:2006/02/16(木) 20:31:25 ID:???
>>838
>テーブル名の指定に変数でも使ったらいかんのかと 
そのとおり。まあなんだ質問するスレを間違ったんだと思うよ。
Oracleなら動的SQLが使える。 execute immediateで調べてみて。
840NAME IS NULL:2006/02/16(木) 20:59:32 ID:???
調べて見ます。
ありがとうございます。
841NAME IS NULL:2006/02/17(金) 04:04:25 ID:hDNGqruM
くだらない質問だったらすいません。
mySQLでテーブル(クライアント、鯖ともにujis)にinsertでカラムを突っ込む
とき、日本語が含まれてると
ERROR 1406 (22001): Data too long for column '日本語が含まれてるカラム名'
となって上手くいきません。文字コード、改行の問題かと思って
変えてみたのですがエラーがまだ出ます。。。
アルファベットのみだとすんなり動くのですが、どういうことでしょうか?
842NAME IS NULL:2006/02/17(金) 16:31:03 ID:???
>>838
execute immediateで希望通りの事が出来ました。
ありがとうございます。

オブジェクト名の指定にバインド変数も使えないみたいなので、
文字列連結でexecute immediateで動きました。
843NAME IS NULL:2006/02/17(金) 19:15:52 ID:???
table_a
code key1
nengappi key2
suryo_a

table_b
code key1
nengappi key2
suryo_b

table_c
code key1
nengappi key2
suryo_c

[sqlの質問]
上記3つのテーブルにデータが入っていて、それを
下記のような形のテーブルにまとめたいのですが
1つのsql文で書くことは可能でしょうか?
よろしくご教授のほどお願いします。

table_m
code key1
nengappi key2
suryo_a
suryo_b
suryo_c

844NAME IS NULL:2006/02/17(金) 19:51:17 ID:???
すごく可能
845NAME IS NULL:2006/02/17(金) 20:16:23 ID:???
ありがとうございます。

やはり可能だったんですね。
846NAME IS NULL:2006/02/17(金) 21:10:11 ID:???
コード | 年月日 |数量a
--------------------------
001 | 0600101 |100
002 | 0600102 |50
003 | 0600105 |100

コード | 年月日 |数量b
--------------------------
001 | 0600102 |100
002 | 0600103 |200
003 | 0600105 |100

コード | 年月日 |数量c
--------------------------
001 | 0600103 |100
002 | 0600104 |200
003 | 0600105 |100

↓↓↓(結果)

コード | 年月日 |数量a |数量b |数量c
-------------------------------------------
001 | 0600101 |100  |   |
001 | 0600102 |   |100  |
001 | 0600103 |   |   |100
002 | 0600102 |50  |   |
002 | 0600103 |   |200  |
002 | 0600104 |   |   |200
003 | 0600105 |100  |100  |100

こんな感じで、縦に入っている数量を横に
展開したいというような・・・
847NAME IS NULL:2006/02/17(金) 23:52:36 ID:???
横展開ってやつですね。
select コード,年月日,数量A,null as 数量B,null as 数量C
from table1
union all
select コード,年月日,null as 数量A,数量B,null as 数量C
from table2
select コード,年月日,null as 数量A,null as 数量B,数量C
from table3
848NAME IS NULL:2006/02/17(金) 23:53:51 ID:???
>>847
table2とtable3の間にもunion allいれといてね。
849NAME IS NULL:2006/02/17(金) 23:56:50 ID:???
>>847
それじゃだめだろ
850NAME IS NULL:2006/02/17(金) 23:59:36 ID:???
>>849
うそだぁ。冗談きついよといいながら、もう一度みなおしてみよう。
851NAME IS NULL:2006/02/18(土) 00:02:16 ID:???
>>849
えどこがだめなの??
そういや、並べ替えはしてないから、するなら
select *
from (先ほどのSQL)
order by コード,年月日
などでしてね。
852NAME IS NULL:2006/02/18(土) 00:05:15 ID:???
>>849
わかった、確かにだめだ。コード003が一行になってた。
ってことで、
select コード,年月日, sum(数量a), sum(数量b), sum(数量c)
from (先ほどのSQL)
group by コード,年月日
で、nullに対する処理はどうなるかちょっと忘れたから、oracleならnvlとかで
処理してくれ。
853NAME IS NULL:2006/02/18(土) 00:08:31 ID:???
つか、846見てなんでやりたいことがわかるの?
854NAME IS NULL:2006/02/18(土) 00:15:25 ID:???
>>852
Oracleの場合、nullの処理は問題なさげでした。他のデータベースでも問題ないと思うが注意してくれ。
>>853
まぁ、FAQみたいなもんだよ。結構質問する人多いし、本に載ってたりもする。
まぁ、経験かな。
とか言って違ってたり。
855NAME IS NULL:2006/02/18(土) 00:27:25 ID:???
select
   code
  ,ymd
  ,sum(nvl(a.qty))
  ,sum(nvl(b.qty))
  ,sum(nvl(c.qty))
from
  (a full outer join b on a.code = b.code and a.ymd = b.ymd )
    full outer join c on a.code = c.code and a.ymd = c.ymd
group by code,ymd
order by code,ymd
;

nullの時、スペースにしてないけど。
その前に試してないから動くか知らんけど。
雰囲気ってことで…('A`)
856NAME IS NULL:2006/02/18(土) 00:29:57 ID:???
full join で一発
857NAME IS NULL:2006/02/18(土) 00:35:03 ID:???
あ。
select
   coalesce(a.code,b.code,c.code) as code
  ,coalesce(a.ymd,b.ymd,c.ymd) as ymd
  ,sum(nvl(a.qty)) as qty1
  ,sum(nvl(b.qty)) as qty2
  ,sum(nvl(c.qty)) as qty3
from
  (a full outer join b on a.code = b.code and a.ymd = b.ymd )
    full outer join c on a.code = c.code and a.ymd = c.ymd
group by code,ymd
order by code,ymd
;

('A`;)コウカ?
858NAME IS NULL:2006/02/18(土) 00:41:04 ID:???
sum したり group by したりいらない。
それとfrom 以降も書き方がおかしい

もうちょいちゃんと勉強したほうがよいぞ

859NAME IS NULL:2006/02/18(土) 00:54:19 ID:???
>>854だけど、その方法もあるな。勉強になった。
でも、SQL文ややこしくなるな、とりあえず、元の表が2つだけの場合、
select coalesce(a.コード, b.コード) as コード,
coalesce(a.年月日, b.年月日) as 年月日,
a.数量a, b.数量b
from table1 a
full outer join
table2 b
on (a.コード = b.コード and
a.年月日 = b.年月日)
where (a.コード is not null and a.年月日 is not null)
or (b.コード is not null and b.年月日 is not null)
こんな感じか。
3つ以上になるとwhere句複雑だな。
860NAME IS NULL:2006/02/18(土) 00:56:20 ID:???
>>858
だって上のリストだけじゃ一日の発生件数が
サマリ済みかどうか判断つかないしー。

…と思ってサマリしたんだけど、複数あったら
それはそれでそのままjoinしちゃダメやね…。
from区おかしい?
861NAME IS NULL:2006/02/18(土) 01:04:16 ID:???
>>854だけど、
from句おかしいのは確かだ。

select *
from table1
full outer join
table2
on (結合条件)
が基本でしょ。
つか、3つ以上のwhere句の条件俺にはギブアップだ。
862NAME IS NULL:2006/02/18(土) 05:09:27 ID:???
select x.code, x.ymd, a.cnt as 数量A, b.cnt as 数量B, c.cnt as 数量C from
(select code, ymd from tableA
union select code, ymd from tableB
union select code, ymd from tableC) x
left join tableA a on x.code = a.code and x.ymd = a.ymd
left join tableB b on x.code = b.code and x.ymd = b.ymd
left join tableC c on x.code = c.code and x.ymd = c.ymd
order by x.code, x.ymd
863NAME IS NULL:2006/02/18(土) 17:20:53 ID:???
>>862
なんだ、どのみち、union使うのか・・
864NAME IS NULL:2006/02/18(土) 18:38:35 ID:???
mssql2000限定
with tableABC(code, ymd, cnt, type) as
(
select code, ymd, cnt, 1 from tableA union all
select code, ymd, cnt, 2 from tableB union all
select code, ymd, cnt, 3 from tableC
)
select code, ymd, [1] as 数量A, [2] as 数量B, [3] as 数量C
from tableABC
pivot (sum(cnt) for type in ([1], [2], [3])) as pvt
order by code, ymd
865NAME IS NULL:2006/02/18(土) 18:39:19 ID:???
>>864
mssql2005に訂正
866NAME IS NULL:2006/02/19(日) 00:54:16 ID:???
MYSQLをphpMyAdminで使っているのですが、
文字コードを運用の途中に変更するのは大変な作業でしょうか?

867NAME IS NULL:2006/02/19(日) 04:42:51 ID:???
http://mixi.jp/view_bbs.pl?id=3964428&comm_id=2234

課題か何かだったのかな。id=1416594 の人。
868NAME IS NULL:2006/02/19(日) 15:37:33 ID:???
>> 843-865

いろいろなアドバイスありがとうございます。
内容の理解と検証に時間がかかりレスが遅くなって
申し訳ありません。

一応まとめレスとさせていただきます。
実験はmysql5.0.18で行いました。

>> 852
select x.code code, x.nengappi nengappi,
sum(x.suryo_a) suryo_a, sum(x.suryo_b) suryo_b, sum(x.suryo_c) suryo_c
from (
select code, nengappi, suryo_a, null as suryo_b, null as suryo_c
from table_a
union all
select code, nengappi, null as suryo_a, suryo_b, null as suryo_c
from table_b
union all
select code, nengappi, null as suryo_a, null as suryo_b, suryo_c
from table_c ) x
group by x.code, x.nengappi
を実行して、次の期待通りの結果が得られました。
+------+----------+---------+---------+---------+
| code | nengappi | suryo_a | suryo_b | suryo_c |
+------+----------+---------+---------+---------+
| 001 | 20060101 | 100 | [NULL] | [NULL] |
| 001 | 20060102 | [NULL] | 100 | [NULL] |
| 001 | 20060103 | [NULL] | [NULL] | 100 |
| 002 | 20060102 | 50 | [NULL] | [NULL] |
| 002 | 20060103 | [NULL] | 200 | [NULL] |
| 002 | 20060104 | [NULL] | [NULL] | 200 |
| 003 | 20060105 | 100 | 100 | 100 |
+------+----------+---------+---------+---------+

>> 857
select
coalesce(a.code,b.code,c.code) as code
, coalesce(a.nengappi,b.nengappi,c.nengappi) as nengappi
, a.suryo_a
, b.suryo_b
, c.suryo_c
from (table_a a
full outer join table_b b on a.code = b.code and a.nengappi = b.nengappi) x
full outer join table_c c on x.code = c.code and x.nengappi = c.nengappi
を実行しましたがエラ−となりました。
未だに原因についてはあまりよくわからないのですが、もしかするとfull joinは
3つのファイルで使うにはもともと何か無理があるのでしょうか?

869NAME IS NULL:2006/02/19(日) 15:38:49 ID:???
(続き・・・)
>> 862
select x.code, x.nengappi, a.suryo_a, b.suryo_b, c.suryo_c from
(select code, nengappi from table_a
union select code, nengappi from table_b
union select code, nengappi from table_c) x
left join table_a a on x.code = a.code and x.nengappi = a.nengappi
left join table_b b on x.code = b.code and x.nengappi = b.nengappi
left join table_c c on x.code = c.code and x.nengappi = c.nengappi
order by x.code, x.nengappi
を実行して、次の期待通りの結果が得られました。
+------+----------+---------+---------+---------+
| code | nengappi | suryo_a | suryo_b | suryo_c |
+------+----------+---------+---------+---------+
| 001 | 20060101 | 100 | [NULL] | [NULL] |
| 001 | 20060102 | [NULL] | 100 | [NULL] |
| 001 | 20060103 | [NULL] | [NULL] | 100 |
| 002 | 20060102 | 50 | [NULL] | [NULL] |
| 002 | 20060103 | [NULL] | 200 | [NULL] |
| 002 | 20060104 | [NULL] | [NULL] | 200 |
| 003 | 20060105 | 100 | 100 | 100 |
+------+----------+---------+---------+---------+

>> 864
残念ながら環境が無いため検証できませんでした。

870NAME IS NULL:2006/02/19(日) 21:13:58 ID:???
SELECT COUNT( DISTINCT 列1, 列2) FROM TBL_TEST
みたくCOUNTのDISTINCTに複数指定したいんですが、エラーになります。
なにか記述方法があれば教えてやってほしいです。

871NAME IS NULL:2006/02/19(日) 22:05:25 ID:???
>870
SELECT COUNT( DISTINCT 列1), COUNT( DISTINCT 列2) FROM TBL_TEST
872NAME IS NULL:2006/02/19(日) 23:51:15 ID:???
>>870
どうもありがとうございます。
そんな書き方もあるんですね。
んでも私のやりたいこととは違いました。
説明不足でした。
列1と列2の両方が同一のを省いてカウントしたいのです。
873NAME IS NULL:2006/02/19(日) 23:56:33 ID:???
select count(*),列1,列2 from tbl_test group by 列1,列2;

select count(*) from ( select distinct 列1,列2 from tbl_test );
874NAME IS NULL:2006/02/20(月) 11:17:41 ID:???
つか、SQLなんて難しくないよね。慣れだよ。慣れ。
人に聞いてもいいけど、時間あるなら色々試してみろ。
そりゃ、俺はじめてのプロジェクトで
テーブル設計がうんこなデータベースでSQL文巨大になったけど、いい勉強になった。
でも、既存のシステムのSQL文で一つのselect文が100行近くのがあって、
あれだけは、手を入れたくなかった・・・
875NAME IS NULL:2006/02/20(月) 17:52:20 ID:???
>>868
括弧でくくったテーブルに別名'x'を付けずに
'a'を直接指定して実行したらちゃんと動いたよぅ@Ora9i

蒸し返してスマソ('A`;)fullx3ガ ダメッテコトハ ナイトオモウノ
876NAME IS NULL:2006/02/21(火) 00:09:54 ID:???
初心者の質問です。

phpMyAdminでMySQL5.0をいじってます。
table01のカラム(cll)に外部キーを設定を追加したいんですが、

ALTER TABLE `table01` ADD CONSTRAINT `fkey` FOREIGN KEY (`cll`) REFERENCES

`table02` (`cll`) ON DELETE CASCADE ON UPDATE CASCADE;

として、何も置きませんでした。
エラーもなかったけど、

SHOW CREATE TABLE table01;

でテーブルの設定をのぞいたところ、変化無し・・・

どなたか理由を教えてください。
初心者にもわかりやすくお願いします。
877NAME IS NULL:2006/02/21(火) 00:59:15 ID:???
たとえば、学級連絡網の電話帳のデータベースで、学年が上がってクラスのメンバーも変わったので、
データベースを新しくしたいとします。でも、もちろんまた同じクラスになった奴らもいるわけです。
そこで、すでにデータベースに存在する名前の奴の電話番号はUpdateで上書き、新しいクラスメートの
電話番号はInsertで追加したいと思いました。一応、前の連絡網の番号も残しておきます。

こういう状況ってよくあると思うんですけれど、方法として思い付くのはSelectで名前があるか調べて、
あった場合はUpdateのクエリ、無ければInsertのクエリと条件分岐させるプログラムを書くということ
くらいです。でもそれってスマートじゃない気がします。
一般的にはどういう風にするのが良いかプロフェッショナルな方々にお聞きしたいです。
878NAME IS NULL:2006/02/21(火) 01:13:24 ID:???
>>876
何も起きないが、「テーブルの設定」のところは
MySQLスレで聞いた方がいいかと。

>>877
そんな貴方にUpsert。

あればUpdate、無ければInsertって確かに出くわすんだけど、
出くわした時点で設計が間違ってたりするんかなとも思ってみたり。
879877:2006/02/21(火) 01:40:53 ID:???
>>878
なるほど、Upsert。調べてみます。
ありがとうございました。
880878:2006/02/21(火) 04:22:38 ID:???
半分ネタだったんだけどな。(^.^; Oracleのみ? だし > Upsert

やっぱ「あればUpdate無ければInsert」って乱暴のような気がする。
Oracle使いじゃないので、過去にUpsertがあれば便利だなと思った
時があった気がしたんだが、どういう事例だったか思い出せない。

>>877が例えに挙げたものも、アプリをちゃんと作りこめばUpsertの
出番は無いと思うのだけどなぁ。
プログラム側で条件分岐させるって意味じゃなくて、新規か更新かは
データを用意する以前に決まっている筈。

一応DBがらみで飯食ってるけど、経験豊富なプロフェッショナルじゃ
無いので、大外しかもしれんが、そんときは笑ってくれ。
881NAME IS NULL:2006/02/21(火) 04:55:29 ID:lFVfelfr
Class::DBI とか DBIx::Class とかで find_or_create とか好き。
882NAME IS NULL:2006/02/21(火) 09:44:48 ID:???
>877
一応MySQLならreplace、SQLiteなら「insert or replace」ってのがある。他はシラネ。
883NAME IS NULL:2006/02/21(火) 09:54:34 ID:???
本来ならUPDATEはSELECTしてるからできるもんだしな。
INSERT できるなら事前にDELETEしてしまえばいいのだけれど
外部キーが入ってるとまずいし、やっぱ設計次第、かなあ
884NAME IS NULL:2006/02/21(火) 10:15:25 ID:???
>>877
話のポイントからずれるのかもしれないが、

前の連絡網の番号を残すとすると、
学年フィールドを設定し氏名+学年をキーとして、
新学年は全てinsertで処理すべきだと思う。
そうでないと、前年分を残す意味がないし、かえって
誤解を生じる。
もちろん、全学年として存在している情報は副照会で
取得できるから、入力する必要はない。
プログラムロジックとしてはそれほど差はない。
885NAME IS NULL:2006/02/21(火) 10:19:22 ID:???
全学年 -> 前学年 ね。
886876:2006/02/21(火) 13:41:10 ID:???
>878
何も起きないとわかっただけでもありがたいです。
MySQLスレに行ってきます。
887NAME IS NULL:2006/02/22(水) 07:00:36 ID:jJtmCmqy
質問です。
たとえば将棋の大会を開催して、その対戦結果をDBに記録するとします。
対戦結果はリーグ戦のように誰が誰に勝ったか(or負けたか)を残したい
のですが、普通に参加者数分の結果レコードを作ると1000人いた場合に
1000*1000-1000 = 999000レコードが必要になってしまうと思うのです。

↓こんなテーブル構造を考えてました。自分と相手のID、あと結果です。
create table hoge (
user_id number(8),
enemy_id number(8),
result number(1),
);

自分と相手をセットで考えて、enemyのほうに自分が含まれる場合は
結果を反転して取得するようにして節約しても半分にしかなりません。

さらに参加者が増えるともう収拾がつかないのですが、何か良い結果の
記録方法(データ構造?)を教えていただけないでしょうか?

データベースはまだ未定ですが、Oracleを検討しています。
888NAME IS NULL:2006/02/22(水) 07:25:37 ID:???
それでいいじゃん。
889NAME IS NULL:2006/02/22(水) 08:19:09 ID:???
>>887
>半分にしか

以下の方法なら1000行(参加人数分)だ。

bitにして対戦相手のID桁のところに勝てば1にする。
未対戦か負け(0)の見分けがつきにくいが、対戦相手共に0なら未対戦と判断。
まぁ2bit割り当てたりCLOBで1文字単位でもいいんだけどさ。

ネタだけど、記録だけでレコードを極端に抑えたいと言うのならこんなこともありカナと。
後で、500勝以上している人の抽出とか勝率での抽出など集計にはSQLだけでは
出来ないけどね。更新も一旦SELECTして該当bitを建ててUPDATEだな。

配列できれば連想配列型が使えれば楽なんかな。
890NAME IS NULL:2006/02/22(水) 08:33:52 ID:???
参加者1000名としてホントに全員で総当たり戦なぞやるのか?
ホントにやるのなら1000x1000のレコードを作っても何の問題もないと思うが、
普通は抽選で数対戦させて勝ち点が多いほうから一定人数が決勝リーグ進出とかやらないか。
891NAME IS NULL:2006/02/22(水) 09:05:06 ID:???
漏れは質問見たときコンピュータ戦なのかな、とおもた。
892NAME IS NULL:2006/02/22(水) 09:15:43 ID:???
その程度のレコード数で構造複雑じゃないんだから、普通に持てば良いよね。
893NAME IS NULL:2006/02/22(水) 09:42:04 ID:???
SQL7のバックアップをSQL2000で復元できなくて困っています。
やりかた教えてエロイ人
894NAME IS NULL:2006/02/22(水) 09:47:51 ID:???
>>893
スレ違いも甚だしいな。ホレ
つ Microsoft SQL Server 総合スレ3【MS SQL】
895NAME IS NULL:2006/02/22(水) 09:51:42 ID:???
>894
thx
896NAME IS NULL:2006/02/22(水) 09:53:15 ID:???
以前他人の作ったアクセスのSQL文をメンテしていて、とてつもなく長くて、あんまり長すぎるSQL文は
だめだなぁと思ってたんだけど、最近自分がSQL書くようになってちょっと長くなる奴い奴を書いちゃった
んですが、実際SQLって何行以上だと迷惑でしょうかね?一行を70文字として。
897NAME IS NULL:2006/02/22(水) 10:01:32 ID:???
1 行。
898887:2006/02/22(水) 10:55:35 ID:???
皆様、ありがとうございます。

>>889
その方法も検討しましたが、仰るとおり勝ち数の集計など結果表示の際に
いろいろと不都合があったため、却下となりました。

>>890
実際には全員と対戦するとは限らないのでレコード数はあくまで理論上の
最大値ですが、理論値でも極端に大きいのは問題があると考えました。
リーグ戦が行われるのではなく、誰に勝利したかを記録したいと思っています。

>>891
対人戦の予定です。

>>892
大学内で行う予定で、最終的には潜在参加者数は10000人程度までは想定しています。
どうみても1億レコードです。本当にありがとうございました。
899NAME IS NULL:2006/02/22(水) 10:59:16 ID:???
>>898
1億レコードなんて普通だ。
気にせず素直に組め
900NAME IS NULL:2006/02/22(水) 20:37:09 ID:JQxH/Ww0

以下のようなストアドでac_valueのcase文3の時は'ZZZ'のところに
ac_testの値を入れたいのですが、どうすればよろしいでしょうか?
SQLServer2000です。
よろしくお願い致します。

CREATE PROCEDURE usp_testA
AS
BEGIN
SELECT
A.filed1,
A.filed2,
(CASE A.filed3
WHEN 1 THEN 'SSS'
ELSE 'TTT'
END
)ac_test
B.filed1,
(CASE B.filed5
WHEN 1 THEN 'WWW'
WHEN 2 THEN 'XXX'
WHEN 3 THEN 'ZZZ'
)ac_value

FROM
Ytable A
Wtable B
WHERE
・・・・・・
END
GO
901NAME IS NULL:2006/02/23(木) 09:17:07 ID:???
見にくい、DBMS限定などなど・・・とりあえずSQL鯖スレで聞けば?
902NAME IS NULL:2006/02/23(木) 10:12:37 ID:NHT06MB4
副問い合わせからのテーブル作成に関しての質問です。

以下のようなテーブルに対し、
data1 data2
---
1 1
1 2
2 1
2 2
3 1
3 2

data1 = 2となる行の数、data2 = 2となる行の数を、
それぞれ別のカラムに返すことができますか?

(結果例
res1 res2
---
2 3

大量のデータから同じ作業を反復して行うので、できるだけスマートに書きたいのですが
良いSQLが思いつきませんでした。
903NAME IS NULL:2006/02/23(木) 10:57:58 ID:???
select
(select count(*) from テーブル where data1 = 1),
(select count(*) from テーブル where data2 = 2)
from dual

これでいんじゃね?
904NAME IS NULL:2006/02/23(木) 11:13:28 ID:???
MySQL 4.0 だったら死ぬ罠
905NAME IS NULL:2006/02/23(木) 12:03:30 ID:9yT5VYNa
>>902
case式
906お願い致します。:2006/02/23(木) 15:51:28 ID:nQOdtPso
【where文で、一文字目だけをチェック】したいのですが。

データに、「”01”」〜「”99”」まで
文字がはいっているンですよ。(入れ物は単なる文字列なンだな。)

これを”50”以下なら取得する、と。



どうするとよろしいのでしょうか。お願いします。
(「一文字目が'0'か'1'か'2'か'3'か'4'か」という検索文を作りたいです・・・。)
907NAME IS NULL:2006/02/23(木) 16:04:10 ID:???
ここでいいのかわかりませんが
会社の部署別にシステムを作りたいのですが
この場合部署ごとにデータベースを分けた方が良いのか?
それともkeiri_tableみたいにデータベースは1つでテーブル名等で分けるほうが良いのでしょうか?
ちなみに全体的な各部署のデータを同時に見る処理なども作る予定です。
908NAME IS NULL:2006/02/23(木) 16:39:08 ID:???
規模にもよるんじゃないの?
909NAME IS NULL:2006/02/23(木) 16:55:22 ID:???
>>906

数値に変換してから判定するとか、SUBSTRING 系の文字列関数を使うとか。

>>907

普通は一緒にするでしょ。
910NAME IS NULL:2006/02/23(木) 17:10:26 ID:9yT5VYNa
>>906
正規表現
911NAME IS NULL:2006/02/23(木) 17:16:44 ID:???
>>906
そのフィールドに索引を張ってるなら
データ like '0%' or データ like '1%' or データ like '2%' or データ like '3%' or データ like '4%'
索引がないなら >>909のいうように
substring、処理系によって名称が違う場合があるが文字の切り出し関数を使う。
substring(データ, 1, 1) in ('0', '1', '2', '3', '4')
912902:2006/02/23(木) 18:08:54 ID:???
>>903
>>905
アドバイスありがとうございます。

case式で一日悩んだので亀レスになりましたが、なんとかスマート*っぽく*解決できそうです。


こんな感じに書けました。
select
sum(case when data1=2 then 1 else 0 end),
sum(case when data2=2 then 1 else 0 end)
from test_table_1
913NAME IS NULL:2006/02/23(木) 20:05:44 ID:???
すみません、初歩的な所からつまづいてしまいました(´・ω・`)

部署表(部署番号 部署名 場所)
社員表(社員番号 社員名 部署番号 給与)
社員表示(社員番号 社員名 部署名 番号)

のテーブルがあります。
(1)部署表と社員表から社員表示を得るためのSQLを書く。
(2)(1)を社員表示という名前のビュー表を作成するSQL文に書き直す。
(3)上記のSQL文は、関係演算において、どの演算に相当するか。

すみませんがご指導お願いします。
914NAME IS NULL:2006/02/24(金) 09:09:08 ID:aAYC5YQv
>>913
入門書を嫁
915NAME IS NULL:2006/02/24(金) 15:13:24 ID:LuqV2U8E
単純にSELECT結果をDELETEしたいのですが、
「=とかの場合サブクエリ結果が複数の値を返すのは許可しません」
と怒られてしまいました。
何を使えばよろしいでしょうか。
お願いします。
ちなみに「〜リンク」が子供なので先に消さないとなんです。

--掲示板メッセージリンク削除
DELETE FROM[掲示板メッセージリンク]
WHERE最終更新日時 = (
SELECT[掲示板メッセージリンク].最終更新日時
FROM[掲示板メッセージリンク] INNER JOIN
[掲示板メッセージ] ON
[掲示板メッセージリンク].[お知らせメッセージ番号] = [掲示板メッセージ].[お知らせメッセージ番号]
WHERE([掲示板メッセージリンク].最終更新日時 < DATEADD(dy, - 180, GETDATE()))
AND (NOT ([掲示板メッセージ].お知らせ対象区分 IN ('A', 'B', 'C')))
)
GO
--掲示板メッセージ削除
DELETE FROM [掲示板メッセージ]
WHERE (NOT (お知らせ対象区分 IN ('A', 'B', 'C'))) AND
(最終更新日時 < DATEADD(dy, - 180, GETDATE()))
GO
916NAME IS NULL:2006/02/24(金) 15:28:13 ID:???
イコールじゃなくてINじゃないのか?
つうかサブクエリにしなくても書けそうな普通の条件なような・・・。
917NAME IS NULL:2006/02/24(金) 15:38:08 ID:???
あざーす!INでできたっす
あとEXISTSとかいうの使ったらできたっぽいです
構ってくれてどうもっす
親の情報を元に子を削除したいのでこんなんになってしまいました
とりあえず動いたのでこのままいくっす

DELETE FROM[掲示板メッセージリンク]
WHEREEXISTS (
SELECT[掲示板メッセージリンク].最終更新日時
FROM[掲示板メッセージリンク] INNER JOIN
[掲示板メッセージ] ON
[掲示板メッセージリンク].[お知らせメッセージ番号] = [掲示板メッセージ].[お知らせメッセージ番号]
WHERE([掲示板メッセージリンク].最終更新日時 < DATEADD(dy, - 180, GETDATE()))
AND (NOT ([掲示板メッセージ].お知らせ対象区分 IN ('A', 'B', 'C')))
)
GO
918NAME IS NULL:2006/02/24(金) 15:59:33 ID:???
あーでもやっぱり後学の為に知っておきたいっす
みなさんなら以下要件でどんなSQL書きますか?

掲示板メッセージ(親)
掲示板メッセージリンク(子)
・親の「お知らせ対象区分」が「A,B,C」でないもの
・子の「最終更新日時」が「現在より180日以前」
に当てあまる行を子からDELETE
919NAME IS NULL:2006/02/24(金) 23:29:26 ID:+kOkioZP
あざーすなんて言ってるやつはばかです。
920NAME IS NULL:2006/02/25(土) 01:12:37 ID:???
>>918
その要件だけなら、JOINしなくてもいいんじゃない?

DELETE FROM [掲示板メッセージリンク]
WHERE
[掲示板メッセージリンク].最終更新日時 < DATEADD(dy, - 180, GETDATE())
AND EXISTS
(
 SELECT * FROM [掲示板メッセージ]
 WHERE
 [お知らせメッセージ番号]=[掲示板メッセージリンク].[お知らせメッセージ番号]
 AND [お知らせ対象区分] NOT IN ('A', 'B', 'C')
)
921NAME IS NULL:2006/02/25(土) 01:59:02 ID:???
子テーブルのキーが何かわからんが、余計なものまで消えないだろーか
922NAME IS NULL:2006/02/25(土) 17:12:51 ID:???
webprog板から誘導されて来ますた。

はてなブックマークのような「タグ」機能をつけたwebアプリを作りたいと思っています。
一つのレコードに対して、ユーザー(データを登録する人)が定義したキーワードのタグを複数割り当てることが出来るものです。
さらに、そのタグが削除されれば、全部のレコードからそのタグのみ削除されたり、
タグごとにいくつのレコードにそのタグが割り当てられているか集計出来たり、
タグによる絞り込みや、新規レコード登録の際にすでに定義されたタグ
(そのタグをもったレコードが存在するという事)があればそれを動的に読み出して、チェックボックスを使って入力の選択肢として再利用するような感じです。

どんなテーブル構成にしたらよいのか、このタグをいったいどういう風にDBに格納するべきか
・タグひとつにつき1フィールドで1か0のフラグ?
・1フィールドにタグを配列で?
なんだか漠然として全然考えがまとまりません。
アドバイスおながいします。

環境はPHP4.3.1、MySQL 3.23.58です。(本番用のレンタル鯖)
923NAME IS NULL:2006/02/25(土) 21:12:57 ID:4Np9D+Kg
超初心者なんですが、教えてください!!
テーブル作成時にある2つのカラムを組み合わせることで
一意性を獲得しているということを表現するには
どんなSQL文を書けばいいんでしょうか??
924NAME IS NULL:2006/02/25(土) 21:20:17 ID:???
>>923
主キーが複合キーってこと?
create table table1 (
key1 integer,
key2 integer,
data1 varchar(20),
primary key (key1, key2))
925NAME IS NULL:2006/02/25(土) 23:01:15 ID:???
納品No      行No     商品名         明細区分

20050001    1        ABC0001         0
20050001    2        haisouhi        0
20050001    3        com             1
20050002    1        com             1
20050003    1        ADD002          0
20050003    2        haisouhi        0
20050003    3        com             1
20050002    2        haisouhi        0

すいません。上のようなデータから、
同一納品Noに明細区分がゼロのものがない納品Noを
取得したいのですが、いい方法があれば教えてください。
いろいろ考えてみたのですが無理なような気がするんですが。。
データとしては

20050001
20050002

のように納品NOでグループ化されたものを取得したいです。
よろしくお願いします。
926NAME IS NULL:2006/02/25(土) 23:11:01 ID:???
>>925
> 同一納品Noに明細区分がゼロのものがない納品Noを
> 取得したいのですが、

この言葉だけを信じれば、

select distinct 納品No
from table1
where 納品No not in (select 納品No from table1 where 明細区分 = 0)

でダメかね? 例としてあげられてるデータだと、結果なしになるけど。
927NAME IS NULL:2006/02/25(土) 23:21:27 ID:???
>>926
ありがとうございます。
例のデータの最後のレコードの明細区分が間違ってましたが
教えていただいた方法で大丈夫だと思います。

distinct とgroupの使い方がまだまだ下手でした。。
ほんとうに助かりました。

928NAME IS NULL:2006/02/25(土) 23:25:01 ID:???
select
  t1.納品No
from
  tbl t1 left join
  (select
     納品No
    ,0 as MK_Flag
   where
     明細区分 = 0
   group by
     納品No
  ) t2
  on t1.納品No = t2.納品No
where
  t2.MK_Flag != 0
group by
  t1.納品No
;

キモイ?
929NAME IS NULL:2006/02/25(土) 23:47:07 ID:???
>>928

ありがとうございます。
その考え方でも取得できますね。
SQLServer2000 なのですが、

0 as MK_Flag

のところを

min(Meisai_Kbn) as MK_Flag
にすれば欲しいデータが取得できました。

いろいろ勉強になりました。
930928:2006/02/25(土) 23:55:09 ID:???
エガッタ('A`*)
931NAME IS NULL:2006/02/26(日) 00:51:11 ID:???
>>929
まぁ、こういうトリッキーなSQLはいけないかもしれんけど、

select 納品No
 from テーブル
group by 納品No
having sum(明細区分) >= count(*)
932NAME IS NULL:2006/02/26(日) 04:16:35 ID:???
>>931
これじゃ、駄目ジャンね。
933NAME IS NULL:2006/02/26(日) 09:39:17 ID:???
上より下みたいに全部カラム指定して書いた方が実行効率がいいって聞いたんだけど、なんで?*は使わないもんなの?
SELECT * FROM table;

SELECT tbl.a,
tbl.b,
tbl.c
FROM table as tbl;
934NAME IS NULL:2006/02/26(日) 10:02:29 ID:???
>>933
それ、某掲示板でも誰か話題にしてたね。
俺的には気にする必要ないと思うけど。
まぁ、でも俺は*は絶対に使わんけど。
935533:2006/02/26(日) 11:14:53 ID:???
>>534
効率云々じゃなくて、SQLのお作法として*は使っちゃいけないってこと?
使わない理由を是非ご教授願いたいです。
936NAME IS NULL:2006/02/26(日) 11:23:37 ID:???
昔は*じゃなくて項目指定したほうが速いからそうしろっていわれたけど、今はどうなんだろ?
オプティマイザも賢くなってるしね。
マニュアルとかでそういうところ書いてある製品ってある?
937NAME IS NULL:2006/02/26(日) 11:40:24 ID:???
どっちにしろ微妙な差しか出ないでしょ
「*」だとカラム名を全部取得し展開する。とかでしょ?

どっちかっていうと、プログラム側の影響度調査が楽になるってメリットが多いんじゃない?
938NAME IS NULL:2006/02/26(日) 14:48:04 ID:???
下記のことで昨日から悩みっぱなしです。ぜひお知恵をお貸しください。

code1 date1 code2
------------------------------
AAA 2006-01-01 DDD
AAA 2006-02-01 EEE
BBB 2006-01-01 EEE
CCC 2006-02-01 FFF

のようなテーブルがあります。PRIMARY KEYは(code1+date1)です。
ここからある日付の直近のdate1を持つ行を抽出し、code2だけを
取得したいのです(ただし、code2は同一の値で集約したい)。
上記の例で行くと、ある日付が2006-02-26ならばEEEとFFFが、
ある日付が2006-01-26ならばDDDとEEEとFFFが取り出せればOKです。

date1が2006-02-26以下の行を抽出し、code2でGROUP化することは
思いついたのですが、これをcode1が同じ値でdate1がMAXのものに
絞り込む方法がわかりません。集計関数をWHERE句で使えませんし、
サブクエリもうまい方法が見つからない状態です。
ぜひご助言をお願いします。
939NAME IS NULL:2006/02/26(日) 15:13:25 ID:???
select code2 from TABLE
inner join
(
select code1,min((TABLE.date1と指定日付の差)) d_diff from TABLE
group by code1
) _T
on TABLE.code1=_T.code1 and (TABLE.date1と指定日付の差) = _T.d_diff
940938:2006/02/26(日) 17:51:17 ID:???
>>939
どうもありがとうございます。
早速教えていただいたSQLを下記のように
解釈して試してみました。

select tb1.code2 from TABLE tb1
inner join
(
select tb2.code1,min((指定日付-tb2.date1)) d_diff from TABLE tb2
group by tb2.code1
) _T
on tb1.code1=_T.code1 and (指定日付-tb1.date1) = _T.d_diff
group by tb1.code2

私の解釈がいけないのだと思うのですが、
上記だと、指定日付が2006-01-26でも2006-02-26でも、
EEEとFFFしか抽出されません。2006-01-26の場合に
DDDも出て欲しいのですが、駄目なようです。
(指定日付の差を取るのに単純に引いただけでは、
指定日付の方がdate1より小さい場合に問題があることは
承知していますが、今はとりあえず無視しています)
941NAME IS NULL:2006/02/26(日) 18:22:23 ID:???
| AAA 2006-01-01 DDD
| AAA 2006-02-01 EEE

2月1日と1月1日なら、1月26日により近いのは2月1日だろ。

>>938の時点で条件が間違ってると思われ。

じゃなきゃ、月を考慮した計算方法に書き直す。
942940:2006/02/26(日) 19:15:13 ID:???
>>941
失礼しました。>>938の書き方が良くありませんでした。

| ここからある日付の直近のdate1を持つ行を抽出し、



「ある日付の直前のdate1を持つ行」を意図していました。
ある日付以前で、かつ最も近い日のものをSelectしたかった
のですが、誤解を生む書き方をしてしまい、申し訳ありません。
943NAME IS NULL:2006/02/26(日) 19:33:12 ID:???
だったら、2006-01-26 に対しては DDD と EEE しか無いはずだが。
944942:2006/02/26(日) 21:40:30 ID:???
>>943
おっしゃる通りでした。ご指摘ありがとうございます。

私が>>938で書いた
| ある日付が2006-01-26ならばDDDとEEEとFFFが取り出せればOKです。
これがそもそも間違っていました。お詫びすると共に訂正いたします。
945NAME IS NULL:2006/02/27(月) 00:17:35 ID:???
>>922
http://www.neuro-tech.net/insipid/

馬鹿が無理する必要も無いと思う。
946NAME IS NULL:2006/02/27(月) 01:33:07 ID:39oPOPzH
データ型でdatetimeというのがあるんだけど,これって
varcharやtextあるいはunix timeで保存するのとどういう違いがあるの?

実際このdatetimeとかの使い方はよくわかってないんだけど
YYYY-MM-DD HH:ii:ssみたいな感じで保存されたら検索時にメリットが,
みたいなこととかがあるんでしょうか?
947NAME IS NULL:2006/02/27(月) 01:52:10 ID:???
datetime型ってベンダー依存じゃなかったっけ。
SQL92には無かったと思う。

昔、PostgreSQLが6.5だった時代、timestampの実装がショボイ(古い)くて
範囲も精度も上だったdatetime型ってのはあったが、今はもうない。
948NAME IS NULL:2006/02/27(月) 02:04:09 ID:39oPOPzH
ふむふむベンダー依存ですか.MySQLとかSQLiteんところで聞いてみます.
どうもでした.
949NAME IS NULL:2006/02/27(月) 09:38:29 ID:???
DATETIME に限らず、TIMESTUMP 等、時刻型にすれば、
時刻の範囲指定とか、時間の足し算とかクエリー時に使えるから
文字列なんかにするのとは全然違う。
950NAME IS NULL:2006/02/27(月) 09:40:26 ID:???
>>946
あと、
>YYYY-MM-DD HH:ii:ssみたいな
INSERT時はこういう指定で入れたかもしれないけど
内部形式はこうなってないよ。
'27FEB06' とか入れても受け付ける環境もあるし。
951NAME IS NULL:2006/02/27(月) 11:29:50 ID:???
複数のDBMS対応が不要ならば、日付型使うべき。
複数対応前提のパッケージなどであれば、こんなところで聞かずに自分で調べてどうしたらいいか十二分に考える。
952NAME IS NULL:2006/02/27(月) 16:43:09 ID:???
http://pc7.2ch.net/test/read.cgi/software/1137894990/944
あき氏を助けてあげてください。
953NAME IS NULL:2006/02/27(月) 23:34:41 ID:???
おれは日付・時刻も普通に文字型で特に困ったことないな。
日付演算したいときだけクエリで日付型にしてる。
どうしてもテーブル定義が日付型でないと困ることってある?
954NAME IS NULL:2006/02/27(月) 23:56:28 ID:???
ソートもいちいち日付にしてんの?
955NAME IS NULL:2006/02/28(火) 00:02:38 ID:???
>>953
漏れも14桁の日付よく使う。
956NAME IS NULL:2006/02/28(火) 00:30:01 ID:???
日付の計算をしない人には、関係ないけどね。
957NAME IS NULL:2006/02/28(火) 03:41:23 ID:???
GROUP BY DATE_FORMAT(hoge, '%Y%m') とかしてる漏れがきましたよ。
958NAME IS NULL:2006/02/28(火) 10:33:28 ID:???
>>954
ソートは日付の文字列でも日付型でも同じになるはずですが・・・。
まさか月日とかが1桁の場合に0を付加せずにやってるとか。それは火に油なような。
959NAME IS NULL:2006/02/28(火) 12:20:23 ID:???
月-日-年
日-月-年
960NAME IS NULL:2006/02/28(火) 13:35:27 ID:???
>>958
じゃあ入力フォーマットをわざわざ固定にして、かつ入力時に正しい日付かも
全ての場所でチェックしてるわけか。ごくろうさんだねえ
961NAME IS NULL:2006/02/28(火) 13:36:52 ID:???
一ヶ月の足し算とかどうしてんの。
ってそのときはいちいち日付型に変換するのか
962958:2006/02/28(火) 21:23:56 ID:???
>>960

>じゃあ入力フォーマットをわざわざ固定にして、かつ入力時に正しい日付かも
>全ての場所でチェックしてるわけか。

入力データは外部からもらう場合ばかりなので、フォーマットは自分たちでは決められない。
つまりフォーマットは最初から決まっている。
入力チェックは、必要な場合はやる。信頼できるデータと分かってたらやらない。

>一ヶ月の足し算とかどうしてんの。
>ってそのときはいちいち日付型に変換するのか

そういうこと。
963954:2006/02/28(火) 21:24:53 ID:???
間違えた。962=954
964NAME IS NULL:2006/03/01(水) 00:18:17 ID:???
出力時に変換するやり方は、Macのファイルメーカー。
入力時に変換するやり方は、一般的なSQLDB。基幹システムもこれ。
965NAME IS NULL:2006/03/01(水) 01:13:42 ID:???
毎年の同月集計とかもテキストだと面倒だが、そういうのがいらない
場合に使えるのか、勉強になった。
まあ自分でテキスト型で日付を格納することはありえないけど
966NAME IS NULL:2006/03/01(水) 11:02:06 ID:???
>>960
DBに日付を文字列として格納する場合、普通そうしないの?
入力されたままをDBに登録しても使えないじゃん。
入力されたままはそれで必要なら取っておくけど、それとそのデータとしての日付は別問題。
967NAME IS NULL:2006/03/01(水) 21:17:16 ID:???
三個のテーブルの共通データを取り出すには
where a=b b=c c=a
とする以外にありませんか。テーブル数が増えると対処できそうにない
968NAME IS NULL:2006/03/01(水) 21:53:51 ID:???
a=b a=c
だけでもいいわけで。
969NAME IS NULL:2006/03/01(水) 22:25:04 ID:???
間違えた。where a=b or b=c or c=a だった。*のような便利記号ありますかね
970NAME IS NULL:2006/03/02(木) 00:04:10 ID:???
INTERSECT
971NAME IS NULL:2006/03/02(木) 00:37:51 ID:???
>>970
ちなみにmysqlでは使えない
972NAME IS NULL:2006/03/02(木) 09:14:17 ID:NYiEbICr
>>967
OracleSQLパズルによるとこんな方法もあるらしい
a=all(b,c,d,e,f)
973NAME IS NULL:2006/03/02(木) 09:15:21 ID:???
つうか、Table数増えるって、別に日本語的に正しいならそんなに苦じゃないと思うが。
>>967が間違った方向にいくと、正規化崩しが正しいとか考えるんだろうね。
974NAME IS NULL:2006/03/02(木) 12:35:18 ID:BxWKW+dX

+----+----+----+----+
|ID |名前|電話|性別|
+----+----+----+----+
|1 |椎名|213 |女 |
+----+----+----+----+
|2 |堀江|332 |女 |
+----+----+----+----+
|3 |緑川|499 |男 |
+----+----+----+----+
|4 |林原|128 |女 |
+----+----+----+----+

|ID |名前|電話|性別|以外全部を
テキストボックス上に表示させた後
そのフォームの内容を書き換えて、一斉にDBを更新するには
どのようにしたらいいでしょうか?

環境はPostgreSQL8.1.3、PHP5.1.2、javascript
です。
975NAME IS NULL:2006/03/02(木) 12:58:33 ID:???
すれ違い。PHPかどっかのスレじゃないのか?
976NAME IS NULL:2006/03/02(木) 13:27:15 ID:???
その仮データの時点でお前はもう駄目だ。
分かる俺も駄目だ。
977NAME IS NULL:2006/03/02(木) 16:13:34 ID:o7wncw1V
UPDATEについて

SELECT * FROM A_table A JOIN B_table B ON (A.code = B.code)

上のように2つのテーブルをJOINして、
AのフィールドB.dateフィールドに A.dateフィールドを代入したいのですが、
どのようなUPDATE文を書けばよろしいでしょうか?



978NAME IS NULL:2006/03/02(木) 16:31:28 ID:???
PostgreSQL 8.1だと
UPDATE B_table SET date=A_table.date from A_table where (A_table.code = B_table.code)

とか書けるみたいだけど、ちゃんと書くならどうなるのかな
979NAME IS NULL:2006/03/02(木) 17:43:28 ID:???
update B_table as b set b.date = (select a.date from A_table as a where a.code=b.code limit 1) where b.code=a.code

こんな感じ?かな?
試してないからわからんけど。
980NAME IS NULL:2006/03/03(金) 01:00:45 ID:???
>>974
テーブルワロス
981NAME IS NULL:2006/03/03(金) 13:37:50 ID:???
次スレは?
帰ってきたの次だからエース?
982NAME IS NULL:2006/03/03(金) 14:14:31 ID:???
次々スレはタロウで次々々スレはレオってか
983NAME IS NULL:2006/03/03(金) 17:59:02 ID:???
データベースって最初に何ギガか空のイメージか何かを作って
その中にデータを入れていくのでしょうか?
それともデータが増えるごとにサイズが大きくなったり
または各データごと個別のファイルだったりするのでしょうか?

データベースの仕組みについて超優しく解説サイト等があれば教えてください
できればイラストたくさんがうれしいです
984NAME IS NULL:2006/03/03(金) 18:15:56 ID:???
>>983
実装によって異なる。
985NAME IS NULL:2006/03/03(金) 18:23:41 ID:???
具体的なデーターベースで勉強した方が良い。色々あるからね。
986983:2006/03/03(金) 20:09:02 ID:???
>>984-985
レスどうもです。
いろんなサイトを見てもデータベースはどれも円筒形で描かれていてイメージが湧かなかったもので。
というかSQLはデータベースを操作する言語のことなんですね。
そういうこともわからず、スレ違いな質問をしてすみませんでした。
987NAME IS NULL:2006/03/04(土) 00:55:23 ID:Ad/biqSE
SQL*LOADERで、ホスト(EBCEDIC)のS9BINARY項目を
VERCHR項目にロードする方法を教えて下さい。
よろしくお願いします。
988NAME IS NULL:2006/03/04(土) 01:19:18 ID:???
>>987
Oracleスレにいってね。

次スレはスレタイ工夫しないとこういうのがあとを絶たないね。
それともいっそSQL-DB何でも相談室にするか(笑
989NAME IS NULL:2006/03/04(土) 21:13:51 ID:og8VHb3X
1つのテーブル内に日付があり、システムの日付と照らし合わせて同じ月のデータが無ければ
データをinsertしたいと考えているのですが、恥かしながら創造がつきません。
どんなSQL文になりますか?

テーブルA
フィールド1.ID
フィールド2.Date

990NAME IS NULL:2006/03/05(日) 00:50:13 ID:???
insert into hoge
 select id, date
  from table_a
  where convert(char(7), getdate() 111) not in (
  select convert(char(7), date, 111)
   from table_a)
991NAME IS NULL:2006/03/05(日) 13:12:23 ID:???
Dateをカラム名にするのは感心しませんな。つか構文エラーになるっしょ。
992NAME IS NULL:2006/03/06(月) 10:05:20 ID:???
それがけっこうならないんですよ、
993NAME IS NULL:2006/03/06(月) 10:07:24 ID:???
そういや、違うRDBMSにデータを移行するためにいくつかツール利用してるが
前DBのカラム名にselect があるもんだからみんなひっかかるw
"" の追加で事なきを得たけど。。。
994次スレテンプレ:2006/03/06(月) 10:47:56 ID:SdupgU6V
995NAME IS NULL:2006/03/06(月) 13:43:16 ID:???
くだらなすぎるかもしれないけど、ネットとかでどうしても
見つからなかったんで教えてくださいませ。
あるテーブルの全ての行の特定のフィールドを全て1にするにはどうすればいいのでしょうか?
特定の行なら where句をつけて
UPDATE table SET field='1' where tokutei;
でよいとわかるのですが、
ようはこれから where tokutei を無くしたSQLを実行したいのです。
996NAME IS NULL:2006/03/06(月) 13:49:03 ID:???
>>995
要はwhere tokuteiを無くしてSQLを実行すればいいのです。
UPDATE hoge SET foo = '1'
997NAME IS NULL:2006/03/06(月) 14:19:13 ID:???
マイクロソフトアクセスでの日付型の扱いについて質問です

次のような表があります。
ID->数値型
NAME->文字列型
BIRTHDAY->日付型

これに対してオラクルだと次のように日付を指定して
挿入するのですが、アクセスだとどういうSQLを発行すれば
いいでしょうか?ちなみに、JAVAからアクセスのファイルに
ODBC経由でSQLを投げる環境です。


INSERT INTO T_BIRTHDAY (ID,NAME,BIRTHDAY)
VALUES(3,'三郎', to_date('20051222', 'YYYYMMDD'));
998NAME IS NULL:2006/03/06(月) 14:25:37 ID:???
【帰ってきた】SQL質疑応答スレ 2問目
http://pc8.2ch.net/test/read.cgi/db/1141622643/
999NAME IS NULL:2006/03/06(月) 18:01:18 ID:???
ume
1000NAME IS NULL:2006/03/06(月) 18:02:16 ID:???
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。