早速ですが質問です。 サーバーAとサーバーBに同じレイアウトのテーブルがあって、 サーバーAのデータをサーバーBにインサートしたいのですが、上手いやり方はないでしょうか?
>2 どんな DBMS でも、データのバルクアウト・バルクインをするツールくらいあるだろ。 サーバAからバルクアウトして、サーバBにファイルを持っていって、バルクインする だけですむじゃないか。 レプリケーションならまた別だが。
4 :
NAME IS NULL :04/12/16 01:08:05 ID:euThd3sb
>>2 ACCESSで言うところのリンクテーブルをBに作って、Aのテーブルを参照できるようにしたらええよ
999 名前:NAME IS NULL[sage] 投稿日:04/12/16 11:56:17 ID:??? 1000ならE.F.コッド復活 1000 名前:NAME IS NULL[sage] 投稿日:04/12/16 11:56:37 ID:??? 1000ならE.F.コッド復活しない 1001 名前:1001[] 投稿日:Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。
6 :
NAME IS NULL :04/12/16 16:18:35 ID:x7wdOupz
すいません。 テーブルのカラムにUNIQUE指定を追加したり削除する 構文を教えてください。
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
>>6 ALTER TABLE テーブル名 ADD CONSTRAINT 制約名 UNIQUE(カラム名)
9 :
NAME IS NULL :04/12/16 16:54:20 ID:x7wdOupz
ありがとうございます。 解除する方法も教えてください。
10 :
NAME IS NULL :04/12/16 16:55:44 ID:HkQr2izB
自分で調べろ。本屋に行く能力か、検索エンジンを使う能力があれば、アホでも解ることだ。
11 :
NAME IS NULL :04/12/16 18:26:53 ID:x7wdOupz
>>10 いや駄目です。
実はUNIQUE追加は分かってたのです。
しかし、UNIQUE指定を外すのは、なかなか見つからなかったのです。
と言うか、その発言からするに、アナタは全然知らないでしょう。
無駄な煽りレスはやめてください。
次の患者さんどうぞ
>>11 ALTER TABLE テーブル名 D
NO CAREER
14 :
NAME IS NULL :04/12/16 18:48:23 ID:PxuDTuxN
荒れる原因だから、教えてくんには答えない方がいいと思う。 教える方も悪い。
>>13 明らかに解ってて釣ってるんだから答えるなよ
16 :
NAME IS NULL :04/12/16 18:53:02 ID:x7wdOupz
>>10 >>12 >>14 >>15 クズオタクどもめ。氏ね!
>>14 何が教えてくんには答えるなだ。ここは質問スレだぞ。
パソコンから離れたら同僚からいじめられるだきの
ネット弁慶のザコオタの分際で。消えろ。
18 :
NAME IS NULL :04/12/16 19:04:24 ID:d6gV77wB
ザコオタ頼りにしてる時点であんたの負けですから! 残 念!!
>ここは質問スレだぞ。 じゃあ、質問だけ勝手にすれば?
釣られるな。図星だったかと笑われて向こうが増長するだけだぞ。
>>22 すみませんねえ。
前の患者さんがウンコ漏らしちゃったんで、今日はもう休診なんですよ。
22 :
NAME IS NULL :04/12/16 21:13:10 ID:qu9wwr5Z
foo というテーブルに、hoge fuga hige moe という2つのフィールドがあります。 で、hoge fuga higeが3つとも同じレコードについては、まとめて1レコードとみなし、 fooテーブルが何レコード持っているか調べたいのですが・・・ //----------------------------------------------------------- 例です: hoge fuga hige moe 1 3 5 6 1 3 4 5 1 3 5 8 1 5 5 5 (↑1行目と3行目を同じとみなし、レコード数は3) //----------------------------------------------------------- どうゆうSQL文を書いたらよいのでしょうか? select sum(*) from favorite group by hoge, fuga, hige とやってもだめでした(そりゃそうだよね。。。) どなたか教えていただければ幸いです。 なお、Postgres(すいません、バージョンは今わかりません)です
>>22 SELECT COUNT(*) FROM (SELECT DISTINCT hoge, fuga, hige FROM foo)
ではどうですか? もっと簡潔にできるのかな。
>>11 ADD CONSTRAINT があるなら DROP CONSTRAINT があるだろうという推測はできないのか?
25 :
22 :04/12/17 02:24:18 ID:xyylN+gv
>>23 ありがとうございます。
もう1度似たような質問’たぶんあってると思うんだけど・・・)ですがよろしいでしょうか?
foo というテーブルに、hoge fuga hige moe
という2つのフィールドがあります。
で、hoge fuga hige の組み合わせで、同じ組み合わせがあるか否かどうかって、
どういうふうに書いたら良いのでしょう?
SELECT COUNT(*) AS cnt FROM (SELECT hoge, fuga, hige FROM foo GROUP BY hoge,fuga, hige)
で、
cntに1以外のものがあるかどうかを、
なんかのスクリプトで(PHPの予定ですが)見ればいいでしょうか?
(CASE文とかよく分からないもので(汗))
p.s.
今自宅で環境もととのってないためテストできず、気になって眠れず・・・
会社いけばテストできますが・・・
select (case when count(*) > 0 then 'true' else 'false' end) as result from (select count(*) as cnt from hoge group by hoge,fuga, hige) as sub where sub.cnt > 1; これで、resultカラムにtrueかfalseが入ります・・・
>>25 Webprog板での質問から疑問に思っていたんだけど、
>foo というテーブルに、hoge fuga hige moe
>という2つのフィールドがあります。
4つじゃなくてなんで”2つ”なの?
同じ組み合わせがある物だけを抜き出すのなら、
SELECT hoge,fuga,hige FROM foo GROUP BY hoge,fuga,hige HAVING count(*)>1;
28 :
NAME IS NULL :04/12/17 22:39:17 ID:lankP6pa
質問です。 Column--a,b (PK1-a,PK2-b) を持つテーブルAに以下のようにデータが入っています。 a b ------ 1 5 1 2 1 1 2 10 2 5 2 1 3 100 3 50 3 5 ここから、 a b ------ 1 5 2 10 3 100 と抽出したいのですが、どのようなSQLを書けばよいのでしょうか? よろしくお願いします。
>28 aで纏めてbの最大値を出したいという意味なら、 SELECT a,MAX(b) AS b FROM テーブルA GROUP BY a
30 :
28 :04/12/17 23:10:06 ID:lankP6pa
>29 ありがとうございます。 意とするところは、そのようになります。 Max の使い方なんですね。少し調べてみます。 さらに発展させて、 Column--a,b,c (PK1-a,PK2-b,PK3-c) を持つテーブルAに以下のようにデータが入っています。 a b c ----------- 1 5 5 1 5 4 1 1 9 2 9 1 2 8 9 2 1 1 3 9 1 3 5 100 3 1 1000 から、 a b c ----------- 1 5 5 2 9 1 3 9 1 と抽出したいのですが、(実はこちらが本当の宿題なのですが) 似たような感じで出来そうですね。 がんばってみます。
31 :
28 :04/12/17 23:22:27 ID:lankP6pa
SELECT a,MAX(b),c AS b FROM ( SELECT a,b,MAX(c) AS c FROM テーブルA GROUP BY a,b ) GROUP BY a これで解決しました! (もちっと、キレイにできるかもしれないが)
>>31 動くのかそれ? 使っているDBMSは何?
SELECT *,
(SELECT MAX(c) FROM Table_A WHERE a=t1.a AND b=T1.b )AS c
FROM (SELECT a,max(b) AS b FROM Table_A GROUP BY a)AS T1;
firebird1.0.3使っています。 コマンドプロンプトで複数行のSQL文を打つ場合 途中で間違えた時(>CONというプロンプトが帰ってくる)に キャンセルするにはどうしたらいいですか? Ctrl+Cやったら接続が遮断されてしまいました・・・
\c
37 :
NAME IS NULL :04/12/19 21:49:55 ID:J0WodSf9
質問です。 VB6(DAO)で.mdbファイルにテーブルを作成する際、それと同時にフィールドの説明欄への 文字入力を行うためのSQLコマンドは存在するのでしょうか? 過去にどこかで見たような気がするのですが、必要になったとき探してみると見つからなくて…。
SQL Server 2000 です。 レコードの抽出結果の行/列を入れ替えるのに何かよい方法はないでしょうか? 例えば ID, ROW, CD, SUU という項目をもったテーブル を抽出し、 ID, ROW, CD, SUU, ROW, CD, SUU, ROW, CD SUU.... のようにしたいのです。 例えばテーブルに 1,1,1,1 1,2,2,1 1,3,1,2 1,4,2,2 とデータがあったら、 1,1,1,1,2,2,1,3,1,2,4,2,2 と返したいのですが。 元のテーブルの行数は不定です。 何かよい方法はないでしょうか?
>>39 SQLで頑張らないでクライアント側で処理するのが吉。
環境はOracle9iです。 日次の売上データがあります。 売上データから週次(日〜土)の統計値を抽出したいのです。 抽出したいのは、週ごとの売上の合計値、最大値、最小値、平均値です。 月次では簡単にできたのですが、週次うまくだとできません。 どなたか教えてください。
月次を晒せ
>42 おお、さっそく 確かこんな感じです。 select to_char(day, 'YYYYMM'), sum(val), max(val), min(val), avg(val) from t where day between '2000/1/1' and '2003/12/31' group by to_char(day, 'YYYYMM')
44 :
41 :04/12/23 15:22:58 ID:???
訂正 s/週次うまくだとできません/週次だとうまくできません/
TO_NUMBER(TO_CHAR(日付, 'DDD'))/7
46 :
41 :04/12/23 17:38:43 ID:???
>45 ありがとうございます。 なるほど、そういうやり方があったか。 なんとなくできそうな気がします。
47 :
NAME IS NULL :04/12/23 21:24:36 ID:qlzX5+ej
グルーピングする明細の中に存在するコードを、 マスタと接続して名称をとってくる時に、その名称も なんらかの計算式にしないといけないのですが、普通、それらは どうするんでしょう? 例としては 売上データの月次集計を行ないたい時、売上データには商品コードしかないので 商品マスタと JOIN して商品名を表示させたいのですが、商品名は Where 対象ではなく、Group By の中に書くしかないと思うのですが、その場合、 商品名はグルーピング対象ではなくて、集計対象となった商品コードに 該当する商品名を取得したいのですが、どうすべきかわかりません。 グループ化する必要はないのですが、Group By の中に入れるのが 一般的でしょうか?それとも、意味はないですが MAX とかつけて 演算対象とするのが一般的でしょうか? わかりづらいかもしれませんがよろしくお願いします。
グループ化された結果と商品マスタをJOINする SELECT 商品マスタ.商品名,a.* FROM 商品マスタ INNER JOIN (SELECT 商品コード,〜 FROM 売り上げデータ GROUP BY 〜) AS a ON 商品マスタ.商品コード=a.商品コード
>41,46 TRUNCATE(日付,'WW') という手もあります。書式は間違っているかもしれません。
select * from table as a,table as b,table as c where a.col *= b.colの*=の意味はどう解釈したらよいですか?
外部結合と解釈
>51 ありがとうございました!
Blobカラムに、バイナリデータを書き込みたいのですが 16進数で 5c,5c,27 (\\') というバイトの並びがあると エラーが出てしまい書き込めません。 どうすればBlobにデータを書き込めるのでしょうか?
>>53 DBMSと開発言語、それとDBアクセスに使ってるライブラリを明示しないと
誰も答えようがないぞ
Accessのmdbです。
┏━━━━━┓ ┏━━━━━━━━┓
┃部品 ┃ ┃品目- 品目_ 再帰 ┃ ┏━━━━━┓
┃----------┃ ┃----------------┃ ┃部品_1 ┃
┃部品コード ┠─┨親部品コード ┃ ┃----------┃
┃… ┃ ┃子部品コード ┠─┨部品コード ┃
┗━━━━━┛ ┃員数 ┃ ┃… ┃
┗━━━━━━━━┛ ┗━━━━━┛
のようなリレーションシップになっており、[部品]=[部品_1]なのですが、
これを子部品が無くなるまで展開し尽くして集計するのは、
SQLだけでは無理だとは思うのですが、
具体的にはどのようにやるのが良いのかどうしても結論が出ません。
アドバイスいただけると助かります。
http://pc5.2ch.net/test/read.cgi/db/1057509675/192-
>>55 隣接リストモデルの木構造を展開して部品リストを作りたいのだと思うのだけど、
SQLだけだと無理だなぁ。ストアドなどを使ってDBで展開するか、ホスト言語から
再帰的に問い合わせするかどちらかしかない。
ってことで、スレ違いかなー。
新スレに移ってからSQLの質問てあまりないな。
58 :
56 :05/01/11 10:15:20 ID:???
つっこまれる前に補足 SQL99には再帰的に呼び出すコマンドが追加されていたような希ガス。 DBMSによっては既にあるのかも。 あと、関数なんかで用意されていたりしたりする。
ソフトウェア開発技術者試験のためにSQL勉強しなきゃならんのですが おすすめの本とかある? 午後の試験でいつもSQLで点取り逃してるから勉強しようかと思うんだけど。 将来的にはSQL使わないから、初心者向けのでOKかなぁ
61 :
57 :05/01/11 20:47:03 ID:???
データモデリング勉強しても実装力が全然おっつきません。。。(TーT
Oracle8i使ってます。 2つのテーブルを外部結合して副問い合わせしたいのですが うまくいかなくて悩んでます。 SELECT A.Code,A.Name,B.Name2 FROM A,B WHERE A.Code=B.Code(+) AND (B.Code,B.Date) IN (SELECT B.Code,MAX(B.Date) FROM B GROUP BY B.Code); Aテーブル Bテーブル Code Name Code Name2 Date 0001 AAAA 0001 GGGG 2004/01/01 0002 BBBB 0001 HHHH 2004/02/02 0003 CCCC 0001 IIII 2004/03/03 0004 DDDD 0002 JJJJ 2004/01/01 0005 EEEE 0002 KKKK 2004/03/03 0005 LLLL 2004/02/02 結果: 0001 AAAA IIII 0002 BBBB KKKK 0003 CCCC (null) 0004 DDDD (null) 0005 EEEE LLLL
表がズレました スイマセン Aテーブル Bテーブル Code Name Code Name2 Date 0001 AAAA 0001 GGGG 2004/01/01 0002 BBBB 0001 HHHH 2004/02/02 0003 CCCC 0001 IIII 2004/03/03 0004 DDDD 0002 JJJJ 2004/01/01 0005 EEEE 0002 KKKK 2004/03/03 0005 LLLL 2004/02/02 結果: 0001 AAAA IIII 0002 BBBB KKKK 0003 CCCC (null) 0004 DDDD (null) 0005 EEEE LLLL
結果: 0001 AAAA IIII 0002 BBBB KKKK 0003 CCCC (null) 0004 DDDD (null) 0005 EEEE LLLL こうなって欲しいんだけど 0003 と 0004が取得できません。 誰か教えてください エロい人
Oracleは知らんけど、LEFT(RIGHT) JOIN 使わなきゃ駄目では?
Oracle では、left join、right join を (+) で指定できます。 SELECT * FROM A,B WHERE A.Code=B.Code(+) SELECT * FROM A LEFT JOIN B ON A.Code = B.Code どちらも同じ意味です
68 :
NAME IS NULL :05/01/13 22:45:31 ID:epuALH3a
たとえば以下のようなテーブルで 各グループが登録した結果が何件あるかをカウントしたい ただし、同一ID-Aに対する結果を複数登録してある場合は1件でカウントする 具体的にどうすれば実現できますか? DBはMySQLを使っています tabA ID-A 内容 1 aaa 2 bbb 3 ccc tabB ID-A グループ 結果 1 1 1 1 1 2 1 2 2 2 2 4 2 2 2 2 3 4 2 4 2 3 1 3 3 2 6 求める結果は グループ 件数 1 2 2 3 3 1 4 1
>>63 SELECT A.*,T2.Name2 FROM A LEFT JOIN (
SELECT * FROM B AS T1 WHERE Date = (SELECT Max(Date) FROM B WHERE Code=T1.Code)
)AS T2 USING(Code);
--思いつき。なんか冗長な気がしないわけでもない :-)
>>68 MySQLで動くかどうか知らんが、こんな感じか?
SELECT グループ,count(ID-A) FROM (SELECT ID-A,グループ FROM tabB GROUP BY ID-A,グループ) GROUP BY グループ;
tabAも関係ないし、tabBの「結果」カラムも関係ないな。
71 :
68 :05/01/13 23:39:42 ID:epuALH3a
>>70 早いですね ありがとうございます
明日試してみます
4.1系なので副問い合わせも大丈夫です
72 :
yo-ko :05/01/14 10:17:33 ID:UC20sTBi
MySQLにて販売管理をしようとしています。 売上に対し複数の請求と入金がある場合があり、売上のレコードごとに請求・入金の合計値を出したいのですが悩んでます。 テーブル:売上 No B 金額 1 1 800 2 1 900 3 2 500 4 3 800 5 1 300 テーブル:請求 No 金額 1 800 2 500 2 200 4 300 5 300 テーブル:入金 No 金額 1 400 1 200 3 300 2 400 3 900 1 200 B = "1" の時の結果が以下になるようなselect文が解りません。 No 売上 sum(請求) sum(入金) 1 800 800 800 2 900 700 400 5 300 300 null 以下のように書くと入金テーブルと請求テーブルがクロス結合のようになって複数のレコードがあると それぞれダブって集計してしまいます。なんとかならないものですかね。 SELECT 売上.No, 売上.B, sum(請求.金額), sum(入金.金額) FROM 売上 LEFT JOIN 入金 ON 売上.No = 請求.No LEFT JOIN 請求 ON 売上.No = 入金.No WHERE 売上.B = 1 GROUP BY 入金.No ; No C sum(D) sum(E) 1 800 2400 800 2 900 700 800 5 300 300 null
>>72 SELECT 売上.No , 売上.金額 , T1.請求金額 , T2.入金金額
FROM 売上
LEFT JOIN (SELECT No,sum(金額)AS 請求金額 FROM 請求 GROUP BY No)AS T1 ON 売上.No = T1.No
LEFT JOIN (SELECT No,sum(金額)AS 入金金額 FROM 入金 GROUP BY No)AS T2 ON 売上.No = T2.No
WHERE 売上.B = 1;
売上のNoはユニークなんだろ?
74 :
yo-ko :05/01/14 13:08:27 ID:UC20sTBi
ありがとうございます。 売上のNoはユニークです。 しかし、試してみたところ'SELECT〜'でエラーが出てしまいました。 MySQLのバージョンでしょうか? 使用しているバージョンは4.0.22です。 よろしくお願いします。
75 :
73 :05/01/14 14:16:27 ID:???
>>74 思いつきで書いただけなんで、いちいち試してません。
まぁ、MySQLも使ってないけどな。
どこでどうしくじってるんかなぁと、見直してみたがワカンネ。
ひょっとして MySQLってASが余計なんだったけ?
ってことで、ここはMySQL使いに譲って俺は寝るZzz...
例えば、以下の構成のようなテーブルがあったときに、 ID AUT 15 片山恭一 11 宮部みゆき 11 我孫子武丸 11 梅原克文 4 京極夏彦 IDの重複しているレコードは無条件で最初の一行のみ選択し、 以下のような結果にしたいのです。 ID AUT 15 片山恭一 11 宮部みゆき 4 京極夏彦 この場合、どのようなSQLを組めばいいのでしょうか? DBはSQLServerを使用しています。 ご教授お願いいたします。
select id, min(aut) as aut from auttable group by id もし順番が大事なら別のフィールドにシーケンス番号を振らないと保障できないですね。
おぉーなるほど、こういうやり方があったのか… 助かりました、ありがとうございます。
79 :
NAME IS NULL :05/01/15 01:54:55 ID:eLX+jWNY
>>74 MySQLの4.0系は副問い合わせできないんじゃなかった?
4.1系にすれば副問い合わせはできるよ
80 :
NAME IS NULL :05/01/16 18:52:29 ID:MW39mL8U
SQL文のコメントアウトって -- コメント でよかったでしたっけ?
そのくらい、いちいち質問するようなことじゃない。
82 :
yo-ko :05/01/17 10:23:53 ID:1ElqsyMX
>>74 ですよね。
>>72 のようなことをするには、MySQLのバージョンを上げずには
出来ないのでしょうか?
質問させて下さい。 select * from test where test.field not in (select 〜) といったようなSQLがあって サブクエリの実行結果が一件もヒットしないような条件のとき これを、 select * from test where test.field is not null と書き換えることは文法的に正しいでしょうか? 宜しくお願いします。
>>83 書き換えることで文法的に正しいとは?
質問の意図がわからないが、
サブクエリが1行も返さない事とNULLとは別物。
SQLでのNULLは無しとか空という意味じゃなくて「不明」。
85 :
NAME IS NULL :05/01/22 18:37:50 ID:pmwmkVIg
質問があります UPDATE文で UPDATE RECORD SET (COUNT=X, TOTALCOUNT=Y) WHERE PRIMARY=XXX 上のTOTALCOUNTの値は現在の(COUNTの値+ X)なのですが この場合、UPDATE文内で現在のCOUNTの値を取得できないのでしょうか? 事前にSELECT COUNT FROM RECORD WHERE PRIMARY=XXX とやるのは冗長で美しくないと思うのです 環境はAccess2000+DAO3.6です よろしくお願いいたします
87 :
86 :05/01/22 18:55:20 ID:???
という意味じゃなさそうだな
88 :
86 :05/01/22 18:57:32 ID:???
TOTALCOUNT=COUNT+X でいいのか? このとき、COUNTはXになる前の値。
89 :
85 :05/01/22 19:09:02 ID:???
>>88 はい、そうです
試しに下のSQLを投げたら怒られました
UPDATE RECORD SET COUNT = 10,
TOTALCOUNT = (SELECT TotalCount FROM Record Where primary_key = '0001')+10
WHERE PRIMARY_KEY = '0001'
Oracleでは確か出来たはずですが・・・
90 :
86 :05/01/22 20:46:45 ID:???
>>89 いや、単純に、
UPDATE RECODE SET COUNT=10 , TOTALCOUNT=COUNT+10 WHERE...
じゃだめなんかと。
全くの初心者で恐縮ですが、 number型の長さが10,0ってどういう意味ですか?
有効桁数が全体で10桁で、小数点以下は0桁
93 :
91 :05/01/24 13:52:49 ID:???
94 :
92 :05/01/24 15:31:29 ID:jIzajTks
>>72 ってMySQL4.0系では出来ないんですかね?
副問い合わせを使わないでSQL文は書けないんですかね?
んあ? 92は俺だ
出勤と退勤を管理する仕組みを考えているのですが うまいSQLが書けずに困っております。 お知恵を拝借できないでしょうか? 1.userテーブル uid ユーザのユニークID 以下ユーザ情報 2.timeテーブル uid ユーザ情報 date 日付 stime 出勤時間 etime 退勤時間 1.2のテーブルから、A日のユーザの出退勤情報を取得したいのですが、 その際にA日に出勤していないユーザの情報も取得したいと考えています。 先ほどouter joinしたものにwhereで is null かつA日であるもので抽出しても 以前に一度でも出退勤情報があるユーザが抜けてしまいorz... cronであらかじめ当日分のデータをインサートするのは避けたいので SQLのみで対応できないでしょうか?
>>96 1のUID(+)=2のUIDで結合じゃないの?
こんなじゃ駄目なんかな SELECT user.name, tm.date, tm.stime, tm.etime FROM user LEFT JOIN (SELECT * FROM [time] WHERE date=A日) AS tm ON user.uid = tm.uid WHERE tm.date Is Null
99 :
NAME IS NULL :05/01/25 18:25:51 ID:mUHU+OzD
売り上げデータ内客先コード 客先マスタ uri-customer mr-customer mr-attribute 123 123 red apple 234 234 red strawberry 567 567 red apple この場合、mr-attributeの5桁目からの文字を参照してappleだけの売り上げデータを select文一発でもってくることできる?
100 :
NAME IS NULL :05/01/25 19:01:58 ID:EnOMoXiA
できる
101 :
NAME IS NULL :05/01/25 20:59:30 ID:v05ch7R9
社員表で(社員番号,氏名,所属)とか 商品表で(商品コード,商品名,単価)とかやってて 所属や単価が変わる時って、 社員番号や商品コードを参照している場合、 過去のデータ(例えば単価*受注数など)を参照しようとすると 登録された当時の正しいデータにならないと思うけど、 こういう場合って、どうするの? SQLで解決できる?テーブル設計で対応しないとだめなのかな?
テーブル設計
103 :
96 :05/01/25 21:26:14 ID:???
ありがとうございます。 98さんのSQLで行けると思ったのですが どうもMySQL4.0なのでサブクエリができないとのエラーが でてだめでした。 でも使えそうなSQLなのでしっかり覚えておきます。
104 :
NAME IS NULL :05/01/26 11:37:07 ID:g/kUoujd
substring
>>101 そういう場合は受注テーブルに単価をコピーするか、単価の履歴テーブル
を持つ、といった対応をする。どちらがいいかはケースバイケース。
>>106 ですね。
基本的な仕様に合わせて選択するのが良いかと。
(マスターなどが間違っていても)その時点での単価というのを記録する必要がある
=履歴生成時点のデータが絶対の場合は前者、
あとの処理で過去のデータをその時点の情報で生成しなければならないのであれは後者。
だと思う。
108 :
NAME IS NULL :05/01/27 15:53:15 ID:kk66tqqq
SQLテクニックの底上げも兼ねて かんなり勉強させてもらってます。 name(text) 1,山田 1,山本 1,山下 2,小森 2,小林 というテーブルのデータを 1,山田 山本 山下 2,小森 小林 として取得するSQLは書けないでしょうか?
ORACLEとかなら、Noに対する名称を全て連結するストアドファンクションを作成して逃げる SELECT No, Func(No) FROM Hoge
110 :
108 :05/01/27 16:30:08 ID:kk66tqqq
すいません、環境書いていませんでした。 access2000です。 普通に作る場面ならストアドプロシージャに逃げるのですが あまりプログラムでがんばりたくない場面なので、 SQLでの対応を模索中です。汎用SQLじゃ無理かな?
無理
Oracle 8i を HP-UXで使用しています。 SELECT DISTINCT TO_CHAR(rownum,'00')||':'||AAA FROM ZZZ WHERE BBB = '2' ORDER BY AAA; を実行すると ORDER BY AAA でエラーとなってしまいます。。 ORDER BY を外すとうまくいくのですが どうにかしてORDER BY したいのです。。 どなたか御教授お願い致します
>>113 rownum あるなら、 distinct はいらんのじゃ?
115 :
NAME IS NULL :05/01/28 09:43:03 ID:kFFslgY7
select文where句で属性の違うパラメータを比較するにはどうすればよいでせうか?
>>115 まず日本語の勉強を・・・・。
それで判るのはえすぱあですよ。
>>113 どういうエラーが出ますか?
>>115 おそらくデータ型の異なるフィールドでの比較ではないかと思うのですが、
だとするとどちらかの型に合わせて変換する必要があるでしょう。
>>116 もし合ってたら、えすぱあに認定してください:-)
118 :
NAME IS NULL :05/01/28 11:25:50 ID:kFFslgY7
>>117 あなたはえすぱあです。m(__)m
型にあわせて変換 はどうすればよいのでしょうか?DB2なんですが、いまひとつ方法がみあたりません。
DBをJOINしているのですが、それぞれのキー項目が片方は文字、片方が数字なんです。(T.T)
MySQL4で以下の文が実行できませんでした alter table tasks add column task_insert_timestamp set default 'now()'; どこがちがうのでしょうか・・・以下ログ。。。 mysql> use hogehoge; Database changed mysql> alter table tasks add column task_insert_timestamp set default 'now()'; ERROR 1064: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right s yntax to use near 'default 'now()'' at line 1 mysql>
型は
>>120 MySQLは使っていないのだけど、now()のところはシングルクォートて括らなくてもいいんじゃないかな?
TIMESTAMPを返す関数としてじゃなくて、文字列として認識されていそう。
もしくは CURRENT_TIMESTAMP に置き換えてみるとか。
123 :
120 :05/01/28 18:09:20 ID:???
すいません。列名のあとに型名いれてなかったとですorz
>>113 仕様か不具合かわかりませんがLinux版10gでもORA-1791だっけ?になりますね。
副問い合わせでdistinctとorder byを分けてしまいましょう。
SELECT TO_CHAR(rownum, '00') || ':' || AAA
FROM
(SELECT DISTINCT
AAA FROM ZZZ
WHERE BBB = '2')
ORDER BY AAA
125 :
NAME IS NULL :05/01/30 04:36:50 ID:fBh0ligt
postgresql7.3でやっております。 たとえば以下のようなデータがありまして id | date | 01|2005-01-25 00:00:00| 02|2005-01-23 00:12:00| 03|2005-01-23 00:10:00| 04|2005-01-23 00:00:00| 05|2005-01-22 00:01:00| 06|2005-01-22 00:00:00| 07|2005-01-21 00:00:00| というデータがあるとしまして、日付によっては複数のデータが 入っている場合もあります。 「データのない日を除いた最新の3日分のデータを抽出したい」場合は、 どのようにselect文を書けばいいのでしょうか? このデータの例の場合は「25日」「23日」「22日」の、idが「01」から「06」を すべて抽出したいです。 分かる方がいましたら、ご教授のほど、よろしくお願いいたします。
俺はめんどくさいことしたくないので先に三日分の日付を抜き出す。
>>125 SELECT * FROM Table WHERE
DATE_TRUNC('day',date) IN (SELECT DISTINCT DATE_TRUNC('day' ,date)AS dt FROM Table ORDER BY dt DESC LIMIT 3);
サブクエリにLIMITを使っているあたりがインチキくせー。
>>126 にかぶったな。
128 :
125 :05/01/30 13:27:53 ID:???
>>126 ,127
解決しました。
date_trunc()なんていう関数があったんですね。
丁寧に教えてだき、ありがとうございました。
129 :
NAME IS NULL :05/01/30 20:23:33 ID:vtcQy9L2
すいません、mysql4なのですが、 ある1行(where user= 'hoge'でslectできる)と全く同じ内容で user= 'hage'でinsertにするにはどうすればいいでしょうか
それじゃ、「全く同じ内容」では無いのでは?
>>129 何をしたいかよくわからないが、ひょっとして、
INSERT INTO Table1 SELECT * FROM Table2 WHERE user='hoge';
ってことなんだろうか?
複雑怪奇なSQLを見たいのですが、どこに行けば見れますか?
133 :
NAME IS NULL :05/01/31 03:55:57 ID:J/9Z5Xf2
MySQL4.0です。 tasksというテーブルのtask_insert_timestamp列のデフォルト値を、 >alter table tasks alter task_insert_timestamp set default 'now'; と変更しようとしたところ >Query OK, 579 rows affected (0.11 sec) >Records: 579 Duplicates: 0 Warnings: 0 と出て、 >desc tasks; >+-----------------------+----------------+------+-----+----------------+----------------+ >| Field | Type | Null | Key | Default | Extra | >+-----------------------+----------------+------+-----+----------------+----------------+ >| task_id | int(11) | | PRI | NULL | auto_increment | >| task_insert_timestamp | timestamp(14) | YES | | 00000000000000 | | >+-----------------------+----------------+------+-----+----------------+----------------+ のように、デフォルトの値が変わらないのですが、 どこがまちがっているのでしょうか?
・デフォルト値は定数でなければならない
SQL Server 2000 です。 TBL_A.CODE と TBL_B.CODE を LEFT OUTER JOIN しています。 この時 TBL_A に存在するコードで TBL_B.CODE は <NULL> と表示されています。 この TBL_B.CODE が NULL の場合は FALSE を、NULL でない場合(値がある場合) は TRUE を返す SQL 文を作成しようとして、 SELECT TBL_A.CODE, TBL_B.CODE CASE TBL_B.CODE WHEN NULL THEN 'FALSE' ELSE 'TRUE' FROM TBL_A LEFT OUTER JOIN TBL_B.CODE ON TBL_A.CODE = TBL_B.CODE と書きましたが、CASE の結果が必ず TRUE でかえってきます。 何がいけないのでしょうか? アドバイスお願いします。
>>136 NULLはイコール比較できないというのは基本ですよ。
CASE文はイコール比較でしょ。
なので、SQLServerは詳しくないんだが、IsNullか何かでチェックじゃないのか?
>>136 value = NULLだとNULLかどうかを判定できないのと同じことかと。
value IS NULLでなければダメ。isnull関数を使ってもいいかも。
被っちまった。スマン。
140 :
136 :05/01/31 16:08:35 ID:???
ありがとうございます。 そういう事でしたか…。 ならば、という事で、 CASE (TBL_B.CODE IS NULL) WHEN ... と書いてみましたが、これでも駄目でした orz. isnull 関数を勉強してみます。
>>140 CASEの別の構文で
CASE
WHEN TBL.CODE IS NULL THEN 'FALSE'
ELSE ’TRUE'
でいけると思う。SQL鯖で可能かどうかは知らんが。
マルチすみません。 ORACLE8にてトリガーステートメント中に、トリガー発動の契機となったSQLを発行した プログラムの名前と、そのSQL文を取得したいのですが、 どのように記述すればよいのでしょうか? 宜しくお願いします。
143 :
NAME IS NULL :05/02/06 10:35:46 ID:cvTuVKEo
postgres7.4.6なんですが、 データベースdice、テーブル名、favorite、列、update_timestamp に対して、 updateをかけるとき、 特に「update_timestamp」に指定がなければ、つまりデフォルト値を、 updateしたときの日時にしたいのですが、どうかけばいいのでしょうか? 以下のようにやったら、default 値に、create tableした日時がdefault値に なってしまいました。 どうぞどなたか、よろしくお願いします。 create table favorite( favorite_id serial PRIMARY KEY not null, url varchar(200) not null, title varchar(200) not null, memo text, insert_timestamp timestamp with time zone not null default 'now()', update_timestamp timestamp with time zone not null default 'now()', delete_timestamp timestamp with time zone );
>>143 insert_timestamp timestamp
with time zone not null default CUREENT_TIMESTAMP
でいるとおもわれ
145 :
143 :05/02/06 11:32:12 ID:???
>>144 どもです。
でも、
ERROR: column "cureent_timestamp" does not exist
と言われてしまいました。なんでだろう。。。
ちと自分でも調べてみますが、
おわかりでしたら教えていただければ幸いです
147 :
143 :05/02/06 13:21:30 ID:???
>>146 いえいえ、ありがとうございます。
無事いきました!
どうもです
148 :
NAME IS NULL :05/02/07 19:53:35 ID:lCd+U9DO
ロックについてお知恵を拝借できませんでしょうか。 (環境は oracle9iR2 です) create table t ( id number primary key, category number not null ); というテーブルがあって、 複数のプロセスが非同期に行を insert していくんですが、 category 毎に、行数が n の倍数になったことを 検地したいと思っています。 select * from t where category = 値 for update; という形でロックして insert して select count(*) ... すればいいのかと思ったんですが、 該当する行が1つもない場合には ロックがかからないようでした。 お助けを。
SQLによるアクセス手順ってどうゆうこと なんでしょうか?
150 :
NAME IS NULL :05/02/07 23:12:36 ID:nzLj4lY6
本を見ても簡単な例しかなく、SELECT文の原理が良く分かりません。SELECT文を勉強するための良いソースがあったら、教えてちょ。
>>148 insertに対して
for updateしてもダメです。(だってfor updateなんだもん)
明示的にテーブルをlockしましょう。
どのモードが良いかはよくわからん。
postgres7です、freebsd5.2です。 で、質問なのですが、 シーケンスpublic.favorite_favorite_id_seq のlast_valueが、 いつのまにか、本来の値より小さくなってしまいます。 これを正常にするにはどうすればいいのでしょう? (updateかけてもだめだったです) 以上、よろしくお願いいたします。
153 :
152 :05/02/09 19:51:24 ID:???
ちなみにそのときのsql文は update sequence favorite_group_favorite_group_id_seq(last_value) values(16); です
>>153 SELECT setval('favorite_group_favorite_group_id_seq', 16);
155 :
152 :05/02/09 21:23:47 ID:???
156 :
148 :05/02/10 03:51:56 ID:???
>151 やっぱりそうなんだ、ありがトン。 せめてcategory毎に並列作業がしたいので 苦肉の策として create table l ( category number primary key ); ってのを作って こっちに対して select category from l for update; をするようにしてみようと思います。
157 :
NAME IS NULL :05/02/10 15:46:14 ID:45NFvvXi
UPDATEでの質問です。 Aテーブル Key 数値A 数値B 文字A というテーブルがもともとあり、 Bテーブル Key 数値A 数値B というテーブルが追加されました。 このとき、BテーブルのKeyとAテーブルのKeyが一致するレコードの B.数値A→A.数値A へ更新したいのです。 UPDATE B JOIN A ON B.Key = A.Key SET A.数値A = B.数値A とやっているのですが、うまく逝きません ご教授願えませんでしょうか?
・DBは何か ・うまく逝かないとは何か
>>158 DB:Oracle
うまく逝かない:SETがありませんとかなんとか
普通に数件のデータを拾うSELECT文で、 WHEREを使わずに一件目のデータのみを抽出する方法はありませんでしょうか?
ORDER等をかけずに、 SELECT * FROM TABLE 等と書いた時に出てくる一件目です。 データが入力された順になるのかな?
>>157 ACCESSのクエリをそのままOracleに持っていこうとしている感じですな
>>162 入力順とかは保証されません。whereを使わないとで一件だけというのは無理。
取り出された行を他の言語で処理する必要があるでしょう。
>164 うーん、そうですか・・・どうもです。 では、ORDER BY等をかけて、その一番最初の項目とかでも駄目でしょうか?
>>165 ORDER BYで順番を決めたとしてもその一番目の一件だけというのは
where句や他の言語で処理して限定する必要があると思います。
DBによってはTOPだのLIMITだのの指定でいけるだしょ。
汎用ならカーソルか?
>>157 UPDATE A SET A.数値A =
(SELECT B.数値A FROM B WHERE B.Key = A.Key)
じゃなかったっけ
UPDATE A SET A.数値A = B.数値A FROM A JOIN B ON B.Key = A.Key って書けるDBMSもあるよ
171 :
NAME IS NULL :05/02/13 05:43:25 ID:Qt77sidg
A,B,C,Dという列があります。 Bの種類毎に最大のAの行を全て持ってくるSQLは、 どう書きましょう?
>>171 SELECT * FROM Table WHERE (A,B) IN (SELECT max(A),B FROM Table GROUP BY B);
173 :
NAME IS NULL :05/02/13 12:46:37 ID:NndmN5hG
>>171 select * from Table T where not exists ( select * from Table where B=T.B and A>T.A )
うまく最適化できない場合も多いのでIN(サブクエリ)は使わないのがふつー。
2つの結合したテーブルを insert文で挿入したいのだが 文がなんか上手くいかねぇ 教えて、エロイ使徒!
175 :
T.O :05/02/14 18:20:50 ID:RwPSRDsG
はじめまして。駆け出しプログラマです。 ご教授頂けたら、幸いです。 特定の時間から時間まで検索するSQLってどう書けば良いのでしょうか? (例:2005/02/14 12:00〜2005/02/15 12:00まで) 日付の範囲指定だけなら分かるのですが、時間の指定が分かりません。 (日付指定:select * from emp where hiredate >= '2005/02/14' and hiredate <= '2005/02/15') 仕事で日付関連のSQLを使う機会が多いので、投稿しました。(ご返信は少し遅れるかもしれません) −−−−−−−−−−−−−−−−−−−−−−−−−−−− SQL> desc emp 名前 NULL? 型 ---------------------------------------------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) −−−−−−−−−−−−−−−−−−−−−−−−−−−−
176 :
T.O :05/02/14 18:21:52 ID:RwPSRDsG
DB板の書き込みから移動しました。
ネタでも釣りでもなく真面目な質問です。 DBソフトはFMしか使ったことないサルですが、 SQLとは一体何なんですか? 言語の一つですか? MySQLやSQLServer、Oracleとかいろいろありますが、 これらの違いって何ですか? 簡単に教えてください。
178 :
ふふだ :05/02/14 20:47:51 ID:OXsxBjgz
同じ値のレコードだけをSELECTするクエリというのはありますか? DISTINCT の逆のような。 たとえば、 | x | y | id | ---------------------------------- | 9 | 3 | 1 | ---------------------------------- | 10 | 2 | 2 | ---------------------------------- | 11 | 1 | 3 | ---------------------------------- | 12 | 5 | 4 | ---------------------------------- | 14 | 5 | 5 | ---------------------------------- | 15 | 3 | 6 | ---------------------------------- | 15 | 4 | 7 | ---------------------------------- から、 ---------------------------------- | 12 | 5 | 4 | ---------------------------------- | 14 | 5 | 5 | ---------------------------------- | 15 | 3 | 6 | ---------------------------------- | 15 | 4 | 7 | ---------------------------------- を抽出することです。
>>175 oracleだったらto_date関数で日付の書式を指定するといいと思います。
to_date('2005/02/14 12:00', 'YYYY/MM/DD HH24:MI')
こんな感じ?
180 :
T.O :05/02/14 21:48:29 ID:AQy8vXib
>>179 おお!!回答頂いて有難うございます。感動です。では、
select * from emp where hiredate >= to_date('2005/02/14 12:00', 'YYYY/MM/DD HH24:MI') and hiredate <= to_date('2005/02/15 12:00', 'YYYY/MM/DD HH24:MI')
とすれば、良いのですかね?両方DATE型ですし。
(理由あって今すぐテストは出来ないのですが・・・)。
とはいえ、教えて頂いた事で、これからのSQLプログラミングで少し楽が出来そうです。
他にも調べていて、両方char型にして、数字での比較を行う手法もあるかなと思いました。
有難う御座いました。
>>180 範囲指定するならbetweenを使う方が一般的かも。
select * from emp
where hiredate between to_date('2005/02/14 12:00', 'YYYY/MM/DD HH24:MI')
and to_date('2005/02/15 12:00', 'YYYY/MM/DD HH24:MI')
182 :
T.O :05/02/14 22:03:09 ID:AQy8vXib
>>181 補足してくださって有難うございます。
なるほど〜。こちらの方が綺麗ですね。
大変参考になります。有難う御座います。
(P.S 当たり前だけど、
日付関連のSQLは日付('2005/02/14 12:00')そのもので
google検索しても引っ掛かりませんでした・・・。
こういった、一般的な用法を覚えるのは、
経験とOracleMasterの教本なのかなぁ・・・。
私の持っていた教本には載っていないし。)
>>178 これを他のフィールドの分も書いてunionでくっつけてみたらどう?
select * from table
where x in (select x from table group by x having count(*) > 1)
>>177 >SQLとは一体何なんですか?
SQL:Structured Query Language
IBM社が開発したデータベース操作用言語。
リレーショナルデータベースの操作に使用する。
アメリカ規格協会(ANSI)やJISで標準化されている世界標準規格
の言語です。
ttp://e-words.jp/w/SQL.html >MySQLやSQLServer、Oracleとかいろいろありますが、
SQL自体は規格化されているけれども、製品として特色を出すために、微妙に色付けをして
いるので、たとえば
MySQL:ライセンス価格が安価(商用でない限りフリー)
SQLServer:Oracleに匹敵する高機能高信頼性でありながら、扱いやすいインターフェースを持つ
Oracle:信頼性では右に出るものがない(とは言い切れないかも・・・)
などの違いがあります。
データを取り出すSQL文は規格内ではほとんど同じですが、製品によっては独自の関数や構文を
もっていて、よりユーザーの要望に答えやすくしたものがあります。
FMは開発環境を含んだ統合的なものなので、エンドユーザー向けのUIを持たず、純粋にDB設計と保守のみを目的と
した上記のような製品を扱おうとすると、最初はどこから手をつけたらよいかわからないと思いますが、
MySQLあたりをダウンロードしてみて、書籍とにらめっこしながらやってみてはどうでしょう。
185 :
NAME IS NULL :05/02/15 00:52:52 ID:+sDpnfE+
こんにちわ。 どなたか教えてください。 MYSQLなのですがautoincrementする主キーがあり、 そのキーが次にいくつの値を挿入するか知るにはどうすればいいでしょう? たとえばいま20までカウントがすすんで全部、消去します。 すると次は21からなのですが、この値はどのように取得すればいいでしょうか?
>>178 (9,3,1)は抽出しなくてもいいの?
もし含めるなら、
select * from テーブル T
where exists ( select * from テーブル where x = T.x )
or exists ( select * from テーブル where y = T.y )
>>185 まずinsertしろ。
話はそれからだ。
188 :
NAME IS NULL :05/02/15 03:35:56 ID:+sDpnfE+
185です。 >> 187 それはわかるのだが、たとえばリレーションしていたとして、 次の挿入IDをinsert前に知りたいのですよ。
リレーションだろうがなんだろうがinsert後にわかれば十分だろ。
190 :
177 :05/02/15 18:01:26 ID:???
>>184 様
回答ありがとうございます。
ある程度SQLについて理解ができました。
重ねて質問で申し訳ないのですが、
世の中にはいろいろな言語があると思うのですが、
SQLを選択する価値等をご教授いただけますでしょうか。
よろしくお願いいたします。
>>190 価値っていうか、SQLを使いたくてDBを使うやつはあまりいないと思う。
ふつうはDBを使うためにSQLが必要になるのでは。
>>190 >191に同意。SQLは目的じゃなくて手段だということ。
それをふまえてあえて言うならば、現在データを設計、抽出、管理する方法が
SQLが最も普及していること、情報量/サンプルが多いこと(=不明点の解決、トラブルシューティング
が比較的容易なこと)、SQLの基礎を押さえておけば、ある製品から別の製品に移ったときに
応用が利くことがあると思います。
たとえばSQLを一切扱えないRDBMSを扱っている場合、その製品をしきりに持ち上げている人がいるけれども、
結局情報量が足りなかったり、他のRDBMSを扱う段階になったときにスキルがほとんど役に立たずに結局苦労しています。
だけど、MySQL、Oracle、MSSQLなどを扱ったときには、基礎的なSQL文に加え、その製品独自の
機能を覚えなければならないし(これは負担はそう大きくないと思う)、それとは別にクライアントのUI
(Java, HTML, VB, C#, Delphiなど)を構成するための言語を別に覚えなければならないということもある。
FMだけで完結しないから。
これはこれでとても楽しいけどね。
>>190 頭でっかちにならずに、適当な環境を作って試せば?
SQL以外のデータ操作ってオブジェクトマッピングとか、昔ならカード型DBとかの操作かな?
そういう選択肢を調べて自分でメリット感じないと、他人に聞いても理解できないよ。
194 :
Oracleの質問です :05/02/15 21:58:38 ID:fRJPeq19
いつもお世話になっております。 当方かなりの初心者です。 質問なのですが、 SQLPLUSにて、テーブル定義の表示はDESCコマンドにて行いますが、 カラムのDefaultは表示されません。 すでに定義済みのDefault値を出力するにはどのようにしたら よいのでしょうか? 宜しくお願いします。
a
>>194 USER_xxx テーブルか ALL_xxx テーブルにあるんじゃないの?
マニュアル参照。
197 :
NAME IS NULL :05/02/16 12:05:59 ID:XuM2Opcf
今朝しらべたらUSER_TABLE_COLUMNSにありました。回答ありがとうございました。
198 :
NAME IS NULL :05/02/16 17:48:53 ID:/Ox5p2pE
DB=ORACLE10g で次のようなこと出来ますか? 会社名1,会社名2,会社名3,売上げ のフィールドがあるとき、 同じ会社名の売上合計を出す。 会社名1,2,3には、全てに値が入っている場合も有れば、どれかにだけしか値が入っていない場合も有る。 よろしくお願いします。
>>198 アイデアだけ、あってるかは知らん。
SELECT 会社、SUM(売り上げ)
FROM
(
SELECT 会社1、売り上げ FROM テーブル
UNION
SELECT 会社2、売り上げ FROM テーブル
UNION
SELECT 会社3、売り上げ FROM テーブル
)
重複の省き方は考えてください。
200 :
NAME IS NULL :05/02/16 18:17:32 ID:XuM2Opcf
OTZ
○|\ ○| ̄ヒ|_
202 :
NAME IS NULL :05/02/16 18:45:37 ID:/Ox5p2pE
>>199 有難うございました。 何とかできそうです。
SELECT 会社1 AS 会社, の様に指定するんですよね。
>>192 ある意味それは正しいと思うが、SQLってどうも設計がぼろい
ような気がして好きになれない... DBMS使いたいからしょうが
なく使ってるけどもっとましなの作ってって感じだな。
>>203 まあしかし、ある程度の規模とか信頼性を求められるとAccessやFM, 4Dなどを使うわけには行かない
こともまた事実なんだよな。
205 :
NAME IS NULL :05/02/17 20:17:30 ID:/WFLyCYA
大量のデータのなかから一定期間ごとにサンプリングしたいのですが、 SQLだけでできるものでしょうか。 たとえば以下のようなデータから 1 時間ごとに抜き出したい (10, 30, 40が欲しい) のです。 2005/2/17 00:00, 10 2005/2/17 00:30, 20 2005/2/17 01:00, 30 2005/2/17 01:30, 20 2005/2/17 02:00, 40
そのパターンなら、分の部分が0のもんだけ取り出せばいいじゃん
207 :
NAME IS NULL :05/02/17 21:38:51 ID:/WFLyCYA
>>206 すいません例が悪かったです。
このパターンならそうなんですけど実際には時間はバラバラなんです。
んじゃあ、その場合の「一時間ごと」の定義は何なのよ。
あるカラムの値を、おのおの同じレコードの別のカラムにコピーしたい、 つまり a | b ---+---- 1 | 2 | 3 | となっているのを、 a | b ---+---- 1 | 1 2 | 2 3 | 3 としたいのですが、a の定義が int, b の定義が varchar になっています。 このような場合、何かうまい方法はありませんでしょうか? 実は、b の値は a と必ずしも同一にする必要はなく、b の中で一意で あれば OK (例えば重複しないランダム文字列)と言う状態ですので、 そちらの方法でも構いません。 質問の仕方等、まずかったらご指摘下されば幸いです。
型変換してSETすればいいじゃん
>>210 ありがとうございます。型変換…の記述方法が分からないでいます_| ̄|○<スミマセン
SQL Server だと CONVERT(type, value) と言うそのままのものがあったのですが...
UPDATE table AS foo SET b = 型変換(varchar, foo.a) のような感じなのでしょうか。
UPDATE table AS foo SET b = foo.a ですと型に互換性が無いと言って怒られました。
使っている DB は DB2 Lite です。
212 :
NAME IS NULL :05/02/18 00:03:26 ID:MOXel1Bc
UPDATE table SET b = CAST(a as varchar(10)) みたいには書けんのかな?
213 :
205 :05/02/18 00:25:13 ID:???
>>208 たびたびすいません。
xx:00〜xx:59 までをひとつの単位として、その区間の中で一番小さいもの
を抜きだす必要があります。以下の例だと 10, 50, 60 です。。
2005/2/17 00:00, 10
2005/2/17 00:30, 30
2005/2/17 00:59, 40
2005/2/17 01:59, 50
2005/2/17 02:00, 60
「時」までの部分でグループ化し、各グループで分が最小の物を
215 :
205 :05/02/18 00:37:35 ID:???
>>214 なるほど。そうやればいいのですね。
ってSQLぜんぜん分からないっす・・・orz
勉強してきます。
SQL以前にロジックの部分で、商と余りを上手く使って考えれば? それをあとはSQLにするだけ。
VARCHARで入っている各値の末尾に文字を付け加えたいのですが、
値を取って、付け加えて、格納すると言ったことは可能でしょうか?
>>209 をパクらせてもらうと
a | b
----+------
1 | foo
2 | bar
を
a | b
----+------
1 | foo$
2 | bar$
と言った感じなのですが...
可能。
UPDATE テーブル SET B = B || '$'
220 :
209 :05/02/18 16:17:22 ID:???
>>212 ありがとうございます。CAST は認識してくれましたが、
BIGINT->VARCHAR のキャストをサポートしない、となりました...
ここからは DBMS に依るってことなんですかね。
221 :
209 :05/02/18 16:24:45 ID:???
ランダム文字列が入れば良かったので取り敢えずDB2の機能を使って これで回避しました... UPDATE table SET b = (generate_unique() as varchar(10)) ありがとうございました。
222 :
209 :05/02/18 16:26:44 ID:???
失礼。 UPDATE table SET b = CAST(generate_unique() as varchar(10)) でした。蛇足ですが…
223 :
NAME IS NULL :05/02/20 08:13:18 ID:AMw9tC3J
SQL Server 2000です。次のようなテーブルがあります。 KEY1(PK&FK), KEY2(PK), KEY3(PK), DATA で、KEY1ごとに最後のレコード(KEY2 desc, KEY3 descでソートした最初のレコード)を抽出したいのですが、 やはりストアドしかないのでしょうか? select A.KEY1, B.KEY2, B.KEY3 from MASTER A(FK元), ( select TOP 1 KEY2, KEY3 from TABLE where TABLE.KEY1 = A.KEY1 order by KEY2 desc, KEY3 desc) B ……なんて風に書けたらいいなぁ、とか思っていたのですが、甘かったようですorz
>223 普通にグループ化してやればいいんじゃないのか? SELECT KEY1,MAX(KEY2),MAX(KEY3) FROM TABLE GROUP BY KEY1
あ、KEY2とKEY3はそれぞれじゃなくて、纏めた形にしないと駄目なのかな? だったらこうか。 SELECT KEY1,KEY2,KEY3 FROM TABLE WHERE (KEY1,KEY2 || KEY3) IN ( SELECT KEY1,MAX(KEY2 || KEY3) FROM TABEL GROUP BY KEY1 )
226 :
223 :05/02/20 09:37:35 ID:AMw9tC3J
……ごめんなさい、「||」って文法、SQL Serverじゃ通らないみたいです(T_T) >あ、KEY2とKEY3はそれぞれじゃなくて、纏めた形にしないと駄目なのかな? はそのとおりです。 KEY1|KEY2|KEY3 ----+----+---- 1| 1| 1 ----+----+---- 1| 2| 3 ----+----+---- 2| 1| 2 ってデータがあったら 1,2,3 2,1,2 ってレコードを返したいんです
227 :
223 :05/02/20 09:38:48 ID:???
あう、ずれてる(T_T)>表 あとageてしまってごめんなさい
うーん、「||」は単に文字列を結合してるだけだから、それに対応する文法を使えばいけると思います。「&」とかになるのかな? えーっと、確認すると、 1,1,3 1,2,1 っていうデータがあったら、 1,2,1 を返したいって事ですよね?
229 :
223 :05/02/20 10:29:06 ID:???
>>228 ですです。
なるほど、文字列連結ですね。もし&でもだめだったら関数探してみます
230 :
223 :05/02/20 11:07:13 ID:???
>>229 イケました。inで複数指定が出来ないのとNullだった場合も考慮して
SELECT A.KEY1,A.KEY2,A.KEY3
FROM TABLE A
WHERE (isNull(KEY2, '') + isNull(KEY3, '')) IN
(SELECT isNull(KEY2, '') + isNull(KEY3, ''))
FROM TABEL
WHERE KEY1=A.KEY1
GROUP BY KEY1)
で、どうやらOKのようです。これからテストデータを作って検証してみます。
ありがとうございました
>>230 最大の(KEY2,KEY3)を持ってくる条件が抜けてるが良いのか?
念のためだけど、
>>225 のmax(key2||key3)というのは使わんほうが良い。
もしkey2が可変長文字列や整数値だった場合、間違ったレコードを
取得する可能性がある。
(A,AA)
(B,AA)
(B,DB) <- 誤
(BC,BA)
(BD,AC) <- 正
その他にも、文字列連結を使った場合は通常indexが使われないなど
問題があるので、初心者はあまりtrickyな方法を使わず正攻法を
覚えるべき。
select A.key1, A.key2, A.key3
from テーブル A
where not exists (
select * from テーブル
where key1 = A.key1
and (
( key2 > A.key2 )
or ( key2 = A.key2 and key3 > A.key3 )
)
)
232 :
223 :05/02/20 16:25:21 ID:???
>>230 existsキーワードですか。まだまだ学ぶべきことは多そうですね。
えと
existsキーワード:サブクエリの条件を満たすレコードがあったらtrue、なければfalse
で、「現在の行のKEY1と等しく、かつKEY2が大きいかまたはKEY2が等しくKEY3が大きい」という条件を満たすレコードが存在したらtrueになって、
先に「not」がついてるから反転してfalse、つまりKEY1の中で一番大きいKEY2+KEY3をもつレコードが抽出されるわけですね。
なるほど、ありがとうございました。非常に参考になりました。
233 :
NAME IS NULL :05/02/23 21:06:19 ID:vKYM6XDJ
SQL Loaderを使ってデータを取り込みたいのですが、 データ内にスペースがあった場合に0に置き換えたいです。 どのように制御文を記述するといいでしょうか。 TRANSLATEとか記述してみたのですが上手くLoaderが動いてくれませんでした。 どうかご教授ください。
234 :
233 :05/02/23 22:07:08 ID:vKYM6XDJ
自己解決した〜。 カラム名 "編集文" でした。 ダブルコーテーションがいるのか…。
すべてのテーブルにdelete from tabale_nameかtruncate table table_nameを かけたいのですが構文としてはどうなりますか? ちなみにDBはSybase11です。 よろしくお願いします
素朴な疑問なのですが、convert関数の数値→日付値の変換って、例えば convert(datetime,36357)だと1999-07-18になりますよね。 これって、内部ではどのような計算が行われてるのでしょうか? ご教授お願いいたします。
1900/01/01を基点とした日数じゃねーのか?
238 :
NAME IS NULL :05/02/24 14:33:01 ID:x9bV7eQL
質問させていただきます。 例えば下の様な2つのテーブルから、SELECT 文で 「『ある食堂(単・複)のうまいメニューが属するジャンル』が好物な人物」 を検索するにはどうすればいいでしょうか? ●「好物」テーブル +------+----------+ | 人物 | ジャンル | +------+----------+ | 太郎 | ごはん類 | | 次郎 | ごはん類 | | 三郎 | めんるい | | 四郎 | めんるい | | 五郎 | どんぶり | +------+----------+ ●「食堂」テーブル +----------+----------+--------+--------+--------+ | ジャンル | メニュー | A食堂 | B食堂 | C食堂 | +----------+----------+--------+--------+--------+ | ごはん類 | 玉子ご飯 | マズイ | マズイ | マズイ | | ごはん類 | お茶づけ | マズイ | マズイ | うまい | | ごはん類 | おむすび | マズイ | マズイ | うまい | | めんるい | ラーメン | うまい | マズイ | マズイ | | めんるい | タンメン | うまい | マズイ | マズイ | | めんるい | ソーメン | うまい | マズイ | うまい | | どんぶり | カツどん | マズイ | マズイ | マズイ | | どんぶり | テンどん | マズイ | うまい | マズイ | | どんぶり | 親子どん | マズイ | マズイ | マズイ | +----------+----------+--------+--------+--------+ 例えば「A食堂またはB食堂でうまいメニューが属するジャンル(めんるい&どんぶり)」が好きな人物 を検索して +------+ | 人物 | +------+ | 三郎 | | 四郎 | | 五郎 | +------+ という結果を得たいのです。 MySQL のバージョンは 4.0.23 です。 分かりにくくて申し訳ありませんが、よろしくお願いします。
おぉーほんとだ!datediffで計算したら仰る通りの結果が出ました。 お陰様でスッキリしました。ありがとうございました。
>>238 select distinct 人物 from 好物,食堂
where
好物.ジャンル=食堂.ジャンル
and
(A食堂='うまい' or B食堂='うまい')
階層構造をDBに持たせたい時はどういう風にテーブルデザインすればいいですか? 例えばカテゴリ、サブカテゴリ、サブサブカテゴリとかがある場合とか。
242 :
238 :05/02/24 15:43:19 ID:x9bV7eQL
>>240 上手くいきました!
ありがとうございます!!!
>>241 カテゴリマスタ コード、名称・・・
カテゴリ階層 親コード、子コード
問合せは階層問合せを使用するなり、プログラム側から再帰でおこなうなり。
244 :
NAME IS NULL :05/02/25 00:49:53 ID:i3qYxhAS
すみません、PostgreSQLのSQL構文についての質問なのですが・・・ 値と日付フィールドを持った数100件程度のレコードがあるとして、 日付の新しいものから100件だけを残して他を全て削除したいのです。 DELETE文でこのような指定は可能なのでしょうか? 試しに、 DELETE FROM hoge_table ORDER BY date DESC OFFSET 100; ・・・とかやってみたのですがダメでした。
delete from hoge_table where pKey not in (select pKey from hoge_table order by date desc limit 100); か delete from hoge_table where not exist (select pKey from hoge_table order by date desc limit 100); じゃだめか? 試したことないけど
>>245 試したことないけどそれは違うだろ。
それだと全デリのオカーソ。
素直にデータ連番もって削除か、一端情報を取ってから削除じゃだめなんか? または単純に一定期間保持にするとか。 件数で削除となると、1SQLで無理にやるぐらいなら一回削除点を取ったほうがいいと思うが。
248 :
246 :05/02/25 11:17:48 ID:???
スマソ。脊髄反射してますた。
>>245 の上はOKっぽい。下はダメだろうけど。
試して無いがなぁー。
249 :
244 :05/02/25 11:28:08 ID:???
レスありがとうございます。 >245さんの上のやり方を実験してみます。
MS-SQL2000で質問です。 あるテーブルにdatetime型で日付が入っているとします(便宜上2000/1/1とします)。 同じ行に何ヶ月後の何日というデータが、それぞれintegerで入っていたとします (便宜上、1ヶ月後の15日とします)。 1本のクエリで、それぞれのdatetime値を何ヶ月後の何日というように変換して 取得したいのですが、この場合はどうすればいいんでしょう。 上記の例ですと、2000/2/15というように日付を計算させた後に表示をしたいのです。 pg上でも可能ですが、サブクエリでも使いたいので・・・
251 :
250 :05/02/25 17:06:04 ID:???
調べてみますた フィールド名が日付→DateTime、何ヶ月後→MonthDiff、何日→MonthDiffとして、 Cast Year(DateTime) + "/" + Month(DateAdd(DateTime,mm,MonthDiff) + "/" + DateDiff As DateTime 文法あってるかどうかわかんないけど、こういうやり方しかないんですかねぇ
>>250 dt datetime
m int 何ヶ月後
d int 何日
SQL鯖で動くかどうか知らんが、特にキャスト演算子は書き換えが必要だろうな。
SELECT date_trunc('month' , dt)+m*'1 month'::interval+(d-1)*'1 day'::interval FROM Table;
253 :
250 :05/02/25 17:27:55 ID:???
>>252 ありがとう。
だけど、SQLには、そういう類の関数はないみたいですねぇ。
SQLって、日付関連の関数がすごい貧弱だ・・・
>>253 ちょっと解説すると
date_truncは切捨て関数なんで、date_trunc('month','2005-1-8')は'2005-1-1'というようにその月の初日になる。
m*'1 month' でmヵ月分のinterval型。
d*'1 day' はd日分のinterval型。2005-1-1+d日になるので予め1日分ひいている。
で、全て足せばお望みの結果になるかと。
date_truncの代替手段はあると思われるけどなぁ。
>>251 それだと年をまたいだ時におかしくならない?
>>252 ,254
SQLServerはDateTimeはあるけどintervalはない。
dateadd()とかdatediff()で頑張るしかない
256 :
NAME IS NULL :05/03/01 23:42:08 ID:6E4qrgjn
下記のようなことを行いたいのですが、もう数十時間悩んでおり、このままだとクビになります。 以下のようなテーブルが2つあります ■テーブルA 顧客ID なまえ 内線 ―――――――― 001、 佐藤、 001 ※同じ(これだけ残す) 002、 鈴木、 002 003、 田中、 003 004、 佐藤、 001 ※同じ(削除) 005、 佐藤、 004 006、 鈴木、 005 007、 佐藤、 001 ※同じ(削除) ■テーブルB 伝票ID 顧客ID 購入物 001、 001、 ガム ※対応する顧客は残る 002、 003、 チョコレート 003、 004、 塩 ※対応する顧客が残らない 004、 006、 ガム 005、 002、 塩 006、 007、 塩 ※対応する顧客が残らない テーブルAの佐藤4人中3人は、名前も内線も同じなので 顧客IDは一番小さいものだけ残し、あとは同一とみなし重複行を削除します。 そうするとテーブルBの伝票IDの001、003、006の顧客IDは全部が佐藤だったのですが 重複を削除してしまったため、003と006に対応する顧客がテーブルAから消えてしまいます。 なので、テーブルAの重複を削除するときに、同時にテーブルBの顧客IDも 一緒に一番小さい顧客IDに更新したいのです。 どうか宜しくお願いいたします。
update B set 顧客ID = sq.min_顧客ID from B inner join A on(B.顧客ID = A.顧客ID) inner join (select なまえ, 内線, min(顧客ID) as min_顧客ID from A group by なまえ, 内線) as sq on(A.なまえ=sq.なまえ and A.内線=sq.内線) delete A from A left join B on(A.顧客ID = B.顧客ID) where B.顧客ID is null
258 :
256 :05/03/02 06:52:59 ID:SXcU4gI8
>257 実施すると ORA-00933 SQLが正しく終了してません とかいうエラーがでまつ。 あとupdate文が複雑でよくわかりません SQLビギナー向けに教えてくだ祭
oracleでしたか・・・すみません。sqlserverしか手元にないです。 文自体はupdateとdeleteの2文です。 update文は 1. Aをなまえと内線で集約した際の最小顧客IDをサブクエリで取得 2. BとAを顧客IDで結合 3. 1.で取得した最小顧客IDでBを更新 delete文は間違えてました。 「Aをなまえと内線で集約して2件以上存在した場合のみ消す」 でないとだめのようです。 AにあるがBに使われてなかったレコード゙が消えてしまうからです。
260 :
258 :05/03/02 08:46:46 ID:om6OBkzg
>259 すいません、oracleです。 せっかくのアドバイスにけちをつけるようですいません。 >1. Aをなまえと内線で集約した際の最小顧客IDをサブクエリで取得 >2. BとAを顧客IDで結合 >3. 1.で取得した最小顧客IDでBを更新 考え方は分かるのですが、やはりピンときません。 テーブルA の削除だけなら分かるのですが、innner joinが良く分かりません。 innnerjoinってwhereで書き換えられませんでしたっけ? 馬鹿ですいません。
261 :
NAME IS NULL :05/03/02 11:32:16 ID:nPxajXBe
>260 削除文を修正しました。 1. Aをなまえと内線で集約して2件以上あったデータを最小顧客IDと共にサブクエリ取得 2. Aとサブクエリをなまえ、内線で結合 3. そのうちの最小顧客IDとはことなる顧客IDのデータを削除 delete A from A inner join (select なまえ, 内線, count(なまえ) as cnt_なまえ, min(顧客ID) as min_顧客ID from A group by なまえ, 内線 having count(なまえ) > 1) as sq on(A.なまえ=sq.なまえ and A.内線=sq.内線) where A.顧客ID <> sq.min_顧客ID >innnerjoinってwhereで書き換えられませんでしたっけ? はい。from A inner join B on(A.顧客ID=B.顧客ID)なら from A, B where A.顧客ID=B.顧客ID と同じです。 分かり辛くて申し訳ないです。 更新系の文は部品ごとにばらして不必要列も取得してみてみると分かりやすくなると思います。
不一致データの抽出を行うSQL文について質問です. 次に示す3つのテーブルがあるとします. 顧客テーブル 顧客ID,顧客名 1 ,Aさん 2 ,Bさん 3 ,Cさん 家具テーブル 家具ID,家具名 1 ,テレビ 2 ,洗濯機 3 ,たんす 顧客保持家具テーブル レコードID,顧客ID,家具ID 1 ,1 ,1 2 ,1 ,2 3 ,2 ,1 4 ,2 ,3 5 ,3 ,2 6 ,3 ,3 このとき,サブクエリとUNION句は使用せずに, 1回でたんすを持っていない顧客のIDを取得する SQL文作ることはできるのでしょうか.
>サブクエリとUNION句は使用せずに なぜ? select a.顧客ID from 顧客テーブル AS a left join (select 顧客ID from 顧客保持家具テーブル as b inner join 家具テーブル as c on (b.家具ID = c.家具ID) where 家具名 = 'たんす') as d on (a.顧客ID = d.顧客ID) where d.顧客ID is null
UNIONはともかくサブクエリが使えないときついな。 たんすを持ってる顧客を求めるのは簡単だから、not in か not exists あたりと組み合わせればできるのだが。 サブクエリの代わりにViewを使えってというのは反則?
EXCEPTとか
面倒なので結合はしてないけど、コレでどうだ。 select 顧客ID from 顧客保持家具テーブル group by 顧客ID having sum(case 家具ID when 3 then 1 else 0 end) = 0
>>267 たんす -> 3
の部分のクエリを省略しちゃいかんな
>>268 そこよりも顧客保持家具テーブルにレコードがない顧客の
扱いをつっこまれたらどうしようかと思ってましたよ。
UNIONは無しだけどEXCEPTはありっていうのが解答だったら
それはそれでなんか納得いかないですけどね。
>264 古い MySQL(サブクエリが使えない)だから、だったりして……
>>269 MSSQLだと家具IDがNULLでもelseに該当します。ほかの処理系は知りません。
だめな場合もCOALESCE(読み方がわからない)やらを組み合わせれば大丈夫かも。
サブクエリーを使わないでというのは納得できないんだが、 ↓のSQLでも実現できるかな? SELECT DISTINCT A.顧客ID FROM 顧客テーブル A WHERE NOT EXISTS (SELECT * FROM 顧客テーブル B WHERE 家具ID = 3 AND A.顧客ID = B.顧客ID)
273 :
272 :05/03/06 09:57:03 ID:???
顧客テーブルではなく家具テーブルだし・・・ 家具を1つも買ってない客は抽出されないじゃん orz 修正!!! ↓こうかな?? (;´Д`) SELECT DISTINCT A.顧客ID FROM 顧客テーブル A WHERE NOT EXISTS (SELECT * FROM 顧客保持家具テーブル B WHERE 家具ID = 3 AND A.顧客ID = B.顧客ID)
NOT EXISTS以下がサブクエリじゃんって突っ込みは無しですか?
275 :
272 :05/03/06 17:34:45 ID:???
>>274 無しです。
サブクエリーが無いSQLは、1のギアしか無いマニュアル車に乗っているようなもんですよ!!(# ゚Д゚)
はぁ?
267の完全版、やはりこの方法しか思いつかない。 select A.顧客ID from 顧客テーブル A left outer join 顧客保持家具テーブル B join 家具テーブル C on (B.家具ID = C.家具ID) on (A.顧客ID = B.顧客ID) group by A.顧客ID having sum(case C.家具名 when 'たんす' then 1 else 0 end) = 0
こんだけ、みんなが親身になって考えてくれてるのに、何の反応を示さない恩知らずな
>>263 がムカツクな。
社会常識を備えているのか?
279 :
263 :05/03/06 20:39:28 ID:???
お礼のレスが遅くなってしまって申し訳ありませんでした.
ご返答下さってどうもありがとうございました.
サブクエリを使わないで,というのは,
>>270 さんの仰るとおり,サブクエリを使えないDBを使用しているためです.
280 :
NAME IS NULL :05/03/07 19:33:59 ID:ozYIDLtO
こんなことできるんでしょか。 select AGE from table group by AGE てやると、 AGE ----- age1 age2 age3 て、AGE のレコードで重複しない部分だけ表示されると。 んでも、その表示されたレコードが何個あるかってわかる? select count(AGE) from table group by AGE てやると、 1 ---- 1 2 1 てなると。さらに、 select count(AGE) from table group by 1 てやると、 1 ---- 4 てなる。重複除いた AGE の数が "3" て出すSQL一発で打てるんでしょうか。
日本語を学んでから出直せ
SELECT COUNT(*) AS NUM FROM (SELECT DISTINCT AGE FROM table) AS COUNTTABLE これでだめですか?
283 :
名無しさん@そうだ選挙にいこう :05/03/07 23:01:36 ID:q3QYEE15
Access2000つかってます。 テーブルAのカラム1の先頭2桁をZZにするにはどうすればよいのでしょう? テーブルA カラム1 カラム2 X0100 aaa X0101 bbb X0102 ccc X0103 ddd ↓SQL実行後↓ テーブルA カラム1 カラム2 ZZ100 aaa ZZ101 bbb ZZ102 ccc ZZ103 ddd こんな感じです。関数を使えるのでしょうか?
mid()
>>280 select (distinct AGE) from ...
そんなことよりGROUP BY の使い方が気になる。こういう使い方ってできるの?
>group by 1
ORDER BY 1 も大丈夫。
287 :
280 :05/03/08 13:17:54 ID:uAPNkung
>>282 ナイスです(/・∀・)/
ありがとうです m(_ _)m
288 :
NAME IS NULL :05/03/08 14:21:24 ID:7EzAYhEF
サブクエリャー!
>>285 は select count(distinct AGE) でした。
>>286 select AGE from table group by 1 なら1列目でグルーピングだとわかるのだが
select count(AGE) from table group by 1 この場合の1列目はグルーピングで
集計した結果だからどうグループ化されるのか不思議に思ったのです。
結果は4だから何をいったいGROUP BYしたのか?
テーブルの制約を追加・削除するとき、alter table文で制約名を指定しますが、 表の作成時に列制約で指定した制約では制約名が指定されていません。 この場合、制約の追加や削除はどのように行うのでしょうか。 特に、not null制約の場合は列制約のみでしか指定できないので、 どのように削除すればよいのでしょうか。お願いします。
>>290 DBMS依存する可能性のある話はDBMSをきちんと書く。
で、削除って考えないで打ち消すような制約をかければいいんじゃないのか?
292 :
258 :05/03/09 16:24:45 ID:yL4n2lnv
以下のようなことを「SQL文のみ」で行いたいのですが、 どなたかご教授のほどお願い致します。 下記のような文字列があるとします。 aaa1bbb2ccc3ddd4 それを 1234 にしたいのです。 要するに数字だけを抜き出したいのですが できますでしょうか。 oracle9iです。
>>292 超無責任モードですが、正規表現でできないか?
REGEXP_REPLACEあたりで、数字以外を痴漢してしまう。
294 :
292 :05/03/09 16:45:50 ID:yL4n2lnv
>>293 早速のご回答ありがとうございます。
しかし残念ながらREGEXPなんとかはoracle10gからの機能のようです。
できそうだったのに悔しいです。
oracle9iです、すいません。
>>292 translate('aaa1bbb2ccc3ddd4','acbdefg....','');
oracleにtranslateがあるかどうか知らんが。
あと、除外する文字にマルチバイトが出てくると現実的じゃないがな。
>>294 ほんとごめんね。手元に10gのマニュアルしかなかったんで。
純粋な1SQLでは無理そうだけど、ちょこっとストアドファンクション組んで、それを呼べば?
297 :
294 :05/03/09 17:10:56 ID:yL4n2lnv
>>295 すいません、基本的に除外する文字は全角文字です。 実際には ■変換前:千葉県浦安市1-5-4浦安マンション203号室 ■変換後:154203 のような感じにしたいのですが、無理そうですか?
298 :
297 :05/03/09 19:03:01 ID:yL4n2lnv
どうやらsqlだけじゃ無理みたいだと判明しました。 よろしければPL/SQLでの関数の例のようなものをご教授いただけたら幸いです。
299 :
NAME IS NULL :05/03/09 22:29:15 ID:ANreh8jo
>>298 例つうかそんなに難しくないだろ?
文字列を受け取って、長さ分ループして、
1文字づつ順に切り出して数字だったら出力用変数に連結、それ以外は捨て。
>298 検証するPL作るの面倒くさい?
301 :
NAME IS NULL :05/03/10 00:28:36 ID:3kehkfpX
うちの会社のSEに オラクルで、データ型がCLOBのフィールドに対して LIKEで検索出来ないって言われたんですけどマジですか? うちの会社のSEがヘボなのかオラクルがヘボなのか どなたか教えてくださいm(__)m
アゲちゃいました。。 本当は自分で検証したくて、オラクルのHPで お試し版をダウンロードしようとしたら、3営業日かかると言われたので、 こちらで質問させてもらいました。 #なんて大名商売な会社なんだよ。。。 似たようなことは、BorlandのInterbaseってDBでも出来ることなんで 天下のオラクルで出来ないはずはない、、はず、、ですよね?
3営業日かかるって言われたのはうそでした。 一旦、ブラウザ閉じて、接続し直したらお試し版ダウンロードまでたどり着けました でも、600Mのファイルをダウンロードなんて、、、、無理です。ゴメンナサイ どなたかCLOBのフィールドに対してLIKE検索の可否を教えて下さい〜
オラクルスレで聞けばいいんじゃないかな?
>>304 そうですね、そうします!
そうじゃないかなぁって後で思っちゃいましたが
複数スレに同じ質問を書き込むのはアレだと思ったので。。。
306 :
NAME IS NULL :05/03/10 19:53:20 ID:ICT2R8x6
DB2です。 A表とB表をJOINして、和を取りたいのですがどうすればよいのでしょう? このときunionではなく、同一キーのものは1レコードとし、片方にしかキーがないものは NULL値としたいのです。 left join だとA表に存在するもののみとなってしまうし、inner joinは積になる。 なんとかならないもんでしょうか? e.g. A B key value1 key value2 01 AA - - 02 BB 02 CC - - 03 ZZ これを 下記としたい。 key value1 value2 01 AA - 02 BB CC 03 - ZZ
307 :
NAME IS NULL :05/03/10 19:58:10 ID:ICT2R8x6
表がぐちゃぐちゃなので再投稿 e.g. A +--------+ |key|value1| +--------+ |001|AAAA| |002|BBBB| +--------+ B +--------+ |key|value1| +--------+ |002|CCCC| |003|ZZZZ| +--------+ これを 下記としたい。 +--------------+ |key|value1|value2| +--------------+ |001|AAAA|------| |002|BBBB|CCCC| |003|-----|ZZZZZ| +--------------+
外部結合という用語の定義に関して質問があります。 外部結合の左外部結合と右外部結合に関して、大多数の本には、 SELECT文のJOIN句の前(左側)に書くテーブルを優先するのが左外部結合、 SELECT文のJOIN句の後(右側)に書くテーブルを優先するのが右外部結合、 と説明されています。ところが、ある一部の本では、一対多のリレーションシップを 設定した場合に、一側のテーブルを優先する場合が左外部結合、多側の テーブルを優先する場合が右外部結合と書かれています。 いったいどちらの定義が正しいのでしょうか?
前者の説明で正しい。リレーションと外部結合は直接関係はない。 おそらく後者の言いたいことは一対多のリレーション関係を持つテーブルを結合する 場合は、一 left join 多 として結合することが多いということでしょう。
312 :
1/3 :05/03/12 03:17:26 ID:???
突然ですが,面白い SQL を思いついたので,ご意見を頂きたいです. 興味を持たれた方は使ってみてくだちい。 一般的に,SQL の発行は,プリペアドステートメントを使う方がよいと されている.その理由は, ・DBMS のキャッシュが良く効く. ・SQL インジェクション等の危険が避けられる,等. しかし,webアプリの検索フォームなどでは,プリペアドステートメントは 使えない場合が多かった.検索条件項目が複数存在していて,いずれの項目も 必須で無い場合,項目が入力されているかどうかをチェックし,それに合わせて SQL 文の WHERE 句の内容をツギハギしなければならないからだ. SQL文そのものも,そしてそれにセットする引数の個数も可変なので, プリペアドステートメントを使うのは無理だったのである. 今回思いついたのは,このような条件で,プリペアドステートメントを使う 方法である.
313 :
2/3 :05/03/12 03:19:15 ID:???
やることは大変簡単で, 1. WHERE 句の内容全てを 括弧で囲み,最後に「IS NOT FALSE」という 述語を付ける. 2.空欄になっている,検索条件に含めない項目には,NULL をセットする. (空文字列や空白をセットしてはいけない) この二つだけである. 例)ユーザID,職業,年齢を条件として検索する.どれも必須項目でない. SELECT * FROM Table_Name WHERE ( user_id = ? AND profession = ? AND age >= ? AND age < ? )IS NOT FALSE ORDER BY user_id
314 :
3/3 :05/03/12 03:20:43 ID:???
このように書くと,null をセットした項目は,検索条件として使われない
かのように振舞う.SQL を if 文でツギハギにする必要も無くなり,
ぐっとコードが読みやすくなると思う.
なんでこういう動作になるのかというと,SQL が実は3値論理だからである.
詳しくはこの辺を参照.
http://www.geocities.jp/mickindex/database/db_3vl.html (私自身とは無関係のページです)
気になるパフォーマンスだが,PostgreSQL で測定したところ,
( ) IS NOT FALSE がつかない場合と比べて,全く差は無かった.
実は既に,現在進行中のプロジェクトで使っている.今のところ,
全く問題は無い.
以上です.質問スレにこういうことを書くのは,かなりスレ違いですみませんが,
SQL 自体について一番詳しい方が来られるのはここだと思って,書かせていただき
ました.ご意見,ご批判などを伺いたいと思います.
同じものを2回ずつ指定するのがスマートじゃないがベンダー依存の部分を排除するとこんな感じ。 WHERE (user_id = ? OR ? IS NULL) AND (profession = ? OR ? IS NULL) AND (age >= ? OR ? IS NULL) AND (age < ? OR ? IS NULL)
これはちょっと面白いねえ。PreparedStatement は面倒なんで試してないけど、
普通のsqlで書いてみると、age < NULL みたいにNULLを指定した条件は確かに
無視されるよ。仕組みは良くわかんないけど。
>>315 ベンダ依存なの?これってSQL92だと思うんだが。
>>313 user_idが5であとがnullだったら全件ヒットしない?
>>316 おまいの使ってるDBMSはなんだ?少なくともOracle9では動かんぞ.
まあOracleは,結構特殊だったりするけど.
BOOLEAN値はSQL99あたりからだったかな? そのせいでまだサポートしてなかったりシノニムで済ませてる処理系が多い。 ただ IS [NOT] [FALSE|TRUE|UNKNOWN]はpostgreSQL独自だと思ったけど。
320 :
316 :05/03/12 11:36:49 ID:???
>>318 俺は PostgreSQL7.3だけど、Oracleで動かないのかよ、これ。まいったな。
どうみても基本的な構文じゃないか。
>>312-314 最初はチョト理解できなかったけど、こういうことか。
user_id = NULL 等とすると NULL(UNKOWN)になるから、
(TRUE and TRUE) -> TRUE (IS NOT FALSE)
(TRUE and NULL) -> NULL (IS NOT FALSE)
(FALSE and NULL) -> FALSE
(FALSE and FALSE) -> FALSE
いけるかも。ありがたく使わせていただきま。
>>321 了解、SQL92なんだけどサポートしてる処理系が少ないということかな。
とりあえず OracleとMSSQLはだめっぽい。MySQLマニュアルを見た限り見当たらないけどどーなんでしょう?
>>322 IS NOT FALSEで真になるのはTRUEかUNKNOWNの場合に最終的にTRUEになるわけだ。
ただそのままいただいちゃうとまずいかも次のようにすべき。
WHERE (user_id = ?) IS NOT FALSE
AND (profession = ?) IS NOT FALSE
AND (age >= ?) IS NOT FALSE
AND (age < ?) IS NOT FALSE
324 :
322 :05/03/12 12:38:27 ID:???
>>323 何故「そのままいただいちゃうとまずい」のかご教示いただきたく。
>>324 すまん、俺が間違ってた。
false and unknown は falseだからいいのか。
false and unknown を unknownと勘違いしてました。
いろいろなご意見,ありがとうございます. 見慣れない構文なので,受け入れていただけるかどうか不安でしたが, ご理解いただけたみたいで,大変ありがたいです. 私が今回の SQL に込めたかった主張は 「もっと積極的に,NULL と3値論理を使おうよ」ということです. NULL の危険性を理解せずに,カラムに NOT NULL 制約をつけないのは論外 ですが,NULL を目の敵のように排除して,2値論理だけしか扱わないのも, もったいないと思うのです.3値論理はそんなに難しいものではありませんし, 2値論理にはない便利さがあるのですから.
( ) IS NOT FALSE は,例えばこんなふうにも使えます. テーブル同士を JOIN するとき,カラム名が共通なら USING を使うの便利だが, 一つでも共通でないカラム名がある場合は,ON TableA.id = TableB.id ... と, ON 句をズラズラ書かなければならなくなる.USING 句と ON 句は併用できない からである. これには回避策があって,USING 句には共通のカラム名だけを並べ,残りのカラムは WHERE 句で結合することができる. しかし,これは外部結合(LEFT JOIN など)の場合は使えない.片方のカラムが NULL になる場合が,ぜんぶ除かれてしまうからである. そこで,( ) IS NOT FALSE である.これで,片方が NULL でも結合ができる. SELECT * FROM TableA LEFT JOIN TableB USING(a, b, c) WHERE (TableA.hoge = TableB.fuga) IS NOT FALSE
上の SQL は,パフォーマンスは確かめてないので,自己責任で試してくだちい. もう一つ,私の込めた主張は, 「ベンダはちゃんと,IS [NOT] (TRUE | FALSE | UNKNOWN) をサポートしてよ」 ということです.これがないと,3値論理をきちんと使えませんから. 私が試したのは Oracle9, MySQL4.1, PostgreSQL7.4 ですが,PostgreSQL しか サポートしていませんでした.こんなに便利なのに,なんとも残念です. とくにOracle! 再帰的SQL まで用意しているくせに,IS TRUE どころか USING すら満足に動かぬ.優先順位というものがあるのじゃないかと思うのだけど. 他の DBMS はどうなんだろう?SQL-Server, Firebird なんかをお使いの方は おられませんか?
PostgreSQL と Struts をお使いの方にだけ補足. ・PreparedStateMent に setInt すると,NULL を代入できません. だから,数値も setString してやる必要があります. この場合,比較が文字列比較になってしまいますから,きちんと数字で比較 されるよう,セットされた値をキャストしてやる必要があります. age < ?::INTEGER ・空欄なら NULL をセットするようにするには,ActionFormBean の getter に 細工をしてやるのが便利です. public String getAge() { return "".equals(this.age) ? null : this.age; } しばらくこのスレを離れます.次に来るのは遅くなるかもしれません.
>>329 >PreparedStateMent に setInt すると,NULL を代入できません.
>だから,数値も setString してやる必要があります.
>この場合,比較が文字列比較になってしまいますから,きちんと数字で比較
>されるよう,セットされた値をキャストしてやる必要があります.
確実に遅くなるじゃん
まあ何だANSI SQLはエスペラント語みたいなもんだな。
もっと下世話な例ではビデ倫みたいなのもで○○不可が売りになる。
>>329 PostgreSQLはよくわからなけどPreparedStatement#setNullじゃだめ?
>>331 if 文を使いたくないから,この構文を導入したのに,値があるかどうかで
setInt() と setNull() をif文で切り替えるんなら,あんまり意味なくない?
>>332 ActionFormはどっちにしろ文字型だからどうでもいいのですが、
PreparedStatementで数値の項目にsetStringするのはどうかといいたいのです。
暗黙に文字から数値の変換はやってくれてるようだけど、
これはベンダー依存ではないかといいたいわけです。
JDBCが仕様的にこの手の変換をサポートしてるならかまわないだけれどね。
>>332 それもあるけど、問題なのは条件によってSQLを動的生成するのではなく
PreparedStatementを使いたいということらしいので
そこくらいはどうとでもなるだろう。
何ならnullかどうか判断してsetIntかsetNullか必要な方を使うメソッドでも作れば良いだけだし
335 :
NAME IS NULL :05/03/13 03:03:25 ID:4M7LWvrN
>>335 読んだけど全体的に何のことやらさっぱりだね。
何度か読み直して一部がなんとなく理解できる程度。
「理解できないのはあなたがバカだから私の提案する方法にしなさい」
って言われている気がしてきた。まぁ、それはそれでいいんだけどさ
◆本物のデータを集める◆の実例のところは一理あるかも知れんけど、
ニワトリとタマゴ的な問題で、一方の考え方を押し付けた感じがする。
スレ違いな反応でスマソ
>>335 「抜粋・収録したものです」ってあるからライターの力量の欠如と見た。
アシストは汎用機向けのツールもつくってるから聴衆は汎用機の顧客で管理者クラスと思える。
特にVIEWをはじめ幾つかの用語がこの聴衆にわかりやすくするためにある前提で語られていて
一般的な用法ではないと思われるが、この要約ではその説明が省略されているように思える。
内容をよく理解せず抜粋して飛び飛びで文章をつないだ感じだ。
>古いRDBMSを相手に話しているのがわかる。 納得しました。
>>335 この部分だけ読むと意味不明だよな。
>>338 さんの書いてるT型ER図ってのをすこし齧らんとわからん。
で、一応は理想的に最適化されたテーブルでは、その通りだとは思う。
あと、実装面でもクラスタ化されたIndexであれば実表参照しないので、=View実装とはなる。
しかも、Viewとちがって扱いやすいし早い。
(最近はViewに対するIndexとかあるからまた別な気もするが・・・。)
大変遅くなりました.少しだけ補足.
>>333 指摘はもっともですが,おっしゃっている内容は,実際と逆です.
PostgreSQL は String をセットされた場合,数値型に型変換はしません.
?::INTEGER は見慣れない構文ですが,これは Integer 型への明示的な
キャストです.PostgreSQL 専用の構文ですので,他のDBをお使いの方は
わかりづらかったかもしれません.
>>334 私の今回のプロジェクトは,あまり速度を必要としなかったので
記述の簡単さを考えてこのような書き方にしましたが,速度を考えた場合,
おっしゃる通り新しい関数を作って,それを実装した PreparedStatement の
子クラスを作るか,setBigDecimal() を使うかした方が良いでしょうね.
実は,私はあまり,実装の細かいところの話をするつもりはあまりなくて, NULL と UNKNOWN を積極的に使うことによって,従来出来なかったことが いろいろ出来るようになる,という話で盛り上がりたいと思っていたの です. 残念ながら,それは私の力不足でうまく行かなかったようです.どうも, 私の出した例が,いずれもあまり説得的でなかったようですね. 私の例にとらわれず,今後どなたかがとても面白い利用法を思いつかれる ことを期待します. では,失礼します.
T字形のおっさん(なんかこの呼称で定着しそうだが)の理論は個性的で面白いのだが、 おっさんの脳内にあるRDBMSの実装は相当古そうだから、具体的にこうすべし こうするべからず的な部分はバイアスかけたほうがよさそうだぞ。
まあ、設計手法は色々勉強しておいたほうがよいとは思う。 T字形を妄信するのもあれだが、いろんなエッセンスは自分で吸収すべき。 温故知新ってこともあるし、今でも通用する部分もあるし。
標準化されたSQL使っててもDBMSによって最適化手法が まったく異なるってのは罪だよなぁ。
でもさ、基本的な考え方は同じでしょ? 基本は兎に角HDDアクセスさせないこと。
DBMS毎に >HDDアクセスさせない SQLの書き方が異なるから困っとるっちゅうねん。
それはSQLの書き方の問題か? そもそもの設計レベルで大半は決まるものだと思うが。 SQLはその結果にすぎず、そこであまりにテクニカルなことしてるのは、設計が糞なだけ。
DBMS毎に最適な設計が異なるから困っとるっちゅうねん。
351 :
NAME IS NULL :05/03/14 19:55:01 ID:mCTqLZDk
・商品テーブル 商品コード、商品名、区分名 ・テーブル1月 商品コード、商品名、売上 ・テーブル2月 商品コード、商品名、売上 ・テーブル3月 商品コード、商品名、売上 以上のテーブルで、3か月間の総売上数をだして、 区分別に並べ替えて、 それを売上が多い順に並べ替えかえるには どんなSQL文になりますか? 商品コードでリレーション組んだらでいろいろしたんですが、 Error 3258がでる。。。どなたかお助けください。 ちなみに環境はAccess2003です。
select st.商品コード,st.商品名,st.区分名,売り上げの合計 FROM 商品テーブル as st inner join (select Q1.商品コード, Sum(Q1.売り上げ) as 売り上げの合計 from ( select st.商品コード,売り上げ from 商品テーブル as st inner join テーブル1月 ON st.商品コード=テーブル1月.商品コード union all select st.商品コード,売り上げ from 商品テーブル as st inner join テーブル2月 ON st.商品コード=テーブル2月.商品コード union all select st.商品コード,売り上げ from 商品テーブル as st inner join テーブル3月 ON st.商品コード=テーブル3月.商品コード ) as Q1 group BY Q1.商品コード) Q1 on Q1.商品コード=st.商品コード order by 区分名,売り上げの合計 desc
Access使いはなぜか1月・2月・3月テーブルという分け方するやつらが多いな。 ビジュアルな環境で限られたデータを相手にするにはこっちのほうがわかりやすいのだろうか?
>>353 Excelの延長で、データシートに直接入力してる人も多い。
便利に使えればそれでもいいかも。
次のようなクエリを保存して、それを元にもうひとつクエリ作ったほうがわかりやすいと思う
Select * From テーブル1月
Union
Select * From テーブル2月
Union
Select * From テーブル3月
355 :
NAME IS NULL :05/03/14 21:00:33 ID:mCTqLZDk
352、354さん ご教授ありがとうございます。 助かりました。 本当にありがとうございます。
356 :
NAME IS NULL :05/03/15 12:35:52 ID:YtHhx7pD
SQLの文法を BNFで表記してる資料ってあります?
357 :
NAME IS NULL :05/03/15 17:49:15 ID:1wTc5Dg1
質問させてください。 現在JSPとOracle8でシステムを作っています。 JSPでの計算結果をDBに登録するのですが、 NUMBER型のカラムに対して1未満の数値、例えば0.87を入れようとすると、 登録は問題なく可能なのですが、selectして返ってくる結果が .87 のようになってしまい、0が欠けてしまいます。 正常に読み出しできる方法を教えていただけないでしょうか。
>>357 それはJSPの表示の問題かと。javaの機能をそのまま使うならDecimalFormat、
JSTLならfmt:formatNumberをつかってね。
数値のフォーマットをOracle側で処理したいなら select TO_CHAR(数値フィールド, '990.99') from ... これでNUMBER型から文字型に変わったので、java側でgetDoubleでなく getStringで読み出すとよい。
質問です。 オラクルにて、SQLで接続しているサーバーやユーザー名を表示することってできますか? それと、テーブルの最終更新日等をSQLで表示することはできますか?
361 :
NAME IS NULL :05/03/17 15:54:50 ID:uwK64/SN
362 :
NAME IS NULL :05/03/17 16:14:43 ID:/ywboqHa
DATE型について質問です。 DATE型のCREATE_TIMEという列に日時を入れたいと思っているのですが、 insert into TABLE (CREATE_TIME) values ('2005/12/31'); というのは実行可能なのですが、 insert into TABLE (CREATE_TIME) values ('2005/12/31 23:59:59'); とすると、 >ORA-01861: リテラルが書式文字列と一致しません。 というエラーが出て悩んでいます。 試しに同じ2005/12/31 23:59:59という値をAccessで直接入力すると値が正常に入るようなのです。 insert into TABLE (CREATE_TIME) values (to_char('2005/12/31 23:59:59', 'YYYY/MM/DD HH24:MI:SS')); としても、 >ORA-01722: 数値が無効です。 と出てしまいます。 SQLでDATE型にYYYY/MM/DD HH24:MI:SS形式のを入力する方法を教えていただけないでしょうか。
>>362 × values (to_char('2005/
○ values (to_date('2005/
>>361 4 集計(SUMとGROUP BY)
のすぐ下の囲みのところに答えが書いてあるやん。
ケース3は微妙な希ガス。
>>362 Oracleはtimestamp型をdate型に自動キャストしてくれないのか?
それともdate型を期待するところにいきなり'2005/12/31 23:59:59'を持ってきても
date型じゃないのでtimestamp型かどうかいちいち検証しない。
のどちらかか?
とりあえず前者なら、'2005/12/31 23:59:59'をdate型にキャストするだけで
いけると思うが、後者ならtimestampにキャストする。
365 :
361 :05/03/17 16:44:20 ID:uwK64/SN
>>364 あ、もろ答えでした・・・すいません、ありがとうございます。
確かにケース3は微妙ですね、中のデータ次第ですよね。
366 :
364 :05/03/17 16:49:49 ID:???
>>365 データ次第なら「間違い」なんだろうけど、そうじゃないように思える。
まさか、処理系次第だたりして...first()って標準なのか?
>>364 暗黙の型変換はするけど、デフォルトの書式に時刻は含まれてないんで。
因みにウチの環境だと
|SQL> select * from v$nls_parameters where parameter = 'NLS_DATE_FORMAT';
|
|PARAMETER VALUE
|------------------ -----------------------
|NLS_DATE_FORMAT RR/MM/DD
データベースのパラメータを弄るか、でなけりゃセッション中に
|SQL> alter session set nls_date_format='YYYY/MM/DD HH24:MI:SS';
|
|セッションが変更されました。
|
|SQL> insert into hoge (CREATE_TIME) values ('2005.12.31 23:59:59');
|
|1行が作成されました。
とするしか。
368 :
NAME IS NULL :05/03/18 10:50:00 ID:bz1wnhzs
where句についての質問なのですが where 履修表.学生番号=学生表.学生弁号 and 履修表.科目番号=科目表.科目番号 and (科目名=’語学’or 科目名=’貿易論’) and 成績=5; のように条件で()を使うことはできるのでしょうか?
>>368 できる。で、その程度なら試してみればいいじゃん。
ついでに、上記例の場合は、orで書くよりINで書くほうが可読性がよいとおもう。
370 :
NAME IS NULL :05/03/18 11:46:06 ID:bz1wnhzs
>>369 ありがとうございます。
試したいのですが、データベースが無いんです。
371 :
NAME IS NULL :05/03/18 11:52:12 ID:qh+VXfcQ
こんにちは。 いつもお世話になっています。 update文を使用して、データに改行を入れたいのですが、どうすればよいでしょうか。 対象列のデータ型はVARCHAR2です。 例えばSQLPLUSから、 SPL>update 「テーブル名」set 「対象列」='あ改行い改行う改行' を投入し、そのあと select 「対象列」 from 「テーブル名」 とすると SQL>あ SQL>い SQL>う と出てくればよいんですが、 SQL>update 「テーブル名」set 「対象列」='あ\nい\nう\n' としても SQL>あ\nい\nう\n と、「\n」が文字列としてでてきてしまいます。 SPL>update 「テーブル名」set 「対象列」='あ 2い 3う' と投入すると、期待通りになるのですが、 そうではなく一行にまとめたいのですがどうすれば良いでしょうか。 Oracle9iを使用しています。 宜しくお願いいたします。
372 :
NAME IS NULL :05/03/18 11:53:35 ID:LK2oaBk/
| SQL>あ | SQL>い | SQL>う | と出てくればよいんですが、 | そうではなく一行にまとめたいのですが 矛盾
>>370 MySQLでもフリーな奴落として試せばいいじゃん。
374 :
NAME IS NULL :05/03/18 12:06:49 ID:qh+VXfcQ
>372 すいません、わかりづらかったですね。 update文を一行にまとめたかったのです。 SQL>update 「テーブル名」set 「対象列」='あ 2い 3う' ではなく SQL>update 「テーブル名」set 「対象列」='あ?い?う?' の?になんらかの文字をいれて 改行を表現したかったのですが、 \n とか \\n とか試したのですが ダメでした。
>>374 MSSQLだと 'あ' + CHAR(13) + CHAR(10) + ..
Oracleだと 'あ' || CHR(13) || CHR(10) || ..
ほかの処理系にも似た関数があると思うから調べてみてくれ。
376 :
NAME IS NULL :05/03/18 12:26:58 ID:qh+VXfcQ
>375 できました、 神よ、ありがとう
377 :
NAME IS NULL :05/03/18 19:21:58 ID:4/cvFSZi
'あ' || CHR(10) || 'い' || CHR(10) || 'う'
378 :
NAME IS NULL :05/03/18 19:36:05 ID:vv1hLnM8
一年生、男性、5人 二年生、女性、3人 というクエリー結果を 男性 女性 一年生 5人 二年生 3人 っていう風に二次元状に見せたいときどうするの? やっぱPHPで加工するしかないのかな?
select 学年,case [性別] when '男性' then [人数] end as 男性,case [性別] when '女性' then [人数] end as 女性 from anyview
380 :
えせ壊人 :05/03/18 20:24:36 ID:Jb7aT050
PostgreSQL 8.0.1を使用しています 現在の年度を取得するために以下の命令を実行しました >Select extract(year from('NOW'::timestamp - '3 month')); 結果 >invalid input syntax for type timestamp: "3 month" 減算符号を加算符号に変えて >Select extract(year from('NOW'::timestamp + '3 month')); を実行すると、予想通りの正常な値を出力してくれるのですが どっか間違えてますかねぇ? >Select extract(year from('NOW'::timestamp + '15 month'))-1; なんてクソな事は避けたいのですが。
'NOW'::timestamp + '-3 month'
382 :
えせ壊人 :05/03/18 20:36:54 ID:Jb7aT050
>>381 即レスありがとうございました。
そのやり方で実行できました。
シーラ本には『加算/減算ができます』と書いてあったのですが
制限があるのですね。
勉強になりました
>>382 Select extract(year from('NOW'::timestamp - '3 month'::interval));
384 :
プログラマ修行中 :05/03/19 23:41:58 ID:KR4nK/+8
すいません(><)学生なのですがサブクエリの問題が分からないので教えていただけないでしょうか?? 次の問題からサブクエリを使ってSQL文を考えなさい。 売れてない商品の商品コードを受注明細テーブルから抜き出し、商品テーブルからその条件に合う商品コードと商品名を取り出す。(商品コード11,13,34) お願いします。。
>>384 SELECT 商品コード,商品名 FROM 商品テーブル AS T1
WHERE NOT EXISTS (SELECT * FROM 受注明細テーブル AS T2 WHERE T2.商品コード=T1.商品コード);
386 :
プログラマ修行中 :05/03/19 23:52:16 ID:KR4nK/+8
387 :
NAME IS NULL :05/03/21 03:02:35 ID:dFe3E0+N
教えてください。 仕事でVB+Oracleで開発してるんですが、 派遣社員が作ったSQLが複雑すぎて読みきれません。 INNER JOINで3つぐらい連結してる程度なのですが、 とにかく読みづらいです。 テストでデータがヒットしないので本人に聞くと 「なんでヒットしないかわからん。」 っておっしゃいます。 単体テストのレベルなら、デバッグでSQL文を取り出して 実行していけばいいのですが、客先テスト中で、ヒット しない原因が客先のデータが悪いのか、プログラムが 悪いのかを調べるのに1テストあたり2時間ぐらい かかってます。 一昔前のプログラムは、ダラダラとIF文がつながっていたけど、 どこで処理が抜けていたかが分かりやすかったと思います。 SQLの複雑さはどの程度までゆるされるんですか? たとえばサブクエリは2つ以上含めないとか コツかなんかありませんか? ストアドを利用するのが一番ですか? 今回のプロジェクトは客先の要望でストアド禁止なんですが
>>387 例えば売上データの一覧表示したいときに
売上テーブルと商品テーブルと顧客テーブルは必要だから、
これだけで3テーブル結合しなきゃならんわな。
これに、顧客グループとか商品カテゴリなんて概念が入るとますます増える。
SQLを書いた本人が「なんでヒットしないかわからん」ってのは論外だと思うけど、
複雑さとか読みやすさって人それぞれだろうし、ケースバイケースなんじゃない。
結合するテーブル数やサブクエリの数じゃないと思う。
んで俺の場合なんだけど、良いか悪いかワカランが、VIEWを作りまくり。
とりあえず売上データ一覧ビューなんて作っておいて、必要に応じて
商品カテゴリと結合したり顧客グループと結合したり。さらにフルセットビュー
なんて全てを結合したビューを用意したりするからビューの入れ子なんてのもアリ。
ビューの入れ子をすると性能が落ちる処理系もある(あった?)みたいだけど、
一度に巨大なビューを作るより、小さなビューを入れ子にした方が、
OOPっぽくておつ? と勝手に思ってますがw。
なんか碇石みたいなものがあるのなら、俺も知りたい。
>>388 つうか、そのためにVIEWが用意されていると思った。
DBMS毎に実装は異なるだろうけど、VIEWはCREATE文を発行したときは何もせず、
参照されたときに(その都度)それに相当するSQL文を生成して実行する。
だから、VIEWを使おうが使うまいがコストの違いは無視できる程度に収まる。
390 :
388 :2005/03/21(月) 05:35:04 ID:???
>>389 そうなんだけど、書籍などはVIEWの説明はあっても、事例などでVIEWを
利用しているものなんてあまり見ない。入れ子となるとなおさら。
まぁ、あまり多くの書籍を読んだわけじゃないからたまたまかもしれんが。
と、性能が落ちると書いたのは、入れ子を深くするとプランナかオプチマイザかが
うまく最良のプランをはじき出せなくなる(つうバグ?)ってのをどこかで読んだ記憶が
あるんだけど... どこにあったか忘れてしまった。
だもんで、VIEWの入れ子は好きなんだけど、なんとなく「邪道かも」って
心の奥底で引っかかっていたりする。気にしながら使い放題なんだけどなーw
>387 そのSQLがどの程度複雑かどうかを 見せて貰えると何か改良点が分かるかも知れない。 ウチの場合レスポンス向上でどうしてもエグイSQLやストアドには ・全員目を慣らしておく ・ネストきっちり ・コメントたっぷり
>>388 VIEWの問題は中身が見えなくなること。どれがキーで何がユニークかといった情報を
確認するために、結局VIEWがどう定義されているか調べなくてはならない。
VIEWを利用する開発者が必要に応じてVIEWを作る分には問題ないと思うが、
VIEWを事前に準備しておいて中身を気にせずこれを使え的に提供する方法だと
予想外の使われ方をされてパフォーマンスがでないケースがある。
ブラックボックスするための手段としてVIEWを捉えたら間違いの元だと思う。
393 :
387 :2005/03/21(月) 18:43:28 ID:EJbK4PSj
たとえば、 SELECT TA.商品番号, TA.単価 FROM テーブルA TA INNER JOIN テーブルB TA ON TA.商品番号 = TB.商品番号 INNER JOIN テーブルC TC ON TA.コンテナ = TC.コンテナ WHERE TA.商品番号 = 'NO998866' AND TB.商品区分 = '子供服' AND TC.倉庫番号 IN ('S0001', 'S0002') こんな感じで、テーブルを3つ繋いで期待した結果が得られないとき テーブルA,B,Cのどこでヒットしないかわからず、 いちいち、WHERE文を削って調べてるわけです。 #元のSQL文を参考に適当につくったので、SQLがおかしいとか、 #この程度が複雑か?っていうのは無しでお願いします。 実際にはWHERE句がもう少し多いので苦労しているようです。 388さんのVIEW案では、テーブル毎にWHERE句を抜き出して CREATE VIEW ビューA AS SELECT * FROM テーブルA WHERE TA.商品番号 = 'NO998866' などでVIEWを作って、最初のSELECTを SELECT VA.商品番号, VA.商品 FROM ビューA VA INNER JOIN ビューB VB ON VA.商品番号 = VB.商品番号 INNER JOIN ビューC TC ON VA.コンテナ = VC.コンテナ にしるということですか?
394 :
NAME IS NULL :2005/03/21(月) 19:31:23 ID:3QUKO9Hm
<<393 <<INNER JOINで3つぐらい連結してる程度なのですが、 <<とにかく読みづらいです。 そのSQL文は、普通のSQL文なので、テーブルを3つくっつけて外部結合で データを取得するためには、そのSQL文しかないと思います>< 私なら、order by で検索条件ごとに並べ替えて、どのにデータが入ってないのか 確認し、それに該当するプログラムを修正します。 まじめに、答えたけど一つ確認します。 釣りじゃないよね?派遣社員の人にそのSQLがおかしいとか言わない方が よいと思うよ。
395 :
NAME IS NULL :2005/03/21(月) 19:56:56 ID:SQHNYrQE
すみません。SQL初心者ですが教えていただけないでしょうか。 表の最後に合計を出したいのですがどうしたらいいかわかりません。 SELECT no, name, price FROM テスト で No name price 1 ああ 1000 2 いい 500 3 うう 200 まででるのですが、下記のようにしたいんです。 No name price 1 ああ 1000 2 いい 500 3 うう 200 合計 1700 sumをつかえば出来ると思うのですがうまくできません。 どうしたらいいのでしょうか? もうしわけありませんがよろしくおねがいします。
>>393 テーブルA,B,Cのどこでヒットしないかって?
両手を拍ってパンと鳴った音は右手から出たものか左手から出たものか?
397 :
387 :2005/03/21(月) 20:28:14 ID:EJbK4PSj
>>394 さん
釣りじゃないです。SQL自体がおかしいとは思ってないです。
ただ、もうすこし条件がおおくて、本人が「わからん」といって、
動かない原因を調べるのに2時間も3時間もかかるもんですから。
ユニットテストのレベルでは仰るような方法で調べてるのですが、
初めての現地でのテストで本人もパニクっちゃって。
仕方なしに、トラブるたびに私がSQLを展開して調べてますが、
いちいちそんなことをしないと分からないようなプログラムって
まずいですよね。
動かないときに、なにが悪いかがすぐに分かるようにしたいのです。
398 :
387 :2005/03/21(月) 20:34:38 ID:EJbK4PSj
>>396 さん
WHERE
TA.商品番号 = 'NO998866'
AND TB.商品区分 = '子供服'
AND TC.倉庫番号 IN ('S0001', 'S0002')
のどの条件が成立していないのかがすぐに分からない
と言った方が適切ですか?
>395 SELECT no, name, price FROM テスト UNION SELECT '合計', '', SUM(price) FROM テスト こんなんでどうか?
400 :
NAME IS NULL :2005/03/21(月) 21:53:09 ID:SQHNYrQE
401 :
NAME IS NULL :2005/03/21(月) 22:14:54 ID:qXH0y2cD
>>395 ,400
with rollup とか compute とか処理系依存の方法もあるが。
402 :
NAME IS NULL :2005/03/22(火) 00:00:16 ID:NPKK/k+D
質問です。 code1 code2 code3 1111 2222 3333 2222 2222 3333 3333 2222 3333 のようなデータで code2,code3 でジョインすると 3レコードとりますが、1レコードだけほしいとき、どうすればいいでしょうか? ROWNUM < 2 以外で何かあればお願いします。
top limit
404 :
NAME IS NULL :2005/03/22(火) 17:38:35 ID:oTWKi1L3
ある仕事を前任者から引き継ぎ、 DB周りのチェックをしていたのですが、 以下のようなビュー作成の構文がありました。 CREATE VIEW VW_TEST AS SELECT A, B, C... FROM X, Y WHERE X.AAA *= Y.AAA AND X.BBB *= Y.BBB AND X.... この、*= の動作は = とどう違うのでしょうか? 手持ちの書籍にも、サイト検索でも例が見つかりませんでした。 どなたかご教示願います。 ちなみにSQLServer7.0です。
| Microsoft SQL Server の以前のバージョンでは、 | 左外部結合と右外部結合の条件は WHERE 句で *= 演算子 | および =* 演算子を使用して指定していました。 | SQL Server の今後のバージョンではこの構文は | サポートしなくなる予定です。
406 :
404 :2005/03/22(火) 20:52:56 ID:???
>>405 情報ありがとうございます。非常に助かりました。
全く意味がわかりません。
きっとよくある質問だと思うんですけど、今 RSS を sql に一旦全部ぶち込んで、
後でパースしようと思うんですけど、table のレイアウトに迷っています。
files { ID, URL, channel_id, item_id}
channel {ID, title, link, descripttion ...}
item {ID, title, link, descrition... }
Channel 要素の items とか、複数個あるし、どうマッピングすればいいんでしょうか?
ttp://www.kanzaki.com/docs/sw/rss.html
>>408 itemsのrdf:li rdf:resource属性はitemのrdf:about属性と一緒だろ。
だからchannelテーブルのitemsはいらんわな。
あ、学習用に使う程度なのでフリーのものを探しています。
MySQL,PostgreSQL,MSDE、どれでもいいんじゃないの? 最初はGUI使わずにCUIで兎に角やることをお勧めする。
select a from test と select count(*) from test の 件数が合わないのですが、なぜだかわかりますか? 条件などはつけてません
415 :
410 :2005/03/24(木) 21:20:06 ID:???
>>412 ty! とてもいいツールですね。こういうのを探していました。
>>413 アドバイス有難うございます。
今回は試験の時間まであまりないので↑のツールを使わせていただきます。
>>414 上はaという列を抽出。下は行数をカウントなので件数が合う合わないの問題ではないと思うのですが・・
>>415 select a from test で 抽出された件数と
select count(*) from test で カウントされた件数が合わない
ってことです。
まず、DBはなによ? それからselect a from testの件数はどうやって拾ったの?
aにnullデータが入ってるに1票
419 :
NAME IS NULL :2005/03/24(木) 22:15:46 ID:nNtZMBKf
mysqlで中央値の取り方を教えてください
>>418 NULLが入ってました。
アドバイスありがとうございました。
422 :
NAME IS NULL :2005/03/24(木) 23:26:02 ID:40Mp0n/M
オラクルで 片方のテーブルには ID KUBUN KANE1 ----------------- AA 10 2000 AA 20 1000 AB 30 700 もう片方には ID KUBUN KANE2 ----------------- AA 30 2000 AB 20 1000 で結合して ID KUBUN KANE1 KANE2 ------------------------- AA 10 2000 0 AA 20 1000 0 AA 30 0 2000 AB 20 1000 0 AB 30 700 0 というようなテーブルを作成したのですが、どうしても作成できません。 だれか、良い結合方法はありませんか。
olacle知らないけどこんな感じじゃない select * from (select ID,KUBUN,KANE1 as KANEa, 0 as KANEb from ATABLE union all select ID,KUBUN, 0 as KANEa,KANE2 as KANEb from BTABLE) as TMPTABLE order by ID,KUBUN
質問なのですが、例えば下記のようなデータがあって、 書籍CD 単価 出版日 00001 1,500 05/02/01 00002 2,800 05/02/15 00002 2,300 04/12/08 00003 3,000 05/03/01 単価を「同一書籍CDのレコードが複数存在する場合、出版日の降順にソートして 最後のレコードのみ選択」して集計するには、どの様にコーディングすればいいのでしょうか? ご教授御願いいたします。
select 書籍CD,max(出版日) from table group by 書籍CD
426 :
424 :2005/03/28(月) 14:04:45 ID:???
>>425 ありがとうございます。すいません、言葉が足りませんでした。
その抽出条件で選択されるレコードの、単価の合計を出力したかったのです。
>>425 を参考に頑張ってみます。
427 :
424 :2005/03/28(月) 14:14:46 ID:???
解決しました。度々のスレ汚し失礼致しましたm(__)m
SQLServerで Image型からText型のへ変換したいのですが、どうしたらいいのですか? Image型に入っている 0x82A041 を Text型に 'あA' と変換してインサートしたいのですが 最大サイズ8000の壁に当たってしまうのです。 どうやって変換したらよいのか教えてください。 宜しくお願いします。
>8000の壁 はvarcharの制限じゃなかったっけ、textは2^31くらいまで大丈夫なはず。 その手の変換はプログラムでやるのが王道だと思います。
>>428 かなり泥臭いけど8000バイト毎にREADTEXTと
UPDATETEXT,WRITETEXTを繰り返せばできると思う
431 :
NAME IS NULL :2005/04/02(土) 14:27:22 ID:1gCSXqqJ
店のデータと、各店の商品データがあったとして、店のデータは一つのテーブルでいいのですが、 商品データは各店ごとにテーブルを作る場合と 一つのテーブルに全店の商品データを詰め込んで後で検索する場合とでは ある店の商品データを表示する際にどちらが高速でしょうか。 普通に考えれば店ごとにテーブルを作った方が早そうですが、 テーブルが多くなりすぎると遅くなるというような話を聞いたので、気になっています。
432 :
NAME IS NULL :2005/04/02(土) 15:02:39 ID:a2Szs17Q
>>431 適切な索引がついてれば処理速度に差は出ない。
それより店が増えたらテーブルを増やす必要があるから面倒でないか。
データ数アクセス数が膨大なら格納域をパーティション化できる
DBMSもあるが、そのレベルの話ではないのだろう?
433 :
NAME IS NULL :2005/04/02(土) 19:50:08 ID:rM1NiQ2i
Web環境で使用中のDBがあるのですが、書き込みをする(INSERTする)ページが極端に遅くなっています。(30秒程度) データを取得する(SELECTする)ページはなんともなく、INSERT実行に時間がかかっているのか???などと思っています。 SELECTはなんともないのにINSERTに時間がかかるなどということはありますでしょうか?
>>433 INDEX が大きすぎるとか、表領域を拡大しているとか。
435 :
NAME IS NULL :2005/04/02(土) 20:21:45 ID:qZMBbSse
すいません。。学校の問題が分からないので助けてください!! 行の更新 UPDATEをやってるのですが・・。 問題 受注更新テーブルの受注日が1995年の運送料を100円増しに変更せよ。 よろしくお願いします(><)
過去の運送料を100円上げる意図がわからんな。
437 :
NAME IS NULL :2005/04/02(土) 21:13:22 ID:a2Szs17Q
まあ学校の問題なんだし、そんなとこ突っ込まんでも。 update 受注更新テーブル set 運送料 = 運送料 + 100 where 受注年 = 1995 受注日の扱いは処理系の日付型の特性やテーブルに索引がついてるか否かで 書き方が違ってくるからここでは受注年にさせてもらった。
あげちまったよorz
>>433 WEB以外からupdateの更新をかけた場合と比べてみては
2005/04/03←このような文字列を入れたいのですが、 insert into test(date) values(2005/04/03)とすると計算した結果が入ります。 フィールドのタイプはtextになってます。 どながか対処法教えてください。
440 :
439 :2005/04/03(日) 16:04:11 ID:???
すみません文字列型以外にもいろいろあるのですね。 手持ちの本に書いてありました。すみません。。
441 :
NAME IS NULL :2005/04/03(日) 16:06:44 ID:ZEyMICN8
シングルクオテーションで囲めやタコ!
442 :
439 :2005/04/03(日) 16:58:53 ID:???
>>441 様
実はまだ悩んでました。
非常に助かりましたありがとうございます!
443 :
NAME IS NULL :2005/04/03(日) 19:35:13 ID:iwqbH7nu
pop3で使うcryptされたパスワードは、 mysqlだとpassword(hogehoge)ではないのでしょうか?(phpmyadmin使用) mysqlにpop3で使うパスワードをcryptしたものを格納して、 courier-imapから参照させたいのですが、password()では「合ってない」と言われてしまいます。
444 :
433 :2005/04/03(日) 22:48:41 ID:PD2SN+DP
>>434 >>438 ありがとうございます。確認してみます。
その他に遅くなる原因として、ログ系が原因で遅くなることは考えられますでしょうか?
フルバックアップをとってトランザクションログを消すとパフォーマンスの向上につながりますか?
使用DBを書いていませんでした。SQLServerを使用中です。設定はほぼデフォルトのまま。
>>444 普通は関係しないはず。あとSQLServerはフルバックアップをとっても
ログバックアップを別に実行しないとログは消去されませんのでご注意を。
446 :
NAME IS NULL :2005/04/04(月) 15:18:34 ID:5HLDnVUd
伝票番号 売上日 商品コード というテーブルから、各商品について最新の売上日のレコードのみ 抽出したい、という時はどうすれば良いでしょうか? 伝票番号, 売上日, 商品コード 1, 4/1, 001 2, 4/1, 002 3, 4/2, 001 というデータがあったら 2,4/1,002 3,4/2,001 という結果が欲しいのです。
447 :
446 :2005/04/04(月) 15:24:12 ID:???
DBMSはSQL鯖2000です。
1と2のレコードのどちらが最新なのかわからないだろ、それ。 伝票番号で見ればいいのなら、日付でグループ化して最大の伝票番号を。
449 :
446 :2005/04/04(月) 15:34:38 ID:???
分かりにくくてすみません、1と2は別の商品なのですが・・・
あ、すまん。 んじゃあ商品コードでグループ化して売り上げ日のmaxだ。
451 :
446 :2005/04/04(月) 15:55:32 ID:???
できますた。 ありがとん
エロい人教えて下さい 例えば電話番号テーブルの中から検索する場合に ハイフンを無視して検索するには、どうすればよいですか 例) 1. 03-1234-5678 2. 045-678-9012 3. 0312341234 4. 03-3333-4444 の場合、031%で検索した場合に1と3を得たいのです よろしくお願いします。
453 :
NAME IS NULL :2005/04/06(水) 11:17:13 ID:bsFmYDLm
>>452 REPLACE(TEL, '-', '') LIKE '031%'
>453 神降臨ありがとん。できました。
455 :
NAME IS NULL :2005/04/07(木) 07:51:10 ID:o4fttHK+
集合関数を用いて定義されているビューAがあるとして(たとえば「SUM(売上) AS 売上合計」とか)、 そのビューAからSELECTするときに SELECT * FROM A WHERE 売上合計>10000 というSQL文はどのDBシステムでも動くもんなんでしょうか? WHERE 売上合計>10000 の部分が WHERE SUM(売上)>10000 に展開(?)されるとしたら、WHERE句では集合関数が使えないので NGですよね?(HAVING使わないとダメですよね) とりあえず、Accessでやってみたら動きましたが、他のDBへの移植を考えると不安なので 教えてくださいm(_ _)m
>>455 動くんじゃないのか?
それで動かなかったらビューの意味が無いだろw
ビューの仕組みとしては、下記の通りのような感じだから全然OK
@「SUM(売上) AS 売上合計」を集計
Aその結果を一時領域に格納
B一時領域から売上合計>10000を抽出
C結果をユーザに返す
試しにOracle9i でやってみたけど、可能だったよ。
sql初心者です。 SELECT * FROM a LEFT JOIN b ON a.1 = b.1 WHERE a.id = 'hoge' の場合、JOINはWHEREで取得する前のテーブルに行われるのでしょうか。それとも WHEREで抽出した結果のみに行われるのでしょうか。 もし、前者であった場合、無駄な負荷がかかると思うのですが、その場合はどのような 回避策がセオリーなのでしょうか。 WHEREで抽出したものを一度テンポラリテーブルに吐き出してそれに対してJOINするくらいしか 思いつきません・・・。
>>457 心配しなくても、その程度の最適化はDBMSがやってくれる。
もし適切なプランが選択されないとしたら、SQLなりデータベース設計なり
を見直す必要があるけどね。
459 :
457 :2005/04/07(木) 15:16:17 ID:???
>>458 解答ありがとうございます。とりあえず最初はあまり気にせずいろいろしてみたいと思います。
初心者でそこまで心配してくれればありがたいよなあ
461 :
NAME IS NULL :2005/04/07(木) 16:33:28 ID:aFrI3lim
>>461 情報処理の試験問題になってるということは、JIS SQL的にはそうなのでしょうね。
ただ実際問題としてWHEREとHAVINGの使い分けはシンタックスシュガーでしかない
ような気がするので、現実の実装ではほぼすべてで可ではないでしょうか。
>>462 規格で決まっている、というよりは、このようなエラーが出る理由はこれ
これこうですよ、という回答を導き出す設問だと思う。もし単純にクエリ
に置換するようなRDBMSだったら確かにエラーになるだろうけど、現実の
RDBMSだったら普通は対応しているでしょう。
#じゃなきゃ派生テーブル(サブクエリ)でも同じエラーになりそう
WHEREとHAVINGは明確に違うので、シンタックスシュガーというのはどうかな。
問題は、仮想表であるビューを実表と同様に扱えるかどうか、ということ
でしょう。
464 :
456 :2005/04/07(木) 20:03:46 ID:???
>>461 そのDBMSでは対応していないというこを前提なんだろうなぁ・・・・。
漏れとしては、ちょっと納得いかないけどな。
初歩的な事ですが調べてもわからなかったので教えて下さい。 PostgreSQL 8.0.1 Windows2000 文字コード UNICODE CREATE TABLE test(name1 VARCHAR(30)); でTABLEを作成し INSERT INTO test (name1) VALUES ('名古屋');を5回 INSERT INTO test (name1) VALUES ('東京');を5回 でデータを入力して select * from test; 1 名古屋 2 名古屋 3 名古屋 4 名古屋 5 名古屋 6 東京 7 東京 8 東京 9 東京 10 東京 当然ながら上のように表示されますが、 SELECT DISTINCT name1 FROM test; 1 東京 2 名古屋 3 名古屋 4 名古屋 5 名古屋 6 名古屋 と表示されます。 また SELECT name1 FROM test WHERE name1='東京'; 1 東京 2 東京 3 東京 4 東京 5 東京 と検索されますが、 SELECT name1 FROM test WHERE name1='名古屋'; では検索されません。 SELECT name1 FROM test WHERE name1 LIKE '名古屋'; では検索されます。 対処方法はあるのでしょうか・・・ アドバイスありましたらお願いします。
>>465 --no-localeになってないとか。
show all;
で lc_* がCになってなかったらぁゃιぃ。
467 :
465 :2005/04/08(金) 21:42:32 ID:???
SHOW ALL; LC_*は "lc_collate";"Japanese_Japan.932" "lc_ctype";"Japanese_Japan.932" "lc_messages";"Japanese_Japan" "lc_monetary";"Japanese_Japan" "lc_numeric";"Japanese_Japan" "lc_time";"Japanese_Japan" になっています。 --no-locale ってどこで確認すればいいですか?
>>467 CP932の情報でUnicodeを扱っている感じなんだなw
--no-localeはデータベースクラスタ作成時(initdb)のオプションです。
ってことで、データベースクラスタから作り直しになります。
Windows版は8.0.0bate3を入れてんだけど、どこでどうやったか忘れてしまった。
しかし、lc_*はCになってるんで、インストール時か作成時にそのようなオプションが
あったんだろうな。
469 :
465 :2005/04/08(金) 22:02:26 ID:???
ありがとうございます。 インストールからやりなおしてみます。
470 :
465 :2005/04/08(金) 22:32:15 ID:???
>>468 インストール中に選択するところがありました。
前回はCではなくわざわざJAPANESEを選んでました。
ありがとうございました。
Oracle8iからPostgreSQL8.0に移行しているのですが、外部結合がよくわかりません。 (A) SELECT * FROM A,B,C WHERE A.xxx = B.xxx (+) AND A.xxx = C.xxx (B) SELECT * FROM A LEFT OUTER JOIN B ON A.xxx = B.xxx, C WHERE A.xxx = C.xxx (A)と等価なSQLは(B)でよいのでしょうか。 (B)では、 A LEFT OUTER JOIN B ON A.xxx = B.xxx をひとつのテーブルとして見ているような気がして、 where以下に条件が必要なのか自信がありません。 あと、FROM句で下のようにCを前に出すと、外部結合が AだけでなくCにもかかるのでしょうか。 C, A LEFT OUTER JOIN B ON A.xxx = B.xxx
472 :
NAME IS NULL :2005/04/12(火) 14:26:21 ID:3gWRq3+L
下記のようなcode1とcode2から商品が一意に決まり、dateに価格改定日が入る価格テーブルで、 今日現在の価格を求めるクエリを作ってみたんだけど、なんかスマートじゃない希ガス。 もっと良い方法ないかな? 教えてえらい人! CREATE TABLE product( code1character varying, code2character varying, datedate, pricenumeric ); SELECT product.code1, product.code2, product.price FROM product, (SELECT p1.code1, p1.code2, Max(p1.date) AS date_max FROM (SELECT product.code1, product.code2, product.date FROM product WHERE product.date < Now() ) AS p1 GROUP BY p1.code1, p1.code2) AS p2 WHERE p2.code1= product.code1 AND p2.code2=product.code2 AND p2.date_max=product.date;
>>427 これでどうかな?
select
code1, code2, price
from
product
where
date = ( select max(date) from product where date < now() );
474 :
473 :2005/04/12(火) 14:56:55 ID:???
みす
475 :
NAME IS NULL :2005/04/12(火) 15:15:43 ID:/8uXX3jw
MYSQLのテーブルをACCESSにリンク付けしたいのですが、 MYODBCの設定で各種パラメータ設定後、 test data sourceボタン押下時に、 アクセス拒否の旨のメッセージが出力されます。 どう対応していいのか分かりません。誰かエロイ人 教えてください。お願いします。 バージョンは以下のとおりです。 MYSQL:4.0.14 MYODBC:3.51.8
476 :
473 :2005/04/12(火) 16:39:06 ID:???
>>472 再度投稿
select code1, code2, price
from product p1
where date = ( select max(p2.date) from product p2
where date < now() and p1.code1=p2.code1
and p1.code2=p2.code2 );
477 :
NAME IS NULL :2005/04/15(金) 20:04:33 ID:hI+LPweD
DBはフィールドaでnvarchar(5)で a 10 20 + / のようになっています。ここから数字だけを計算して合計したいのですが select sum(convert(・・・)from table ではできませんよね ?DBはSQL SERVERです。 やっぱできないのかな?
1行ずつ回しながら1文字ずつ取得して…
数字から始まるものは絶対数字、という保証があれば where 項目名 between 0 and 9999 とか
480 :
NAME IS NULL :2005/04/15(金) 21:30:48 ID:hI+LPweD
SQL一発でやりたい
481 :
NAME IS NULL :2005/04/15(金) 21:42:53 ID:7ROuCIoq
へ へ|\ へ √ ̄| へ ( レ⌒) |\ ( |\)| |/~| ノ ,__√ /7 ∠、 \ . 丶\ _ __ |\_/ /へ_ \) | | | |∠ | |__ | / ! | | |_〜、 レ' レ' \_./| |/ \ .| |( ̄ _) | ) | | i | へ_,/ ノ ,へ / / ̄~ヽ ヽ. | | フ ヽ、 ノ √| | ! レノ | !. \_ ー ̄_,ー~' ) / /| | | | | |( ノ| |`、) i ノ | | \_ノ ノ / フ ! (~~_,,,,/ノ/ | | | | / / | | . し' ノ ノ | | / / | |  ̄ \\ノ | / / | |___∠-". | | ノ / ノ | /( \_ノ_/ / (____) し' ノ/ / / | 〜-,,,__ ∠-''~ ノ/ (_ノ 〜ー、、__)
aに0〜9以外が含まれている行を除外して 残りを集計すりゃいけるんじゃないの?
>>477 SQLSERVERには正規表現の使える置換関数ってないの?
あるなら数値以外はゼロに置換して集計すればいいよね。
484 :
NAME IS NULL :2005/04/15(金) 22:29:46 ID:hI+LPweD
ロジックなら簡単だがやはりSQL一発 でやりたい。やりたい
select sum(cast(a as int)) from tblA where a not like '[^0-9]'
まちがえた。'1Z'とか'B45T'とかがあるだろうから select sum(sq.a) from ( select case when isnumeric(a) <> 0 then cast(a as int) else 0 end as a from tblA where a not like '[^0-9]') as sq
488 :
NAME IS NULL :2005/04/17(日) 15:30:00 ID:O4OxBSDE
DB2は、SQLで書く ものなんですか?
>>487 きっと自分で自分をぶちのめすことになるんだろうな
SQL Server での質問です。 col1 col2 1 1 1 2 1 3 2 1 2 2 3 1 3 2 3 3 上記のようなテーブルから 1 3 2 2 3 3 このようにデータを取得したい場合 どのようにSQLを記述したらよいのでしょうか? col1が同じ値の中でcol2の一番大きな行を返したいのです。
>>490 SELECT col1,MAX(col3) FROM tab GROUP BY col1
しかし、ここで聞く前にまずは初歩のSQLの本を買って
勉強した方が良いんじゃない?
以下の様なレイアウトのテーブルで column `email` に重複した値を持つ row を全て表示したいのですが、 どうすればいいですか? TABLE `list` ( `id`, `name`, `email` )
select * from list where email in (select email from list group by email having count(email) > 1)
494 :
492 :2005/04/18(月) 04:11:11 ID:???
>>491 すいません。説明が足りませんでした。
col1 col2 col3 ・・・ col n
1 1 任意 ・・・
1 2 任意 ・・・
1 3 任意 ・・・
2 1 任意 ・・・
2 2 任意 ・・・
3 1 任意 ・・・
3 2 任意 ・・・
3 3 任意 ・・・
上記のようなテーブルから
1 3 任意 ・・・
2 2 任意 ・・・
3 3 任意 ・・・
という風に取得したかったのです。
SELECT col1,MAX(col2), col3,・・・coln FROM tab GROUP BY col1, col3, ・・・coln
とすると、col1とcol3・・・colnでくくられてしまうためうまく取得できないのです。
逆に、
SELECT col1,MAX(col2) FROM tab GROUP BY col1, col3, ・・・coln
とするとエラーになってしまいます。
>>495 col1 と col2 で行が特定できるなら
SELECT T1.col1, T1.col2, T1.col3, ...
FROM
tab T1
JOIN
(SELECT col1, MAX(col2) maxcol2 FROM tab GROUP BY col1) T2
ON
t1.col1 = T2.col1 AND T1.col2 = T2.maxcol2;
>>495 それ、そもそも正規化が足りてない。
キーが何だか分からないが、部分関数従属か推移関数従属が残っているから
こういうことになる。
きちんと正規化して分割し、集計のSQLの結果と、分割後の表を結合して
結果を表示する。
>>497 複合キーがメンドイのは確かだが正規化は関係ない気がするが。
無学な漏れにこの表のどこが部分関数従属でどこが推移関数従属か教えて欲しいな。
>>496 ありがとうございます。うまくいきました!
490みたいな事例ってこのスレで一番多いよね。
>>497 俺も聞きたいな。
例えば、レコードを更新する代わりに枝番を増やして新規挿入し
改定履歴として以前のものは残しておくと言う感じで作った場合。
number , subnum , 内容...
ってなって、(number,subnum)が主キー。
最新の情報はnumber,max(subnum)になるから、
>>496 のようなSQLになると思うのだけど何が足りね?
--実際には
>>496 とは違ったSQLで解決するけど。
502 :
NAME IS NULL :2005/04/19(火) 20:22:05 ID:YJB50fFf
INSERTを行うたびに、採番という項目に値を1ずつ追加するという処理を行いたいのですが、 INSERT INTO TABLE VALUES(name,address,(max(num) + 1))という 書き方で正しいのでしょうか。
しーけんす
それだと同時に複数ユーザが実行したときうまくいかない。 シーケンスを自動生成する機能を使うか 自動で列の値を更新してくれる機能を使う
SQL 文を発行して、帰ってきた row がいくつあるかってどうやって数えればいいんですか? Count?
507 :
NAME IS NULL :2005/04/22(金) 17:35:21 ID:GpuTLJpm
DB2で下記をするのにどういうSQLが必要なんでしょうか? +-------------- |西暦|品名|数量1| +--------------+ |2004|AAA|00010| |2004|BBB|00020| |2004|EEE|00030| |2005|CCC|00040| |2005|DDD|00050| |2005|EEE|00060| |2005|FFF|00070| +-------------+ これを品名をキーとして数量を横に展開したい。 再帰的なJOINが必要だとおもうけど、LEFT OUTER JOINなどだと、品名CCCとDDDが かけてしまう。 +--------------------------+ |品名|数量1(2004)|数量1(2005)| +--------------------------+ |AAA|00010|-----| |BBB|00020|-----| |CCC|-----|00030| |DDD|-----|00040| |EEE|00030|00060| |FFF|-----|00070| +--------------------------+
こういうこと? select distinct 品名, (select 数量1 from テーブル as tbl where tbl.品名=テーブル.品名 and tbl.西暦=2004) as [数量1(2004)], (select 数量1 from テーブル as tbl where tbl.品名=テーブル.品名 and tbl.西暦=2005) as [数量1(2005)] FROM テーブル
509 :
507 :2005/04/22(金) 18:23:15 ID:GpuTLJpm
>>508 レスありがとうございます。
品名をキーとして2004年と2005年の両方に存在しているものを余すとこなく
表示したいのです。
以下の様な table があって、 userid 毎に何個 row があるか知りたいんですが、 どうすればいいですか? table list { userid, text }
511 :
NAME IS NULL :2005/04/22(金) 19:33:09 ID:GpuTLJpm
>>510 select count(*) from table group by userid
512 :
510 :2005/04/22(金) 19:37:57 ID:???
>>511 ありがとうございます。
これを、その count で数えた値によって並び替えたい場合はどうすればいいんですか?
select `userid`, count(*) from list group by userid order by ??
513 :
NAME IS NULL :2005/04/22(金) 19:39:21 ID:GpuTLJpm
>>511 select userid, count(*) as cnt from list group by userid order by cnf じゃだめか?
514 :
NAME IS NULL :2005/04/22(金) 19:39:51 ID:GpuTLJpm
まちがえた、 select userid, count(*) as cnt from list group by userid order by cnt
515 :
512 :2005/04/22(金) 19:40:00 ID:???
自己解決しました。 select `userid`, count(*) O from `list` group by `userid` order by O ありがとうございました。
table { id, userid, pointer, text } のようなテーブルがあります。 pointer は -1 か、他の id を指しています。 例えば、userid = 10 で、pointer が -1 ではない row は SELECT * FROM `table` WHERE `userid`= 10 HAVING `pointer`>= 0; で取得できますよね?で、ここで得られる pointer 群と等しい id の row を 得るにはどうすればいいのですか?? SELECT * FROM table A JOIN( SELECT * FROM `table` WHERE `userid`= 10 HAVING `pointer`>= 0 ) B ON( A.id = B.pointer ); ではダメなんですけれども…
なぜにHAVING
>>516 SELECT * FROM TABLE A, TABLE B
WHERE A.POINTER = B.USERID
AND A.USERID ='10'
でいいんじゃね?
520 :
516 :2005/04/22(金) 23:51:05 ID:???
>>519 ありがとう
SELECT B.*
FROM table A, table B
WHERE A.pointer = B.userid
AND A.userid ='10'
でした。
>>507 テストしてないけど
SELECT DISTINCT A.品名,B.数量1,C.数量1
FROM TABLE A,TABLE B,TABLE C
WHERE A.品名 = B.品名(+)
AND A.品名 = C.品名(+)
(+)は外部結合。
FireBird 1.0.3 で テーブル A ID NAME ---------- 1 AAAA テーブル B ID F_ID DATA -------------- 1 1 10 1 2 20 というようなテーブルがありこれを テーブル KUIKA NAME F_ID DATA ------------------ AAAA 1 10 AAAA 2 20 BBBB 1 25 BBBB 2 30 を使って下記の様に更新したいのですが テーブル A -> これはストアドで出来ました。 ID NAME ---------- 1 AAAA 2 BBBB テーブル B -> これが出来ません。 ID F_ID DATA -------------- 1 1 10 1 2 20 2 1 25 2 2 30 B の方が出来ません。 宜しくお願いします。
>>522 テーブルAの
2 BBBB
のid =2 はどこから引っ張ったのか?
524 :
522 :2005/04/24(日) 09:01:47 ID:???
>>523 すみません
ジェネレータからストアドで
(テーブル KUIKA は TUIKA の間違いです)
create procedure TEST_PRO
returns
(ID numeric(18,0), NAME varchar(20) character set ascii)
as begin
for select NAME from TUIKA
where not exists(select NAME from A where TUIKA.NAME = A.NAME)
into :NAME
do begin
ID = gen_id(ID_GEN, 1);
suspend;
end
end
を
insert into A select ID, NAME from TEST_PRO;
と取得してます。
テーブル B の更新に
insert into B select A.ID, TUIKA.F_ID, TUIKA.DATA from A, TUIKA
where (A.NAME = TUIKA.NAME)
and not exists(select ID from B where A.TYP_ID = B.TYP_ID);
としましたが
テーブル B
ID F_ID DATA
--------------
1 1 10
1 2 20
2 1 25
となってしまいます。
select A.ID, TUIKA.F_ID, TUIKA.DATA from A, TUIKA
where (A.NAME = TUIKA.NAME)
and not exists(select ID from B where A.TYP_ID = B.TYP_ID);
で表示すると
2 1 25
2 2 30
でよさそうなんですが?
525 :
522 :2005/04/24(日) 09:06:30 ID:???
表示がくずれますね。 テーブル B ID F_ID DATA -------------- 1 1 10 1 2 20 2 1 25 は テーブル B ID | F_ID | DATA --+----+------- 1 | 1 | 10 1 | 2 | 20 2 | 1 | 25 です。
>>522 insert into b
(select a.id, kuika.f_id, kuika.data from a, kuika
where kuika.name = a.name and not exists ( select * from b where b.id = a.id and b.f_id = kuika.f_id));
これでどうだ?
527 :
NAME IS NULL :2005/04/24(日) 19:17:41 ID:Vz2BeRQe
すみません。教えてください。 MSDEをアプリケーションに組み込みたいんですが、 やり方をマイクロソフトのHPをみても説明が英語版しかありませんでした。 どなたか紹介してるサイトがあればおしえてください。
528 :
507 :2005/04/25(月) 10:43:30 ID:/d5cKyiI
>>521 レスありがとうございます
残念ながらできませんでした(やってみたかぎり)、というか、よくわかりません。
再帰的にテーブルを3つにするということですか?
>>528 FULL OUTER JOUIN では駄目なのかいや?
530 :
507 :2005/04/25(月) 11:45:08 ID:/d5cKyiI
>>529 私の使っているDB2ではなぜか FULL OUTER JOIN と指定することができません。
失礼します。いきなりですがSQL SERVERのストアド内でCREATE VIEWを使用する方法って あるのでしょうか?よろしければご教示下さい。
532 :
522 :2005/04/25(月) 22:19:51 ID:???
>>526 ありがとうございます
insert into b
select a.id, kuika.f_id, kuika.data from a, kuika
where kuika.name = a.name and not exists ( select * from b where b.id = a.id and b.f_id = kuika.f_id);
これでうまく行きました。
>>530 LEFT JOINとRIGHT JOINは使えるのか?
使えるのなら両方とってUNIONで連結すれば。
>>530 DB2ではFULL OUTER JOINは使えてるけど。こっちの環境はDB2 V8.2
SELECT * FROM DEPARTMENT AS D FULL OUTER JOIN STAFF AS S ON D.DEPTNO =
S.NAME
みたいな感じで。(上の例は適当)
535 :
530 :2005/04/26(火) 10:24:29 ID:ZrP6qzxF
>>534 私の環境では FULL OUTER JOIN は使用できませんでした。
>>533 LEFTとRIGHT JOIN、UNIONにて実現することができました。
ありがとうございました。 m(__)m
536 :
NAME IS NULL :2005/04/27(水) 14:27:01 ID:OI4vcXV1
カラムuser_id(ユニークな数値)を含むテーブルuser_listがあり、 別のテーブルevent_recordでのuser_id(重複あり)の出現数をもとに user_listをソートして出力したいのですが…どうすればいいのでしょうか。
>>536 SELECT * FROM user_list AS T1
LEFT JOIN (SELECT user_id,count(user_id)AS cnt FROM event_record GROUP BY user_id)AS T2
USING(user_id)
ORDER BY T2.cnt DESC;
--ソートはevent_recode.user_id出現回数の多い順でよかったのかな?
538 :
537 :2005/04/27(水) 15:19:59 ID:???
外部結合をする必要があったかどうか知らないけど、
外部結合の場合T2.cntがNULLになる行があって、
ソートした場合、ベンダーによってNULLが最初に出るのか
最後に出てくるのかマチマチのようだから、
>>537 の最初の行は
SELECT T1.*,COALESCE(T2.cnt,0)AS cnt FROM ...
として、最後を ORDER BY cnt DESC;
ってした方がいいかな。
539 :
536 :2005/04/27(水) 16:53:50 ID:OI4vcXV1
>>537 できました!うまくいったみたいです。
COALESCEの調整もやってみます。
ありがとうございました。
540 :
536 :2005/04/27(水) 18:43:44 ID:OI4vcXV1
>>535 うちの環境(postgresql-7.2.7)では確かにCOALESCEで調整してやらないと
NULLが最初に来てしまうようでした。
細かいところまでありがとうございました。
541 :
536 :2005/04/27(水) 18:45:11 ID:OI4vcXV1
542 :
NAME IS NULL :2005/04/27(水) 20:53:55 ID:I7MAuU2N
質問です。 Oracle8iで、joinを用いた結合はできるのですか? 今までは普通にwhere句で結合していたのですけど、 上司に「joinで結合したら?」と言われてしまいまして。 いろいろ試してはみたものの、どうも通らないので、 もしや8iではできないのでは?と。 どうぞご教授下さい_( 。_ 。)_
>>542 できるよ。
それより、質問のしかたを考えなさい。
なんどもやりとりが必要な聞き方ではうざがられるぞ。
後から後から小出しで条件がでてきそうだな。
545 :
NAME IS NULL :2005/04/27(水) 21:19:47 ID:bfa/bL9M
>>543 おいおい・・・嘘をつくなよ。
標準規格SQL99は、Oracle9iから対応だろ。
>>545 Oracleは知らんが、JOINはSQL92じゃなかったケ?
545みたいなこと言い出すだろうとおもたから、質問のしかたが悪いと言ったのだが
548 :
542 :2005/04/27(水) 21:55:47 ID:I7MAuU2N
質問の仕方が悪かったようで申し訳ありません_( 。_ 。)_ tb_a a_id name b_id --- ----- ----- 0001 name1 1111 0002 name2 2222 tb_b b_id name --- ----- 1111 name1 2222 name2 SELECT tb_a.a_id , tb_a.name , tb_b.name FROM tb_a JOIN tb_b ON tb_a.b_id = tb_b.b_id; というような事ができるのでしょうか。 USING句やNATURAL JOIN等も試してみたのですが、 どれもエラーになってしまいまして。 書式が悪いだけなのでしょうか。。。
549 :
542 :2005/04/27(水) 21:57:38 ID:I7MAuU2N
↑ 書き忘れました。 環境はOracle8iです。 SQL Plus や CSEで試しました。
>>548 その構文は9iから対応だったと思うよ。
552 :
542 :2005/04/28(木) 00:15:32 ID:???
Oracle8iでこの構文は使えないようですね。 INDEXと絡めた使い方をどこかで見たような見なかったような気もするので、 一応そちら方面も調べてみます。 どうもありがとうございました。
553 :
NAME IS NULL :2005/04/28(木) 01:11:17 ID:yo9ktJF9
正規化についての質問です 社員番号 氏名 年齢 性別コード 性別 入社日 所属コード 部署名 資格名、 社員表・性別表・所属表・資格表に正規化しようと思うんですが、 社員ごとに資格を保有させるやり方がわかりません。 資格表はどう作ったらよいでしょうか?
>>553 > 資格表はどう作ったらよいでしょうか?
資格のマスター表 (資格ID , 資格名)と
資格ID-社員番号マッピング表(社員ID, 資格ID)
を作れば良いんじゃない?
ところで性別表って何を入れる気なの?
性別マスタなんて普通つくらんだろw
create table 性別マスタ ( 性別ID number(3), 出生時 number(1), 自称 number(1), 戸籍上 number(1), 玉の有無 number(1), 棒の有無 number(1) );
559 :
553 :2005/04/28(木) 12:23:19 ID:???
みなさん、アドバイスありがとうございます。 なるほど、資格表のほかに、資格IDと社員番号をマッピングする表を作るんですね。 やってみます!性別表はなくても良かったですね(汗)
table hoge ( ID int(20), URLのMD5 varchar(32) ) これで、`URLのMD5` の値が重複してる row を見つけ出したいんですが、 どうすればいいですか?
自己結合でwhere条件にIDが!=かつURLのMD5が=。
562 :
560 :2005/04/29(金) 00:56:56 ID:???
>> 561 SELECT * FROM hoge A, hoge B WHERE A.id != B.id AND A.MD5edURL = B.MD5edURL ですよね? 眼で見る分には明らかにダブってるのに、コレでは出てこない…なぜだろう?
563 :
NAME IS NULL :2005/04/29(金) 01:31:31 ID:IgS1g41k
>>562 そのSQLでは重複分は出てこない。
↓でどうだ? 試してないが・・・・
SELECT A.*
FROM hoge A,
(SELECT
FROM MD5edURL
HAVING COUNT(*) > 1
GROUP BY MD5edURL) B
WHERE
A.MD5edURL = B.MD5edURL;
select id, md5edurl from hoge where md5edurl in ( select md5edurl from hoge group by md5edurl having count(*) > 1); こうだろ
565 :
563 :2005/04/29(金) 01:55:35 ID:IgS1g41k
>>564 そうですね。
その方が良いと思います。
566 :
562 :2005/04/29(金) 02:30:54 ID:???
>>566 >>563-564 のどちらでもでると思うけど、単純に
SELECT count(md5edurl) FROM hoge GROUP BY md5edurl;
等としてみて、本当に2以上の値が出てくるのか試してみたら。
ついでに、別の構文。
SELECT * FROM hoge AS T1 WHERE 1 < (SELECT count(*) FROM hoge AS T2 WHERE T2.md5edulr=T1.md5edurl);
568 :
567 :2005/04/29(金) 03:12:25 ID:???
あーれ、
>>563 をよく見りゃなんか妙だな。ひょっとして、
SELECT A.* FROM hoge A,
(SELECT md5edurl FROM hoge GROUP BY md5edurl HAVING count(*)>1)B
WHERE A.md5edurl=B.md5edurl;
の間違いか? これなら
>>564 より速いと思うのだが。
それとも
>>563 で通るベンダーがあるのか?
569 :
566 :2005/04/29(金) 03:49:42 ID:???
>>567-568 れすありがとうございます。
567 にある、count して2がでるか確認、は全部1でした…
でも寝てなくても、眼はちゃんと動いてると思うなぁ…
いや、つまり同じ値はあるんですよ…
というわけで、他に挙げて下さった SQL statment はみんな空が帰ってきます…
はっ!もしや?
md5edurl には“カーディナリティなしの INDEX”があります。
関係あります??
だいぶ前に相談した DBA の卵が where 節で使う値は INDEX を作っておくと
速くなるよ、って言ってたから、よく考えずやってみたんだけど…
mySQLなら
alter table hoge add unique index (md5edurl);
を実行してみなよ。これでエラーがでれば重複行は確実にある。
てゆーか
>>567 が全部1ならそもそも重複行はないんじゃないの。
ところで、mySQLにおける"カーディナリティなしのINDEX"ってナニ?
571 :
563 :2005/04/29(金) 08:41:55 ID:???
>>568 >それとも
>>563 で通るベンダーがあるのか?
having句 とgroup by句 の順番が変と言いたいのですよね?
Oracle9iだと、どちらが先に来ても構わないようです。
572 :
563 :2005/04/29(金) 08:54:09 ID:???
>>569 >md5edurl には“カーディナリティなしの INDEX”があります。
「カーディナリティなし」 の意味が解らん。
要するにユニークなインデックスと言いたいのか?
>567 にある、count して2がでるか確認、は全部1でした…
そもそも重複行が無いやんw
同じ内容のINSERT文を2度発行して、再度試してみろよ。
>568 md5edurlにNULLが無い場合なら SELECT count(md5edurl) FROM hoge SELECT count(DISTINCT md5edurl) FROM hoge 件数が同じかどうかで重複してるか確認
574 :
567 :2005/04/29(金) 10:04:58 ID:???
>>571 そうなのか。
それと一点、
> SELECT FROM MD5edURL
も通るのか?
575 :
563 :2005/04/29(金) 11:38:39 ID:???
>>574 通りませんよ (´・ω・`)
ぐだぐだなSQL文になってたな。
当時は眠かったからなぁ・・・
>>569 「眼で見た」っていうのはテーブル単体でselectしたのか?
MD5を持ってるテーブルに重複は無くても別のテーブルとjoinさせたときに
そっちに同じIDを持つレコードが複数あれば重複してるように見えなくも無い。
577 :
569 :2005/04/29(金) 20:11:03 ID:???
578 :
NAME IS NULL :2005/04/30(土) 11:59:05 ID:sm4/+wI6
すいません、質問してもいいでしょうか? MySQLで連結主キーを設定しようと思っているのですがなぜか ERROR 1068 (00000): Multiple primary key defined とでてしまって成功しないのですが、どなたか解決策をご教授できませんか? ちなみに自分の作ったSQL文は CREATE TABLE TEST (TEST1 int not null primary key, TEST2 date primary key, TEST3 int); です。
>>578 primary keyはひとつのみ設定できます。
580 :
NAME IS NULL :2005/04/30(土) 12:31:10 ID:SINnPo3b
>>579 え?
MySqlってPKを1つしか設定出来ないの?
581 :
NAME IS NULL :2005/04/30(土) 12:43:03 ID:HnW/0DNU
>>579 早速のレスありがとうございます。
そうなんですか、MySQLって連結主キーって許されていないんですか。
>>580-581 主キーは一つだろ。なんか勘違いしてね?
複数の主キー ≠ 連結主キー
>>578 なら、primary key (TEST1,TEST2)
とするのが連結主キー。
この場合、TEST1やTEST2は重複が許されるが、
二つを組み合わせた重複は許されない。
583 :
NAME IS NULL :2005/04/30(土) 14:52:25 ID:gfgjhi2b
>>582 レスありがとうございます。
自分がやりたかったのはまさにそれです。
CREATE TABLE TEST
(
TEST1 int not null, TEST2 date, TEST3 int
PRIMARY KEY(TEST1,TEST2)
);
でできるんですか?
これだとSyntax errorになってしまうんですが、やり方あってますでしょうか?
>>583 TEST2 に not null 制約を付けてみるとか・・・・
>>583 TEST1 int not null, TEST2 date, TEST3 int , <- カンマが必要な気が
PRIMARY KEY(TEST1,TEST2)
586 :
NAME IS NULL :2005/04/30(土) 15:20:00 ID:gfgjhi2b
>>585 その通りでした OTL
ありがとうございました。
つうか、慣れてないなら、素直に「phpMyAdmin」やら「かねやんMySQLAdmin」とかの ツール使えばいいのに・・・・
588 :
NAME IS NULL :2005/04/30(土) 21:34:21 ID:NV11Vl1N
お世話になります。 環境はJavaとOracle9iを使用しています。 前提条件として、仮にAテーブルにBというフィールドがあるとします。 そのフィールドにはコンマ区切りで文字列が格納されています。 この条件下で、htmlのフォームで入力された文字列と部分一致するBがあれば データを取り出すにはどうしたらいいんでしょうか? また、入力された文字列が大文字小文字に関わらず検索出来るようにしたいのですが、 そういう関数みたいのはあるのでしょうか?
589 :
NAME IS NULL :2005/04/30(土) 23:55:41 ID:g2pe/2k1
>>588 select * from A
where upper(B) like '%' || upper('○○') || '%';
○○ = 入力された文字列
590 :
NAME IS NULL :2005/05/01(日) 17:12:20 ID:q86PUpeT
検索の入力項目に以下の3つ(A、B、C)があるSQLを作りたいと思っています。 入力項目「A」は値を直接指定するもの(A=) 入力項目「B」「C」は範囲を指定するもの(B 〜 C) 条件としてA、B、Cのうちどれか1つが必須入力で、 直接指定する「A」と範囲指定する「B」「C」のどちらも入力された場合、 ORとします。 どのようなSQLになるのか教えてください。
>>590 その時々に応じてSQL文を組み替えれば良いやん。
>>590 この程度なら、
>>591 に同意。
無理やり1発で済ますなら>>312- が示した構文を応用して使ってみた。
入力されなかった項目にはNULLを代入しておき、
WHERE field = A OR ( field >= B AND field <= C AND CASE WHEN B IS NULL AND C IS NULL THEN FALSE END) IS NOT FALSE
BとCが共に入力されなかった場合、それを排除する為にBとCがそれぞれ2度出てくるのがちょとツマランな。
593 :
NAME IS NULL :2005/05/01(日) 19:01:38 ID:zUboSMiQ
>>590 全て1発でSQL文を組むという考え方を止めてくれ。
>>592 のようなやり方で出来なくも無いが、保守や改修する身にもなれ。
それともストアドプロシージャで静的にSQL文を組みたいのか?
594 :
◆3vcDGoBERc :2005/05/01(日) 22:29:44 ID:+KegvkFy
www
595 :
www# :2005/05/01(日) 22:33:13 ID:+KegvkFy
111
596 :
588 :2005/05/02(月) 09:34:20 ID:???
>>589 返信が遅くなって申し訳ありませんでした。
教えていただいたSQLを実行してみたところ、
うまく検索することが出来ました。
本当にどうもありがとうございました。
597 :
NAME IS NULL :2005/05/02(月) 14:26:45 ID:zNMKVUp2
質問です。 Oracle9iを使用して、以下のテーブルA、Bから結果Cを 得る場合のうまいSQLの書き方ってありませんか? (レスポンス無視したらできるんですが) A B C a b c a b c a b c 1 10 110 1 20 120 1 10 110 1 20 120 1 60 160 1 20 240 1 40 140 2 60 260 1 40 140 1 50 150 1 50 150 2 20 220 1 60 160 2 40 240 2 20 220 2 40 240 2 60 260
598 :
597 :2005/05/02(月) 14:32:15 ID:zNMKVUp2
スペースが詰まった・・・orz テーブルA、Bと結果Cを書き直します。 A a,b,c 1,10,110 1,20,120 1,40,140 1,50,150 2,20,220 2,40,240 B a,b,c 1,20,120 1,60,160 2,60,260 C a,b,c 1,10,110 1,20,240 1,40,140 1,50,150 1,60,160 2,20,220 2,40,240 2,60,260
unionじゃいかんのか?
600 :
597 :2005/05/02(月) 16:02:34 ID:zNMKVUp2
>599 早いレスありがとうございます。 unionは別件で使ってみてレスポンスが遅かったため敬遠してましたが 一度試してみようと思います。
union では駄目だろ。 union all でやれ。
>>601 よく見ろ 1,20,120 の重複は取り除くのだからallじゃいかんだろう
603 :
601 :2005/05/02(月) 21:49:25 ID:???
>>602 cの列をよく見ろ。
a と b をグループ化して、cの合計を求めているんだから
union all で無いと求められない。
ちょー基本っぽいですが、例えば以下の様な table があったとして、 日付毎の row の数を知りたいときはどうすればいいんですか? table { id, date,.....}
select date(A.date) as B, count(*) from table as A group by B order by B かな?
Atable ID NAME ------- 101 A 102 B 103 C Btable ID DATA ------- 101 1 101 2 103 3 103 8 103 9 から ID NAME DATA1 DATA2 DATA3 DATA4 DATA5 ------------------------------------- 101 A 1 2 (null) (null) (null) 102 B (null) (null) (null) (null) (null) 103 C 3 8 9 (null) (null) を作る素敵な方法はないですかねぃ。 Btableが ID X DATA ------- 101 1 1 101 2 2 103 1 3 103 2 8 103 3 9 じゃないので困ってます
>>606 素敵じゃなくて泥臭いのなら思いつくけどw
>>606 SQL ではやりにくい。
(でも、Excel とか使ってた人からは何でできひんの ? とかよく言われる。)
素直に、SQL の呼び出し元側で処理した方がいい。
609 :
606 :2005/05/03(火) 23:22:53 ID:???
使ってるコンポーネントがSQLの結果そのものしか印刷できないから困り中です。 泥臭くてもできますか?
610 :
607 :2005/05/04(水) 00:51:47 ID:???
>>609 Bの(ID,DATA)がユニークの場合、Xを求めるのは簡単。
SELECT id,data,(SELECT count(data) FROM B AS T2 WHERE T2.id = T1.id AND T2.data <= T1.data) AS x FROM B AS T1;
これで、
>>606 の最後に書いてある表と同等なものが取れるので、全体をサブクエリにして扱えばOK。
611 :
NAME IS NULL :2005/05/04(水) 01:30:24 ID:XGMVXOLk
>>606 無理やりSQLを作るのでは無くて、昇順で取得したものをアプリケーション側で
組み立てた方が解り易いぞ。
SQLは横への展開が苦手なんだよ。
すいません。 どうしてもわからないので教えてください… エクセルからマクロ組んでmdbファイルを使ってるのですが、 その時のSQLで「 like '%〜%' 」っていうSELECT文を使うと 結果が返ってくるはずの値でも、該当レコード0で返ってきてしまいます。 「%」の文字を使用せず、完全一致のもので検索すると 上手く行くのですが、これじゃぁ、部分一致の検索になりません。 どうにか部分一致の検索をしたいのですが…。
>>612 MDBのバージョンは97?
それだと「%」は使えない。
「%」の代わりに「*」を使え。
614 :
612 :2005/05/04(水) 08:05:24 ID:???
>>613 さん
ありがとうございます!
できました!
MDBのバージョン、97でした。
ほんと、無学で申し訳ありません…。
615 :
NAME IS NULL :2005/05/04(水) 10:44:16 ID:WN3q55GR
Oracle9i使ってます。 Timestamp(6)というフィールドに どうやっても入力されないんですが知ってる方いましたら お願いします。
616 :
NAME IS NULL :2005/05/04(水) 11:37:12 ID:XGMVXOLk
617 :
606 :2005/05/04(水) 13:46:32 ID:???
>>607 ,608,611
どうもありがd
とりあえず
>>610 の方法で実装して、あとは何かあったときに考えます。
618 :
NAME IS NULL :2005/05/06(金) 11:01:40 ID:/pOiwcTU
初心者な質問だなと思うんですが・・・。 SQLでとあるテーブル名の配列を検索して表示するんです。 基本的にA〜Zまでの26のテーブルがあると仮定して 特定のK・Lと言うテーブルだけが特別重要なんでそれだけを一番最初に出して 後は昇順で普通に並べるみたいなことできますか? 今はK・L以外のテーブル名をSQLで取り出して プログラムのほうで最初にK・Lをつけて 配列にするしかないかなと思ってますが・・・。
>>618 そのテーブルに重要度ってカラム入れられるの?
620 :
NAME IS NULL :2005/05/06(金) 15:08:11 ID:/pOiwcTU
>>619 それ考えたんですが、
もう今となっては時期的にDB系は変更不可能です・・・。
本番がちょっと近すぎるので。
621 :
NAME IS NULL :2005/05/06(金) 15:09:41 ID:JMuaPQ3N
>>618 >>619 が言うように重要度というカラムを追加して、
重要なテーブルは0、重要で無いテーブルは1をカラムに格納する。
あとは、SQL文を 「order by 重要度, テーブル名」
とすれば可能ではないかな。
622 :
NAME IS NULL :2005/05/06(金) 15:36:49 ID:/pOiwcTU
>>619 >>621 ご助言ありがとうございます。
結局今回はDB変更できないのでSQLそのままで受け側Javaのほうで
強制的に配列処理して逃げることにしました。
次回以降似た事例があればご助言のとおりにしたいと思います。
明らかにそちらの方がきれいなやり方なんで。
それ以前に、本番一週間前にそんな変更入れるなよと思うんですが・・・。
>>622 CASEとサブクエリの使えるDBMSならこんな書き方ができるよ。
select * from
(select *, case when a='K' or a='L' then 0 else 1 end as tmp_order from test_1
) tmp_test_1
order by tmp_order, a
624 :
NAME IS NULL :2005/05/06(金) 20:43:19 ID:/pOiwcTU
>>623 おお、ありがとうございます。
いったん
>>622 のやり方で実装したんですが、
明らかにこちらのやり方のほうがすがすがしいんで
こちらのやり方で実装しなおします。
625 :
NAME IS NULL :2005/05/07(土) 18:30:20 ID:FpscRTiD
SQLの勉強用に大量の(数万、数十万オーダーの)csvデータが欲しいんですけど どっかにそんなの提供してるとこありますか? ※郵便局csv以外で
ランダムに生成するか、フリーの辞書かなにかをcvsに変換すりゃいいおはなし。
YahooBBとか
628 :
NAME IS NULL :2005/05/07(土) 18:57:10 ID:FpscRTiD
>>626 リアルなデータが欲しかったもので。
フリーの辞書って何ですか?
テーブルで、主キー以外が同じデータのものを1件だけのこして 削除するSQL文はどうかいたらよろしいのでしょうか。 たとえば、以下のようなテーブルがある場合、 1,りんご,200 2,みかん,300 3,りんご,200 4,りんご,250 以下のようにしたいのです。 1,りんご,200 2,みかん,300 4,りんご,250 よろしくお願いいたします。
630 :
NAME IS NULL :2005/05/07(土) 19:29:20 ID:10rxYhPX
>>625 株価の時系列データは?
CSV形式でダウンロードするフリーウェアもあるみたいだし
>>629 DELETE FROM t1 WHERE num NOT IN (SELECT min(num) FROM t1 GROUP BY name,price HAVING count(*) > 1 OR count(*) = 1);
とかでどうか
632 :
631 :2005/05/07(土) 20:08:49 ID:???
って、、、min が使えりゃ HAVING いらんな、すまん
ありがとう。さっそくやってみます
635 :
NAME IS NULL :2005/05/07(土) 22:00:20 ID:FpscRTiD
636 :
NAME IS NULL :2005/05/07(土) 22:34:34 ID:X72YLO1J
すいません。みなさんノートパソコンでACアダプタ接続して起動さすときは バッテリ入れてます?それともとってます?
>>636 (゚Д゚)ハァ?
入れっ放しでいいよ。
基本的に、AC 駆動の時はバッテリーを外しておいた方がいい。 バッテリーの寿命に影響する。 でも、せっかくの簡易 UPS だし (何回か救われた)、何より面倒だから、俺はつけっぱな。
639 :
NAME IS NULL :2005/05/07(土) 23:25:04 ID:X72YLO1J
UPSってなんですか?(^o^;
充電どーすんの
641 :
NAME IS NULL :2005/05/07(土) 23:26:37 ID:X72YLO1J
そしたらバッテリはずしたままにしてコンセントを出かける時に抜いてもデータとかは消えないんですか?
>>641 消えないけど、何でそんな事をSQLスレで訊くのかと・・・?
基本的にバッテリーは入れっ放しでいいよ。
最近は抜いたら起動出来ない機種も有ったと思うし・・・
>>639 > UPSってなんですか?(^o^;
ググレ。
(つーか、SQL には関係ないけど、コンピュータつながりなんだから UPS ぐらい知っとけと思う。)
>>640 バッテリー使う前に充電するんだろ。
>>641 悪い、SQL や UPS の前に 「 日 本 語 」 を勉強してくれ。
>>642 何を持ってデータは消えないと言ってるの ?
>>641 の日本語はよくわからんが、少なくともシャットダウンについては言及してないから、稼動中かもしれないよ。
それでなくとも、スタンバイモードとかもあるしな。
>>643 >バッテリはずしたままにしてコンセントを出かける時に抜いてもデータとかは消えないんですか?
コンセント抜くんだから稼動中じゃないでしょ?
>>644 常識は通用しない。
質問者の書き込みから義務教育すら修了していないことは明らかだ。
>>645 分かった分かった。
後は君にお任せします。
>>644 普通は稼動中じゃないと思うよ。
ただし、素人さんは何をするかわからない。
>>643 にも書いた通り、スタンバイモードにするならまだ可愛げ
あるが、自分のやりたいこと終わったら「シャットダウンもせずに」
コンセント抜くなんてこともある。
その時も、
>>642 はデータが消えないことを保証できるのか ?
まあ、2ch で保証どうのこうの言うのも野暮だけど、「〜だから○○
だ。」と思い込むのは危険だよ。
>>644 が SQL 使って自分が使う
ソフトしか開発しないならいいけど、他人が使うソフトを開発してる
ならそういう思い込みは極力排除しないとね。
(と、無理やり SQL スレに戻してみる。)
648 :
NAME IS NULL :2005/05/08(日) 00:47:58 ID:bO5JQSSo
おまえらは豚の糞
649 :
NAME IS NULL :2005/05/08(日) 14:25:05 ID:DKFDRvPO
現在存在するテーブルの一覧を表示するにはどうしたらいいんですか?
>>649 SQLではないんじゃないか。コマンドでSHOW TABLESと
クエリ発行すると、結果を返すDBMSもあるけど。
651 :
NAME IS NULL :2005/05/08(日) 15:43:25 ID:UZwAhcDm
mysqlを使っています。 show tables;でできました。
653 :
NAME IS NULL :2005/05/14(土) 15:28:24 ID:g1e6gXQ0
SQLを使う職種や企業でのセクションってどこなんですか? うちの会社では管理部門にいる人間が使ってますが、 そこの人間に、お前VBAしか知らね〜のかよ。 そんなんじゃどこ行っても通用しね〜ぞ。 って言われました。 そんなにSQLって高度な知識を要するんですか?
高度じゃないから、そのぐらい知ってろよって意味でしょうね。
SQLも知らないのかよって言われたわけじゃないでしょ? つうか、VBAしか知らねーのかよと言われて、何でSQLなんだろう・・・ この辺の思考回路がおかしい時点で、確かにヤバイんだろうけど・・・ ちなみに、SQLを使う職種は一般にPGやSEと呼ばれる人間。 素人でも使うことは使うが、データベース(OracleやらSQLServerやらDB2やらMySQLといったもの)を 使う人間。 セクションは関係無い。 管理部門だろうが、開発部門だろうが運用部門だろうが、開発者側の人間で データベースを使うなら必須。 ちなみに、VBAしか知らないと何処行っても通用しないというのは同意。 じゃあ、何なら通用するのか?という疑問は、何処で通用したいかによる。 制御系・汎用機系・Windowsクライアント・Webアプリなどなど色々種類はある。 それぞれによって使う言語は違うし会社によっても違う。 SQLは高度かといえば、全然高度じゃない。 単純にデータベースの簡単な”操作”をするぐらいなら、この業界では”常識”に近いほど。
>>653 業務系システムを開発しているならば、SQLの知識は最低限必要だと思うが?
657 :
NAME IS NULL :2005/05/15(日) 13:34:17 ID:Y/+OVhbH
テーブルA コード 個数 場所 テーブルB ・・・ コード 個数 場所 MSSQLを使用しています。 上記のようなテーブルがあり、 テーブルAの個数、場所を テーブルAのコードと合致する テーブルBの個数、場所を全て テーブルAの個数、場所と同じに更新をさせたいのですが 一度に行う方法はありませんでしょうか? 最初は、テーブルAを一行ずつ更新をかけているときに テーブルBも更新させていました;;
>>657 テーブル構造を見直した方が良いよ・・・
オレもそう思うけど・・・ UPDATE テーブルB SET 個数 = (SELECT 個数 FROM テーブルA WHERE テーブルA.コード = テーブルB.コード) , 場所 = (SELECT 場所 FROM テーブルA WHERE テーブルA.コード = テーブルB.コード); とか
660 :
659 :2005/05/15(日) 14:30:05 ID:???
ああ、↑のに WHERE テーブルA.コード = テーブルB.コード 追加しといてね・・・
661 :
657 :2005/05/15(日) 20:04:14 ID:???
>>658 さん
>>659 さん
レスありがとうございます。
今、出先のため試すことができませんが、やってみます。
併せてテーブル構造の見直しもやってみようと思いますが、
そちらの方は、ちょっと先になるかも・・・
662 :
NAME IS NULL :2005/05/16(月) 21:05:41 ID:XtQXSnJH
アクセス権限について質問です。 ユーザBさんにユーザAさんが作ったオブジェクトしか見られない権限の与えかたってありますか? オブジェクトごとではできてもユーザごとで指定はできるんでしょうか?
初心者なんですが、課題で質問させてください 一つは、学生の属性に関するテーブル、もう一つはサークルの属性に関するテーブルである。 2つのテーブルに収録する項目は、 学籍番号、学生氏名、、所属サークルコード、サークル名、顧問名、サークル代表者の中から選ぶものとする。 同じ項目名を2つのテーブルに含めても良い。サークル代表者という項目には学籍番号を入力する。 学籍番号と所属サークルコードにはアルファベットが含まれる。 2つのテーブルのテーブル名は、「学生テーブル」と「サークルテーブル」とする。 なお、この2つのテーブルを利用した検索例としては、学生テーブルを使って、指定した学籍番号によってある学生を検索し、 その学生が所属しているサークル名、顧問名、代表者コードなどをサークルテーブルを使って検索する、などが想定される。 このときテーブルを作成するためのSQL命令を、テーブルごと記すとどうなるんでしょう?
>>664 初心者じゃない生徒はかわいくないよね。
>>664 OK。
まずは、テーブル作成するSQLというのは後に置いておいて、
作るべきテーブルを具現化しようじゃないか。
学籍番号、学生氏名、、所属サークルコード、サークル名、顧問名、サークル代表者
この項目を使うという事だから、この項目を使って、、「学生テーブル」と「サークルテーブル」を
作ってみなよ。
学生テーブルにはどの項目が入るのか。
サークルテーブルにはどの項目が入るのか。
667 :
664 :2005/05/18(水) 22:55:46 ID:???
なんとかできました。 ありがとうございました。
668 :
NAME IS NULL :2005/05/23(月) 10:48:49 ID:Ofs6lKlO
教えて下さい。 例えば SELECT * FROM ( SELECT 1 AS A, 2 AS B FROM DUMMY UNION ALL SELECT 1 AS A, 2 AS B FROM DUMMY ) AA, ( SELECT 1 AS A1, 3 AS B1 FROM DUMMY UNION ALL SELECT 1 AS A1, 3 AS B1 FROM DUMMY ) BB WHERE AA.A = BB.A1(+) というsqlを実行すると、結果は 1213 1213 1213 1213 となってしまいます。 出来れば AAのもっている2レコード分のみ表示させたいのですが、 どうすればよいでしょうか?
669 :
668 :2005/05/23(月) 10:57:38 ID:Ofs6lKlO
あ、DBはOracle8iです。 よろしくお願いします。
結合しなければいいんじゃないか? 文意からじゃなんで結合した上で、AA側だけ表示したいのか伝わらんよ。
>>668 何をやりたいのかが、さっぱり解らないんだけど、
↓なら2レコードになるだろ。
SELECT * FROM
(
SELECT 1 AS A, 2 AS B FROM DUMMY
UNION ALL
SELECT 2 AS A, 2 AS B FROM DUMMY
) AA,
(
SELECT 1 AS A1, 3 AS B1 FROM DUMMY
UNION ALL
SELECT 2 AS A1, 3 AS B1 FROM DUMMY
) BB
WHERE AA.A = BB.A1(+)
672 :
668 :2005/05/23(月) 11:58:28 ID:Ofs6lKlO
すみません、自分で矛盾に気づきました。 BBでA=1が2レコードある以上デカルトにしかなりえませんね。 お騒がせしました。
質問です。 SQLでSELECT文の結果に対して連番のテーブルをつけるような方法はないですか?
>>673 CREATE TEMP SEQUENCE temp_seq;
SELECT nextval('temp_seq'),* FROM table;
>>673 DBMSによって違うから、何でやってるんか書く。
676 :
NAME IS NULL :2005/05/23(月) 22:32:19 ID:9VqsJki8
下記のSQLで 今はひとつだけですが SELECT句のstaff_master.staffが同じ内容で複数あった場合 一つ目の列にはstaff_masterから日本語名を取得して表示できるのですが 二つ目以降は表示できません(数字だけが出てきます) この場合二つ目以降もstaff_masterにある名称で表示させるには どうすればいいのでしょうか? SELECT staff_master.staff FROM staff_job ,staff_master WHERE staff_job.ID = staff_master.staff
質問です 二つのテーブルをつなげて SQLで一つにまとめて表示するにははどのようなやり方があるのでしょうか? 例えば テーブル1 Name Age Ohita 25 Kakawami 35 テーブル2 Name Age Betto 46 Fujimura 19 という二つのテーブルがあった場合テーブルはいじらずに Name Age Fujimura 19 Ohita 25 Kakawami 35 Betto 46 みたいにしたいのですが教えてください
ゆにおん
unionで
UNIONがいいでしょう
親切なんだか、不親切なんだか良くわからんヤシラが多いな。 MS-ACCESSの場合なら SELECT [テーブル1].[Name], [テーブル1].[Age] FROM テーブル1 UNION SELECT [テーブル2].[Name], [テーブル2].[Age] FROM テーブル2; PostgreSQLなら SELECT "テーブル1"."Name", "テーブル1"."Age" FROM "テーブル1" UNION SELECT "テーブル2"."Name", "テーブル2"."Age" FROM "テーブル2"; 他はしらん。
683 :
NAME IS NULL :2005/05/25(水) 11:36:31 ID:l1ByO6Tv
条件に該当する行の、先頭100行以外をDELETEしたいのですが 1行で書く方法ありますか?
>>683 そこにユニークな項目はあるのかな
あれば、
DELETE FROM table WHERE unique_key IN (SELECT unique_key FROM table ORDER BY xxx LIMIT 100 OFFSET 0)
とかできると思うけど
あ、以外か。NOT IN で・・・
つうか、DBMSに依存するだろ?この手の話題は。 きちんと何でやってるのか書けよ。 でもって、まあたとえそういうSQLがあったとしても使いたくはないわな。 なんか気分悪い。カーソルでループして削除でいいじゃん。
>686 まあそう言うな。 SQLって言われただけで、MS SQL SERVERだと思ってるヤシもいるんだし。
ここは基本的にSQL92なのでは って質問者はそのつもりじゃないか・・
>>686-687 次スレのテンプレに入れた方が良いな。
↓な感じでどうでっしゃろ?
質問する時のルール
1.DBMS名を明記すること
(DBMSによってSQLの体系が微妙に異なり、使用可能な関数も違ってきます。)
2.結果を報告すること
(回答者も自分のアドバイスが有効だったか気になります。)
3.問題が解決したら感謝の気持ちを示すこと
(回答者は質問者の為に時間を割いてくれますし、励みになります。)
>>689 あと、そもそものやりたいことを日本語で書くってのも欲しい。
根本的に間違った考え方をした挙句で、小難しいSQLをどうにかしたいって質問も多いから。
そんなことしなくてもこうで良いじゃん、ってありがちだし。
テーブルのサンプルデータと期待する結果データも揚げてもらった方がいいかな。 文だけだと情報の小出しになったりするし、逆にいきなり長文書かれても読むのマンドクセ。
誰か模範質問してくれるといいんだがw
SQL Server 2000です。教えてください。 自己解決しました。 ありがとうございました
最後、句点がない。減点 - 1 。
ガビーン
DBの設計に関しての初歩的な質問です。お手柔らかに宜しくお願いしま。
過去ログで3値論理を利用した問い合わせの方法を見ました。
>>312-343 やってみたのですが、検索対象のデータにNULLがあるとうまいこと行きませんでした。
考えてみれば当然ですが「NULL = '検索文字列'」はNULL(=not false)なのでヒットしてしまいます。
そこで最初から全カラムをnot nullにし、defaultを全部0や空文字列
にすることを考えました。
CSEなどのクライアントでもNULLと空文字列の見た目が紛らわしいと常々思っていたのもあります。
ネットで「可能な限りnot null制約を」と解説しているサイトもありましたが、
僕は一つ残らずnot nullにしてしまいたい勢いです。
このような設計は一般的に正しいでしょうか。ご助言よろしくお願いします。
↓華麗なスルー
>>696 それで問題がでないなら、
全列NOT NULLなのは、別に悪いことじゃないですよ。
ただ、多くの場合はどこかの表にどうしてもNULLを置いておきたい
(その方が自然な)列ができちゃう場合が多いですけど。
たとえばその数値、未登録と0が入ってることを区別する必要ないんか? あと日付とかも
自然に考えるのが一番かと。 データの項目がある時点で不定ならば正にNULLなわけだし。 その不定っていう状態を、該当なしという状態に割り当てて特別なコードを割り当てることと、NULLってのも微妙にいみが変わる。
そもそも「NULL = '検索文字列'」が思いつくことがおかしい
3値論理の利用は学術的には面白そうだけど、なるほどこういう問題があるのか。
実用的には
>>315 の方法が一番無難そうですね。
>>701 「NULL = '検索文字列'」というのは
「フィールド1 = '検索文字列'」でフィールド1に値としてNULLが
入っていた場合の事だと思うが。
>>697 見事にスルーされてる。
>>698 さん,
>>699 さん
なるほど、だめですね。NULL全排除は止めました。
文字列型では特に問題あるケースが思い当たらないですが、
どちらかというと空文字列のほうを排除したほうがいい気もしてきました。
考え中です。
>>700 さん,
>>701 さん,
>>702 さん
説明べたですみません。702さんのおっしゃる通りです。
今のところ3値論理の活用方法が見出せません。
ありがとうございました。
>>703 3値論理の活用方法が見出せないなら、
逆にNOT NULL制約を活用しておいた方がいいんじゃね。
NULL と 空文字の話が出ていますが・・・。 Oracle って NULL と 空文字を同一 視しませんか? SQL Server は NULL と 空文字を別のものとして扱ってくれるの ですが・・・。Oracle で NULL と 空文字を区別する方法があったら教えてください。
ばあちゃらちゅーをつかわない。
708 :
705 :2005/06/03(金) 22:57:19 ID:???
>>706 ばあちゃらちゅーを使わないって、代わりに何を使えばいいんでしょうか?
ばあちゃらわんですか? ちゃらですか?
そもそも、ばあちゃらちゅーとばあちゃらわんの違いが分かってないんですが。
>>707 3値論理でもてあましてるのに4値だともうついていけないよ。
>>708 びぃろぶとちぃろぶおいときまちぇね
ろぶだといんでっくす貼れなくないですか?
711 :
NAME IS NULL :2005/06/05(日) 12:18:15 ID:B+dEKXSL
質問があります。 TABLE1 (ID, NAME) TABLE2 (ID, COST) というテーブルがあります。 TABLE1は、 1 名称1 2 名称2 TABLE2は、 1 100 1 500 1 200 1 400 1 300 2 600 というデータが入っています。 欲しい結果は ID NAME COST1 COST2 COST3 1 名称1 100 500 200 2 名称2 600 のように、 TABLE1のIDとNAMEに加えて TABLE2のCOSTを最大3つまで表示したものです。 上記の結果を取得する方法はありませんでしょうか。 使用している環境はSQLServerです。 ベンダ依存のSQLでも問題ありません。 どうぞよろしくお願いします。
>>711 定期的にこういう事したいやつ出てくるな…。
SQL で頑張るより、アプリケーション側でやった方がいいと思うが。
あと、三つまでのデータの選択は任意でいいのか ?
つまり、名称1に対して 400,300, 600 でも OK ?
>>712 そこをなんとかお願いします。
アプリ側だと遅いのです。
3つまでのデータの選択は、
偶然検索された上位3件で問題ありません。
よろしくお願いします。
>>713 リレーショナルデータベースの使い方を理解してないね。設計が悪い。
DB側でこねくり回してもコストはかかるよ。遅くなる。
あきらめてテーブル設計をやり直したほうがいい。
私的なDBならテーブル設計変えられるんですけどね。 リレーショナルってこういうことできないんですね。 残念です。
公的なDBにこういう設計持ち込んでるのもどうかと思うぞ。
717 :
711 :2005/06/05(日) 15:16:39 ID:???
DBの設計に問題はないと思いますが。 よくある 受注1−明細多 の場合も同じような設計になると思います。 問題は結果の出力方法にあると思います。 もしくは欲しい結果を生成できないリレーショナルDBにあると思います。
>>717 だから、そういった結果はDBじゃなくて表示するクライアントで制御しろよ。
719 :
711 :2005/06/05(日) 15:30:04 ID:???
長々と付き合っていただきありがとうございました。
>>717 例えば、TEBLE2に明細番号さえ振っていればVIEWを作って結合なんてことができる。
問題は欲しい結果を考慮してないテーブル設計にあると思う。
哀愁漂わせてないで頑張れよ。
>>720 そんな出力にべったり依存した設計もどうかと思うが…。
>>711 最大3つというのはアプリで処理するのが普通。
ただ帳票作成ツールでこの手の帳票を作るのに、
>>711 のようなSQLの
結果を必要としてしまうケースがある。
一時表が使えるデータベースならストアドでカーソル使って順に処理
して結果を返せば対応できる。
帳票ツールの選択を誤ったというのはなしで(笑)
>>711 DBを限定していいなら、再帰SQL(再帰照会)で書けば
SQLだけで実現できそうだけどね。
いや、俺は書けないけどね。
DB限定ならほとんど実装されていなさそうな再帰SQL(RECURSIVE)より OFFSETとLIMITを使ったほうが楽だろ。最大3つと限定されているし。
>>713 >アプリ側だと遅いのです。
TABLE1を1件ずつ読んで、ID毎に毎回TABLE2にクエリーかけてたら遅いのは当たり前。
アプリ側で処理するときは、TABEL1と2を結合してID順にID, NAME, COSTで順次読み込み
IDが切り替わるごとに行換えの処理を行うとDB−>アプリ間のクエリは1回で済む。
RDB以前は普通に見られたコントロールブレイクという手法なのだが、
最近はあまり使わないのだろうか。
COBOLerの本領発揮だなw
最近勉強し始めた者ですが、MySQLのselect文について教えてください select * from テーブル where フィールド like 変数 として 該当フィールドのデータが 「あいうえお」、「あい」 がある時 「あい」を選択したいのに「あいうえお」も選択してしまいます。 「あい」だけを選択したい場合はどう記述したらよいのでしょう?
>>727 マッチングもアプリでやり始めたら真性COBOLerだなw
コントロールブレイクはたまに使うよ。
>>728 where フィールド = 変数 じゃだめ?
MySQLのlikeって 'あい%' としなくても前方一致なのかな?
>>730 素早いレスありがとうございます。
select * from テーブル where フィールド = 変数
とやってみましたが、エラー
select * from テーブル where フィールド == 変数
とやってみましたが、likeの時と同じでした
select文の所で制御するのが間違いなのでしょうか?
「変数」とあるから何かの言語から使ってるのでしょうか? SQL単体だと == なんて構文は存在しないはずなので、 前後のプログラムコードもアップしないと答えは出ない気がします。
>>732 変数はブラウザから
sample.php?hensu=あい
でphpを呼び出しています。引継ぎ先は
select * from テーブル where フィールド like '%hensu%';
のようになっています。
たびたび申し訳ありません。
>>733 sample.php?hensu=あい
と呼び出されたとき、最終的に発行されるSQLが
SELECT * FROM テーブル WHERE フィールド = 'あい';
となるようにPHPのコードを書き直せば桶。
社員とゆー表(社員ID,名前、年収、課ID)と、組織とゆー表(課ID,課名、課長)があって この2つの表から設計課に属する社員の社員IDと名前、課名を知りたい、これをSQLと 関係代数でやれとゆー問題が出たんですが、出来そうで出来ません。どなたか教えて ください。設計課とゆーのは、組織とゆー表の課名の所にあります。お願いします。
>>735 >この2つの表から設計課に属する社員の社員IDと名前、課名を知りたい
課名が知りたいって、設計課で抜き出すんだから、抽出された結果の課名は全部”設計課”じゃ?
>>736 はい、導出表てゆーのはできたんですが、2つの表を使ってSELECTとかFROM
とかでやれってことだと思うんですが、何か順序みたいのがあるのか、それとも
結合とか射影とかを使うものなのかぜんぜんわからないんです。SQLと関係代数で
で記述しろって書いてあるんです。
何がゆーたいのかゆーわからん。
>>737 そうゆー質問はこうゆーところでやるより先生に確認する方が早い。そもそも宿題とゆーのは
自分でやるもので、分からないなら「こうゆー風に考えたけど出来なかった」と解答するのが
正しいあり方とゆーものだ。
ゆー聞いちゃいなよ。
>>738 すいません。うまく言えないのですが、表"社員”と表"組織”から、設計課に属する
社員の、社員IDと名前と課名を知りたい。この問合わせをSQLと関係代数で記述し、
結果を導出表として作成しろってゆー問題なんです。
宿題の提出はいつまでなの?
ゆー答えちゃいなよ。
お前らホント使えねぇな
>>739 そーですね、自分がまちがっておりました。ご指導ありがとうございます。
746 :
NAME IS NULL :2005/06/08(水) 00:25:16 ID:xXW03fha
SELECT 社員.社員ID,社員.名前,組織.課名 FROM 社員とゆー表 社員,組織とゆー表 組織 WHERE 組織.課名 = '設計課' AND 社員.課ID = 組織.課ID
こんなテーブルに対し hoge ( dt date, tm time, data varchar, ); 6/7の12時から6/8の13時までのデータが取りたいと思い select * from hoge where (dt>='2005/6/7' and tm>='12:00') and (dt<='2005/6/8' and tm<='13:00'); としましたが、これでは6/7と6/8の12時から13時のデータの問い合わせになってしまいました。 (select * from hoge where dt>='2005/6/7' and tm>='12:00') intersect (select * from hoge where dt<='2005/6/8' and tm<='13:00'); も同様でした。 このような場合どんなSQLを書くのでしょうか?よろしくお願いします。
>>747 SELECT * FROM hoge
WHERE dt+tm>='2005-6-7 12:00:00' AND dt+tm<= '2005-6-8 13:00:00';
なんで、timestamp型を使わずに別けたんか知らんが、
これじゃdtにインデックスを張ってたとしても効かないね。
749 :
748 :2005/06/08(水) 09:10:59 ID:???
自己ツッコミ 関数作って関数インデックスを張れば桶だ。
750 :
747 :2005/06/08(水) 09:20:44 ID:???
>>748 ありがとうございます。解決しました。
>なんで、timestamp型を使わずに別けたんか知らんが、
日付に関係なく時間のみでデータを引っ張る場合があるのですが、
何かもっとスマートなやりかたがあるかもしれませんね・・・
751 :
748 :2005/06/08(水) 09:43:18 ID:???
>>750 それならtimestamp型にしておいて、時間のみ抜き出すかtime型にキャストするとか。
まぁ、全体の兼ね合いもあるだろうから一概にどうとは言えんが。
うちでもTIMESTAMPでやってたのを不便だから DATE と TIME にわけたものもあるよ かなり扱いやすくなった。
select * from hoge where (dt='2005/6/7' and tm>='12:00') or (dt='2005/6/8' and tm<='13:00') 今回は1日違いなので必要はないが、数日の範囲があるなら次のも追加 or (dt > '2005/6/7' and dt < '2005/6/8') 検索対象のフィールドに関数は使いたくないので、用途によってはDateTime, Date, Timeの3つを 持ってしまうこともあります。 めったに走らない集計処理なら関数で済ますこともありますけど。
754 :
747 :2005/06/08(水) 12:43:28 ID:???
>>751 datetimeでやっといて必要ならキャスト、ならインデックス
はり易そうですね。
>>753 うう、うまくいきました。orでも出来たんだ・・・orz
3値にフィールドを分けてしまうのもよさそうですね。
アドバイスありがとうございました。
755 :
NAME IS NULL :2005/06/08(水) 19:00:16 ID:6vNeS4FX
すいません。初めての書きこみテストです。
さんぺー師匠ならよし
お餅も入ってベタベタと
759 :
NAME IS NULL :2005/06/09(木) 14:12:40 ID:51V8mQh9
SQLの質問の回答をお願いします。 DBはOracle9iです。 Table1,Table2というテーブルが存在し、以下の項目があります。 Table1:hbn bmn sur (Primary:hbn, bmn) Table2:hbn nm mak (Primary:hbn) 以下のレコードが登録されています。 Table1 hbn bmn sur ------------ A 1 10 A 2 1 A 3 5 B 1 5 Table2 hbn nm mak ---------------- A Neji1 MA B Neji2 MA C Neji3 MA この状態の時、以下のように出力を行いたいのですが、どうにも上手く行きません。 Output bmn hbn nm mak sur ----------------------- 1 A Neji1 MA 10 1 B Neji2 MA 5 1 C Meji3 MA 0 2 A Neji1 MA 1 2 B Neji2 MA 0 2 C Neji3 MA 0 3 A Neji1 MA 5 3 B Neji2 MA 0 3 C Neji3 MA 0 現在、方法がわからない為、bmn毎にUNION ALLでhbnを外部結合しています。 1つのSQLで、bmnが今後、4,5,6・・・と増加していく事を想定したSQLが作成したいのです。 ご教授お願い致します。
>ご教授お願い致します。 教授は留守だ、ゼミ生のおいらが答えてやろう。 Table2の結合はあまり意味を持ってないので忘れよう。そうすれば、 A 1 10, A 2 1, A 3 5, B 1 5 を A 1 10, A 2 1, A 3 5 B 1 5, B 2 0, B 3 0 C 1 0, C 2 0, C 3 0 にするにはどうしたらいいかという問題であることがわかる。 自然結合でhbn×bmn演算をしてもよいが、 Table1にSurが0の場合も情報をはじめから保持しておけば簡単に解決する。
>>759 Oracle9iで動くかどうか知らないYO
SELECT T1.*,T2.*,COALESCE(T3.sur,0) FROM
(SELECT DISTINCT bmn FROM Table1)AS T1 CROSS JOIN Table2 AS T2
LEFT JOIN Table1 AS T3 USING(hbn,bmn);
762 :
NAME IS NULL :2005/06/09(木) 15:39:48 ID:51V8mQh9
>760 確かに・・・。そうですね。 一番初めにそういう設計になっていれば悩む必要は皆無でしたか・・・。 しかし、テーブル情報もこれだけではないし、 もう結構大きいシステムになってしまっていますので、 今から、Table2が作成されるタイミングでTable1を作成するという方法は取れません。 (Table1は他のテーブルが更新されるとトリガーで追加・更新される仕組みで、 Table2はhbnが登録されるマスタテーブルです。) >761 出来ました!! SELECT bmn, hbn, nm, mak, COALESCE(sur, 0) FROM (SELECT DISTINCT bmn FROM Table1) T1 CROSS JOIN Table2 T2 LEFT JOIN Table1 T3 USING(hbn, bmn) ORDER BY bmn, hbn で。 FROM句で何をやっているかサッパリ解析出来ませんでした・・・。 調べて、納得出来たら実装しようかと思います。 とてもスマートに完結しているのでビックリです!! ただ、DISTINCTを行っているので、スピードが気になります。 が、出来ないより出来ている方が良いので、あまり気にしない事にします(笑) 有難うございました。 今回の内容に関連するSQLがもう1つあるのですが、 今回の方法の応用で解決出来るかもしれません。 もし解決出来かった際には宜しくお願い致します。
>>762 >FROM句で何をやっているかサッパリ解析出来ませんでした・・・。
760のいってる「自然結合でhbn×bmn演算」をやってるわけだが、
CROSS JOINは理解せずに使うと火を噴くからがんばって理解しよう。
764 :
761 :2005/06/09(木) 16:10:44 ID:???
自然結合と言われるとNATURAL JOINを先に連想してしまう俺がいる(´・ω・`)
まぁ、CROSS JOINを使わずにホスト言語で補完した方がいいことのほうが
いいかもね。
>>762 T1だけ
T1+T2
T1+T2+T3
と順に結果を見ながら足していったらすぐ理解できると思うよ。
私もデカルト積を自然結合と思ってましたよ。 調べてみると、 1.同じフィールド名があった場合にそれで結合する。(SQL92はこっちだそうだ) 2.外部キー制約でリレーションが設定されている場合にそれで結合する。 の2つの意味があるそうで、処理系ごとに実装が違ってそうですね。 2.の方が自然だと思うがどうなんでしょ。
766 :
NAME IS NULL :2005/06/09(木) 17:00:35 ID:51V8mQh9
1.登録されてるbmnを取得。 2.1.の内容全てに対して、全てのTable2情報をぶら下げ。 3.2.の内容で、bmnとhbnがTable1と同一の情報にTable1のレコードを結合。無ければNULL。 みたいな感じですか、きっと。 2.の内容って、テーブルの結合を行わない時になる現象と同じ感じですね。 (理解の仕方がテキトーかもしれませんが) 奥が深いですSQL!! なんとか無事対応出来ました。有難うございます。 >1.同じフィールド名があった場合にそれで結合する。(SQL92はこっちだそうだ) >2.外部キー制約でリレーションが設定されている場合にそれで結合する。 こういったSQLの規約情報?みたいなのって皆さんどこで入手しているんでしょうか? 探せど一向に見つかりません・・・。
mysql4.0.*を使用しています。 hoge ( id INT PRIMARY KEY, person VARCHAR, dttm DATETIME ) こういうテーブルに対し、person毎にdttmが最新のレコードを返すようなSQLを書きたいです。 SELECT MAX(dttm) FROM hoge GROUP BY person; だと最新レコードのIDがわからないのでだめでした。 すごく初歩的な質問かもしれませんが、どう書けば良いのでしょうか?
>>767 SELECT person,max(dttm) FROM hoge GROUP BY person;
769 :
でり :2005/06/09(木) 23:12:45 ID:QHZ69jsO
SQLを始めてみたんですが、ちょっとつまずいています。 質問させてください。 あるテーブルに、AというIDとBというIDがあります。AとBはフィールドです。 この二つのIDは別テーブルのCというIDに紐づいています。 IDには有効期間があり、Cと同じテーブルに定義されています。有効期間には開始日と終了日があり、フィールドで分けられています。 ここからが質問の本題です。 「今日」がAの有効期間内ならAを取得し、Bが有効期間内ならBを取得するSQLがわかりません。 携帯からなので、テーブル定義を示せなくて申し訳ないんですが。。 よろしくお願いします
770 :
でり :2005/06/09(木) 23:16:20 ID:QHZ69jsO
すいません。 書き忘れましたが、DBはPostgresです。 バージョンは8.xです。
>>769 携帯からなので、答えを示せなくて申し訳ないんですが。。
よろしくお願いします
>>734 お礼が遅れましたが、教えていただいてうまく機能するようになりました。
教えていただいたことと、入門書を読み進めていくことで解決できました。
半ばあきらめかかっていたところを最後までやる気にさせていただいた
ことに大変感謝します。ありがとうございました。
773 :
767 :2005/06/10(金) 02:39:17 ID:???
>>768 ありがとうございます。
それだと、personごとの最新dttmはわかりますが、求めたいのは
そのdttmとpersonを持つレコードのidなのです。
>>773 すまん、ボケてた。
SELECT DISTINCT ON (person) person,dttm,id FROM hoge ORDER BY person,dttm DESC;
>>769 他にも方法はありそうだけど、UNIONを使うのがシンプルでは?
select A from テーブル1 inner join テーブル2 on テーブル1.A = テーブル2.C
where テーブル2.開始日 <= 日付 and テーブル2.終了日 >= 日付
union
select B from テーブル1 inner join テーブル2 on テーブル1.B = テーブル2.C
where テーブル2.開始日 <= 日付 and テーブル2.終了日 >= 日付
776 :
767 :2005/06/10(金) 13:14:10 ID:???
>>776 mysqlってLIMITが使えると思うので、DISTINCT ONに近い感覚だと、
SELECT person,(SELECT id FROM hoge WHERE person=T1.person ORDER BY dttm DESC LIMIT 1)AS id FROM hoge AS T1 GROUP BY person;
かな? LIMITの書き方はちょっと違うと思ったけど。↑はPostgreSQL表記
速度的には...
>>776 の方が速いかな。
777(σ゚∀゚)σGets!!
778 :
NAME IS NULL :2005/06/11(土) 22:45:48 ID:1Tj5SFGP
クエリに関する質問です。 |月|支店|売り上げ +−+−−+−−−− |1|東京|10000 |1|大阪|20000 |2|東京|20000 |2|大阪|10000 以上のようなテーブルがあったとして、月ごとに一番売り上げの高かった 支店名を得るようなクエリを、ひとつのSELECTで実装したいのですが、 お知恵をいただけませんでしょうか? 結果は以下のようになるのを想定 しています。 |月|支店|売り上げ +−+−−+−−−− |1|大阪|20000 |2|東京|20000 よろしくお願いします。
一つのselectでは無理。
780 :
778 :2005/06/11(土) 22:52:49 ID:1Tj5SFGP
って書いておいて、もしかしたら
>>767 と同じ問いなのかな、、と思いました。
コレは運がいいかもしれません。ちょっくら実験してみます。
なにかアドバイスありましたら、引き続きよろしくおねがいします!
>>780 基本的に同じだが、同月に同売上で売上トップが2店以上存在することを考えると
冗長気味なSQLになると思うよ。
標準的なSQLだけでもサブクエリを使えば出来そうな気もするが 同率首位の場合どうするかが微妙だ。
783 :
778 :2005/06/12(日) 00:04:45 ID:m0JkroiI
みなさん反応をありがとうございます。
実は実際に扱っているデータは純粋に数値処理のデータで、
お店の売り上げデータとは関係無かったりします。
数千万行のデータでやっているので、なんとしてでも一発のクエリで
処理をしたくて、ここんとこずっと悩んでいました。
>>778 の例だと、普通は
SELECT MAX(売り上げ) 〜略〜 GROUP BY 月
を一時テーブルに入れて、支店名・売り上げでJOINをすればいいのですが
数百〜数千万行の一時テーブルを作るのは現実的ではなく。。とりあえず
VIEWを作ってそれとJOINしていますが、自己JOINは試していませんでした。
あ、サブクエリ試してなかった・・・。 なんか知見が得られたら
報告します。引き続きアドバイスよろしくお願いします。
Viewを重ねたりサブクエリで自己JOINした場合には、この手のクエリは内部的に 中間表が作られると思うから、一時表でもよいのではないだろうか。 どうしてもSQLでスマートに処理できない場合は、時系列でシーケンシャルに 読み込んで処理してみるのも一手だと思う。
>>783 GROUP BY のクエリを走らしても数千万行か。経験無いなw。
数千万行ある元のtableと数百万〜数千万のサブクエリを結合するときに
両方ともソートして結合するような場合は相当なリソースを消費しそうだが。
-- GROUP BY 月 で数千万行になると言うのは例えが悪すぎと言うことで無視して。
インデックスが(month,sales)もしくは逆で作られてて有効に働くと考えて、
先にGROUP BYのサブクエリを実行して、tableとの結合はインデックス検索してくれれば多少は速くなるかな。
SELECT * FROM (SELECT month,max(sales) AS sales FROM table GROUP BY month) AS T1 JOIN table USING(month,sales);
もしくはもっと強引に(同月同売上TOPが複数あったらダメだけど)
SELECT (SELECT office FROM table WHERE month=T1.manth AND sales=T1.sales),*
FROM (SELECT month,max(sales) AS sales FROM table GROUP BY month) AS T1;
とか。
786 :
NAME IS NULL :2005/06/12(日) 22:10:52 ID:jCvHThrw
はじめまして。 SQLについて質問させていただきます。 SELECT 社員名 AS 社員名称 FROM 社員マスタ WHERE 社員名称 = 'A' このSQLをSQL-Serverで実行すると、 列名 '社員名称' は無効です。 と怒られてしまうのですがSQLを始めたばかりで調べても原因がよくわかりません。 どなたか分かる人がいらっしゃいましたら教えてください。 よろしくお願いします。
'社員名称'という列名が無効なんだろうなあ。
SQL始めたばかりで会社の社員マスタとかはいじらん方がいいと思われ。 SELECT 社員名 AS 社員名称 FROM 社員マスタ WHERE 社員名 = 'A'
masterのリストアをするときの方法を教えて下さい。 起動時に「-s」のパラメータ、という記述があったので、プロパティから 追加してみましたが、今度はDBとつながらず…orz
>>789 MS SQL Serverスレの誤爆?
起動パラメータ-s はインスタンス名の変更
-m がシングルユーザーモード起動
791 :
789 :2005/06/13(月) 14:20:49 ID:???
>>791 ここはSQL一般のスレだからMS SQL Server固有の運用にかかわる質問はスレ違いってこと。
Agent止めてる?そいつがシングルユーザーモード唯一のユーザーになってログオンできないのでは。
他から接続がないのが保障できればAgentさえ止めれば通常モードでもリストアできたと思ったけど。
794 :
NAME IS NULL :2005/06/14(火) 10:22:06 ID:FN/Zifsa
SQL Server2000 Developer Editionを購入したのですが、 中に ・SQL Server 2000 Developer Edtion(64bit) ・SQL Server 2000 Developer Edtion 開発用およびテスト用限定版 が入っていたのですが、どちらをインストールすればよいのかわかりません。 違いを教えていただけませんか? 一応開発用のテスト環境にいれるのですが、64bitの方が基本ぽい気がしたもので・・
なんかSQLって言語とSQLServerって製品が違うってことが理解できてないお約束な初心者が連荘してるね。
796 :
794 :2005/06/14(火) 12:04:43 ID:FN/Zifsa
すいません。スレが違うようなので移動します><
>>794 移動したようだけど、一応回答しておく。それらの違いはターゲット OS が
32ビットか 64ビットかという違い。64ビット版も開発とテストにしか
使用できないので注意しとけよ。実運用環境に配備したらアウト。
ここで初めて質問させていただきます。 あるフィールドにおいて、重複したデータを 一つだけにするSQL文ってかけないのでしょうか。 例)ファイル名が重複しないように、 更新日が一番新しいものを取り出す。 もとのテーブル ID、ファイル名、更新日 1,doc01,2000/01/01 2,doc02,2001/03/01 3,doc01,2000/02/01 4,doc03,2001/05/01 5,doc01,2001/02/02 6,doc02,2000/05/02 目的のもの 5,doc01,2001/02/02 2,doc02,2001/03/01 4,doc03,2001/05/01 どうぞよろしくお願い致します。
かけるよ。
>>798 最近の質問はその手の物ばかりだということにはお気づきでしょうか?
3回連続でほとんど同じ質問、、、流行ってるの?
で、答えは?w
そうか、みんな先生が同じなわけか。
SELECT DISTINCT ファイル名,ID,更新日 FROM もとのテーブル
すまん、ボケてた。 SELECT ID,ファイル名,更新日 FROM もとのテーブル WHERE ID IN(SELECT DISTINCT ON(ファイル名)ID FROM もとのテーブル) ORDER BY 更新日
まあ
>>774 だけでいけますけどね。
SELECT DISTINCT ON (ファイル名) ID,ファイル名,更新日 FROM もとのテーブル ORDER BY ファイル名,更新日 DESC;
このスレはDBMSが限定されていない状況で方言使って答えるのはありなのか?
>>807 Accessでやったら、構文エラーが出た。。。
811 :
774 :2005/06/15(水) 23:20:18 ID:???
812 :
NAME IS NULL :2005/06/16(木) 02:11:13 ID:Eqy3o70c
ぽすぐれなんですが、以下のような2つのテーブルがありまして・・・ テーブル hoge =============================================== id fuga_id num =============================================== シーケンス integer integer (PKEY) (※) (NOT NULL) (※)外部キー制約あり(fuga.idを参照) ----------------------------------------------- 1 1 20 2 1 30 3 2 50 4 2 10 5 2 40 6 3 10 7 3 80 8 3 10 9 3 40 =============================================== テーブル fuga =============================================== id city city_kana =============================================== シーケンス varchar varchar (PKEY) ----------------------------------------------- 1 東京 とうきょう 2 名古屋 なごや 3 那覇 なは 4 大阪 おおさか =============================================== 「SELECT fuga_id, SUM(num) FROM hoge GROUP BY fuga_id」なら 1 50 2 100 3 140 となってなにも問題ないのですが、もうちょっと情報をたして、リレーションをたどって、 1 50 東京 とうきょう 2 100 名古屋 なごや 3 140 那覇 なは という結果を得るには、どうすればいいのでしょうか? SELECT fuga_id, SUM(num) , city, city_kana FROM hoge , fuga GROUP BY fuga_id WHERE hoge.fuga_id = fuga.id などとやってもだめでした・・・まぁ、確かに・・・しかし分からず・・・ (なお、この2つのテーブルの間、簡単のために↑こう書きましたが、 ほんとは6つくらいテーブルたどってます・・・。 んー、こういう場合どうかけばいいのでしょうか?) 教えていただければ幸いです。
がむばれ
>>812 適当にMAXでも付けとけば
SELECT fuga_id, SUM(num) , MAX(city), MAX(city_kana)
815 :
812 :2005/06/16(木) 02:26:29 ID:???
>>814 おお、目からうろこ。はじめてしったそのやりかた。
ちなみにそれって定番手法すか?
>>815 俺ならこうするが。
SELECT *,(SELECT SUM(num) FROM hoge WHERE fuga_id=fuga.id) FROM fuga;
大阪まででちゃうけど。
Postgresは使ったことないのだけど、派生テーブルがサポートされている のであれば、こんな感じでできない? SELECT fuga_id, num_total, city, city_kana FROM fuga inner join (SELECT fuga_id, SUM(num) num_total FROM hoge GROUP BY fuga_id) hoge_sub on hoge_sub.fuga_id = fuga.id
こんなんとか SELECT fuga_id, SUM( num ) total_num, city, city_kana FROM hoge LEFT JOIN fuga ON fuga.id = hoge.fuga_id GROUP BY fuga_id
>>817 さんの、
SUM(num) num_total を SUM(num) AS num_total
にかえたら出ますね
oracle8 でエクスポートを速くする方法ってありますようでしょうか? 宜しくお願いします。
>>820 まずすれ違い。
次にマニュアル嫁。
最後に多分EXPORTで行うってのが間違い、バックアップ計画自体の見直しを。
MySQLでSELECT文を投げる時、 「'」を「\'」でエスケープしても、「''」でエスケープしても 結果が返ってきてくれないんだけど、どうしたらいいですか?
824 :
822 :2005/06/17(金) 22:09:15 ID:???
>>822 一通り目を通してみたけど、そこにある書式通りには書いてると思うです。
SELECT * from bb where aa = 'Let''s';
とか
SELECT * from bb where aa = 'Let\'s';
では駄目でした。
>>822 原因がどっちにあるのか判らないとしてもマルチはイヤずら。
826 :
822 :2005/06/17(金) 23:45:20 ID:???
>>825 うぁ、すいませんでした。
向うに書き込んで悩んでる間に、こちらで聞くのが相応しいような気がして
書き込んでしまいました。
板越えでも駄目だったのですね。
申し訳ありませんでした。
結局なにが原因だったのかわかりませんが、解決いたしました。
有難うございました。
板どころか、2ちゃん以外でもマルチはマルチ
質問はしたものの回答に期待なんかできないから 別のスレでも聞いてみるというところがこたえる気を無くさせる
>>826 スレを移るのはかまわないのだが、元のスレにこっちに移ることを書くのが礼儀。
質問スレはあなただけの質問に答える場所じゃなく、
同様の疑問を持った人や質問の内容に興味を持った人たちに向けての場所。
とくに放置した元スレに答えてくれたり興味を持った人に失礼だ。
同様に自己解決したといって内容も言わずに打ち切るのも礼を失する。
830 :
822 :2005/06/21(火) 11:26:12 ID:???
結局、プログラムサイドの全く関係ない部分を修正したら問題解決したので、 自分でも何処が悪かったのか解らなかったんです。 SQLだけを投げた場合も通らなかったので何か問題があったのでしょうが、 実際SQLには手を加えていないので何とも…。 元スレの方にもお礼は言ってまいりました。 向うで欲しい答えが貰えなかったからこちらに書いたのではなく 向うで聞くべきことは向うで、 こちらで聞くべきことはこちらで聞いた方が良いかと思い、 SQLの部分についてはこちらでお伺いしました。 自分でもある程度のことを試した上でどちらが原因か解らなかったので。 結果、同じ内容を聞いている状態になってしまい マルチになってしまったわけですが。 以下謝罪を延々書いてもきりが無いので割愛。 6年間ROMってきます。
831 :
NAME IS NULL :2005/06/21(火) 19:45:56 ID:EM1tOAWr
SQL初心者で申し訳ないのですが、 postgreSQL7.3 FreeBSDの環境でつまっています。 複数語句によるLIKE検索を行う場合以下のSQLだとエラーになってしまいます。 SELECT * FROM hoge WHERE hoge_hoge LIKE "%hoge%" AND "%hoge%" AND検索する場合はどうすればよいのでしょうか?
hoge_hoge LIKE "%hoge%" AND hoge_hoge LIKE "%hoge%"
833 :
NAME IS NULL :2005/06/21(火) 21:36:14 ID:yHhcEPPA
ネットなどでも調べてみたのですが… 営業 品番 成約件数 成約月 というテーブルがあります。 これを営業・品番ごとにまとめて select 営業,品番,sum(成約件数) as 件数 from T group by 営業,品番 とすれば、たとえば ---------------------------------------- 営業 品番 件数 Aさん 品番1 10 Aさん 品番2 20 Aさん 品番3 30 Bさん 品番1 15 Bさん 品番2 25 Bさん 品番3 35 Cさん 品番1 5 Cさん 品番2 6 Cさん 品番3 7 ---------------------------------------- というような結果が得られますが、これを ---------------------------------------- 営業 品番1 品番2 品番3 Aさん 10 20 30 Bさん 15 25 35 Cさん 5 6 7 ---------------------------------------- というような形で得ることはSQLの書き方で実現できるのでしょうか?
DBMSかけと。 ORACLE風でなんとなく SELECT 営業 SUM(数量×DECODE(品番=品目A、1、0)) ・・・ FROM どっかから 要するに、品目AのカラムはAの場合だけ1掛けて、それ以外は0掛けて数量を潰す。 標準のSQLだとCASEかな?
835 :
NAME IS NULL :2005/06/21(火) 22:50:24 ID:H148Fcgg
831です。
>>832 さんありがとうございます。
試してみます!
対戦結果のリザルトを入れるのに良さそうなテーブルないっすか?
838 :
833 :2005/06/22(水) 10:25:29 ID:1PcqlwUc
834さんありがとうございました。 参考にします。
837さんありがとうございました。 参考にします。
すみませんが、教えてください。 テーブル2つあって、どちらのテーブルに存在する行も結果には含めて、 且つ、結合する行は結合させて取得する場合ってSQLはどうなるんでしょう? テーブルA A_C1|A_C2 −−−−−−−−− A1| A2| B1 A3| B3 テーブルB B_C1|B_C2 −−−−−−−−− B1| B2|AAA B3|BBB 取り出したい結果 A_C1|A_C2|B_C1|B_C2 −−−−−−−−−−−−−−−−−−− A1| | | A2| B1| B1| A3| B3| B3| BBB | | B2| AAA お願いします。
841 :
840 :2005/06/22(水) 13:54:45 ID:lIBAhvXC
あ、書き忘れましたがPostgreSQLの7.4.7です。
843 :
NAME IS NULL :2005/06/22(水) 20:20:47 ID:nrsoLKzv
MySQLで select エリア,店名,県名 from tab2 NATURAL JOIN tab1 order by table2.エリアID, 店名 というセレクト文があるのですが。 ここで県名の重複を排除したいのですけど。 DISTINCTを使えばいいのでしょうけど どう表記すればいいのでしょうか?
本当にもう、この質問ばかりだな。
DISTINCTはSELECTの後。 つまり、SELECT DISTINCT 〜
846 :
843 :2005/06/22(水) 21:14:58 ID:nrsoLKzv
>>845 select DISTINCT 県名 エリア,店名,県名 from tab2 NATURAL JOIN tab1 order by table2.エリアID, 店名
って事でしょうか?
試してみたのですが重複のままで表示されてしまいます。
847 :
NAME IS NULL :2005/06/22(水) 22:01:12 ID:Xwpjr34c
店名と県名がN:1の関係になっていませんか? 例えば、西東京店−東京都、東東京店−東京都みたいない。。。 であれば、県名の重複排除は無理だと思いますよ。
848 :
843 :2005/06/22(水) 22:14:57 ID:nrsoLKzv
>>847 店名と県名には同一の名詞は無いんです。
コクヨ-東京都、ヤマハ-静岡県、凸版-東京都って感じです。
…あくまでも例です。
>>848 県名の重複を排除すると、コクヨか凸版どちらかを捨てなきゃならんが、
どうなんだ?
つーか、覚えているだけでもこのスレで3例既出なんだけどな。
850 :
NAME IS NULL :2005/06/22(水) 22:24:57 ID:Xr5H56/Q
ORACLEって、SQL92やSQL99には準拠してないの? ORACLEしか使ったことないんだけど、SQL92のSQLとはだいぶ違うの?
851 :
843 :2005/06/22(水) 22:30:17 ID:nrsoLKzv
>>849 あくまでも例なので
コクヨでもヤマハでも県名が重複した分は排除したいのです。
852 :
NAME IS NULL :2005/06/22(水) 22:45:36 ID:Xwpjr34c
HAVINGを使えばできるかも
853 :
NAME IS NULL :2005/06/22(水) 22:56:18 ID:Xwpjr34c
>>848 MySQL、知らないんだけど、こんなようなことってできない?
select エリア,店名,県名 from tab2 NATURAL JOIN tab1
where 県名 = (select 県名,count(*) from tab1 group by 県名 having count(*) < 2)
>851 使ね
855 :
843 :2005/06/22(水) 23:09:42 ID:???
856 :
NAME IS NULL :2005/06/22(水) 23:23:36 ID:Xwpjr34c
だよね。 select句のcount(*)はいらないかも。 tab1、2の列関係がよくわからないのですよ。
>>851 あのなぁ〜。
どういう基準でどちらを捨てるんだ?
両方とも捨てるのか?
ハッキリ言ってみんな呆れてるぞ。
「みんな」とか言って勝手に不特定多数の名義で腐す奴に ろくなこと言える奴はまずいないな、ホント。
859 :
857 :2005/06/23(木) 00:46:38 ID:???
>>858 つっこまれた本人だけど、正直同意w
ンでも、このスレでGROUP BY後の1行表示は俺も答えたし、
他の人も答えれる人は居る。どういう答えが欲しいのは概ね
分かってんだけど、質問の仕方が中途半端で小出し。
ちょっと遡ればヒントはたくさんある。俺でなくても呆れると思うが。
860 :
840 :2005/06/23(木) 00:48:06 ID:???
>>841 望みどおりのことができました。
ありがとうございました。
>>850 SQL92のスーパーセットである、とのことですのでSQL92の構文であれば使えると
思います。
863 :
質問です :2005/06/23(木) 14:36:36 ID:3shTqTmY
R1(A1,A2,A3)、R2(B1,B2,B3)、R3(A1,B1,C1)の3種類の表の場合には VR(A1,B1,A2,A3,B2,B3,C1)となる表VR。 表R1からデータ1件削除し(このデータのA1の値をaとする) 表R1で削除したデータをVRから削除する(VRからA1='a'の条件でデータを削除) この二つの結果の違いって何ですか? ヒントが削除不整合って言われてもまったくわからないんですが…
865 :
863 :2005/06/23(木) 14:46:41 ID:???
>>864 これはどうこうしたいじゃないのでDBMSに依存することもないだろうし…
>>865 そもそも何がしたくて、何が不具合なの?
元文書は日本語じゃねーよ。
>>850 ANSI SQL準拠の基準がいまだにわからない。
文法や構文が違っていても相当の機能があればよいのか、
それとも規格があいまいで実装で違いが出るのか。
準拠を満たしているといっても普通のプログラム言語の規格のような
ポータビリティは期待できないようだ。
>>867 所詮"準拠"ですから。RS-232C準拠とか
結局は各マシンごとにチェックが必要でしたしね。
>>863 他スレで宿題は・・とあしらわれてた人ですね。なぜ回答がつかないかといえば、
問いの内容をあなたが理解してなくて他の人も理解できないからです。
その設問にはあなたの使ってる教科書か出題者特有の約束事が含まれているよう
に思います。まずは設問を理解して設問の内容を正しく伝えられるように
なってから質問しましょう。
>>870 変なところで改行するね、読んでて気持ちわる〜
>>871 使ってるブラウザや2chビュアーの入力ボックスの幅に依存してるんだろ。
で、宿題は終わったのか?
873 :
NAME IS NULL :2005/06/23(木) 16:29:17 ID:3ZmXJLi2
SELECT行の重複を防ぐのにDISTINCTがあり、 これは行全体なのですが、 ある列のみの重複を防ぐにはどうすればよいでしょうか。 DBはMSDEです。よろしくお願いします
ぐるーぷばい。(なんとなく胡散臭い福岡弁)
また同じ質問。 こうも同じ質問が続くってことはSQLの仕様が腐っているってことか。
「同じ質問が続く」のは質問する香具師が腐ってるから。
877 :
NAME IS NULL :2005/06/23(木) 19:40:16 ID:WtHH1CtQ
データバックアップする方法は?どうやるの?
>>874 ありがとうございます。
同じ質問ですいませんでした
TableA と TableB を ID で結合させて、KEYWORD カラムを空白でつないで 1 カラムとして出力したいのですが、どうすればよいでしょう? 一つの ID に対する TableB のレコード数は不定で、0 件の場合もあります。 よろしくお願いしましゅ。 TableA ID | NAME --------- 1 | エロ 2 | 少しエロ 3 | かなりエロ TableB ID | KEYWORD ------------- 1 | 熟女 1 | SM 1 | パンスト 2 | ロリ 2 | 妹 結果 ID | NAME | KEYWORD ------------------------- 1 | エロ | 熟女 SM パンスト 2 | 少しエロ | ロリ 妹 3 | かなりエロ |
もうさぁ… 始めから「熟女 SM パンスト」って入力しとけば? キー無しにしてまでもレコード分ける根拠は? 結果のKEYWORDの優先順位が不明だね TableB ID毎のKEYWORD数は有限だよな? TableB ID毎の連番項目の追加は×? ピボットテーブルの使用は不可? 不可ならCASE文だな こういうのは自分ならSQLでやらねーけどな
882 :
NAME IS NULL :2005/06/24(金) 14:38:48 ID:QXFZJ7Kt
insertする前にselectしてindexエラーにならないかどうかを 確認する手法っていうのは一般的なのでしょうか? 個人的にはエラーになったのをキャッチしてダメなら 別の処理にまわすという手法をよく使っていたのですが…。
883 :
NAME IS NULL :2005/06/24(金) 14:40:25 ID:CwZSp9tD
>>882 Oracle10gであれば、とても良い方法があるよ。
884 :
NAME IS NULL :2005/06/24(金) 14:48:01 ID:QXFZJ7Kt
>>883 Oracleじゃないです。というか、一般的なプログラミング技法として
どうするのかが知りたいと思ってます
本屋の中の重複のない本の冊数を調べるにはどうしたら良いでしょうか。 SELECT COUNT(*) FROM 本屋 GROUP BY 本の題名 とした場合、1ROWにつき重複された本の冊数が入って全体の重複の無い本の数が分かりません。 同一の本の重複を取り除きたいのでGROUP BYでなくても良いのかもしれませんが思いつきません。。
886 :
885 :2005/06/24(金) 15:10:37 ID:???
大事な事を書き忘れました。mysql4.0なのでサブクエリが使えません。
>>882 通常のトランザクションモードではselectしてからinsertするまでの間に
別のタスクから同じキーのデータが挿入される可能性がある。
シリアライズトランザクションを使えばいいがコストが高い。
だからエラーになったらキャッチでいいんじゃないかな。
あと同じキーがあればupdate、なければinsertといった処理なら、merge文が使える。
merge文がサポートされてなければ、updateして更新件数が0ならばinsert
するようなプロシージャを作る。
888 :
NAME IS NULL :2005/06/24(金) 19:24:19 ID:CwZSp9tD
>>882 DBMSによって違うかもしれないけど・・・、
SELECT ⇒ データ確認 ⇒ INSERT
の方が良いよ。
DBMSのエラー処理はコストが掛かる。
ああ、
>>887 の例もあるから、他セッションが同テーブルを触ってないのを限定ね。
>>887 merge てOracle10g のみで使えるんだよね。
merge 出来るならば、その方が良いし。
>>885 SELECT COUNT(*)
FROM 本屋
GROUP BY 本の題名
having COUNT(*)=1
あとは行数を数えれば
>>887-888 双方のメリットがよくわかりました
ありがとうございました<m(_)m>
MySQLadminがPC起動時に自動的にたちあがりタスクバーに常駐するのを やめさせたいのですが、何か方法ありますか?
スレ違い
すみません
>>889 Oracleなら、
SELECT COUNT(DISTINCT 本の題名)
FROM 本屋
とかも、できましたよね
895 :
885 :2005/06/25(土) 00:06:32 ID:???
やはり総数のカウントはサブクエリか外部でカウントするしかないのですね。。 プログラム側でカウントするか、サブクエリに対応したバージョンにサーバーを変更するか 検討してみます。 どうもありがとうございました。
merge文って9iからじゃなかったか?
897 :
NAME IS NULL :2005/06/29(水) 21:34:19 ID:SVTDoC0K
TABLE A ------- KEY primarykey ELEM1 ELEM2 TABLE B -------- ID primarykey KEY ELEM3 ELEM4 DATE TABLE C -------- ID primarykey ELEM5 次のようなTABLE Aのレコード群を取得するにはどうしたらいいのでしょうか? 1、A.KEYでTABLE Bを引いてそのうちB.DATEが一番最新の奴のB.IDで TABLE Cを引いてC.ELEM5='aaa'なるもの 2、A.KEYでTABLE Bを引いてそのうちB.DATEが一番最新の奴のB.IDで TABLE Cを引いたがCに該当レコードがなかったもの 3、A.KEYでTABLE Bを引いたがTABLE Bに該当レコードがなかったもの 4、1&2&3を満たすようなSQL文は1文で書けるのでしょうか ※3だけはNOT EXISTSを使って簡単にできたのですが。。。よろしくお願いします
1、 SELECT A.KEY ,B.KEY ,B.ID ,B.DATE ,C.ID ,C.ELEM5 FROM A ,B ,C WHERE B.KEY = A.KEY AND B.DATE = (SELECT MAX(DATE) FROM B WHERE KEY = A.KEY) AND C.ID = B.ID AND C.ELEM5 = 'aaa'
...つづき 2、は3が出来れば、できるはず。 4、は全てがTABLE Aに対するOUTER JOINと考えて良いのであれば 可能。
900 :
NAME IS NULL :2005/06/30(木) 11:33:20 ID:PnJiH1Xi
SELECT where の文で 指定のカラムがない場合のエラー画面がでるのですが、 エラーだったら他の処理をさせたいのですが、どのような構文にすればよいのでしょうか? 環境は JSP oracle9i です。 よろしくお願いします。
100%、(SQLの)構文の問題では無いだろ。
>>900 初心者が問題の切り分けができないのは仕方ないだろうな。
SQLではなくてJSPの問題で、JSP のPageディレクティブでエラーページを指定するか、
<%@ page errorPage="error1.jsp" %>
スクリプトレットなら try catch で囲むかする。
これ以上の内容はWEB/JSP関連のところできいてみてね。
>指定のカラムがない場合のエラー なんでそんなもん出るんだよ
ダイナミックにカラムが変わるテーブル・・・
オブジェクト指向DB?
等価結合をWHERE IN を使って書くことは出来ますか?
>>905 単にカラム1から256まで並んでいて、それが動的に役割を変えるだけとか・・・・。
RDBがきちんと広まる前によくあった糞設計だったらありえるよね。
908 :
NAME IS NULL :2005/07/05(火) 16:48:50 ID:ghscICpB
PostgreSQL上で 複数の店舗が同時に使う商品テーブルがあり、構造として 店舗ID、商品ID、商品名。 といった感じになっている物があるのですがこのテーブルから 店舗IDがA、B、Cの商品をそれぞれ10個ずつ取り出す事を SQL一発で出来るでしょうか?
>>908 意味がわからんな。
サンプルデータと期待する結果サンプルも書いたほうがいいと思うよ。
LIMIT付きSELECT文を3つUNIONする感じなんかな?
>909 分りにくくてすいません。以下長くなりますがよろしくお願いします。 やりたいのは以下のような商品テーブルがあり tProd ------------------------------ shop_id | prod_id | prod_name ------------------------------ 1 | 1 | item1 1 | 2 | item2 1 | 3 | item3 2 | 1 | itemA 3 | 4 | item_a 3 | 5 | item_b 4 | 4 | ITEM1a があり、ユーザテーブル tMem ---------------------------- mem_id | shop_id | mem_name ---------------------------- 1 | 1 | aaa 1 | 2 | aaa 1 | 3 | aaa 2 | 4 | bbb mem_id=1 の人が登録している店舗の商品を二つずつ取り出す ------------------------------ shop_id | prod_id | prod_name ------------------------------ 1 | 1 | item1 1 | 2 | item2 2 | 1 | itemA 3 | 4 | item_a 3 | 5 | item_b といった感じの事がしたいのです。出来ますでしょうか?
>>910 ユーザテーブルは置いといて、
各ショップの商品を2点ずつ引っ張り出せるSQLを
書ければいいのだがそれが出来ん(´・ω・`)
それが出来れば後は結合するだけなんだが...
でけた。 条件として、同一ショップ内に同じprod_idを持った商品はなく(当たり前だろうけど) そのprod_idの小さい物から2点を抽出している。 SELECT * FROM (SELECT (SELECT count(*) FROM tprod WHERE prod_id<T1.prod_id AND shop_id = T1.shop_id)AS cnt ,* FROM tProd AS T1) AS T2 WHERE cnt<2 AND EXISTS (SELECT * FROM tMem WHERE shop_id=T2.shop_id AND mem_id=1); なんか無駄が多そうだがw
あ、相関サブクエリはターゲットリストに書かず、WHERE句に書けばいいか。 SELECT * FROM (SELECT * FROM tProd AS T1 WHERE 2>(SELECT count(*) FROM tprod WHERE prod_id<T1.prod_id AND shop_id = T1.shop_id)) AS T2 WHERE EXISTS (SELECT * FROM tMem WHERE shop_id=T2.shop_id AND mem_id=1); 相関サブクエリの2段ループ....(-_-) EXISTS述語を使わずに結合してしまう手もあるがな。
連投スマソ。 SELECT * FROM tProd AS T1 WHERE 2>(SELECT count(*) FROM tprod WHERE prod_id<T1.prod_id AND shop_id = T1.shop_id) AND EXISTS (SELECT * FROM tMem WHERE shop_id=T1.shop_id AND mem_id=1);
select * from チラシの裏
>SELECT * FROM tProd AS T1 >WHERE 2>(SELECT count(*) FROM tprod WHERE prod_id<T1.prod_id AND shop_id = T1.shop_id) このクエリが全く理解できないんだが 頭の悪い俺に説明を頼む 特に >SELECT count(*) FROM tprod WHERE prod_id<T1.prod_id AND shop_id = T1.shop_id ここで何を評価してるのかワケワカラン
prod_id順に連番つけてる。
IN1 a(key) b IN2 a(key) a'(key) c d OUT b(key) c(key) sum(d) 入力はIN1とIN2の2つ。この2つは親子関係にあります。 ここで、IN1から項目bを、IN2から項目Cを取り出して、 (この時のIN1とIN2は、共通のキーaをもつ) b,cをキーとして持つOUTテーブルに、IN2のdの集約値を 反映させたいのです。 いろいろやってみましたが上手くいきません。周囲には SQLに詳しい人もいません。こうしたらいいというヒント をご教授願います。
>914 ありがとうございます。php等からループといった手段を出来れば使わない方向で 出来ないか試案していたのでとても助かりました。
>>918 こーゆーことか?
update OUT set sum_d=_sum_d
from (select b,c,sum(d) as _sum_d from IN1 inner join IN2 on IN1.a=IN2.a
group by b,c) as A where OUT.b=A.b and OUT.c=A.c
921 :
918 :2005/07/07(木) 01:13:34 ID:???
有難うございます。試してみます。
質問です。 以下のテーブルがあるとします。 name data -------------- AAA 1 AAA 0 AAA 1 AAA 1 BBB 1 BBB 1 BBB 0 このとき、以下のテーブルのように、nameでgroup化し、 それぞれのdataの合計数を出力するにはどうすればよいでしょうか。 name 0の数 1の数 -------------------------- AAA 1 3 BBB 2 1 DBはMSDEです。
>>922 MSDEなんて使ったことないから動くかどうか... 動いても列数が増えると大変だな。
SELECT DISTINCT name,
(SELECT count(*) FROM Table WHERE name=T1.name AND data=0) AS 0の数,
(SELECT count(*) FROM Table WHERE name=T1.name AND data=1) AS 1の数
FROM Table AS T1;
>>922 dataカラムが1か0「しか」ないのならこんなのでも行けると思う。
1、0以外もあるのなら、
>>923 の仰せの通りで。
SELECT name,
COUNT(*) - SUM(data) AS '0の数',
SUM(data) AS '1の数'
FROM table1
GROUP BY name
SELECT t1.name, t1.cnt0, t2.cnt2 FROM (SELECT name, COUNT(*) cnt0 FROM table1 WHERE data = 0 GROUP BY name) t1, (SELECT name, COUNT(*) cnt1 FROM table1 WHERE data = 1 GROUP BY name) t2 WHERE t1.name = t2.name という感じのでどうかな?
TABLE_A ID LITTLE BIG --------------------- 001 10 20 002 10 30 003 10 40 TABLE_B CNT ---- 3 4 21 34 こんな2テーブルがあって、 TABLE_Bのいずれかの値が TABLE_AのLITTLEとBIGの 範囲内であるIDを返すように したいのですが (この場合IDの002と003が返る) だれか教えてもらえませんか。 単純なようで難しくて。。
927 :
922 :2005/07/09(土) 23:09:07 ID:???
>>926 SELECT * FROM Table_a AS Ta
WHERE EXISTS (SELECT * FROM Table_b WHERE cnt BETWEEN Ta.little AND Ta.big);
>>926 これで出来ないかな。
SELECT DISTINCT ID
FROM TABLE_A, TABLE_B
WHERE TABLE_B.CNT BETWEEN TABLE_A.LITTLE AND TABLE_A.BIG
てかよく926のやりたいことがわかるな・・・俺全然わかんねえ
>>930 ID=001
10〜20の範囲に、(3,4,21,34)のいずれかが含まれる⇒含まれないのでNG。
ID=002
10〜30の範囲に、(3,4,21,34)のいずれかが含まれる⇒含まれる(21)のでOK。
ID=003
10〜40の範囲に、(3,4,21,34)のいずれかが含まれる⇒含まれる(21,34)のでOK。
なので、002と003を返す。
・・・ってことじゃないかな?
932 :
928 :2005/07/09(土) 23:51:44 ID:???
>>930 やりたいことは俺にもサッパリワカランw
>>928-929 のSQLで合っているのなら、
どういう状況でこんなSQLを使うのかこちらが聞きたいぐらいだw
なんかわからんけど、多分俺ならTABLE_Aは用意しない気がする。
start end でDATE型にして どれに収まるか、というのに置き換えられるかな?
935 :
NAME IS NULL :2005/07/13(水) 01:17:33 ID:lLK5g07m
select nvl(aaa,0) into bbb from ccc と書いたとき、 データが0件だとエラーになってしまいます。 エラーがない時にbbbに0をいれたいのですが どうしたらいいのでしょうか?お願いします。
936 :
NAME IS NULL :2005/07/13(水) 09:25:22 ID:xeA6fKcY
>どういう状況でこんなSQLを使うのかこちらが聞きたいぐらいだw 税額表を引くような処理とかいろいろあるじゃん
会社のネットワークで、 SQL2000サーバーに各端末から.MDBでデータ処理しています。 テーブルのレコードを変更したとき、他ユーザーが開いていますなどと称して、 競合で変更が更新されないことがあります。もちろん競合はない筈でも、この メッセージがでて変更ができないことがあります。 この不具合の原因について、教えていただけないでしょうか。
938 :
928 :2005/07/13(水) 11:47:53 ID:???
>>935 かなり強引。おまけにaaaはユニークで無いとダメだけど、こんなん思いつきました。
SELECT DISTINCT CASE WHEN (SELECT count(*) FROM ccc)>0 THEN aaa ELSE 0 END INTO bbb FROM ccc;
>>936 税額表って範囲が被らなくね。
それとちょっと書き方悪かったかな。
>>926 が示したテーブル構成で
このようなSQLを実行して何が得られるのか、サッパリ思いつかんということで。
まぁ、サンプルテーブルだからそこに無いほかの要素があるのだろうけど。
>>937 スレ違い。
848 名前:NAME IS NULL[] 投稿日:2005/07/13(水) 10:31:59 ID:cwIOx3kC 会社のネットワークで、 SQL2000サーバーに各端末から.MDBでデータ処理しています。 テーブルのレコードを変更したとき、他ユーザーが開いていますなどと称して、 競合で変更が更新されないことがあります。もちろん競合はない筈でも、この メッセージがでて変更ができないことがあります。 この不具合の原因について、教えていただけないでしょうか。 18 名前:NAME IS NULL[] 投稿日:2005/07/12(火) 22:11:06 ID:bmQRX1mO 会社のネットワークで、 SQL2000サーバーに各端末から.MDBでデータ処理しています。 テーブルのレコードを変更したとき、他ユーザーが開いていますなどと称して、 競合で変更が更新されないことがあります。もちろん競合はない筈でも、この メッセージがでて変更ができないことがあります。 この不具合の原因について、分る方いっらしゃいますでしょうか。 探せばもっとこいつの書き込み出てきそうだなw
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < カネネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
954 :
NAME IS NULL :2005/07/13(水) 20:58:19 ID:UecA1U0d
会社のネットワークで、 SQL2000サーバーに各端末から.MDBでデータ処理しています。 テーブルのレコードを変更したとき、他ユーザーが開いていますなどと称して、 競合で変更が更新されないことがあります。もちろん競合はない筈でも、この メッセージがでて変更ができないことがあります。 この不具合の原因について、教えていただけないでしょうか。
>各端末から.MDBでデータ処理しています。 やり方がいくつもあるから具体的に書かないと誰も答えようがない。
956 :
NAME IS NULL :2005/07/13(水) 23:34:57 ID:vwRoK+XR
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < ウルセーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
>>953 ∧ ∧ ┌─────────
( ´ー`) < ザマーミロ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
>>954 ∧ ∧ ┌─────────
( ´ー`) < ウゼーンダヨ、あおってんじゃねえよ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
‖| ‖| ‖| ‖| ‖| ‖| キキキキキキキ━━━━ ∧∧∩ ( )ノ | | 〜 |
‖| ‖| ‖| ‖| ‖| ‖| キキキキキキキ━━━━ ∧∧∩ ( )ノ | | 〜 |
‖| ‖| ‖| ‖| ‖| ‖| キキキキキキキ━━━━ ∧∧∩ ( )ノ | | 〜 |
969 :
935 :2005/07/14(木) 01:08:56 ID:???
>>938 ありがとう。やっぱりなにか工夫が必要なんですねぇ・・・。
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シラネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < カネネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
>>973 ∧ ∧ ┌─────────
( ´ー`) < 早くシネヨ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
∧ ∧ ┌───────── ( ´ー`) < シナネーヨ \ < └───/|──── \.\______// \ / ∪∪ ̄∪∪
>>975 ∧ ∧ ┌─────────
( ´ー`) < 今スグシネヨ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
>>975 ∧ ∧ ┌─────────
( ´ー`) < 早くシネヨ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
>>975 ∧ ∧ ┌─────────
( ´ー`) < イイヨモウ、生ナクテ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
>>975 ∧ ∧ ┌─────────
( ´ー`) < 逝ってヨシ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
>>975 ∧ ∧ ┌─────────
( ´ー`) < 楽ニナレヨ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
>>975 ∧ ∧ ┌─────────
( ´ー`) < ザマーネェゼ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
>>975 ∧ ∧ ┌─────────
( ´ー`) < 1円25銭
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
983 :
NAME IS NULL :2005/07/14(木) 23:06:42 ID:43hA+2Dc
会社のネットワークで、 SQL2000サーバーに各端末から.MDBでデータ処理しています。 テーブルのレコードを変更したとき、他ユーザーが開いていますなどと称して、 競合で変更が更新されないことがあります。もちろん競合はない筈でも、この メッセージがでて変更ができないことがあります。 この不具合の原因について、教えていただけないでしょうか。
984 :
NAME IS NULL :2005/07/15(金) 00:40:15 ID:88XhpiuL
はじめまして、初心者でなにぶんすいませんが、よろしくお願いします。 oracleを使ってまして、以下のことがやりたいです。 Aのテーブルが・・・ A-date hoge 2005/4/30 aaa 2005/1/1 bbb 2004/10/1 ccc 2004/4/1ddd 2003/4/1 eee 2002/4/1fff Bのテーブルが・・・・ B-datecode 2005/1/11 2004/4/12 2002/4/13 とした場合このように抽出したいです。 A-date hoge code 2005/4/30 aaa1 2005/1/1bbb1 2004/10/1 ccc2 2004/4/1ddd2 2003/4/1eee3 2002/4/1fff3 ずっと考えていたのですが、 思うような結果は得られませんでした。 よろしくお願いします。
985 :
NAME IS NULL :2005/07/15(金) 01:01:03 ID:88XhpiuL
>>984です。 すいません。表がずれました。 Aのテーブルが・・・ A-date | hoge −−−−−−−−−−−−−−−− 2005/4/30| aaa 2005/1/1| bbb 2004/10/1 | ccc 2004/4/1| ddd 2003/4/1| eee 2002/4/1| fff Bのテーブルが・・・・ B-date |code −−−−−−−−−−−−−−−− 2005/1/1 |1 2004/4/1 |2 2002/4/1 |3 とした場合このように抽出したいです。 A-date | hoge | code −−−−−−−−−−−−−−−−−−−−−− 2005/4/30| aaa | 1 2005/1/1|bbb | 1 2004/10/1| ccc | 2 2004/4/1|ddd | 2 2003/4/1|eee | 3 2002/4/1|fff | 3 どなたか、よろしくお願いします。
>>985 普通に連結させりゃいいんじゃないのか!?
>>984 SELECT *,(SELECT min(code) FROM table_B WHERE B_date<=A_date) FROM table_A;
>>983 ∧ ∧ ┌─────────
( ´ー`) < 煽りウゼーンダヨ、もう解決したんだよボケ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
>>983 ∧ ∧ ┌─────────
( ´ー`) < 煽りウゼーンダヨ、もう解決したんだよボケ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
>>983 ∧ ∧ ┌─────────
( ´ー`) < 煽りウゼーンダヨ、もう解決したんだよボケ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
>>983 ∧ ∧ ┌─────────
( ´ー`) < 煽りウゼーンダヨ、もう解決したんだよボケ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
>>983 ∧ ∧ ┌─────────
( ´ー`) < 煽りウゼーンダヨ、もう解決したんだよボケ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
>>983 ∧ ∧ ┌─────────
( ´ー`) < 煽りウゼーンダヨ、もう解決したんだよボケ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
>>983 ∧ ∧ ┌─────────
( ´ー`) < 煽りウゼーンダヨ、もう解決したんだよボケ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
>>983 ∧ ∧ ┌─────────
( ´ー`) < 煽りウゼーンダヨ、もう解決したんだよボケ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
996 :
NAME IS NULL :2005/07/15(金) 09:02:48 ID:9lsO3wW+
会社のネットワークで、 SQL2000サーバーに各端末から.MDBでデータ処理しています。 テーブルのレコードを変更したとき、他ユーザーが開いていますなどと称して、 競合で変更が更新されないことがあります。もちろん競合はない筈でも、この メッセージがでて変更ができないことがあります。 この不具合の原因について、教えていただけないでしょうか。
今だ! 997げっと♪  ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ __∧∧__ /\(゚ー゚*) \ (´´ \/| ̄∪ ̄ ̄|\ (´⌒(´ \|____|≡≡≡(´⌒;;;≡≡≡ (´⌒(´⌒;;
ume
999
1000 :
NAME IS NULL :2005/07/15(金) 10:19:52 ID:N7gfngbO
おまんこ女学院
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。