1 :
NAME IS NULL :
2005/08/16(火) 16:55:25 ID:EZKuoK/7 お待たせ! 夏休みの宿題に間に合うかな?
お、帰ってきたか
3 :
NAME IS NULL :2005/08/17(水) 17:30:28 ID:QQOPOPnl
華麗に3ゲト
おっ、やっぱいいな。 密かにWikiを用意していたんだけど、 他のネタに使っちゃった。
教えて下さい。 データを削除する方法として、論理削除と物理削除があると思いますが、 どちらが一般的なのでしょうか? 自分は今まで物理削除しかしていませんでしたが、最近仕事で一緒にやっている人間が 論理削除派なのです。 理由はトラぶった時に対応できるからだそうですが、実際にはどちらが良いのでしょうか? また論理削除の場合、物理削除や復活機能は付ける物でしょうか? 何卒教えて下さい。
>>6 ADO.NETともSQLともは関係ない話だな。マルチすなw
8 :
NAME IS NULL :2005/08/31(水) 12:07:07 ID:x9q05yEX
楽しかった夏休みも今日で終わり。宿題は終わった?
9 :
NAME 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です。
>>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 表示順
初めまして。 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に持っていく事が出来ません。 どのように変更したらよいでしょうか? 皆様よろしくお願いいたします!
12 :
9 :2005/09/12(月) 20:41:49 ID:???
13 :
NAME IS NULL :2005/09/13(火) 12:16:53 ID:Ey+pKjIi
>>13 重複する2の扱いで難易度アップだ。単なるtypoかもしれないけどね。
15 :
NAME IS NULL :2005/09/13(火) 18:08:26 ID:Ey+pKjIi
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) が欲しいんですが、そういった問い合わせはどうすればいいんでしょうか。
17 :
NAME IS NULL :2005/09/14(水) 11:43:38 ID:Y33JtPdi
18 :
NAME 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" の値を動的に変えたい場合は どのように書いたら?
マルチ&回答済み
【まだまだ】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" の値を動的に変えたい場合は
どのように書いたら?
>>17 サンクス
select * from TABLE
where A_ID in
(select min(A_ID) from TABLE group by B_ID)
こんな感じでできました
この場合 select min(A_ID),B_ID from table group by B_ID order by 1 でも同じ結果が得られると思うけど。
22 :
NAME IS NULL :2005/09/14(水) 18:48:58 ID:qFo7wpdd
科目(科目コード、科目名、単位数)の表を定義するSQL文を記せ。 ここで科目コードは3けた、科目名は漢字で15桁以内の可変長、単位数は整数とする。 という問題があるんですが、 CREATE TABLE 科目( 科目コード CHAR(3) NOT NULL, 科目名 NCHAR VARYING(15), 単位数 CHAR これあってるでしょうか?多分違うと思うんですが… どなたかご教授お願いします。
>>23 日本語力無くてすいません
つーかそういうレスいらないんで
答え合ってるか見てほしいんですけど
25 :
NAME IS NULL :2005/09/14(水) 19:12:16 ID:A03+/ogp
質問させてください SELECT * FROM XXX WHERE 条件 ORDER BY 特定行 こんな感じのSELECT文で取得データ数を指定することは出来るでしょうか? あっても最大200個までのデータを取りたい場合とかはどうすればいいのでしょうか?
自己解決しました。すみません。
検索結果の頭に 1,a1,a2,a3 2,b1,b2,bc のように、SQL 分で番号を追加することはできますか?
>検索結果の頭 >SQL 分で番号 頭って何だどっち方向だ SQL分って何だ特殊な時間か ただの連番(行番号)ならDBMSによる
29 :
27 :2005/09/18(日) 01:00:44 ID:???
行番号です。 SQL Server です。
31 :
27 :2005/09/18(日) 04:01:07 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
SELECT ID,MAX(時間) xx FROM テーブル GROUP BY ID ORDER BY xx(列の別名) これが通らないなら、上記SQLをFROMに突っ込んで。 SELECT ID,xx FROM (上のSQL) ORDER BY xx
37 :
NAME 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
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
39 :
37 :2005/09/21(水) 15:36:54 ID:???
>>38 折角質問にお答え頂いたところ
申し訳無いのですが、当方Oracle未経験で
現在使っているDBもPostgreSQLなのです…
再度の質問になりますが上記のSQLを
PostgreSQLに直して使うにはどうしたらよいでしょうか
40 :
NAME IS NULL :2005/09/21(水) 16:09:06 ID:EVbwtLR8
decodeって、if x then a elseif ・・・ else なので。 case式とかかな?
41 :
35 :2005/09/21(水) 17:10:16 ID:???
>>41 つうか、入門書を買うか、入門Webページをブックマークに突っ込め。
>>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ではなくてプログラムロジックで処理したほうが早いことがある。
SELECT id FROM テーブル WHERE code in (1,2,3,4) GROUP BY id HAVING count(*)=4
45 :
NAME IS NULL :2005/09/22(木) 11:17:19 ID:/gIUfeom
47 :
NAME 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列になってしまうのがよくありませんでした。
>>47 文字列を結合するような集合関数はない。あったら便利だとは思うが、
第一正規系を崩してしまうことになるからあえて実装を避けてるのかもしれない。
idで単純に結合してプログラムでid順に読み込みながら最終の形にするのが単純で効率もいい。
それ以外では問合せ結果を結合するストアドファンクションを自作する。Access2000ならVBAで作れる。
ただこの場合idの数だけ繰り返し子テーブルにクエリが発生するので実行効率はよくない。
>>42 お薦めの入門Webページを紹介して下さい。
53 :
NAME 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が無効とエラーが出てしまいます。
DBMS何よ
55 :
NAME IS NULL :2005/09/26(月) 18:55:09 ID:4g4KCvW+
MsSQLです さっきの訂正でsUcdとは顧客コードのことです。
56 :
47 :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が並ぶようなつくりになっています。 レコード数が増えたときにどの程度の時間がかかるかまだ試験していないので、 後日親テーブル数万件程度のデータを作って検索時間を調べてみようと思います。
>>59 55 名前:NAME IS NULL[] 投稿日:2005/09/26(月) 18:55:09 ID:4g4KCvW+
MsSQLです
さっきの訂正でsUcdとは顧客コードのことです。
M s S Q L で す
M s
61 :
NAME 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 可能でしょうか?うまく検索かけれないので 調べ方を教えて頂けないでしょうか?
62 :
NAME IS NULL :2005/09/27(火) 11:29:23 ID:C3pVQHL0
テーブルへの付与権限を参照する方法を探しています。 環境はoracle8i/sqlplusです。 table name >> abc 参照ユーザー >> user1,user2 とあった場合、abcを参照できるユーザー一覧、をコマンドで取得できるでしょうか。 また、user1が参照できるテーブルの一覧、の取得は可能でしょうか。 select分のオプションで出来るかと思ったのですが、どうにも出来ません。 方法などありましたら、教えていただけないでしょうか。 宜しくおねがいします。
>>61 DECODE式
>>62 V$なんとかっていうビューであるんじゃないの?
ORACLEに関しては、マニュアルが無料でDL出来るんだから、それをDLしろ。
65 :
NAME IS NULL :2005/09/28(水) 10:16:09 ID:wKutUxf5
66 :
NAME IS NULL :2005/09/28(水) 11:11:53 ID:wKutUxf5
67 :
NAME IS NULL :2005/09/29(木) 11:14:36 ID:lESN49Jz
ID PRICE 1 100 2 30 3 500 の中から最大値と最小値を それぞれ取得は出来ますが 最大値最小値を同時に 3 500 2 30 と表示させる事ができません。 グーグルで 表 合成 等で検索しても見つかりません うまい検索の仕方を教えて頂けないでしょうか? sql+使用しています。宜しくお願い致します。
68 :
NAME IS NULL :2005/09/29(木) 11:18:22 ID:m8iYeg7a
69 :
67 :2005/09/29(木) 11:27:17 ID:lESN49Jz
>68 良く分かりました。 ありがとうございました。
70 :
67 :2005/09/29(木) 15:04:04 ID:lESN49Jz
もう一つ質問させてください。 ID DATE 1 99/02/10 2 88/08/30 とありDATE型で年の99年だけを表示したいです。 検索キーワードを教えて頂けないでしょうか
88年は非表示てことか?
ああ、ごめん。思い切りスレごと勘違いしてたわ。忘れて。
>>70 単純に1999/01/01 <= date < 2000/01/01
じゃダメなん。
もしくはdate_trunc('year',date) = '1999/01/01' とするか。
そもそもSQL*PLUSはDBMSじゃないし、ORACLEでよいのでしょうか? WHERE 日 >= 年初 AND 日 < 次の年の年初
75 :
67 :2005/09/29(木) 15:35:54 ID:lESN49Jz
>73 早いレスありがとうございます。 上下2つとも試させて頂きましたが ORA-00933: SQLコマンドが正しく終了されていません でした。 私は検索の仕方を知りたいです。 わがままいって申し訳ありません
76 :
73 :2005/09/29(木) 15:41:03 ID:???
>>75 Oracleつかっとらんので、細かい文法までしらんがな。
ちゃんと相応に書き直せばいいじゃん。
いったいどんなsqlを書いたんだ、試したsql晒せ。
78 :
67 :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
文字列としての日付はデフォルト書式設定によって変換できれば変換する。 で、そもそもシングルコーテーションで括られてないから文字列にもなってないし。 あと、文字列日付型変換はTO_DATE あとは調べろ。 ついでに、IDとかDATEって予約語っぽいから絡む姪には避けたほうが。
「上手な検索の仕方教えてください」じゃスレ違いだしな
81 :
67 :2005/09/29(木) 16:05:50 ID:lESN49Jz
>79 ありがとうございます。 解決できました。 また他の皆さんの好意に対して失礼な事 言ってすみませんでした
テーブル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 とは出来ないんで、何かいい方法はありますか?
>>82 めっちゃズレてるorz
あとテーブルCの
3 003 マウス
↓
3 003 キーボード
ですた。すいません。
DBMSはなによ
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
反応ないな。これじゃダメだったんだろうか。
すいません。今試せる環境にないんで。 明日試して結果報告します。
Oracleで次のような場合どのようなSQLを発行すればいいですか? 商品コード 001 管理コード 005 から 商品コード 005 管理コード 002 まで の間で該当するものだけを取得する
>>89 とりあえずコードは整数値?
と、商品コード002〜004の場合は管理コードは全てって事かな?
ベタな書き方だが、下限の商品コードをX0、管理コードをY0
上限の商品コードをX1、管理コードをY1として、
WHERE (商品コード = X0 AND 管理コード >=Y0)
OR (商品コード > X0 AND 商品コード < X1)
OR (商品コード = X1 AND 管理コード <= Y1);
必要に応じてキャスト(型変換)が必要かも。
91 :
NAME IS NULL :2005/10/04(火) 10:41:01 ID:M8bZahSh
IDの列に1から10000までの数値を入れたいのですがいちいち手打ちにしたら大変です。クエリでなにか繰り返し処理をやる方法はあるのでしょうか。
使ってるDBMSくらい書こうぜ
93 :
NAME 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です。
95 :
93 :2005/10/05(水) 16:27:22 ID:R/pBqEHx
>>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);
97 :
NAME IS NULL :2005/10/05(水) 16:32:01 ID:mXvyy2I3
98 :
93 :2005/10/05(水) 17:42:35 ID:???
>>96-97 ありがとうございます。
あれこれ手直しして、SQLは組むことができました(脳内で)
で、サブクエリの中身と、それ以外での実行は可能だったんですが
組み合わせて実行すると・・・・
MySQL3.23…○| ̄|_
サブクエリ未対応・・・・・
どうしたらいいんでしょうか?
99 :
NAME IS NULL :2005/10/05(水) 17:47:06 ID:7ZhDZrog
SQLのコマンド入力を途中でキャンセルする方法を教えてください。 Ctrl+ZしたらSQLまで終わってしまいました。
100 :
NAME IS NULL :2005/10/05(水) 18:30:29 ID:mXvyy2I3
reca decimal(5) のレコード長はいくらですか? reca decimal(5) recb decimal(5) と記述された時のの合計のレコード長はいくらですか? あと、DATE のレコード長は10であってますでしょうか?
予約状況を検索するシステムを作っています。 名前|日付|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を書くことは可能でしょうか?
105 :
103 :2005/10/06(木) 09:58:08 ID:???
>>104 select 日付、sum(1),sum(2),sum(3),sum(4),sum(5)… from tableA group by 日付 having 日付 = 今日
でいけました。ありがとうございます。
106 :
103 :2005/10/06(木) 10:03:17 ID:???
あ、sumだと集計だから2になることもありえるんですね。 プログラムの仕様上、1か0しか入ってこないのでmaxでも良さそうですね。 いずれにしても1以上なら予約済みってことでいけそうです。ありがとうございました。
107 :
NAME IS NULL :2005/10/06(木) 11:14:01 ID:evieqYdL
初歩的な質問ですみません。 postgreSQLで、int型のものを、text型に変更したいのですがどうもうまく行きません。 changeまたはmodifyを使えばできると聞いたんですが、エラーになってしまいます。 バージョンはpsql 7.4.8です。 よろしくお願いします。
>>107 ポスグレのことはさっぱり分からんが、エラーになる記述を書いておいた方が回答来やすくなるんじゃないか?
>>107 テーブルの定義済みint型カラムをtext型に変えるのは無理だったと思う。
SELECT int_column::text , ... INTO New_Table FROM Old_Table;
てな感じで、型変換しつつ新しいテーブルを作って、古いテーブルを削除して
新しいテーブルをリネームするとかやってた。
110 :
NAME 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 さんのやり方を見ていると、列と列の間に列を追加することも
できないんでしょうか?
どうも検索してもうまくヒットしないので、申し訳ありませんがご教授お願いします。
行き詰ってしまったので質問させていただきます。 mysplとphpを使った簡単なクイズのサイトを作りたいと考えております 現在、問題ID、問題文、5択なので選択肢5つ、解答とフィールドを作っており htmlのサイト上でそれらを呼び出し ラジオボランで正確な答えをチェックして 当たりかどうか判別してやる という所まではいけたのですが困った事が起きてしまいました。 現在では1つのページに問題が1問しか表示してないのですが、 一度に何問も表示させ判定したいと考えております。 問題だけをを沢山表示させることは可能なんですが、それぞれの問題に答えをチェックする ラジオボタンの表示にすごく困っております。 問題文は追加できるようになっており、現在存在する最後のID番号から+1した所に 追加されます。 すごく分かりにくい説明かもしれませんが どなたか分かる方おられましたら よろしくお願いいたします。
113 :
109 :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は無理だったと思う。
114 :
NAME IS NULL :2005/10/06(木) 15:58:20 ID:evieqYdL
>>113 ご回答ありがとうございます!!
非常に助かりました!
早速試してみます!
ちなみに、隣の席の詳しそうな人に質問したところ、
AFTER....でもできるって言われたんですが、postgreSQLでは無理ですよね?
調べてみてもそのようなものは見当たらなかったのでできないだろと思うんですが。。
115 :
109 :2005/10/06(木) 15:58:48 ID:???
116 :
NAME IS NULL :2005/10/06(木) 16:05:44 ID:evieqYdL
>>115 ぬおおおご丁寧にありがとうございます!
_かどうかわかっただけでも、無駄な時間を使わずにすみました!
本当にありがとうございます!!
>>109 さんの方法を試してみようと思います。
本当にありがとうございました。
117 :
NAME 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
そもそも実表の列の並び順に意味はあるのか?
元質問のような場合は意味ないが、性能を求める場合には意味が出る。 クラスタ化されたIndexでDBMSによってデータの取得順が保証される場合にソート不要になるとか。
で、結局117の「?」は何なのだ?
さぁ
プログラム内であればパラメータクエリのパラメータの可能性。 そうじゃなければ・・・書いたときに考え事してたんでしょ?
オレもホスト言語のパラメータだと思う。 ひょっとしてユーザ定義の演算子だったり。
124 :
NAME IS NULL :2005/10/12(水) 17:15:36 ID:xuezRbdp
?は、文字化けか、javaのプリペアドステートメントだと思われ
>117 アプリケーションから似たりよったりのSQLを大量に発行する場合の定石。 SQLをキャッシュして?の部分だけ入れ替えてつかいまわすわけ。 100〜10000回連続で試し投げしてみ? レスポンスぜんぜんいいから。
PreparedStatementね。
127 :
NAME IS NULL :2005/10/13(木) 16:19:48 ID:fh/hG6tg
┓°リ∧°了├~ス〒―├乂冫├
128 :
NAME IS NULL :2005/10/15(土) 00:56:50 ID:tIcXe7xh
existsとinの違いがわかりません・・。existsで偽の場合、値を何も返さないということはただ条件にあったものを抽出してるだけだと思ってしまうんですが・・。inと何が違うんでしょうか?お願いします。
130 :
NAME IS NULL :2005/10/15(土) 12:14:31 ID:My+8kmaa
>>128 結果は一緒ということは、違うところはどんなところなんでしょうか?お願いします
質問全部丸投げかよ……。 existsはbooleanで返ってくるから項目そのもの返してくるinよりデータ量少なくてウマーって事じゃないの?
132 :
NAME IS NULL :2005/10/15(土) 12:24:26 ID:My+8kmaa
>>131 なるほど、わかりました。ありがとうございました
133 :
NAME IS NULL :2005/10/15(土) 13:01:45 ID:r/3g3H4p
existsは、副検索文を書いて、その副検索文の結果一行以上の結果リストが作成されると正になります。 IN は In の前にある列名等の値が、In の数値リストや検索結果の値の中と一致すると正になります。 In を使用する場合に、数値リストや再帰なしの副問い合わせで比較するINの値が 確定して、数値の数が一定以上になるとハッシュテーブルにしてくれるDBも あるようです。最適化により、同じ結果になってしまうかも知れませんが、きちんと 作り手の意思を示しておいたほうが、オプティマイザのバージョンに振り回されることが なく、美しいと思います。
134 :
NAME IS NULL :2005/10/15(土) 13:25:52 ID:bnb8MZCS
INは3値論理でEXISTSは2値論理
なるほど、わかりました。ありがとうございました
136 :
NAME IS NULL :2005/10/15(土) 14:09:33 ID:My+8kmaa
>>133 ‐124
初級シスアドの知識範囲内なのでそこまで詳しくやらなくても大丈夫ですがなんとなくわかりました。ありがとうございました
137 :
NAME IS NULL :2005/10/16(日) 22:01:11 ID:GZI0E0IQ
MSDBでテーブルを作ろうとしたのですが、vrchar型を指定した列に文字列を入力しようとすると、 「式や変数はいいけど列名はやめて」というようなメッセージが出ます。 integer型になってしまっているということなのでしょうか? 文字列を入力するにはどうすればよいのでしょうか、どなたかご教授ください。
139 :
NAME IS NULL :2005/10/17(月) 03:09:54 ID:wyL2n/Pf
SQL全くの初心者ですがどんな形式のファイルならSQLコマンドでデータを抽出できるんでしょうか? CSV形式とかのデータじゃだめですか?
>>139 Windowsなら ODBCテキストドライバでCSVファイルに直接クエリーを発行できるが、
単純な読み込み以上のことをするとひどくパフォーマンスが悪い。
CSVファイルからデータベースにデータを取り込むのはたいていどれもできるから一度取り込んでからクエリーすればいい。
SELECT A.単価 * A.税 AS 税込単価 税込単価 * A.数量 AS 金額 FROM A なんでSQLってこういうの駄目なの?
DBMS次第なんじゃねーの?
Aテーブルに同じフィールドを持ったcsvをd, e, f, g と4つのフィールドを比べて 1つでも違っていたら、insertするというSQLをつくりたいのですが、 これは、ストアドになるのでしょうか? データはだいたい5万件くらいあります。 サーバーはSQLサーバーになります。 宜しくお願い致します。
>>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を削除
145 :
NAME IS NULL :2005/10/20(木) 11:40:31 ID:2aNV0QkE
>>144 ありがとうございます。
とりあえず同一構造のテーブルをつくったのですが、このカンマで区切ってあるcsvをどうやってインポートするのでしょうか?
なにか、簡単な方法はありませんか?
146 :
NAME IS NULL :2005/10/20(木) 11:51:27 ID:uShZCwun
>>145 SQL鯖だよな?
bcp あるいは DTS をBooksOnlineで調べるがよろし
147 :
NAME IS NULL :2005/10/20(木) 16:11:58 ID:2aNV0QkE
>146 ありがとうございます。 無事、DTSにてインポートできました!
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 どーか上手くいく方法教えて下さい
>>148 SELECT code,a+b+c as d From Table;
150 :
148 :2005/10/22(土) 09:26:57 ID:???
>>149 ありがとうございます。
そうでした、全く簡単な構文でした
複数テーブルじゃないからUNION必要ありませんね…orz
直前の処理に似たような奴でUNIONやってたせいか頭がうねってました
151 :
NAME 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がひとつしかでないのですが
何故失敗したSQLを書かないのか
153 :
NAME 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になってしまいます
「union all」 それ以前に「手ぶれ」はどうにかしてくれ。
TEBLE
SQLServerなのですが、テーブルのフィールドの順番をSQL文で変更することは可能でしょうか? 素人質問かもしれませんがご指導いただけたら光栄です。
質問の意味が理解できない。 select fild01,fild02,....を select fild02,fild01,....とかこんなの?
158 :
156 :2005/10/24(月) 21:09:18 ID:???
>>157 記述足らずで申し訳ありません。
テーブルで定義されているカラムの順番(colid)をalter table等のSQLで変更したいのです。
Accessのadpでなら可能なのですが・・
adpで出来たならトレースしてみれば分かる。 力ワザだったような
select * into #tmp from HOGE drop table HOGE create table HOGE 順番入れ替えたカラム定義 insert into HOGE select 入れ替えた順番考慮したカラムリスト from #tmp
161 :
NAME 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とかを 使って取得できるんですが、これはどうしても分かりません。やり方はあるでしょうか。。。
あります ・グループ化 ・サブクエリ
>>159 ,160
レス有難うございます。記載していただいた内容でやってみます。
164 :
161 :2005/10/25(火) 22:25:24 ID:30Ub9SpH
ずっと考えてましたが解りませんでした…orz ユーザと試験の種類、MAX(日付)でグループ化したレコードの値と一致するものだけを 元のテーブルデータから取得すればいいと思ったのですが、グループ化するまではできても 一致するものを取得ができません。 どなたか、ご教授お願いします。
166 :
161 :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.日付 とにもかくにも、ご返答くださった方々ありがとうございました。
DBMS何?
>161 ナゼにWHERE NOT EXISTS? WHERE EXISTSでできるじゃん…。 HAVING句を使うべし。
169 :
NAME 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
SQL”サーバ”スレで聞けば? ここはSQLスレです。
ヘルプのCREATE PROCEDUREの項を見ろ。
答えたがりがいる限り、スレ違いでも安心ですv
>>168 ふつー not exists だろ。
つか逆に、なんで exists とか having なん?
not existsって遅くない?
集約関数使ってhavingの方が遅いだろ。
集約関数をSELECT句で使うと遅いけどな
>168 は多分こう言いたいと思われ 速いか遅いかは各自好きな環境で確かめてけれ select * from 試験テーブル a where exists (select 1 from 試験テーブル b where a.ユーザ = b.ユーザ and a.試験 = b.試験 group by b.ユーザ, b.試験 having max(b.日付) = a.日付)
ヘボいプランナならNestedLoopの内側でSeqScanが走ってしまうパターンだな。
計画次第だけど、 Not Existsはないことを証明しないとダメだからね。 Existsは有ったらその時点で打ち切れるけど、Notは全部見ないとダメ。
何か勘違いしてないかな? not exists も「有ったらその時点で打ち切れる」んだよ。 んで、賢くないプランナは集約関数を使っちゃうと打ち切ってくれなくなるわけ。
>>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.試験の種類
)
>>180 なーるほど。思い起こしてみれば集計関数使っていたような気がする。
勉強になったよthx
SELECT 受注No,SUM(数量) ,SUM(売上) FROM 受注テーブル GROUP BY 受注No ORDER BY 受注No で受注テーブルに 区分 があって、 区分が「1」のものだけ SUM(数量) したいんだけど無理でしょうか? WHERE句に条件入れたらSUM(売上)も減ってしまいました。
>>183 そりゃ当然の結果かと。
どうしてもやりたいなら、WHERE句使わないで
selectで「もし 区分が1なら 数量 違ったら 0」のSUMじゃないと
>>183 SELECT 受注No,SUM(CASE WHEN 区分=1 THEN 数量 ELSE 0 END),SUM(売上)
以下同じ...
>>184 ありがとうございます!
Select句で 場合分けして、SUMですね。
お力添え感謝します。
ありゃ、8分遅れの大カブリ(´・ω・`)
>>185 具体的にありがとうございます!
そういう発想がありませんでした。。
ホントに助かりました。
189 :
NAME IS NULL :2005/10/29(土) 00:49:05 ID:hb6jInpd
質問です。postgresqlです。 ツリー型の掲示板を作ろうとしていまして、下記のようなテーブルを作りました。 create table "main_log" ( "uid" int4, ・・・・ "parent" int4 ); 記事番号"uid"の親記事は"parent"番という感じです。そこで、ある記事の子孫だけを対照に 例えば文字列検索をする場合、子記事をSELECTしてそのまた子記事をSELECTして、と 子供がいなくなるまでアプリからSELCETし続けるのはきっと効率が悪いのだろうと思いました。 簡潔に問い合わせるにはどのようにしたらいいでしょうか。 キーワードだけでもいいので教えてください。ググっていてビューあたりが怪しいと 思いましたが、当たってないでしょうか。
ずっとググっていたのですが、同じような質問がいくつかあり、いずれも 解決していないようでした。別の方法を考えることにします。
>>189 PostgreSQLなら connectby というストアドが用意されている。
最初からインストールされているわけじゃなく
ソースのcontrib/tablefunc/ に用意されているので、
そこでmake / make install すれば使えるようになる。
>>191 のセットモデル(Celkoは入れ子モデルといっているが)も面白い。
分類(大->小->孫)とか部品展開程度なら使ってみるのも一考。
だけど掲示板のようなどんどん追加されていくものは、
あまり向いていない希ガス。
特にPostgreSQLはUPDATEが旧行の無効化と新規挿入だから
レスがつく度に過去レスの行がUPDATEされる入れ子モデルは
頻繁にVACUUMしないときつい。
193 :
sage :2005/10/29(土) 23:49:47 ID:ZlSB+wKn
194 :
sage :2005/10/30(日) 00:09:09 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は使ってみます。
ありがとうございました。
196 :
NAME IS NULL :2005/10/31(月) 23:35:24 ID:4VmPGkxj
プロシージャからファンクション内でgetdateできないのは何故?
197 :
NAME IS NULL :2005/10/31(月) 23:40:19 ID:jzNIdK4H
以前から思っていたのですが、「hoge」って何ですか??
ほげほげー
200 :
NAME IS NULL :2005/11/01(火) 18:33:04 ID:DUU3lZ/C
PostgreSQLでOracleのMergeと同等のものはないでしょうか? 主キー制約に反するかどうかのチェックをするのに 一旦SelectしたあとInsertのようなことをプログラムで実現しています。 これを1回のコネクションではできないでしょうか?
202 :
NAME 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回問い合わせしないように スマートにするにはどうしたらいいでしょうか?
>>202 SELECT pid,pup,pty,pup*pty as price FROM tord JOIN tup USING(pid);
普通にWHERE句で単価テーブルと受注テーブルを結合したら。 それだともろ直積が出てレコード数増えすぎるでしょ。
>>204 まともな処理系なら直積のためのマッチングと平行して日付条件の絞込みもするから、
レコード数が増えすぎることは無い。
データの分布によっては何度もサブクエリーを繰り返す
>>202 より早いかもしれない。
もしテーブルの設計に手を加えられるなら、単価は受注時に解決しておいて受注テーブルに
受注時単価か単価IDを持たせておくとすっきりする。単純なキーで結合できるようにするべきだろう。
206 :
203 :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;
と書くだけで、日付絞り込み後結合するようにプランナ/オプチマイザが
判断するんじゃね。
207 :
204 :2005/11/03(木) 11:28:11 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 思い切り後じゃん
209 :
NAME IS NULL :2005/11/06(日) 09:53:05 ID:p3ndZTAk
210 :
NAME IS NULL :2005/11/07(月) 05:27:36 ID:kqwYN43F
5.0の日本語設定ってどうやるんですか? @my.iniのdefault-character-setをsjisとする →× Amysqladmin --default-character-set=sjis →× もうわけわかめ
何の5.0だよ
まあMySQLなんだろうな。 自信は無いけど。
213 :
NAME 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.評価 ;
214 :
NAME IS NULL :2005/11/08(火) 22:03:23 ID:LmLbG6/B
>213 tableBは商品コード、数、日付です。 見づらくてスイマセン・・・。
here tableA.Aコード = (select tableB.商品コード from tableB =じゃなくてINしとけ。複数行返すだろう。
INSERT INTO tableC SELECT tableA.Aコード, tableA.個数, tableA.評価, tableB.数, tableB.日付 FROM tableA, tableB WHERE tableA.Aコード = tableB.商品コード AND tableA.商品コード = '001' AND tableB.評価 = 'A'
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] ; んじゃ漏れはこんな幹事で
スペースキエルノワスレテタ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] ;
219 :
NAME IS NULL :2005/11/09(水) 13:45:28 ID:V02w1ql5
SQL文内で列名に%をつけることはできないのでしょうか? イメージ的には 表A.列1 LIKE 表B.列1% のようにしたいです。 表A.列1の文字列長が表B.列3よりも長く、表B.列3の前方一致で検索したいです。
220 :
NAME IS NULL :2005/11/09(水) 13:52:35 ID:9RygzwaV
221 :
NAME IS NULL :2005/11/09(水) 13:56:06 ID:V02w1ql5
>>220 ありがとうございます。
よく読んでやってみます。
222 :
NAME IS NULL :2005/11/09(水) 21:08:41 ID:IMpEBTHt
>218 回答どうもありがとうございました。 解決できて助かりました。
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ものを全て抜き出しているようです。 どなたか複数条件の設定方法を教えてくださいませ
>>223 select * from anken where oya = 1 and status = 0 and (tantou = 0 or tantou = 1);
>>224 即レスありがとうございます!
カッコで優先する部分を囲ってあげればいいんですね。
助かりました
優先度はANDのほうが高いから その場合 oya1 status0 tantou0 か tantou1のものを抜き出してることになる
select * from anken where oya = 1 and status = 1 and (tantou = 0 or tantou = 1); では? 気が付いてると思うけど念のためね。
MySQLとPostgreSQLってそれぞれ何に使われてるの? 前者はオンライン上で後者はオフラインで使われていると思ってて良い?
>228 概ねOKじゃね
>>229 やっぱそうなんだ。よかったよかった。回答ありがとうございます
231 :
NAME 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文一発で取得は無理なのでしょうか・・・? できるだけスマートな方法で実現したいと考えています。 どなたかお知恵を拝借させてくださいませ。
FAQ
233 :
231 :2005/11/14(月) 16:25:44 ID:???
やはり一時テーブルを使用して云々・・・?
>233 概ねOKじゃね
235 :
NAME IS NULL :2005/11/14(月) 20:57:12 ID:kOPx2ZGf
236 :
668 :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'
237 :
668 :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'
>>236 SELECT のターゲットリストにあるサブクエリはカッコで括ってみそ。
SELECT a,(SELECT b FROM t)b ...
(´・ω・`)
>>237 複数のcolumnを返すサブクエリが拙いんじゃね。
ターゲットリストに書かずにJOINしなはれ。
no1,2,3が複数カラムを返してるんだが
>231 select * from hoge where (date, code) in (select max(date), code from hoge group by code)
242 :
668 :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'
243 :
NAME IS NULL :2005/11/14(月) 22:28:35 ID:U6dj6UD0
ANY使うんじゃね
1行に複数行は収まらないでしょ? そういうこと。
245 :
668 :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
246 :
668 :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'
ヒント:どういう入力があり、どういう出力にしたいのかを書いてみる
sqlのselect文で何件該当したかだけを取得する事は出来ますか? あるqueryで何件引っかかったか知りたいのです。 ちなみにpostgreです。
select count(*) from hoge; select count(hage) from hoge;
>241 試してみましたが、 ',' 付近の WHERE 句にエラーがあります。 クエリ テキストを解析できません。 となってしまいました。 使用DBはSQLServer2000です。 なんでだろ・・・orz
251 :
231 :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と同じことか・・・
252 :
231 :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 です。
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`)ノ
SQL文書くときの一般的なインデントの付け方を解説しているサイトとかないかな? 見やすければ良いんだろうけど基本があるんだったら知りたい。
255 :
231 :2005/11/15(火) 11:39:42 ID:???
>253 結局、現在はこの方法で実装してまつ。 いろいろdクス。
スマソ、レスヨクミテナカッタヨ...(´・ω・`)イッテクルワ
257 :
241 :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がわかり易くていいですね。 勉強になります。
258 :
668 :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
259 :
NAME 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の昇降順にしたいのですが、うまくいきません どこを手直しすればいいのでしょうか?
1.脳みそ 2.取得したいIDをMAXかMINに絞る 3.諦める
261 :
NAME 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
262 :
259 :2005/11/16(水) 21:36:31 ID:???
早速の返事ありがとうございます。
悩む事1日。きょうはもうだめぽと思い帰ってきてしまったので、早速明日やってみたいと思います。
>>260 1.脳内ではバシッと決まってます
2.261さんと同じ事なのですよね?
3.2chでダメなら諦めるつもりでした
>>261 その文法に足の親指の爪を突っ込んだ程度の事はやってみたのですが、意味が分らずやめてました
そのIN(〜)の部分がselectにselectを掛けている感じになるのかな?
今までもチラッとSQL文をやっていましたが、今までは至極単純なselectだけですんでいました。
今回のは今までのようにはいかず、selectにselectをかければいいのか?と思いわけもわからず
unionしてみたりdistinctをしてみたり、結局わけがわからなくなり、泣いてました。明日めげずにがんばってみます
ありがとうございました
263 :
NAME IS NULL :2005/11/16(水) 22:00:18 ID:Zk9jqIGD
なんか中古車サイト作ってるって感じだな。
264 :
NAME 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 ... );
265 :
264 :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 ... ;
266 :
259 :2005/11/16(水) 22:58:34 ID:???
>>263 はい。車に関係したソース組んでます。
ちなみに、VBとSQL-SERVERで見積もり・商品車管理・決算書の作成と印刷などのSQLは
なんとかこなしてこれました。そして4日ほど前からASP.NETに手を出し、悩んでます。
実質PGとSEっぽい事してます
そんな私はただの車屋です
>>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デスカ?
>>257 お褒めに預かり光栄ディス!!(0w0)ゥェーィ
>259 図書館に行けばSQL関係の本はたくさんあるので借りれるだけ借りてきて読むべし。 グループとサブクエリのサンプルSQLを熟読するだけで >259で質問した内容がいかにヤバいかわかってくると思います。 簡単なSQLはかけるんだから読むことを強く薦めます。 局所的に覚えた知識や聞きかじった知識でSQL組んでもいいことないです。 誤解を恐れずに書くと、グループ化とサブクエリ以外の機能は、 一回読めば大体理解できるし、構文を忘れてしまっても読み返せばいける。 しかし、グループ化やサブクエリを利用した結合や 相関サブクエリ、EXISTSなどが どういう動きをするのか理解していないと構文を覚えても無意味です。 お試しあれ。
>>267 しまった、最後字下げするの忘れてたorz
ちなみに
> つーか、これって車種マスター?
って聞いたのはホントにテーブル設計これでいいのか疑問だたから…
サムクナッテキタ…モウネテモイイヨネパトラssy
まずちゃんと正規化からお勉強した方が良いような希ガス
272 :
259 :2005/11/16(水) 23:30:35 ID:???
>>267 ありがとうございます。明日早速試して見ます。
一応マスターで、今考えているのが、3つのListBoxにメーカー・車名・グレードを配置し、
メーカーを複数指定したら指定した文の車名が出て、同様に複数指定した車名のグレードが出る
という形にする予定です。
今後マスターフィールドを増やし、グレードを特定する部分が車検証に乗っているのでソレを入れると
車の諸元が出るように企んでます。
273 :
269 :2005/11/16(水) 23:42:54 ID:???
>272 そのSQLは、その仕様を満足させることはないでしょう。 まあ、がんばってくださいな。
>>272 車やさんなのに専門外の分野に一生懸命でなんとなく応援したくなってくる
ガンバレ
275 :
259 :2005/11/17(木) 01:03:44 ID:???
>>269 SQLにしてみたら初歩でしょうね・・
ちょっと.NETの勉強を中断して一からSQLを勉強しなおしてみます
>>270-271 今ちょっと正規化の部分をぐぐってみました。
知り合いのプログラマーから教えて貰ってた事とちょっと違うきが・・
とりあえずマスターだらけになる気がするけど、効率を考えるとバラしまくった方が
よさそうなのでもう一回見直してみます。
最終的にどんな形にしたいか伝えたほうがいいのかな?
ヤフオクのような事をweb上で行う&より車屋にも特化した仕組みを企んでます
多数のアクセスを妄想しているのでサーバーになるべく負担が無い形にはしたいです
まぁ妄想よりも今は勉強ですね・・・.NETでも手一杯なのに・・挫けそう。・゚・(ノД`)・゚・。
276 :
NAME IS NULL :2005/11/17(木) 06:16:41 ID:gm+QOnj6
そういや既存の中古車サイトに不満があったな。 排気量で検索できるようにしておくといいよ。 税金面で排気量を気にするって結構有ると思うし。 公開して速攻クラックされそうな悪寒(w
277 :
NAME IS NULL :2005/11/17(木) 07:59:05 ID:IPjFhHO7
車男 がんがれ
278 :
267 :2005/11/17(木) 09:13:52 ID:???
設計がまずそうなことに僅かな間に気づいてもらえたみたいだし、 前向きな姿勢があればきっとうまくいくと思うなり('A`)ノシ
映 画 化 決 定 !!!
280 :
259 :2005/11/17(木) 10:43:50 ID:???
おはようございます。昨日は遅くまでありがとうございました。
さっそく2案とも試してみました。
1案はトヨタが1番に来なかった(maxIDとなっているからと思います。)
2案はバッチリいきました。
よって2案を拝借したいと思います。
>>276 検索方法は2種類で考えています。
1つはおおまかにもう1つは詳細に。もちろん排気量でも検索出来るようにします。
ほかにも距離とか年式、色などの複数の組み合わせです。
クラックもあると思います。セキュリティもちょっと勉強しましたが、これが一番大変そうですね。
本職さんの苦労が創造できました。
>>277 ありがとうございます。
>>278 がんばります
>>289 ('A`)
車男と共にSQLを勉強できると聞いて心弾ませスキップしながらでも時々転んだりしながらも勇んでやってきた俺ですよ。
282 :
NAME 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)、思い通りの 結果が得られません。 宜しくお願いいたします。
283 :
282 :2005/11/17(木) 21:05:47 ID:???
select cast((current_timestamp + '-1') as timestamp) from dual これでいけました!!
284 :
NAME IS NULL :2005/11/17(木) 23:18:25 ID:TyMLG6B5
データーベース関連の資格って何があるの?
286 :
259 :2005/11/17(木) 23:50:51 ID:???
コンバンワ。テーブル関係の事でもここで受け付けてるのでしょうか?
select from where having group by これだけ分かってりゃオケ。 あとは適当にやっときゃ何とかなる。 procedure等もノリで何とかなる。
290 :
289 :2005/11/18(金) 12:38:26 ID:???
そんな適当な俺から質問。 denormalizationした場合は絶対にtrigerが必要なの?
291 :
289 :2005/11/18(金) 12:41:36 ID:???
triggerね、スペルミスすまそ。
よほどメリットがない限りトリガーは使わない方がいい、というのが俺の経験則。
理由1.こけたときのエラーを知りにくい
理由2.オプティマイザがSQLを最適化してくれない
他の人はトリガーについてどう思ってるんだろう? 聞いてみたいな。
非正規化したときに何でトリガーが必要になるの
>>289
INSERT時に複数テーブルで同期取るんだろ。
294 :
289 :2005/11/19(土) 02:10:19 ID:???
サンクス。 非正規化して2NFに反した場合トリガーでコントロールしないと いけないと思ったもので、、、
土曜の早朝まで仕事かよ。。。。乙。。。
おいらもトリガーは使いたくない派。 理由1.2.は>292と一緒。 あとプラスして、たまに動いてくれない。(汗 Oracleぐらいちゃんと動いてくれると思ったのに ごくまれに動いていないときがあったのを目にしたときには もうトリガーは信用しないと心に決めた。
297 :
292 :2005/11/19(土) 10:10:36 ID:???
>>293 >INSERT時に複数テーブルで同期取るんだろ。
この目的だったら、INSERT発行後にソース内からSQL投げる方が安全じゃない?
>>294 (289)
>非正規化して2NFに反した場合トリガーでコントロールしないと
ソース内から投げるSQL & ビュー でカバーできないかな。
似たようなSQLをソースのあちこちから投げるのは面倒だからトリガーにまとめてしまえ、
という発想は自然だけど、でもSQLまとめるなら、プロシージャでもいいわけだし、プロシージャなら確実にエラー拾えるし、
>>296 のように動かないということもないし。
とにかく、クリティカルな処理にトリガー使うのは、個人的には恐怖を感じる。
298 :
NAME IS NULL :2005/11/19(土) 14:08:04 ID:PeviD3/v
CGI+PostGresの環境で CGIにSQLを組み込みたいのですが、どうすれよいのでしょうか? 参考になるサイトなどがありましたら教えてください。
300 :
259 :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されるようにする事は無理なのでしょうか?
301 :
NAME IS NULL :2005/11/21(月) 11:10:55 ID:ynEg+chv
>>車男 質問する時はエラーメッセージを書くように p_car_old_nameにnot null制約がかかってるんじゃないのか?
302 :
259 :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制約というのはテーブル側でしょうか? テーブル側は「許可しない」となっていたので、「許可する」に変更しましたがだめでした。
303 :
NAME 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を使用しています
単に INSERT INTO mas_car_name (mas_car_var_name, mas_car_maker) VALUES ('クラウン', 1) というのは通るのか? あと、プロシージャ定義にデフォルト引数用意していないのに 呼び出し側で使おうとしている? のはなんのつもりだ
>>303 2005/11/20から2005/11/25までの行をなんらかの形で作って
case式でマッチングさせてtrueとfalseを返せばいいお
306 :
303 :2005/11/21(月) 15:33:58 ID:???
307 :
259 :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で呼び出して各部分に値は入るようにはなっています
で、ストアドプロージャの実行時にはその都度値を入れて文法のチェックをしています。
308 :
259 :2005/11/21(月) 20:29:52 ID:???
お騒がせしました。 事故解決しそうな雰囲気が出てきました。
309 :
NAME IS NULL :2005/11/25(金) 23:18:53 ID:nfczkiDK
カーソルを定義するときに、条件をつけて、 Aならこのカーソルを実行…FETCHしてINSERT Bならこっちのカーソルを実行…FETCHしてINSERT ということがしたいときどうする?
310 :
NAME IS NULL :2005/11/26(土) 08:49:53 ID:hgVj/m1b
簡単な質問ですがお願いします。 「給料」という列の値の中で 一番数字が低い人を3人表示させるにはどうしたらいいでしょうか。
>>310 処理系によって違いがある。
select 給料from xxx limit 3
select top 3 給料 from xxx
など
あと同額3位などの処理をどうするかによっていろいろ変わってくる。
具体的なことが聞きたいなら環境や条件を明記すべし。
312 :
310 :2005/11/26(土) 09:28:40 ID:hgVj/m1b
313 :
NAME 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以外のときにループを停止する、というものです。 乱文ですいませんが、どなたかわかる方お願いします。
とりあえずプログラムの基礎とPL/SQLの勉強すれば?
315 :
NAME IS NULL :2005/11/28(月) 13:27:06 ID:yH9VVTPB
>SQL超初心者ですが、質問させてください。 入門書で買ってきて中級者になれば
316 :
NAME IS NULL :2005/12/01(木) 00:38:56 ID:V8y/6DtB
>>313 PL/SQLは、よくわからないんだけど、
T−SQLでは、
ループを抜けるには、
BREAK(ループからぬける)か、CONTINUE(今のデータは飛ばして、次のデータをFETCH)
をいれるんだよね。
ごめん、参考書、会社だ。。。
317 :
NAME 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です。
>>317 SQL Serverならマニュアルや解説本でフルテキスト検索が使えるかどうかよく検討してくれ。
ここで説明するには内容が多すぎるので説明は省く。
要件に合わないなら、語句の出現回数を数えるストアドファンクションを作りそれ順に並べ替えるなど、
いまやってる通りのことをやればよい。
319 :
317 :2005/12/01(木) 10:43:22 ID:8EgnSfPq
>>318 つまり、出来ないって事なんですか orz
ありがとうございました。
320 :
NAME IS NULL :2005/12/01(木) 10:47:06 ID:q3yIUH/k
>>317 oracleならtranslateを使えばできる
322 :
NAME IS NULL :2005/12/02(金) 00:32:41 ID:npYEalDS
Webアプリでページングがある表の表示するSQLで質問どす Orderかけた後にROWNUMで41行目から60行目の取得 みたいなこと Oracleではインラインビューつかって出来るじゃないですか。 PostgreSQLなどではoffsetで同じコトが実現できますよね。 そんじゃSQLserverで同じことするにはどうすりゃいいの? TOPだけじゃ何件目から〜が取得できないっすね〜
323 :
NAME IS NULL :2005/12/02(金) 01:10:15 ID:i693pvse
あのー、 超初心者なんだけどここに質問書いていい?
324 :
NAME IS NULL :2005/12/02(金) 02:21:18 ID:/MiT62e7
いいんじゃない??答えられることなら答えるよ。誰かが。
普通のSQL文ネタならいいんじゃね。 インストールとか運用とかベンダー依存ネタなら 該当スレへ。
>>322 MSSQL2005からROW_NUMBERがサポートされるが、
いまのところ先頭から不要な分を読み飛ばすしかない。
ただ、ページ替えのたびに範囲変えて毎度クエリーする手法は、
よほどデータに動きが無い場合にしか使えないから困ることは少ないと思う。
MSSQLは使ったことないが、SQL標準のCURSORじゃダメなんか?
328 :
NAME IS NULL :2005/12/02(金) 09:09:48 ID:QYxvluag
329 :
NAME IS NULL :2005/12/02(金) 09:31:00 ID:rODeKmhf
Oracleにはインラインビューがあるからでなくて、RowNumがサポートされているからっていうことね
>>322
330 :
NAME IS NULL :2005/12/02(金) 09:31:58 ID:rODeKmhf
>>321 oracleのtranslateに相当する関数は
sqlserverに多分あるはずだ
>>322 select top (60-41+1)
* from テーブル
order by 逆順でソート
もしくは
select top 41
* from テーブル
order by
差集合
select top 60
* from テーブル
order by
334 :
323 :2005/12/02(金) 12:16:49 ID:i693pvse
仕事でDBの練習する事にしたんだけど、My SQLとPostgreSQL どっち選んだら良い? 誰かたのんます〜
>>334 環境は?
オレなら、SQLの勉強なら制限の少ないPostgreSQLにするけどな
336 :
323 :2005/12/02(金) 13:23:13 ID:i693pvse
>335 ありがとさんです。 環境はOS X、G4の133なんだけどスペック足りないかなぁ。&英語は超苦手〜 金髪美女は好きなンだけと…
337 :
NAME 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ディレクトリを #変更しています。
338 :
337 :2005/12/02(金) 13:58:12 ID:LniOy+zB
すみません、SQL質問をPostgreSQL質問と勘違いしました。 すれ違いでしたらすみません。。。
>>338 MSSQLのスレと勘違いするものは居たような気もするが、
PostgreSQLスレと勘違いするやつは初めてのような希ガス。
コンパネから管理ツール->サービスを開いてPostgreSQLの
プロパティを開けば解ると思うが、たぶん起動時のオプションで
-D "C:\Program Files\PostgreSQL\8.1\data"
が付いているのだと思う。これを削除すればpostgresql.confの
設定が反映されるはず。
うまくいかなかったら、以後はPostgreSQLのスレで聞いてみて。
340 :
339 :2005/12/02(金) 14:31:14 ID:???
スマソ。素直に -D "D:\PostgreSQL\data" と書き換えた方が良い。 dataディレクトリにpostgresql.confがあるんだった。
>>336 スレ違いのマカは氏ね。
OpenBaseだかでも使ってな。
342 :
338 :2005/12/02(金) 19:09:20 ID:LniOy+zB
>>340 やっぱりサービスのプロパティを書き換えないとダメなのですね。
#書き換え方がわからないのでレジストリを直接書き換えましたorz
ありがとうございました。
343 :
323 :2005/12/02(金) 19:52:24 ID:23Pkqip1
>
>>341 オマエが氏ね!
安保!鮹!炒らない!
344 :
NAME IS NULL :2005/12/02(金) 20:42:44 ID:23Pkqip1
OpenBase 悪いのか?
345 :
sage :2005/12/04(日) 00:42:59 ID:Hq0a3CZF
仕事で、SQL書くことになったんだけど、 おまいらのおすすめ書籍教えてくれ〜
まずはDB依存でいいんじゃね? DBのマヌアル見ろよ。 複数DB扱うなら普通はフレームワークで抽象化して扱うし。 で、フレームワークで速度とかで限界が出てチューニングが必要な時に改めてDBのマヌアルを見る。
347 :
NAME IS NULL :2005/12/04(日) 16:25:54 ID:uwLPjKnj
例えば販売管理システムなどで、会員一人一人の購入履歴を保存する場合、 一つのテーブルにIDなどで区別してまとめて処理するのか それとも新たに一人一人にテーブルを作って用意してあげるのか どちらが良いのでしょうか? 一人一人にテーブルを作る場合、管理がやや大変になりそうな気がするのですが・・・
>>347 ちょwwwwwwwwwwwwwwww 前者以外ありえないだろwwwwwwwwwww
349 :
NAME IS NULL :2005/12/04(日) 20:24:30 ID:JImhRfZp
>>347 >一人一人にテーブルを作る場合、管理がやや大変になりそうな気がするのですが・・・
大変でしょうね。会員が追加されるたびにテーブルを作成する。しかも、
構造は一緒で名前だけ違う。リレーショナルデータベースではありませんね。
350 :
347 :2005/12/04(日) 21:42:29 ID:uwLPjKnj
>>349 なにか勘違いしてました・・・すいません
確かに膨大な行を処理できるからDBを使うんでしょうし
>350 凝り固まった頭をガツンとやられた感じです。 超新鮮って感じです。
SELECT * FROM 00000001,00000002,00000003.....
SELECT * FROM *
>>347 おもすれー
磁気カードに全部情報持たせるような感覚だね。
データベースが巨大になるから、個別に作っちゃえ(w
>>355 select email,count(email) from table_a group by email;
あ、取り違えた。 select count(*) from (select email from table_a group by email)as foo;
358 :
355 :2005/12/06(火) 00:33:15 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 ・・・ ・・・ ・・・ ・・・
>>360 ギャグみたいなことを書いてしまいましたか。
つまり、できないということですね。
SQLは初歩の初歩しか知らないのですみません。
やはりちゃんと本を買って勉強することにします。
>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つを旨いこと並べられない。 なんか他に旨いアイデアは無いのかな?
363 :
NAME IS NULL :2005/12/07(水) 06:47:45 ID:jascnQUV
たしか10gではこういう日付リストなどを 作成できる機能のSQLがあったよ
朝で時間が無いから考えれないけど 「パーティション化された外部結合」 キーワードとしては 「PARTITION BY」です
>>360 横レスだが、別にギャグでもないと思うが・・・。
データの分析を主とする業務の場合(データストア)、結構あることだと思うけど。
>>357 select count(distinct email) from table_a
まあテーブル設計がギャグっぽい
369 :
NAME IS NULL :2005/12/07(水) 12:42:16 ID:g6FDfGeo
だから、異なる3つの事象を後で分析するのに、同一の時系列に乗せるって仕様がそこまで糞か? もともと正規化した場合は別事象とされていたことを合わせて見たいなんてのは五万とある。
joinすら知らないのがギャグってことじゃねーの?
371 :
NAME IS NULL :2005/12/07(水) 13:02:46 ID:g6FDfGeo
>>370 このスレでそんなこと書いてどうするの?
知るかボケ
373 :
NAME IS NULL :2005/12/07(水) 17:29:22 ID:qk1TVI3M
>372 知るかボケ だってさぁ〜 ププ〜
テーブル設計スレって無いの?
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 …
>376 あっ、そうだね GJ
すみませんお願いします。 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
380 :
379 :2005/12/08(木) 12:59:45 ID:???
環境はPostgreSQL8.0です
381 :
NAME IS NULL :2005/12/08(木) 13:45:39 ID:gElLaYlp
382 :
NAME 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 ) こんな感じでいけると思ったんですが、戻ってこなくなってしまいます。 ご指導、宜しくお願い致します。
>>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;
>>382 ある条件って?
Bテーブルのfって?
UPDATE A SET b = (SELECT f FROM B WHERE AテーブルとBテーブルを結びつける条件) WHERE ある条件
385 :
382 :2005/12/08(木) 18:30:18 ID:V+RjvCQg
>>384 解り難い上に、間違ってしまってて、すみません。
×:Bテーブルのf
○:Bテーブルのe
です。
ある条件は
A.b <> B.e
A.c IS NOT NULL
この2つの事でした。
>>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
387 :
382 :2005/12/08(木) 19:43:13 ID:V+RjvCQg
度々すいません。環境はOracle8iです。
388 :
379 :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);
>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
>>382 >戻ってこなくなってしまいます。
エラーじゃ無いというのが怪しそうだ。最初のBとあとのBにそれぞれ別の別名をつけてみたら?
FROM B B1
FROM B B2
すいません初心者なのですがお教え願いします。 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は存在しない 初心者なので例もわかりにくいと思いますがどなたかよろしくお願いいたします。 コード削除で他のテーブルに使用してたら削除不能とし使用していなかったら 削除可能というチェックをしたいのですが悩んでおります。。(ノ_∂。)クスン
>>391 存在をチェックするSQLはいろいろと書けるけど、
その前にテーブルBCDのcodeは外部キーとして
外部キー制約(参照整合性制約)を掛ければ、
> コード削除で他のテーブルに使用してたら削除不能とし使用していなかったら
> 削除可能というチェックをしたいのですが悩んでおります。。(ノ_∂。)クスン
がDB側で可能となる。
393 :
NAME IS NULL :2005/12/09(金) 01:26:12 ID:wPvfvG6f
>392 ありがとうございます。 参照整合は知らなかったので勉強になりました。 今回の場合は私がテーブルの設定等するわけではないので (すみませんまだ一ヶ月目のオッペケプログラマーです・・) プログラム上でSQLをつかって存在チェックをしなければなりません。 すみませんが例をおしえてくれないでしょうか? よろしくお願いいたします。
>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 ) )
396 :
NAME IS NULL :2005/12/10(土) 01:09:29 ID:tpnyWUoA
>>393 >(すみませんまだ一ヶ月目のオッペケプログラマーです・・)
>プログラム上でSQLをつかって存在チェックをしなければなりません。
私も、1ヶ月ちょいのおっぺwけぺーだよ。
お互いがんばろっ。
ちょうど、わたしもSQLやってるよ
>396 質問しろや
399 :
NAME IS NULL :2005/12/10(土) 11:32:01 ID:0QKZ2e8J
とりあえず初級、中級レベルのクエリは書けるようになりました。 その次のステップとして、テキストファイルにアクセスしてテーブルに書き込む ようなSPを書きたいのですが、どこから手をつければよいのでしょうか? 参考書やサイトなどがあれば教えてください。
煽りを呼びそうなレスだな
401 :
NAME IS NULL :2005/12/10(土) 11:42:47 ID:0QKZ2e8J
>>399 です
>>400 そうでしょうか。
あとはカーソルの使い方とかマスターしたいんですが、アドバイスをお願いします。
>401 アドバイス: スレタイを800回読む
403 :
259 :2005/12/10(土) 18:09:59 ID:???
こんばんわ。現在あちこちと躓きながらなんとかこなしております。
スレタイを800回呼んだうえであえてお聞きしたいことがあります。
以前
>>276 の意見を取り入れたいと思っており、たった今排気量
検索ができるようになりました。
他にも「一般の方の意見で」こんな検索できたらいいなというご意
見がございましたら教えていただきたいと思います。
ちなみに現在の検索手法は「金額」「排気量」「車両タイプ」「メーカ
ー」「車名」「グレード」となっております。
スレ汚し誠申し訳ないですが、意見が出たので参考にしたいと思い
ますので、よろしくお願いいたします。
『 S Q L 』質疑応答スレ
>>403 は自分で車買おうと思ったことないだろ。
SQLは英語のキーワードですが これはどこの国のデータベースでも共通ですか? だとしたら、アメリカを敵視する国では かなり屈辱に耐えながらの使用を余儀なくされている ということでしょうか。
はいそうですえいごはあめりかだけのものです
昔予約語だけ日本語にしてくれるBASICインタープリターがあったのを思い出した。 あの会社ならきっとこういうのを作ってると思う。 問い合わせ * から 表1 条件 性別 等しい 女 かつ 年齢 より大きい 20
410 :
NAME 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の行数になるでしょうか? お教えください。
411 :
NAME IS NULL :2005/12/11(日) 11:58:43 ID:ZSVSQhz1
〇〇〇〇@alpha.hmc3.com ってところから変な偽装メールが携帯にくるんだけどこのアドレス?について何か知っている人 教えてください。スレ違いですいませんが。 〇〇〇〇にはアルファベットが入ります。
t_data.ID=t_copy_data_id.ID
414 :
410 :2005/12/11(日) 13:14:13 ID:???
>>413 あぁ!
わざわざサブクエリ使わなくてもいいってことですね
どうもアリがd
フロム句にあるものをわざわざサブクエリすなってことだな
2つのテーブルがあって、その2つを特定のキーで結合し そこからORを使って検索を掛けたいのですが、結果が正確に出ません。 誰か助けてください_| ̄|○
まず出来なかったSQLを書けよ
>>416 その情報だけで
助けられたらエスパーだよ
>>416 エスパーな俺が答えてやるぜ!!
やり方間違えてる。
先輩のWinXPにPostgreSQLをインスコしようとしたら すでにチャレンジしていたらしく、WidXPのユーザアカウントでは 見えないpostgresユーザアカウントが出来上がっていたのです・・・ これって消せないんでしたっけ? もし消せるのであれば教えてください!
421 :
NAME IS NULL :2005/12/12(月) 12:42:55 ID:W4/ThV//
見えないユーザーアカウントの存在をどうやって知ったの? それってエラーメッセージがてきとーいってるんじゃないのか。
いや、net userで見えるのは何ですか? あれ勘違い? でも取り合えず追加できないのはなぜでしょう?
すでにあるなら追加せず、そのまま進めればいい。 ユーザー関連はホームとプロでちょっとかわってくるかもしれんが、、 マイコンピューターの右クリック→管理からローカルユーザーとグループ、でどうか
おっと、PostgreSQLのスレじゃ無かったのか、勘違いした
426 :
NAME IS NULL :2005/12/12(月) 17:10:40 ID:K+7MEGhT
すでにデータの入力がされているテーブルを複製したいのですが Oracleでは以下のように CREATE TABLE 2005_data_tbl AS SELECT * FROM data_tbl; すれば出来るということは調べてわかったのですが 他の物(今回Accessを使用しています)でも結果を同じにするには SQL文はどのように書けばいいのでしょうか?
>>426 そのSQLはAccessでは通らなかったのか?
428 :
NAME IS NULL :2005/12/12(月) 17:42:45 ID:K+7MEGhT
>>427 通りませんでした。
当たり前ですが
CREATE TABLE 2005_data_tbl(test TEXT);
は通りました。
VBAでやっちゃえば?
430 :
427 :2005/12/12(月) 17:55:49 ID:???
>>428 そっか、Accessもってないんで以下も通るかどうか不明だが、
SELECT * INTO 2005_date_tbl FROM data_tbl;
だとどうよ。
>431 Access2003だが、コピペで出来たおw 単純複製ならこっちの方が楽だね。
テーブル構造を複製するのは環境依存 テーブル構造だけその環境に合わせた方法で作っておけば データをコピーするのは標準のSQLでできる
何言ってんだかわかりません
>433 イボ痔が飛び出たじゃねーか! 謝れ!
>>435 ところで俺は切れ痔なんだが、
ヲシュレット直撃が非常にチビシイ件について。
>>436 塗り薬タイプのボラギノールはマジで効くよ。綿棒に塗ってアナルオナニーしてればいつの間にか治る。
痔の話題で盛り上がっている中すみませんが、 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 つマッチするため )。 どう書くものなんでしょう?
>>437 ほほう、それは良いことを聞いた。ありがとう。
さっそく帰宅時に購入を試みることにする。
小生、以前にプリザS軟膏を所望し、試行してみたのだが、
油分を多く含んで着床性が良好な割に、治癒率が低いので使用を中止したのだ。
しかるに現在はオロナイン軟膏などを試しているのだが、これが存外に良い。
親水性が高いようで、洗浄時にもべたつかず、治癒性もそこそこに良好。
ちなみに座薬タイプだとどれも、菊紋直下の浅い患部には届きにくい気がする。
440 :
NAME 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文、どこがおかしいんでしょうか・・・。 よろしくお願いします。
||'-'||<アイシテ!!
443 :
NAME IS NULL :2005/12/13(火) 11:33:13 ID:BihONEEK
444 :
438 :2005/12/13(火) 11:53:46 ID:???
>>442 ありがとう。
今回のケースは重複ありなので
>>43 の方法でうまくいきました。
>>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;
446 :
NAME IS NULL :2005/12/13(火) 13:09:50 ID:BihONEEK
>>445 ぬおおおおおおおお!!!
でででできました!!!!
すごいっす!ありがとうございます!!!
感激っす!
447 :
NAME IS NULL :2005/12/13(火) 15:35:16 ID:yNQyxieU
すみません。質問させていただきます。 たとえば、prime intというフィールドだけの テーブルがあったとして、中身は以下のようになっているとします。 1 2 3 5 7 11 13 17 19 : : これのx番目からy番目を抽出するSQL文はどのようなものになるのでしょうか?
すみません。limitを使えばよかったんですね。 select * from ~~ limit (x-1),(y-x+1) でいけそうです。
449 :
NAME IS NULL :2005/12/13(火) 17:18:18 ID:ftuq8miM
つうか、中身の順番に保証は無いっていうDBの基本は理解してるか?
質問です。 テーブルAとテーブルBのデータをグルーピングするにはどうしたらいいでしょうか?
>450 group by
どんな風ニダ
せめて、テーブル構成とどのカラムをグルーピングしたいのか書けよ
はい Aというテーブルに名前、年齢があります。 Bというテーブルに名前、年齢があります。 それで、年齢をグルーピングしたいと思ってます。 よろしくおねがいします。
>>455 どんな風に group by 使うんですか?
よろしくおねがいします。
create table [group by](名前 LONG, 年齢 IMAGE, CONSTRAINT pkey PRIMARY KEY(名前));
仕様書にサマリーするって書いてるんですけど、 句は何でしたっけ?
>456 >459 別にできなくてもいいやと思ってるでしょ?w 誰かがケツ拭いてくれると思ってるでしょ?w 会社に行ってさえいれば銭になると思ってるでしょ?w そのうちできるようになると思ってるでしょ?w ビンビン伝わってくるよw
答えられない人は書き込まなくて良いですよ^^;
462 :
454 :2005/12/14(水) 10:42:33 ID:???
すみません自己解決しました
>462 どう解決したのか書けや
>461 答えられない人は書き込まなくて良いですよ^^;
>>463 グループ化ごとき書くまでもないだろ^^;
>464 答えられない人は書き込まなくて良いですよ^^;
>465 答えられない人は書き込まなくて良いですよ^^;
答えられない人書き込みすぎですよ><;
>468 答えられない人は書き込まなくて良いですよ^^;
まったりしたところ申し訳ないですが テーブル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が入る順位はウ>イ>アです。 うまく説明できない・・・_| ̄|○
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;
検索キーワードに『hoge1 hoge2 ...』とあったとして、 そのキーワードを全て含むレコードを求めるには、 hoge like '%hoge1%' and hoge like '%hoge2%' and ... みたいに書かなきゃダメですか? もっと短くスマートにできませんかね?
474 :
470 :2005/12/15(木) 11:45:29 ID:???
できました〜! これで大幅にソースを減らせます。 ありがとうございました。
477 :
473 :2005/12/16(金) 09:40:33 ID:???
いえ、何が入るかわかりません。 スペースで区切られたキーワードを元にDBからマッチするイベントを探したいんですが... イベントのタイトルや説明、備考が検索対象なんですよね。 つう事は、キーワードの数×検索対象の列の数だけlikeを書かなきゃダメって事になるんですかね?
手書きしなきゃいいじゃん
480 :
NAME IS NULL :2005/12/16(金) 13:01:43 ID:KqztSrAJ
MSSQLなんだけど 小数点以下の桁を切り捨てるにはどうすれば良いの? 1234.5→1234 丸めないようにすり仕方教えてください
>>479 良く読んでないのでまだ理解してないが・・・
ちょっとそこを参考に色々調べてみる。
アリガト^^
482 :
NAME IS NULL :2005/12/16(金) 15:24:17 ID:bTCAxfTe
>>480 round(1234.5, 0, 1)
484 :
NAME IS NULL :2005/12/17(土) 20:09:33 ID:ulJ0EouX
トリガはどうやってデバッグするの?
485 :
NAME IS NULL :2005/12/18(日) 17:04:15 ID:FsmsuTpb
>484 プリント文
教えて下さい。 下記の様なテーブルがあります。 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です。 どうか、ご教授お願い致します。
>>486 縦を確定させる要素(例の場合はid)
横を確定させる要素(例の場合では無い)
ので横を確定させる要素が欲しいところですね
「クロス集計」のキーワードで探してみたら
参考になるHPが有ると思います
>>487 ぐは。ツッコミありがとです。
>>488 ヒント、ありがとうございます。
>横を確定させる要素(例の場合では無い)
>ので横を確定させる要素が欲しいところですね
つまり、この状態から
id|色
----------
10|赤
10|青
10|黄
20|赤
20|黄
このid毎の連番が必要になってくるという事ですよね。
id|色 |連番
------------
10|赤 |1
10|青 |2
10|黄 |3
20|赤 |1
20|黄 |2
この連番、SQLでとれるのでしょうか・・・。
出来そうな気はして考えてはいるのですが、自分の頭では思いつきません・・・。
ユー フィールド 作っちゃいなよ
>プログラムを使用せずに行う必要 ユー 妥協しちゃいなよ
力技でくっそ重そうなクエリで良けりゃ出来そうだがな。
>>492 力業でもないし、全然おもくないし
よくあるテクニックの一つで、
FAQ状態のような気がする
495 :
492 :2005/12/19(月) 01:44:01 ID:???
リレーションにLIKEを使うにはどうすればよいのでしょうか? SELECT A,B FROM asdf, jkl WHERE asdf.D like '%j'kl.E%'; 雰囲気としてはこのようになってほしいのですが・・・
497 :
492 :2005/12/19(月) 04:21:40 ID:???
>>496 WHERE asdf.D LIKE '%'||jkl.E||'%';
498 :
496 :2005/12/19(月) 04:23:56 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
500 :
NAME IS NULL :2005/12/19(月) 10:28:53 ID:1X0MvCSs
select name from user where id in ('8',6'',14''...); みたいなので、結果を、where id inの()の中のid順序で返すようにソートする方法ってありますか? 全部取得して、アプリ側でソートしなおすしかないでしょうか?
INにしないで1個ずつ検索をUNIONALLとか。w
順番,ID というカラムを持つ一時テーブルに突っ込んで結合。
503 :
NAME IS NULL :2005/12/19(月) 13:54:20 ID:Y1hJqnoN
504 :
NAME IS NULL :2005/12/19(月) 17:02:37 ID:kkDnjsh8
505 :
NAME 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一回では無理でしょうか?
最高金額と商品NOを取り出してそれを持った物を取り出す ってやると SELECT ユーザNO,商品NO,購入金額 FROM 顧客購入履歴 WHERE (購入NO,購入金額) IN (SELECT 商品NO,max(購入金額) FROM 顧客購入履歴 GROUP BY 商品NO) こうなるけど、こんな感じでよいのかな?
マチガタ × WHERE (購入 ○ WHERE (商品
508 :
505 :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)
HAVINGでmaxなのを拾ってくるのとかも できそうな気がする。 携帯なのでここまでだが
>>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
511 :
NAME IS NULL :2005/12/19(月) 21:11:57 ID:jNcYoMKv
>>510 MSSQL2005かよ
貧乏人を愚弄してるな!
513 :
486 :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
514 :
NAME 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です。
>514 >506
516 :
514 :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文的にはおかしくないでしょうか?
4だとサブクエリの制限はそんなにきつくないみたいだけどね
518 :
515 :2005/12/20(火) 21:24:46 ID:???
・・・
>>514 SELECT * FROM TABLE A WHERE NOT EXISTS(SELECT * FROM TABLE WHERE date=A.date AND num>A.num) order by date
520 :
514 :2005/12/21(水) 16:04:28 ID:CVbNnIh0
>>519 それでできました。
が、実用にならないほど遅かったです。
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
>>520 適切なINDEXが設定されていないんジャマイカ?
A(date,num)が必要。
どういうスペックのDB鯖で遅いの?
>>514 この手のテーブルは履歴を持ちたいためにこういう構造にしてるケースが多いのだが、
使うのはほとんど最新のレコードだけ。
最新のレコードのnumを常にゼロにしておけば、問い合わせの手間も効率もだいぶ省ける。
つうか、別Tableで最新データを持っておくところを作っておく。 更新は履歴TableのInsertトリガーで。
526 :
514 :2005/12/22(木) 19:41:40 ID:???
皆様、いろいろとレスありがとうございます。
自分まだまだ勉強不足なんで大変参考になりました。
>>521 ではエラーで実行できませんでした。
とりあえずは create index したら、問題ない速度で取得できました。
環境は P3 550M メモリ 768M sqlite3 です。:wq
PHPとかの業者に丸投げした方がいいよ。 明らかにおまいには無理。
>>527 ここで聞くのは多分すれ違いの内容だと思うから、簡単にだけ答えとくと・・・
その2つのアカウントでは好きなデータベースは作らせてもらえない。
Sakuraなら専用サーバを借りるしかない。
>>529 スレ違いには同意だが、
>>527 の示したページを読む限りでは、少なくともxreaでも設置可能だと思うがな。
sakurは使ったこと無いからワカランがたぶん可能だろう。
好きなデータベースは作らせてもらえないけど、必要とするのはひとつだけだし、
/config.inc.phpでデータ名を指定すればいいんじゃね。
>>531 重ね重ねありがとうございます。
数年後、自身のスキルが向上した時に、もう一度チャレンジしてみます。
数年もかかるのか・・・ 自宅の動くけど古くなっていらなくなったPCにlinuxとか入れて いろいろインストールして試せば半年で一通りなんでもできるようになるぞ
業者に丸投げして依頼した方がいいね。
536 :
NAME 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とユーザ名が違う場合も考慮しない
537 :
NAME IS NULL :2005/12/27(火) 15:53:37 ID:RFxj046c
>536 3件以上あった場合に問題になる予感。 max(ID) と min(ID) を使うといいと思う。
540 :
NAME IS NULL :2005/12/27(火) 16:49:15 ID:pbglOAMD
掲示板のようなものを作っています。 ページに表示する範囲のアイテムの他、 ページャーにナビゲーションを表示するため、 アイテム総数が必要です。 1:まず全体をcountしてから、指定範囲をselectする(クエリ2回) 2:全体をselectし、指定範囲をfetchする(クエリ1回) どちらかが定石なのでしょうか?
>>540 DBMSも、開発言語も、使用するミドルウェアも書かずに何を求める?
542 :
NAME IS NULL :2005/12/27(火) 17:21:56 ID:RFxj046c
1:まず全体をcountしてから、指定範囲をselectする(クエリ2回) ファントムリードとかアンリピータブルリードがおきるが
543 :
536 :2005/12/27(火) 17:55:41 ID:ev8Bf63q
前のレコード ← 指定レコード → 次のレコード
と言うような感じで、3つのデータを並べて表示する予定でした。
(実際には、IDとNAME以外にもデータが存在します)
>>539 さんもありがとうございます。
そうなると、select文が3つに増えてしまうような気がするのですが…?
>>543 件数によるが、対象となるやつ全件とってきて、プログラム側で順次処理したほうがよくね?
>>536 いくつかやりかたあるがMySQL3はよくわからんので書かない、でも
LIMIT で絞るときはORDER BY で順番入れとかないと期待した
答えにならないから気をつけれ
*おおっと* order by は素で抜かしてました。ヤバカッタ プログラム側で処理してもいいのですが、Perl/CGI(≠mod_perl)なもので、 やれるところはやれるだけ、SQLで済ませたいなと思ったためです。 たぶんクエリ2回投げたほうがサーバに優しそう…。
>543 select文がいくつに増えようがやりたいことできなきゃ意味ないじゃん。 544方式でやったら? >545 ORDER BY じゃ解決しない予感。
548 :
536 :2005/12/27(火) 18:47:51 ID:???
上司と相談&テストしつつ、最適なものを選んで使うことにします。 色々ありがとうございました。
549 :
536 :2005/12/27(火) 23:22:57 ID:???
進展報告。 上司 「 やっぱこの機能なし 」
ラッキーじゃん
ミドルウェアはパフォーマンス稼ぐために事前にプリフェッチして、内部で順次処理してくれたりするね。 欠点はメモリ喰う。
>>549 あるよねあるよね。
できたのにやっぱいらねーとか言われると凹むよね。
まぁ、おまいのは作る前で良かったな。
勝手に盛り込んで、実は使えますの方が後で楽だけどね。 やっぱり使うなんて言い出しても、使えますよというだけで済むし。 後で使えない物を使えるように修正するのはかなり厳しい事が多い。ほぼ全部作り直しに成るとかね。 もちろん、勝手に盛り込んでるから、その部分のデバックが大変とか実装が大変とかのいい訳には使えない。
554 :
NAME 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; これで、とりあえずは大丈夫だったのですが もっとスマートな方法があったら教えてください。
そのマイナスされる側、する側を選ぶ根拠を日本語で書いてくれ。
日にちごとに集計されたテーブルを作りたいなあ。 毎回計算するのはアフォらしい。
いろいろレスありがとうございます。 >マイナスされる側、する側を選ぶ根拠 これは特に法則等あるわけではなく、その時々です。 ただし、日付は必ず同じ日付どうしです。 >Lag関数を使えばいいんじゃね sqliteですので・・・ それほど頻繁に行う処理ではなく、たまに コマンドラインから打って確認する程度ですので お手軽にできるのはないかなぁーと思ったまでです。 ありがとうございました。
>>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で規定されてるのかな?
>>561 おぉ、素晴しいです。ありがとうございます。
563 :
NAME IS NULL :2005/12/31(土) 15:36:44 ID:vxYpC2+H
右近のSQLの新機能はLAGもFIRST_VALUEも正規表現も階層問い合わせもないのか ORACLEの数年前の機能しかないんだな
MSだし、本格的に使われるのはこれからですよ。
565 :
NAME IS NULL :2005/12/31(土) 21:57:18 ID:8smF4z+3
VisualBasic2005Expressで、MySQLって使えないんでしょうか??
は?
2003 ServerとSQL Serverを買ってください。
569 :
NAME IS NULL :2006/01/02(月) 04:19:34 ID:/iRoSIb9
ほんとだよ。分析関数なんてOracle8iかな?くらいから使ってたのに。 もう、3年前からだよ。つか、正規表現って前からあったか?? 10gになってからついたのは知ってるけど。
570 :
NAME 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
そこまで知ってて何故に select max(ID) from table;
572 :
NAME IS NULL :2006/01/04(水) 00:19:38 ID:PgskHvVR
あ、取得したいのは最大値ではなく、最大IDのフィールド全体なんです
573 :
NAME IS NULL :2006/01/04(水) 00:26:19 ID:4f2i8HMR
よく、流れ読んでませんが、 select * from table where ID in ( select max(ID) from table ) とかじゃないですか??
574 :
NAME IS NULL :2006/01/04(水) 00:28:33 ID:4f2i8HMR
あと、 select * from table where ID = ( select max(ID) from table ) だと、副問い合わせが行を戻さなかったとき、エラーになるような気がします。
>>572 そう言うことか
ORACLEで考えるよ
select * from table where rownum < 1 order by ID desc
select * from table where rownum < 2 order by ID desc
ああ、そうか。ID逆順にしてTOP1だけ取得すりゃいいのか。なるほどなるほど。
578 :
NAME 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を使うなら副問い合わせ使わないといけないと思います
579 :
NAME IS NULL :2006/01/04(水) 00:41:00 ID:PgskHvVR
すいません>< Mysql version 4.0.26 なんです・・・。 サブクエリーも満足に動かなくて。oracle いいなぁ・・・。 素直に2回発行します_| ̄|○il|li
580 :
NAME 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 です。
581 :
NAME 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 って手もあります。サブクエリーがだめなら、こっちもだめな気しますが。
>>579 MySQLなら
>>577 さんも書いてあるけど、ORDER BY ID DESC LIMIT 0,1 でOKじゃね。
>>578 書いた後に自分もそう思った(w
何故か最近SQLServerやってて...
正月ボケだな
このSQLは「t_permのc1がタで始まる部分を全て抽出」であっていますでしょうか? select * from t_perm where c1 regexp '^タ'; また、「t_permのc1がタで始まらない部分を全て抽出」という 場合はどう記述すべきでしょうか?
質問させてください。 日付型[yyyy/mm/dd hh:mm:ss]から特定時間帯(例えば22:00〜翌05:00)を抽出するにはどうしたらよいでしょうか?
DBMSくらい書けよ
588 :
NAME IS NULL :2006/01/04(水) 18:47:07 ID:6n7ZUbwc
ASAって何?
谷岡ヤスジ
ごめんなさい。もう一度書き直しますね。 Adaptive Server Anywhere(ASA)において 日付型[yyyy/mm/dd hh:mm:ss]から特定時間帯(例えば22:00〜翌05:00)を抽出するにはどうしたらよいでしょうか?
592 :
NAME IS NULL :2006/01/04(水) 22:43:58 ID:s7aUH/mP
25日移動平均を求めるSQL文ってありますかね?
>>592 テーブルの作りによると思うが。
まあ一々SQLでやるより、配列に取り出してオンメモリで計算したほうが。
同じデータを何度も触ることになるからね。
>>593 やはりそうですか。。。
ありがとうございます。
>>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
データベースと名付くものをはじめて触ったので苦戦中です。
楽しいけど。
株とか為替か。何度も使うなら25日平均のテーブル作ったら? 毎日数回計算して値を更新するスクリプト動かせばいいと思う。 他にもRSIとか一目均衡表とかいろいろ使うだろうし。
598 :
595 :2006/01/05(木) 01:56:09 ID:???
>>596 申し訳ない。よくみてなかった。そういうことでしたか。
datepart(hour,日付) not between '5' and '21'とか。
599 :
NAME IS NULL :2006/01/05(木) 09:10:28 ID:lHvidXxf
移動平均を求める関数はoracleにあったはず
600 :
596 :2006/01/05(木) 09:18:07 ID:???
>>598 いえいえ、ありがとうございます。
そか、否定が使えるのか。勉強せんといかんなぁ。
601 :
NAME IS NULL :2006/01/05(木) 10:15:51 ID:lHvidXxf
5時ジャストと 22時ジャストはどうなん?
BETWEENは、<=、 >= だからなあ 含めたくなければ不等号式2つで。 PostgreSQLだと時間の足し算できるけど、他は無いのかな。
603 :
NAME 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') だと帰ってきます。 どなたか原因教えてください。
カッコがないからじゃ?
おれも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
andとorの優先順位について調べてみ 1+1*9 の結果を考えてみ
22:00-5:00ってニューヨーク市場?
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 といったデータを抽出したいのですが、可能なのでしょうか?
科目コード次第じゃないの? MAXなんかで取れば良いんじゃない あと追試の方が点数悪かったらどうすんのYO
610 :
608 :2006/01/09(月) 09:43:39 ID:???
一応、科目コードで追試は正規試験の科目コードに1を加算した値になっています。 つまり、現国がZ100なら現国(追試)はZ101といった具合に。 しかし、科目コードをMAXで単純には取れないと思うのですが? 追試の方が点数悪かった場合ですが、まったく考慮しなくてOKです。 考慮するのは追試を受けたかどうかであり、追試を受けた場合は無条件で追試の点数を採用します。 つまり、実際にはありえないのですが、正規試験で100点を取ったのに 追試で0点なら、無条件で0点です。
もっとやりやすい設計にすりゃ良かったのに……
612 :
608 :2006/01/09(月) 09:55:40 ID:???
>>611 ごもっともです。
しかしながら、私が赴任したときには既にこのテーブル構造であり、
データベースは今回バージョンアップしたみたいなのですが、
既存システムやら過去データの関係で、そのままのテーブル構造で
データ移行したようなので、何とも言えません。
MAXとサブクエリ使えば一発だべ
614 :
NAME IS NULL :2006/01/09(月) 11:00:31 ID:5shPHhyC
615 :
NAME IS NULL :2006/01/09(月) 11:10:50 ID:5shPHhyC
試験区分が最大の行を取得すればいい 分析関数かサブクエリでも使えばいい ORACLESQLパズルに似たようなSQLがあるだろ
616 :
NAME IS NULL :2006/01/09(月) 11:14:53 ID:Vki8VgXj
SQLの質問になるかわかりませんが、 カラム位置ってなんですか? 賢い皆様、教えてください
オラわかんねぇだ
618 :
NAME IS NULL :2006/01/09(月) 11:32:52 ID:5shPHhyC
SLECT* WHERE 科目コード iN 科目コードの先頭三文字でグループ化したなかでの最大の科目コードリスト
619 :
NAME 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
620 :
NAME IS NULL :2006/01/09(月) 16:38:01 ID:5shPHhyC
>>219 品物コードでDECODEかCASE式を使ってサマリ
はじめまして。 -- 最近データベース(postgres)を始めたものです。 -- 大量のUPDATEを発行し返答を見ていたのですが、 -- UPDATE 1に紛れてUPDATE 0が出ていました。 -- 当てずっぽうですが、これはUPDATEのWHERE句でマッチするものがなかった、と思い、 -- 主キー(WHEREは主キーしか見ていない)が全てあるかどうかを調べることにしました。 そこで、下記のような表で、3を見つけ出すようなSQLを書きたいのです。 割り算を使うとうまくいくような気がするのですが、書き方が分かりません。 どんな風に書けばいいでしょうか? table_1 code --- 1 2 3 4 table_2 code --- 1 2 4
623 :
NAME IS NULL :2006/01/10(火) 11:24:29 ID:ZSzgEvxU
差集合の書き方もわかんないんじゃね?
624 :
621 :2006/01/10(火) 11:45:51 ID:???
>>622 SELECT * FROM table_1 EXCEPT SELECT * FROM table_2;
コレでうまくいきました。ありがとうございます。
>>623 はい、わからなかったので、ググりました。
625 :
NAME IS NULL :2006/01/10(火) 15:10:43 ID:CJlFymHA
以下のようなテーブルの在庫数が0以外を select したい場合のSQLの書き方を教えてください。 品名 在庫数 A 0 B 1 C 2
WHERE 在庫数<>0
TRIM(hoge) ってどういう意味があるの?
629 :
NAME IS NULL :2006/01/12(木) 14:47:50 ID:iP3LgLdS
ありがとうございます
631 :
NAME 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しかわからない)
plpgsql で swap 関数作るんじゃダメ?
SET order=3-order
update 3回。 1).1 -> 999 2).2 -> 1 3).999 -> 2 999はレコード上あり得ない数字や文字。
636 :
631 :2006/01/14(土) 02:42:12 ID:vVKmarWQ
>>632 関数に関しては勉強不足なので勉強してみます。
>>633 勉強不足で理解できません。すいません
>>634 これは自分も考えたのですが、もっと簡単にできないのかなあと思いました。
ちなみに、UPDATE時に順位を変更するレコードのプライマリキーしか
分からない場合は、selectを二回行ってさらにupdate三回行うという事になってしまいました。
>>635 おっ、ありがとうございます。
かなり近そうな情報です。
637 :
NAME 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)
638 :
NAME IS NULL :2006/01/14(土) 17:16:59 ID:oOx/pn3s
Datetime型のフィールドを更新したのですが、うまくいきません。 2005年1月14日をいれるにはどうすればよろしいでしょうか? Update R_event Set ew_date = 2005-01-14
639 :
257 :2006/01/14(土) 23:30:33 ID:???
引き算にしか見えないが。。。
640 :
638 :2006/01/15(日) 10:15:24 ID:HxBAQqEv
マルチになってました。すいません。 '2005-01-14'と文字列にするようにアドバイスいただきました。
641 :
639 :2006/01/15(日) 15:10:32 ID:???
スマソ、257ってのは嘘だ。 別な板での番号。
642 :
NAME IS NULL :2006/01/17(火) 02:07:53 ID:4WWcgr5p
どうしてもわかりません。教えてください。 ○はPRIMARY KEY 部門(○部門番号、部門名) 従業員(○従業員番号、部門番号、氏名、住所、年齢) 商品(○部品番号、部品名) 業者(○業者番号、業者名、住所、電話番号) 供給(○部門番号、○部品番号、○業者番号、単価、数量) 1.登録されているすべての部品の供給を受けている部門の部門番号の一覧 2.全従業員が30歳以上の部門の部門番号と部門名の一覧
> 商品(○部品番号、部品名) これは 部品(○部品番号、部品名) の間違いかな? > 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...
1. 登録されている部品のうち、その部門に供給されていない部品がない部門 2. 29歳以下の従業員が所属せず、かつ従業員が1人以上所属する部門
645 :
642 :2006/01/17(火) 03:25:34 ID:???
>>643 私のような初心者にこんなに早くレスしてくれる人がいるなんて思ってませんでした。
ありがとうございます。
ご指摘のとおり商品は部品の間違いです。
上記の回答については現在検証中です。
>>644 視点を変えてみるのもいいかもしれません。
が、私のレベルではそれでも厳しいものがあるみたいです。
う〜ん
SQL文を実行した結果の件数だけを取得する事はできませんか?
647 :
NAME IS NULL :2006/01/17(火) 13:59:56 ID:fbrdujm0
>>646 結果の件数を何で取得したいわけ、例えば、クライアントにADOとか使ってて
それで取得するの?DBは何?
>>647 SELECT count(*) FROM Hoge_table
できました♪ありがとう^^
>>648 そうです。
DBはOra10g。
件数を表示してuserにその後の動作を選択させようと思ったからなんですが。
count(*)から聞いてるんじゃ先は長そうだな、、ガンガレ
651 :
NAME IS NULL :2006/01/18(水) 02:22:43 ID:ebqLU//i
PostgreSQLで、ある項目が、ある条件で並べたときに何番目に来ているかを 調べるにはどうすればよいでしょうか? やりたいことは、つまり、ランキング順位の取得です。 この項目は○位です、というのを、全項目を取得せずに調べたいのです。
知りたい項目の値より大きいのは何個あるか
653 :
NAME IS NULL :2006/01/18(水) 07:24:27 ID:qaHbGZoA
654 :
NAME IS NULL :2006/01/18(水) 09:11:05 ID:5hePtDX3
質問させていただきます。 PostgreSQLのセッションセーブハンドラを使用して、セッションデータをデータベースに 保存しています。 仮にそのときのデータが $_SESSION["name"] = abc とするとき、ハンドラが自動的に | sess_data | -------------- |name|s:3:"abc"| と、保存するのですが、これをSQLコマンドか、あるいはその他の方法によって、 元のデータである"abc"だけ呼び出すということはできないでしょうか? なにぶんプログラミング初心者なもので、お見苦しい質問かもしれませんが、 なにとぞよろしくお願いします。
659 :
NAME 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]= の後がさっぱりわかりません。 片っ端から書いて試してはみたんですが、混乱が深くなりなにを試したのかすらわからなくなる始末で。 どうぞよろしくお願いします。
>>658 スレ違い。
unserialize(); //PHPの関数な
663 :
662 :2006/01/18(水) 18:07:35 ID:???
スレ違いつーより板違いだた。
ついでだが、
>>659 参照操作のCASCADEあたりかな。
664 :
NAME IS NULL :2006/01/18(水) 21:01:40 ID:lvPTbbdm
DB2で、複数行を一度にinsertしたいのですが、どうすれば良いのですか? 私はvalues(変数,変数,変数)という文字列を行数分つくり、UNIONして登録みました。 これだと、変数がNULLの時、NULL値をUNIONしてしまい、エラーとなりました。 古いシステムのレスポンス改善作業で、SQLとJAVAソース以外は触れません。
INSERTは一行づつやるのが前提だからそれは無理ってもんだ。 JAVAのループの方を改善できない?
666 :
658 :2006/01/18(水) 21:40:02 ID:???
>>662 ありがとうございます。助かりました m(__)m
>>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;
てな感じはできんのかな?
668 :
664 :2006/01/18(水) 23:10:26 ID:???
ありがとうございます。
>>665 Javaの方はもう詰めようがないですね。
単純に登録作業だけなんです。
>>667 現在自宅なので試せませんが、
DB2にはDUAL表は無いです。
ただ、ダミーテーブルは使用できると思うので、
出社したらサブクエリを早速試してみます。
values をselectにするとか
670 :
659 :2006/01/19(木) 08:21:12 ID:???
>>661 ,663
ありがとうございます。
ちょっと調べてみます。
671 :
638 :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 . . .
GROUP BY と max() を使う 他の項目も欲しいならこのスレのどっかに(ry
>>668 バルクインサートとかできないのかね??
675 :
664 :2006/01/19(木) 21:09:53 ID:???
結局、元通り、UNIONの方法を使いました。
ただ、NULL値をそのままUNIONするとエラーになるのを、
CAST(NULL AS CHAR)とかするとうまくいくことがわかりました。
>>669 SELECTでも固定値だと、NULLはそのままではUNION出来ませんでした。
DB2の仕様って結構ややこしいものです。
>>674 バルクインサートはDB2では聞いたことがないです。
調べても見つからないですね・・・。
676 :
NAME 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 です。
>>676 replace(tel,'-','')
678 :
677 :2006/01/20(金) 02:15:21 ID:???
老婆心 $telってのはPerlかPHPの変数だと思うのだけど、 SQLに埋め込む前にそちらもハイフンを取っとけば、 WHERE replace(tel,'-','') = '$tel' だけで済む。 また、関数インデックスを作ってインデックス検索を 行わせることも可能になる。
679 :
676 :2006/01/20(金) 03:39:17 ID:???
>>677 ,678
おーすばらしい!
非常に単純に実現できてよかったです!
ありがとうございます!
>>678 のアドバイスもありがとうございます。
ただ、ハイフン付きで入力された場合には、ハイフンの位置まで合ってるものしか検索しちゃまずいかなという気がするので、
>>676 のようなクエリにするか、あるいは入力にハイフンが含まれてるかどうかで SQL を作り分けるしかないかと思います。
ところで、関数インデックスなんてものがあるのですね。
貴重な情報、これまたありがとうございます。
680 :
NAME IS NULL :2006/01/20(金) 11:41:26 ID:90pLxJZI
Oracle9iで テーブルのキーとなっている列が何なのか知りたいのですが、 これって普通にビューか何かで取得できたりするのでしょうか?
681 :
NAME IS NULL :2006/01/20(金) 12:00:50 ID:PQZPCefo
>>680 INFORMATION_SCHEMA.TABLE_CONSTRAINTSでわかる。
これはANSI SQL 92で規定されてるんでスレの範囲内なんだけど、
Oracleで使えるかどうかは知らん。
684 :
NAME IS NULL :2006/01/20(金) 14:25:53 ID:f0GEt5Kc
あるテーブルのプライマリキーとしてInteger型を使うことはよくあると思うんだけど、 そのとき、insert していくとなると、いちいち使われてないプライマリキーを探すための select 文とか実行しなきゃいけないよね。 これって、みんなそうやってるもんなの? それとも、なにかもっといい方法ある?
>>684 auto increment とか Unique Indentifier な列を使うんでない?
686 :
NAME IS NULL :2006/01/20(金) 14:29:30 ID:f0GEt5Kc
687 :
NAME 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 となる。
689 :
NAME 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文)を実行させたいのですが、 やり方がわかりません。
>>689 わかってるならw
書きに行くなら、マルチと思われないy(ry
691 :
NAME IS NULL :2006/01/20(金) 19:40:42 ID:LfAl3oMP
>>690 すいません。
ですが、カテゴリーがグレーな問題はよくあるんです。
>>691 とりあえずSQLとは関係ない。VBScriptかOracleのどっちかへ行け
書きに行くなら、マルチt(ry・・
>>689 手っ取り早い方法として、コマンドを記述したファイルを容易しておき、
そのファイル名をSQLPlusの引数に渡してSQLPlusを実行する。
694 :
NAME IS NULL :2006/01/21(土) 08:36:48 ID:4J/aRi5Q
なんでスレ違いに答えちゃう我慢できない答えたがりがいるんだ?
>>694 Insert文だけだから、SQLLDRでもいいね。実行するのがクライアント側なら
SQLPLUSがいいかもめ。
答えたがりだけど、別に答えれるなら答える。
あんま、スレ違いとかあんま気にしてない。
じゃあ何でも質問スレに変えようぜ
>>697 変えたければ、勝手に変えてくれ。俺は知らんけど。
699 :
NAME IS NULL :2006/01/21(土) 17:14:51 ID:Xl6mwZUm
ハァ?
700 :
NAME 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」の昇順で並び替えたいです。
ORDER BY id DESC,col1 じゃ駄目なの? グループ化ってどういう事?
>>700 なんか日本語が変な気がするのでデータだけ見て答えると、
order by id desc, col1 asc
703 :
700 :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
今年になってから、データベース(SQL鯖2000)を触り始めたのですが、 1 クエリとビュー 2 ユーザ定義関数とストアド の違いって何でしょう? 特にUDFとストアドのl使い分けがよく分からない・・・
>>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
>>708 ありがとうございます。
それで行けそうなのでやってみます。
710 :
NAME IS NULL :2006/01/24(火) 23:04:34 ID:iiwd5C2f
「TEST」ユーザに紐付くテーブルをエクスポートし、 「TEST2」ユーザに紐付くテーブルへインポートしたら ユーザーが違うって感じのワーニングが出て インポートできませんでした。 どうすれば、異なるユーザ間のエクスポート→インポートが できるのでしょうか?
>>700 規則が分からんが
order by句でサブクエリを使えばいいんじゃね
>>700 ID毎にまとめて表示させたいんじゃが、ID毎の並びはcol1の値の小さい順にって事か?
だったら select * from table700 a order by (select min(b.col1) from table700 b where b.ID = a.ID),col1 じゃね?
716 :
NAME 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
分かったら教えて下さい。
>>716 注文が多いのう
where b.ID = a.ID), col1
↓
where b.ID = a.ID), id, col1
>>717 ありがとうございます。
Order by句にサブクエリ書けるのすら知らなかったので勉強になりました。
精進します。
すれ違いだったらごめん。 ソースの中からSQL文だけを抜き出すツールって無いかな? DBのバージョンUPすることになったんだけど、 ソースの中にSQLが散っていて、クエリの検証が出来ない…orz
何のソースだよ
721 :
719 :2006/01/26(木) 17:14:00 ID:???
あ、ごめん、PHPです。
スレ違いだな。それ以前に俺は知らないが。
echo "【".$sql."】";
それ考えたけど、実行しないと出力できないじゃん まあgrepでいいとおもうんだけどなー
下記のような顧客の月度別売上データがあったときに、 その顧客の最新売上データを取得するにはどうすればよいでしょうか? 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本で出来ないのか悩んでいます・・・
厳密にはSQLではないんですが・・oracleのdecode関数で評価式を 常に真にするような方法はあるんでしょうか??
>>726 decodeはほぼcaseと等価だから話題にしてもかまわないと思うけど、
評価式を常に真というくだりをもっと具体的に説明してくれ。
>>725 またかよwこのスレの1-764くらいは目をとうそうな。
目を凍瘡?
国語の教科書に目を通した方が良さそうだなwwwwwwwwwwwwwwwwww
typoごときで喜んでもらえるとはお前らもら単純だね。 正誤表をだしとくよ。 誤)目をとうそうな。 正)目をとうそう(←なぜか変換できない)な。
こういうのをtypoといって誤魔化すあたりが。
732 :
725 :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 でも大丈夫ですよね
来週までテストできないもので・・・
>>727 selectで、'文字列'を使わずあるカラムの値は全て、常に、固定の文字列を
表示させたいんです。
>>732 > 1-764まで目をとうそうとしたのですが、
> 731までしか確認できませんでした、私のPCがおかしいのでしょうか?
> でも、
>>241 にあった回答を参考にしました
その生真面目さに惚れた。
>>732 select * from Table where (ID,Date) in (select ID,max(date) from table group by ID)
残念MSSQLでは無理。Oracleの独自構文じゃないかな。MyとかPostgreとかはどう?
736 :
275 :2006/01/29(日) 00:59:55 ID:???
>>735 そうなんですか・・・・
MSSQLでは出来ないのでしょうか?もう少し悩んでみます
>>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;
738 :
NAME IS NULL :2006/01/29(日) 06:55:23 ID:fVRFGgcX
ORACLE独自のMERGE文て、あまりサンプルとかも見ないんですが、 実業務では使われているのでしょうか?
739 :
NAME IS NULL :2006/01/29(日) 08:34:37 ID:dA0xHFxT
>>735 テクニカルエンジニア(データベース)の参考書に
IN述語 ::= 行値構成子 [NOT] IN 副問合せ | 値式 [NOT] IN (値式コンマリスト)
行値構成子 ::= 値式 | (値式コンマリスト) | (問合せ式)
副問合せ ::= (問合せ式)
ってあるから標準SQLでもOKじゃね?
741 :
NAME IS NULL :2006/01/29(日) 15:12:59 ID:dA0xHFxT
テクデはJISだから
だからORACLE固有じゃないって
まったくのあてずっぽうだけど、エントリーレベルの条件には含まれてないのかも。 ところでこんな書き方はあり? where (a, b) in ((1, 'a'), (2,'b')) つまり複数カラムを対象にサブクエリを使わないで in を使えるかどうかですけど。
744 :
NAME 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です。 簡単なことかもしれないんですが誰か助けて〜!!
>>744 サブクエリを使えないんだったら
MySQLのマニュアルのどこかに答えはある
747 :
NAME IS NULL :2006/01/30(月) 11:21:56 ID:GHCJnnU6
745,755さんレスどーもです。 >>このスレのどこかに答えはある >>サブクエリを使えないんだったら〜 それらしきレスはあるんですがサブクエリを使うんです。 mysql4.0系なんでサブクエリつかえないんですよ。 ほんとはpostgresqlでやる予定なんですが実際のデータが なぜかインポートできなくて(copyでcsvを入れようとすると文字コードが違うみたいなエラーが出る。) とりあえずPCにはいってるMySQLを使ってます。 とりあえずマニュアル読んでみます。
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
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
質問なんですが今まで使えてたのに知らないjavaが・・とか エラーが増えてきたのはバージョンアップしてないからでしょうか? 新規インスコじゃなく現状のをバージョンアップする方法を教えてください。
超能力者プリーズ
このスレタイでSQLに関係ない質問だと、SQLServer関連だろか・・ しかしOracleのクライアントツールがJAVAなのいは知ってるがSQL Serverは知らんからな。。
データベースに総合スレがないからここをSQL-DB何でも相談室と
誤解するやつらが後を絶たない。だれか総合案内スレ立ててくれんかの。
ちなにみここはSQL言語についてのスレ。
>>750 せめて環境くらい書けば誘導はしてあげるよ。
>>754 タイトルがよくないよ。ネタスレにしか見えない。
756 :
NAME IS NULL :2006/01/31(火) 18:34:20 ID:bxhHT1jk
view-source:をいれても「指定されたパスが見つかりません」と なってソースが見れないんですけどなんででしょうか? 前は見れたのに。。。
758 :
NAME 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にぶち込む書式を教えてください。 文盲スマソ
スレ違いでした。別スレで聞いてきます
下記のテーブルがあるとし、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
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
>>760 select句でサブクエリか
外部結合
外部結合なら 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
764 :
760 :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を使いたくないのですが、
それは無理な話でしょうか・・・。
VIEWを作れば間接的だが避けられる
766 :
760 :2006/02/06(月) 16:33:20 ID:???
>>765 そうですね、どうもviewが最も適切なようです。
ちょっと頑張ってみます。
ありがとうございました。
767 :
NAME IS NULL :2006/02/06(月) 22:30:11 ID:wuuawFti
すみません!質問です! SQLサーバーで金額にカンマをいれて表示したいのですが、どうすれば よいでしょうか少数点も表示したくないのですが、 ご教授おねがいします(_ _)
>>767 全 部 テ キ ス ト 型 で 保 存 し ろ
769 :
767 :2006/02/06(月) 23:48:55 ID:wuuawFti
>>768 ・・・
SQL質疑応答スレの住人のスキルはこの程度か
消防並みの回答だな、自分で考えた方がましだからもういいや
だってお前馬鹿なんだもん。
まず第一にスレ違いだし、
第二にカンマは書式の問題だし
第三に小数点はデータ型の問題だし
第四に
>>767 の頭が悪い。
771 :
767 :2006/02/07(火) 00:07:35 ID:jHoApGYS
772 :
767 :2006/02/07(火) 00:15:08 ID:jHoApGYS
しょうがない日本語理解できない頭のわるいお前の為に もう少し説明してやるわw SQLサーバーで保存されているデータ例えば1000000.000を1,000,000でSQLで selectしたいわけなんだわ、oracleならto_char関数つかえばできるんだが、 SQLサーバー経験の無い俺は聞いているわけなんだよ、解ったかね? 普通は解るとおもうんだが。。。
それはそうと、SQLserverにはto_char関数がないのか? あってもよさそうだと思うのだが。
SQL質疑応答スレでSQL Serverの質問するやつが絶えないな・・・
で、ちょっとググったら convert() 関数というのが出てきたけど、 これは使えないの?
どう見ても767が馬鹿だろ? 表示なんてSQL鯖の問題じゃないことが理解できていない時点で。
declare @MnyTemp money; select @MnyTemp = 1234567; select '\' + convert(varchar, @MnyTemp, 1)
間違えた 小数以下と¥不要だった。 select left(convert(varchar, @MnyTemp, 1), len(convert(varchar, @MnyTemp, 1))- 3)
780 :
NAME 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です。実際は日本語名ではないです。
んー
782 :
NAME IS NULL :2006/02/07(火) 18:44:37 ID:L8YKM3YT
数値のカンマ区切りも だがとりあえずCASEを使えばできる
783 :
NAME IS NULL :2006/02/07(火) 18:47:26 ID:L8YKM3YT
>>780 分析関数か
SELECT句でサブクエリ
784 :
780 :2006/02/07(火) 19:26:16 ID:WI5IjHuc
783さん selectに副問い合わせを持って来たら、だいぶ早くなりました! ありがとうございます
>767 BooksOnlineを「金額」で検索汁 その上でConvertもしくはCast
786 :
767 :2006/02/07(火) 21:35:33 ID:jHoApGYS
>>779 ,785
サンクス
参考にするぜプログラムでやることも考えたけど効率考えたら
表示のみだからSQLで処理したいと思って、ソースもすっきりするし
>>786 なんでSQLサーバーのスレで聞かないの?
788 :
767 :2006/02/08(水) 22:01:12 ID:???
>>786 うっせーw
SQLの問題だからSQLで聞いてんだよ
お前センスねーな
思い切り環境依存だよな
790 :
NAME IS NULL :2006/02/09(木) 03:44:15 ID:sQbsXhb8
>788 Oracle でならわかるが、SQLServer だとわからないという SQLServer でたずねたらといわれる SQL のもんだいだという 期待の大物ルーキーデビューwww
>>790 でも、もうここで質問しちゃってるからいいじゃんと俺は思うよ。
どうせ、おまいら手当たり次第データベースのスレ見てるだろうし。
まぁ、とにかく、
>>767 の「全 部 テ キ ス ト 型 で 保 存 し ろ 」はひどすぎるな。
表示するデータに型をあわせるなんて、ひどい発想だと。
バカにはバカしか回答しないということだ。
なぜ
>>767 がわざわざ1文字ずつ空白をあけたか考えろよ。
793 :
NAME IS NULL :2006/02/09(木) 08:52:47 ID:sQbsXhb8
よう、ルーキー!おはよう! >791 ネタにマジレスかこわるいぞwww
まぁ、でも、からかうつもりで
>>768 と発言したとして、
>>770 みたく、逆に相手にムキにさせられてたら、アホだよ。
796 :
NAME IS NULL :2006/02/09(木) 13:06:36 ID:sQbsXhb8
あほばっかだなw >770 は某逮捕者の有名な言い回しだ ネタをネタとわからんやつは 半年ROMってろや なっ?
>>796 2ch用語がわかる2chのスーパー住人にはなりたくありません。
某逮捕者の有名な言い回しまでとかわかる、君はよほどやることなくて、
2chづけの毎日か。
>>796 2chのネタや2chのルール知ってるとなんか自分すごいとか思う勘違いの人多いい
と思うが、そんな事を知ってると主張すると、暇人の2chづけの廃人を自ら証明しそうなので、
半年もROMるの遠慮しときます。
ID無しって便利だな
よう!ルーキー! しっかり、SQL勉強しろよw
802 :
NAME IS NULL :2006/02/09(木) 13:35:35 ID:pH1EVzRS
>>801 ありがとうございます。しっかり、勉強します。
私はSQLの勉強しますが、あなたはパソコンの事より、社会勉強したほうがいいと思います。
大漁だなw
804 :
NAME IS NULL :2006/02/09(木) 13:47:36 ID:pH1EVzRS
次スレは
>>1 にしっかり書いておかないとな
え、なにを?
おうおう! 凄いことになってるな! まさに俺カリスマ!
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使ってるんで、いつもここは空欄にするんだけど、アプリが終了して しまいます。なんででしょう。
811 :
NAME 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 このようなテーブルで、国ごとに県の数をもともるにはどうすればいいでしょうか?
select 国 ,count(県) from テーブル group by 国 こぉ?
オレもそれ考えたけど、県の数ってのがあいまいなんだよね。 同じ県は一つと数えるなら SELECT 国, count(DISTINCT 県) from このようなテーブル GROUP BY (国) かなあ
>>811 例を出すなら、求めるべき回答例も書いてちょ
815 :
812 :2006/02/10(金) 18:01:13 ID:???
816 :
811 :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
>>812 でいいんじゃん
SELECT a.国,a.県,a.市,count
FROM テーブル a,(SELECT 国,count(県) FROM テーブル GROUP BY (国)) b
WHERE a.国 = b.国
ORDER BY 国,県,市
こんな感じか、、、環境依存かわからん
セレクトクでサブクエリが使えるDBなら select 国,県,市,(select count(県) from テーブル where 国=A.国) from テーブル A
>>817 Oracleで分析関数使えれば一番ベストだな。
>>818 サブクエリ使う方法でもいいけど、レコード件数めちゃ多いと、表の1レコードにつき、
サブクエリ1回走ってそりゃまた、時間かかるから、
素直に結合した方がいいかも。
select A.国, A.県, A.市, B.県の個数
from テーブル A,
( select 国, count(県) as 県の個数
from テーブル A
group by 国 ) B
where A.国 = B.国
昨日MySQL入れたばっかの素人ですが、 例えば銀行みたいに多人数のアカウントを扱うような場合って 日付,入金額,云々 みたいな個人用のテーブルを人数分作るんでしょうか?
すれ違いばっかりだな。 MySQLとSQLServerは馬鹿阿呆ホイホイか?
ごめんなさいスレ違いだったようですね
ウザいから消えろよ 二度と来んな低脳。
ヽ(`Д´)ノ
スレ違い風味濃厚ですが、他に適切なスレがなかったため。 他にあったら誘導してください。 会社とかの管理システムを作りなおしています。 そこで、住所データを保持する必要があるのです。 今のところ下記の候補があります。 みなさんは( or 標準としては)どうしていますか? 1.住所をまるごと文字列 若しくは 番地など複数にわけて文字列 2.都道府県、市町村、町名をコード化 番地とかは文字列 3.郵便番号で引かせる 番地とかは文字列 今のところ1と3の組み合わせで、入力時には郵便番号引くけど、保存は文字列 でいこうかと迷ってるんですけど、合併やらで変更がめんどいよ、って言われて困ってます。 これまでの構成は2でした。
そんなの用途によるわ。 別に1と2を併用したってかまわないつうか、2の結合=1でしょ? だから1ってのはまず無くなる。 3が良いか悪いかは微妙。 郵便番号とそれ以外の部分を厳密にわけられるなら良いけど。
2だとコスト掛かりすぎ。
郵便番号ってユニークじゃないから3(のみ)は無理でしょ。 市町村+町名までをコード化してメリットが出るぐらいの規模ならいいが... 結局用途次第か。 郵便局のサイトから出される郵便番号簿だけでは合併などの変更の 自動更新はむりぽ。
830 :
NAME 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 ぽ
831 :
NAME IS NULL :2006/02/15(水) 21:38:01 ID:AHQPPjUE
SQL SERVER2000ですが、Oracleの「ROWNUM」に変わるものって何かありますか?
>>830 ためしてないからわからんが
select code, concat(name) from 入力テーブル group by code
はどうだろ?
id 順に並べるの忘れてた。
並べたやつをサブクエリーにするなりすればいいんじゃね?
>831 一時テーブル利用してIDENTITY
834 :
NAME 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を宣言してください。 と出るんですが、何がおかしいのかさっぱり判りません。 何かご存知の方がいたら教えていただけないでしょうか。 よろしくお願いします。
>834 var_A char(20) のセミコロンっていらないの?
836 :
834 :2006/02/16(木) 16:44:21 ID:???
すいません、カキコの時に書き込み忘れしただけです。 たとえば、insert into の所をコメントして dbms_output.put_line(var_A); でやれば、正しくコンパイル・実行できます
>836 だったら insert into の行が悪いんでしょ? >insert into var_A select ...... なのに省略してるのは宗教的理由ですか? values 句が見えないけどいいの?
insert 句自体がでしたか。 テーブル名の指定に変数でも使ったらいかんのかと 思ってしまって。 見直して来ます。
>>838 >テーブル名の指定に変数でも使ったらいかんのかと
そのとおり。まあなんだ質問するスレを間違ったんだと思うよ。
Oracleなら動的SQLが使える。 execute immediateで調べてみて。
調べて見ます。 ありがとうございます。
841 :
NAME IS NULL :2006/02/17(金) 04:04:25 ID:hDNGqruM
くだらない質問だったらすいません。 mySQLでテーブル(クライアント、鯖ともにujis)にinsertでカラムを突っ込む とき、日本語が含まれてると ERROR 1406 (22001): Data too long for column '日本語が含まれてるカラム名' となって上手くいきません。文字コード、改行の問題かと思って 変えてみたのですがエラーがまだ出ます。。。 アルファベットのみだとすんなり動くのですが、どういうことでしょうか?
>>838 execute immediateで希望通りの事が出来ました。
ありがとうございます。
オブジェクト名の指定にバインド変数も使えないみたいなので、
文字列連結でexecute immediateで動きました。
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
すごく可能
ありがとうございます。 やはり可能だったんですね。
コード | 年月日 |数量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 こんな感じで、縦に入っている数量を横に 展開したいというような・・・
横展開ってやつですね。 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
>>847 table2とtable3の間にもunion allいれといてね。
>>849 うそだぁ。冗談きついよといいながら、もう一度みなおしてみよう。
>>849 えどこがだめなの??
そういや、並べ替えはしてないから、するなら
select *
from (先ほどのSQL)
order by コード,年月日
などでしてね。
>>849 わかった、確かにだめだ。コード003が一行になってた。
ってことで、
select コード,年月日, sum(数量a), sum(数量b), sum(数量c)
from (先ほどのSQL)
group by コード,年月日
で、nullに対する処理はどうなるかちょっと忘れたから、oracleならnvlとかで
処理してくれ。
つか、846見てなんでやりたいことがわかるの?
>>852 Oracleの場合、nullの処理は問題なさげでした。他のデータベースでも問題ないと思うが注意してくれ。
>>853 まぁ、FAQみたいなもんだよ。結構質問する人多いし、本に載ってたりもする。
まぁ、経験かな。
とか言って違ってたり。
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`)
full join で一発
あ。 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`;)コウカ?
sum したり group by したりいらない。 それとfrom 以降も書き方がおかしい もうちょいちゃんと勉強したほうがよいぞ
>>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句複雑だな。
>>858 だって上のリストだけじゃ一日の発生件数が
サマリ済みかどうか判断つかないしー。
…と思ってサマリしたんだけど、複数あったら
それはそれでそのままjoinしちゃダメやね…。
from区おかしい?
>>854 だけど、
from句おかしいのは確かだ。
select *
from table1
full outer join
table2
on (結合条件)
が基本でしょ。
つか、3つ以上のwhere句の条件俺にはギブアップだ。
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
>>862 なんだ、どのみち、union使うのか・・
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
MYSQLをphpMyAdminで使っているのですが、 文字コードを運用の途中に変更するのは大変な作業でしょうか?
>> 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つのファイルで使うにはもともと何か無理があるのでしょうか?
(続き・・・) >> 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 残念ながら環境が無いため検証できませんでした。
SELECT COUNT( DISTINCT 列1, 列2) FROM TBL_TEST みたくCOUNTのDISTINCTに複数指定したいんですが、エラーになります。 なにか記述方法があれば教えてやってほしいです。
>870 SELECT COUNT( DISTINCT 列1), COUNT( DISTINCT 列2) FROM TBL_TEST
>>870 どうもありがとうございます。
そんな書き方もあるんですね。
んでも私のやりたいこととは違いました。
説明不足でした。
列1と列2の両方が同一のを省いてカウントしたいのです。
select count(*),列1,列2 from tbl_test group by 列1,列2; select count(*) from ( select distinct 列1,列2 from tbl_test );
つか、SQLなんて難しくないよね。慣れだよ。慣れ。 人に聞いてもいいけど、時間あるなら色々試してみろ。 そりゃ、俺はじめてのプロジェクトで テーブル設計がうんこなデータベースでSQL文巨大になったけど、いい勉強になった。 でも、既存のシステムのSQL文で一つのselect文が100行近くのがあって、 あれだけは、手を入れたくなかった・・・
>>868 括弧でくくったテーブルに別名'x'を付けずに
'a'を直接指定して実行したらちゃんと動いたよぅ@Ora9i
蒸し返してスマソ('A`;)fullx3ガ ダメッテコトハ ナイトオモウノ
初心者の質問です。 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; でテーブルの設定をのぞいたところ、変化無し・・・ どなたか理由を教えてください。 初心者にもわかりやすくお願いします。
たとえば、学級連絡網の電話帳のデータベースで、学年が上がってクラスのメンバーも変わったので、 データベースを新しくしたいとします。でも、もちろんまた同じクラスになった奴らもいるわけです。 そこで、すでにデータベースに存在する名前の奴の電話番号はUpdateで上書き、新しいクラスメートの 電話番号はInsertで追加したいと思いました。一応、前の連絡網の番号も残しておきます。 こういう状況ってよくあると思うんですけれど、方法として思い付くのはSelectで名前があるか調べて、 あった場合はUpdateのクエリ、無ければInsertのクエリと条件分岐させるプログラムを書くということ くらいです。でもそれってスマートじゃない気がします。 一般的にはどういう風にするのが良いかプロフェッショナルな方々にお聞きしたいです。
>>876 何も起きないが、「テーブルの設定」のところは
MySQLスレで聞いた方がいいかと。
>>877 そんな貴方にUpsert。
あればUpdate、無ければInsertって確かに出くわすんだけど、
出くわした時点で設計が間違ってたりするんかなとも思ってみたり。
879 :
877 :2006/02/21(火) 01:40:53 ID:???
>>878 なるほど、Upsert。調べてみます。
ありがとうございました。
880 :
878 :2006/02/21(火) 04:22:38 ID:???
半分ネタだったんだけどな。(^.^; Oracleのみ? だし > Upsert
やっぱ「あればUpdate無ければInsert」って乱暴のような気がする。
Oracle使いじゃないので、過去にUpsertがあれば便利だなと思った
時があった気がしたんだが、どういう事例だったか思い出せない。
>>877 が例えに挙げたものも、アプリをちゃんと作りこめばUpsertの
出番は無いと思うのだけどなぁ。
プログラム側で条件分岐させるって意味じゃなくて、新規か更新かは
データを用意する以前に決まっている筈。
一応DBがらみで飯食ってるけど、経験豊富なプロフェッショナルじゃ
無いので、大外しかもしれんが、そんときは笑ってくれ。
881 :
NAME IS NULL :2006/02/21(火) 04:55:29 ID:lFVfelfr
Class::DBI とか DBIx::Class とかで find_or_create とか好き。
>877 一応MySQLならreplace、SQLiteなら「insert or replace」ってのがある。他はシラネ。
本来ならUPDATEはSELECTしてるからできるもんだしな。 INSERT できるなら事前にDELETEしてしまえばいいのだけれど 外部キーが入ってるとまずいし、やっぱ設計次第、かなあ
>>877 話のポイントからずれるのかもしれないが、
前の連絡網の番号を残すとすると、
学年フィールドを設定し氏名+学年をキーとして、
新学年は全てinsertで処理すべきだと思う。
そうでないと、前年分を残す意味がないし、かえって
誤解を生じる。
もちろん、全学年として存在している情報は副照会で
取得できるから、入力する必要はない。
プログラムロジックとしてはそれほど差はない。
全学年 -> 前学年 ね。
886 :
876 :2006/02/21(火) 13:41:10 ID:???
>878 何も起きないとわかっただけでもありがたいです。 MySQLスレに行ってきます。
887 :
NAME 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を検討しています。
それでいいじゃん。
>>887 >半分にしか
以下の方法なら1000行(参加人数分)だ。
bitにして対戦相手のID桁のところに勝てば1にする。
未対戦か負け(0)の見分けがつきにくいが、対戦相手共に0なら未対戦と判断。
まぁ2bit割り当てたりCLOBで1文字単位でもいいんだけどさ。
ネタだけど、記録だけでレコードを極端に抑えたいと言うのならこんなこともありカナと。
後で、500勝以上している人の抽出とか勝率での抽出など集計にはSQLだけでは
出来ないけどね。更新も一旦SELECTして該当bitを建ててUPDATEだな。
配列できれば連想配列型が使えれば楽なんかな。
参加者1000名としてホントに全員で総当たり戦なぞやるのか? ホントにやるのなら1000x1000のレコードを作っても何の問題もないと思うが、 普通は抽選で数対戦させて勝ち点が多いほうから一定人数が決勝リーグ進出とかやらないか。
漏れは質問見たときコンピュータ戦なのかな、とおもた。
その程度のレコード数で構造複雑じゃないんだから、普通に持てば良いよね。
SQL7のバックアップをSQL2000で復元できなくて困っています。 やりかた教えてエロイ人
>>893 スレ違いも甚だしいな。ホレ
つ Microsoft SQL Server 総合スレ3【MS SQL】
>894 thx
以前他人の作ったアクセスのSQL文をメンテしていて、とてつもなく長くて、あんまり長すぎるSQL文は だめだなぁと思ってたんだけど、最近自分がSQL書くようになってちょっと長くなる奴い奴を書いちゃった んですが、実際SQLって何行以上だと迷惑でしょうかね?一行を70文字として。
1 行。
898 :
887 :2006/02/22(水) 10:55:35 ID:???
皆様、ありがとうございます。
>>889 その方法も検討しましたが、仰るとおり勝ち数の集計など結果表示の際に
いろいろと不都合があったため、却下となりました。
>>890 実際には全員と対戦するとは限らないのでレコード数はあくまで理論上の
最大値ですが、理論値でも極端に大きいのは問題があると考えました。
リーグ戦が行われるのではなく、誰に勝利したかを記録したいと思っています。
>>891 対人戦の予定です。
>>892 大学内で行う予定で、最終的には潜在参加者数は10000人程度までは想定しています。
どうみても1億レコードです。本当にありがとうございました。
>>898 1億レコードなんて普通だ。
気にせず素直に組め
900 :
NAME 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
見にくい、DBMS限定などなど・・・とりあえずSQL鯖スレで聞けば?
902 :
NAME 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が思いつきませんでした。
select (select count(*) from テーブル where data1 = 1), (select count(*) from テーブル where data2 = 2) from dual これでいんじゃね?
MySQL 4.0 だったら死ぬ罠
905 :
NAME IS NULL :2006/02/23(木) 12:03:30 ID:9yT5VYNa
906 :
お願い致します。 :2006/02/23(木) 15:51:28 ID:nQOdtPso
【where文で、一文字目だけをチェック】したいのですが。 データに、「”01”」〜「”99”」まで 文字がはいっているンですよ。(入れ物は単なる文字列なンだな。) これを”50”以下なら取得する、と。 どうするとよろしいのでしょうか。お願いします。 (「一文字目が'0'か'1'か'2'か'3'か'4'か」という検索文を作りたいです・・・。)
ここでいいのかわかりませんが 会社の部署別にシステムを作りたいのですが この場合部署ごとにデータベースを分けた方が良いのか? それともkeiri_tableみたいにデータベースは1つでテーブル名等で分けるほうが良いのでしょうか? ちなみに全体的な各部署のデータを同時に見る処理なども作る予定です。
規模にもよるんじゃないの?
>>906 数値に変換してから判定するとか、SUBSTRING 系の文字列関数を使うとか。
>>907 普通は一緒にするでしょ。
910 :
NAME IS NULL :2006/02/23(木) 17:10:26 ID:9yT5VYNa
>>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')
912 :
902 :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
すみません、初歩的な所からつまづいてしまいました(´・ω・`) 部署表(部署番号 部署名 場所) 社員表(社員番号 社員名 部署番号 給与) 社員表示(社員番号 社員名 部署名 番号) のテーブルがあります。 (1)部署表と社員表から社員表示を得るためのSQLを書く。 (2)(1)を社員表示という名前のビュー表を作成するSQL文に書き直す。 (3)上記のSQL文は、関係演算において、どの演算に相当するか。 すみませんがご指導お願いします。
914 :
NAME IS NULL :2006/02/24(金) 09:09:08 ID:aAYC5YQv
915 :
NAME 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
イコールじゃなくてINじゃないのか? つうかサブクエリにしなくても書けそうな普通の条件なような・・・。
あざーす!INでできたっす あとEXISTSとかいうの使ったらできたっぽいです 構ってくれてどうもっす 親の情報を元に子を削除したいのでこんなんになってしまいました とりあえず動いたのでこのままいくっす DELETE FROM[掲示板メッセージリンク] WHEREEXISTS ( SELECT[掲示板メッセージリンク].最終更新日時 FROM[掲示板メッセージリンク] INNER JOIN [掲示板メッセージ] ON [掲示板メッセージリンク].[お知らせメッセージ番号] = [掲示板メッセージ].[お知らせメッセージ番号] WHERE([掲示板メッセージリンク].最終更新日時 < DATEADD(dy, - 180, GETDATE())) AND (NOT ([掲示板メッセージ].お知らせ対象区分 IN ('A', 'B', 'C'))) ) GO
あーでもやっぱり後学の為に知っておきたいっす みなさんなら以下要件でどんなSQL書きますか? 掲示板メッセージ(親) 掲示板メッセージリンク(子) ・親の「お知らせ対象区分」が「A,B,C」でないもの ・子の「最終更新日時」が「現在より180日以前」 に当てあまる行を子からDELETE
919 :
NAME IS NULL :2006/02/24(金) 23:29:26 ID:+kOkioZP
あざーすなんて言ってるやつはばかです。
>>918 その要件だけなら、JOINしなくてもいいんじゃない?
DELETE FROM [掲示板メッセージリンク]
WHERE
[掲示板メッセージリンク].最終更新日時 < DATEADD(dy, - 180, GETDATE())
AND EXISTS
(
SELECT * FROM [掲示板メッセージ]
WHERE
[お知らせメッセージ番号]=[掲示板メッセージリンク].[お知らせメッセージ番号]
AND [お知らせ対象区分] NOT IN ('A', 'B', 'C')
)
子テーブルのキーが何かわからんが、余計なものまで消えないだろーか
webprog板から誘導されて来ますた。 はてなブックマークのような「タグ」機能をつけたwebアプリを作りたいと思っています。 一つのレコードに対して、ユーザー(データを登録する人)が定義したキーワードのタグを複数割り当てることが出来るものです。 さらに、そのタグが削除されれば、全部のレコードからそのタグのみ削除されたり、 タグごとにいくつのレコードにそのタグが割り当てられているか集計出来たり、 タグによる絞り込みや、新規レコード登録の際にすでに定義されたタグ (そのタグをもったレコードが存在するという事)があればそれを動的に読み出して、チェックボックスを使って入力の選択肢として再利用するような感じです。 どんなテーブル構成にしたらよいのか、このタグをいったいどういう風にDBに格納するべきか ・タグひとつにつき1フィールドで1か0のフラグ? ・1フィールドにタグを配列で? なんだか漠然として全然考えがまとまりません。 アドバイスおながいします。 環境はPHP4.3.1、MySQL 3.23.58です。(本番用のレンタル鯖)
923 :
NAME IS NULL :2006/02/25(土) 21:12:57 ID:4Np9D+Kg
超初心者なんですが、教えてください!! テーブル作成時にある2つのカラムを組み合わせることで 一意性を獲得しているということを表現するには どんなSQL文を書けばいいんでしょうか??
>>923 主キーが複合キーってこと?
create table table1 (
key1 integer,
key2 integer,
data1 varchar(20),
primary key (key1, key2))
納品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でグループ化されたものを取得したいです。 よろしくお願いします。
>>925 > 同一納品Noに明細区分がゼロのものがない納品Noを
> 取得したいのですが、
この言葉だけを信じれば、
select distinct 納品No
from table1
where 納品No not in (select 納品No from table1 where 明細区分 = 0)
でダメかね? 例としてあげられてるデータだと、結果なしになるけど。
>>926 ありがとうございます。
例のデータの最後のレコードの明細区分が間違ってましたが
教えていただいた方法で大丈夫だと思います。
distinct とgroupの使い方がまだまだ下手でした。。
ほんとうに助かりました。
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 ; キモイ?
>>928 ありがとうございます。
その考え方でも取得できますね。
SQLServer2000 なのですが、
0 as MK_Flag
のところを
min(Meisai_Kbn) as MK_Flag
にすれば欲しいデータが取得できました。
いろいろ勉強になりました。
930 :
928 :2006/02/25(土) 23:55:09 ID:???
エガッタ('A`*)
>>929 まぁ、こういうトリッキーなSQLはいけないかもしれんけど、
select 納品No
from テーブル
group by 納品No
having sum(明細区分) >= count(*)
上より下みたいに全部カラム指定して書いた方が実行効率がいいって聞いたんだけど、なんで?*は使わないもんなの? SELECT * FROM table; SELECT tbl.a, tbl.b, tbl.c FROM table as tbl;
>>933 それ、某掲示板でも誰か話題にしてたね。
俺的には気にする必要ないと思うけど。
まぁ、でも俺は*は絶対に使わんけど。
935 :
533 :2006/02/26(日) 11:14:53 ID:???
>>534 効率云々じゃなくて、SQLのお作法として*は使っちゃいけないってこと?
使わない理由を是非ご教授願いたいです。
昔は*じゃなくて項目指定したほうが速いからそうしろっていわれたけど、今はどうなんだろ? オプティマイザも賢くなってるしね。 マニュアルとかでそういうところ書いてある製品ってある?
どっちにしろ微妙な差しか出ないでしょ 「*」だとカラム名を全部取得し展開する。とかでしょ? どっちかっていうと、プログラム側の影響度調査が楽になるってメリットが多いんじゃない?
下記のことで昨日から悩みっぱなしです。ぜひお知恵をお貸しください。 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句で使えませんし、 サブクエリもうまい方法が見つからない状態です。 ぜひご助言をお願いします。
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
940 :
938 :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より小さい場合に問題があることは
承知していますが、今はとりあえず無視しています)
| AAA 2006-01-01 DDD
| AAA 2006-02-01 EEE
2月1日と1月1日なら、1月26日により近いのは2月1日だろ。
>>938 の時点で条件が間違ってると思われ。
じゃなきゃ、月を考慮した計算方法に書き直す。
942 :
940 :2006/02/26(日) 19:15:13 ID:???
>>941 失礼しました。
>>938 の書き方が良くありませんでした。
| ここからある日付の直近のdate1を持つ行を抽出し、
は
「ある日付の直前のdate1を持つ行」を意図していました。
ある日付以前で、かつ最も近い日のものをSelectしたかった
のですが、誤解を生む書き方をしてしまい、申し訳ありません。
だったら、2006-01-26 に対しては DDD と EEE しか無いはずだが。
944 :
942 :2006/02/26(日) 21:40:30 ID:???
>>943 おっしゃる通りでした。ご指摘ありがとうございます。
私が
>>938 で書いた
| ある日付が2006-01-26ならばDDDとEEEとFFFが取り出せればOKです。
これがそもそも間違っていました。お詫びすると共に訂正いたします。
946 :
NAME IS NULL :2006/02/27(月) 01:33:07 ID:39oPOPzH
データ型でdatetimeというのがあるんだけど,これって varcharやtextあるいはunix timeで保存するのとどういう違いがあるの? 実際このdatetimeとかの使い方はよくわかってないんだけど YYYY-MM-DD HH:ii:ssみたいな感じで保存されたら検索時にメリットが, みたいなこととかがあるんでしょうか?
datetime型ってベンダー依存じゃなかったっけ。 SQL92には無かったと思う。 昔、PostgreSQLが6.5だった時代、timestampの実装がショボイ(古い)くて 範囲も精度も上だったdatetime型ってのはあったが、今はもうない。
948 :
NAME IS NULL :2006/02/27(月) 02:04:09 ID:39oPOPzH
ふむふむベンダー依存ですか.MySQLとかSQLiteんところで聞いてみます. どうもでした.
DATETIME に限らず、TIMESTUMP 等、時刻型にすれば、 時刻の範囲指定とか、時間の足し算とかクエリー時に使えるから 文字列なんかにするのとは全然違う。
>>946 あと、
>YYYY-MM-DD HH:ii:ssみたいな
INSERT時はこういう指定で入れたかもしれないけど
内部形式はこうなってないよ。
'27FEB06' とか入れても受け付ける環境もあるし。
複数のDBMS対応が不要ならば、日付型使うべき。 複数対応前提のパッケージなどであれば、こんなところで聞かずに自分で調べてどうしたらいいか十二分に考える。
おれは日付・時刻も普通に文字型で特に困ったことないな。 日付演算したいときだけクエリで日付型にしてる。 どうしてもテーブル定義が日付型でないと困ることってある?
ソートもいちいち日付にしてんの?
日付の計算をしない人には、関係ないけどね。
GROUP BY DATE_FORMAT(hoge, '%Y%m') とかしてる漏れがきましたよ。
>>954 ソートは日付の文字列でも日付型でも同じになるはずですが・・・。
まさか月日とかが1桁の場合に0を付加せずにやってるとか。それは火に油なような。
月-日-年 日-月-年
>>958 じゃあ入力フォーマットをわざわざ固定にして、かつ入力時に正しい日付かも
全ての場所でチェックしてるわけか。ごくろうさんだねえ
一ヶ月の足し算とかどうしてんの。 ってそのときはいちいち日付型に変換するのか
962 :
958 :2006/02/28(火) 21:23:56 ID:???
>>960 >じゃあ入力フォーマットをわざわざ固定にして、かつ入力時に正しい日付かも
>全ての場所でチェックしてるわけか。
入力データは外部からもらう場合ばかりなので、フォーマットは自分たちでは決められない。
つまりフォーマットは最初から決まっている。
入力チェックは、必要な場合はやる。信頼できるデータと分かってたらやらない。
>一ヶ月の足し算とかどうしてんの。
>ってそのときはいちいち日付型に変換するのか
そういうこと。
963 :
954 :2006/02/28(火) 21:24:53 ID:???
間違えた。962=954
出力時に変換するやり方は、Macのファイルメーカー。 入力時に変換するやり方は、一般的なSQLDB。基幹システムもこれ。
毎年の同月集計とかもテキストだと面倒だが、そういうのがいらない 場合に使えるのか、勉強になった。 まあ自分でテキスト型で日付を格納することはありえないけど
>>960 DBに日付を文字列として格納する場合、普通そうしないの?
入力されたままをDBに登録しても使えないじゃん。
入力されたままはそれで必要なら取っておくけど、それとそのデータとしての日付は別問題。
三個のテーブルの共通データを取り出すには where a=b b=c c=a とする以外にありませんか。テーブル数が増えると対処できそうにない
a=b a=c だけでもいいわけで。
間違えた。where a=b or b=c or c=a だった。*のような便利記号ありますかね
INTERSECT
972 :
NAME IS NULL :2006/03/02(木) 09:14:17 ID:NYiEbICr
>>967 OracleSQLパズルによるとこんな方法もあるらしい
a=all(b,c,d,e,f)
つうか、Table数増えるって、別に日本語的に正しいならそんなに苦じゃないと思うが。
>>967 が間違った方向にいくと、正規化崩しが正しいとか考えるんだろうね。
974 :
NAME 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 です。
すれ違い。PHPかどっかのスレじゃないのか?
その仮データの時点でお前はもう駄目だ。 分かる俺も駄目だ。
977 :
NAME 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文を書けばよろしいでしょうか?
PostgreSQL 8.1だと UPDATE B_table SET date=A_table.date from A_table where (A_table.code = B_table.code) とか書けるみたいだけど、ちゃんと書くならどうなるのかな
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 こんな感じ?かな? 試してないからわからんけど。
次スレは? 帰ってきたの次だからエース?
次々スレはタロウで次々々スレはレオってか
データベースって最初に何ギガか空のイメージか何かを作って その中にデータを入れていくのでしょうか? それともデータが増えるごとにサイズが大きくなったり または各データごと個別のファイルだったりするのでしょうか? データベースの仕組みについて超優しく解説サイト等があれば教えてください できればイラストたくさんがうれしいです
具体的なデーターベースで勉強した方が良い。色々あるからね。
986 :
983 :2006/03/03(金) 20:09:02 ID:???
>>984-985 レスどうもです。
いろんなサイトを見てもデータベースはどれも円筒形で描かれていてイメージが湧かなかったもので。
というかSQLはデータベースを操作する言語のことなんですね。
そういうこともわからず、スレ違いな質問をしてすみませんでした。
987 :
NAME IS NULL :2006/03/04(土) 00:55:23 ID:Ad/biqSE
SQL*LOADERで、ホスト(EBCEDIC)のS9BINARY項目を VERCHR項目にロードする方法を教えて下さい。 よろしくお願いします。
>>987 Oracleスレにいってね。
次スレはスレタイ工夫しないとこういうのがあとを絶たないね。
それともいっそSQL-DB何でも相談室にするか(笑
989 :
NAME IS NULL :2006/03/04(土) 21:13:51 ID:og8VHb3X
1つのテーブル内に日付があり、システムの日付と照らし合わせて同じ月のデータが無ければ データをinsertしたいと考えているのですが、恥かしながら創造がつきません。 どんなSQL文になりますか? テーブルA フィールド1.ID フィールド2.Date
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)
Dateをカラム名にするのは感心しませんな。つか構文エラーになるっしょ。
それがけっこうならないんですよ、
そういや、違うRDBMSにデータを移行するためにいくつかツール利用してるが 前DBのカラム名にselect があるもんだからみんなひっかかるw "" の追加で事なきを得たけど。。。
994 :
次スレテンプレ :2006/03/06(月) 10:47:56 ID:SdupgU6V
くだらなすぎるかもしれないけど、ネットとかでどうしても 見つからなかったんで教えてくださいませ。 あるテーブルの全ての行の特定のフィールドを全て1にするにはどうすればいいのでしょうか? 特定の行なら where句をつけて UPDATE table SET field='1' where tokutei; でよいとわかるのですが、 ようはこれから where tokutei を無くしたSQLを実行したいのです。
>>995 要はwhere tokuteiを無くしてSQLを実行すればいいのです。
UPDATE hoge SET foo = '1'
マイクロソフトアクセスでの日付型の扱いについて質問です 次のような表があります。 ID->数値型 NAME->文字列型 BIRTHDAY->日付型 これに対してオラクルだと次のように日付を指定して 挿入するのですが、アクセスだとどういうSQLを発行すれば いいでしょうか?ちなみに、JAVAからアクセスのファイルに ODBC経由でSQLを投げる環境です。 INSERT INTO T_BIRTHDAY (ID,NAME,BIRTHDAY) VALUES(3,'三郎', to_date('20051222', 'YYYYMMDD'));
ume
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。