2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

SQL質疑応答スレ Part 2

1 :NAME IS NULL:04/12/15 21:19:15 ID:???
■関連スレ

Oracle 総合 Session2
http://pc5.2ch.net/test/read.cgi/db/1091508494/

MS SQL Server 総合スレ2
http://pc5.2ch.net/test/read.cgi/db/1093012583/

【まだまだ】Microsoft Access クエリ2【使える】
http://pc5.2ch.net/test/read.cgi/db/1089161114/

PostgreSQL & pgsql-jp ML 3テーブル目
http://pc5.2ch.net/test/read.cgi/db/1079771059/

MySQL 総合 Part3
http://pc5.2ch.net/test/read.cgi/db/1096838301/

IBM DB2 スレ
http://pc5.2ch.net/test/read.cgi/db/1057170768/

諸君、私はSybaseが大好きだ【ASE】
http://pc5.2ch.net/test/read.cgi/db/1080536260/


2 :NAME IS NULL:04/12/15 21:42:40 ID:???
早速ですが質問です。
サーバーAとサーバーBに同じレイアウトのテーブルがあって、
サーバーAのデータをサーバーBにインサートしたいのですが、上手いやり方はないでしょうか?

3 :NAME IS NULL:04/12/16 00:30:24 ID:???
>2
 どんな DBMS でも、データのバルクアウト・バルクインをするツールくらいあるだろ。
 サーバAからバルクアウトして、サーバBにファイルを持っていって、バルクインする
だけですむじゃないか。

 レプリケーションならまた別だが。

4 :NAME IS NULL:04/12/16 01:08:05 ID:euThd3sb
>>2
ACCESSで言うところのリンクテーブルをBに作って、Aのテーブルを参照できるようにしたらええよ

5 :NAME IS NULL:04/12/16 13:37:41 ID:???
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指定を追加したり削除する
構文を教えてください。


7 :NAME IS NULL:04/12/16 16:28:30 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪


8 :U ◆CZtFsGiu0c :04/12/16 16:37:48 ID:???
>>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指定を外すのは、なかなか見つからなかったのです。
と言うか、その発言からするに、アナタは全然知らないでしょう。
無駄な煽りレスはやめてください。


12 :NAME IS NULL:04/12/16 18:33:38 ID:???
次の患者さんどうぞ

13 :U ◆CZtFsGiu0c :04/12/16 18:46:50 ID:???
>>11
ALTER TABLE テーブル名 D
NO CAREER

14 :NAME IS NULL:04/12/16 18:48:23 ID:PxuDTuxN
荒れる原因だから、教えてくんには答えない方がいいと思う。
教える方も悪い。

15 :NAME IS NULL:04/12/16 18:50:23 ID:???
>>13
明らかに解ってて釣ってるんだから答えるなよ

16 :NAME IS NULL:04/12/16 18:53:02 ID:x7wdOupz
>>13
どうもありがとうございました。

17 :NAME IS NULL:04/12/16 18:58:04 ID:???
>>10
>>12
>>14
>>15
クズオタクどもめ。氏ね!

>>14
何が教えてくんには答えるなだ。ここは質問スレだぞ。
パソコンから離れたら同僚からいじめられるだきの
ネット弁慶のザコオタの分際で。消えろ。


18 :NAME IS NULL:04/12/16 19:04:24 ID:d6gV77wB
ザコオタ頼りにしてる時点であんたの負けですから! 残 念!!

19 :NAME IS NULL:04/12/16 19:05:17 ID:???
>ここは質問スレだぞ。

じゃあ、質問だけ勝手にすれば?

20 :NAME IS NULL:04/12/16 19:11:12 ID:???
釣られるな。図星だったかと笑われて向こうが増長するだけだぞ。

21 :NAME IS NULL:04/12/16 19:11:50 ID:???
>>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(すいません、バージョンは今わかりません)です

23 :U ◆CZtFsGiu0c :04/12/16 21:30:42 ID:???
>>22
SELECT COUNT(*) FROM (SELECT DISTINCT hoge, fuga, hige FROM foo)
ではどうですか? もっと簡潔にできるのかな。

24 :NAME IS NULL:04/12/17 00:00:08 ID:???
>>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.
今自宅で環境もととのってないためテストできず、気になって眠れず・・・
会社いけばテストできますが・・・

26 :NAME IS NULL:04/12/17 03:34:12 ID:???
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が入ります・・・

27 :NAME IS NULL:04/12/17 03:56:47 ID:???
>>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を書けばよいのでしょうか?
よろしくお願いします。


29 :NAME IS NULL:04/12/17 22:57:03 ID:???
>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

これで解決しました!
(もちっと、キレイにできるかもしれないが)


32 :NAME IS NULL:04/12/18 00:57:16 ID:???
>>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;

33 :NAME IS NULL:04/12/18 02:28:27 ID:???
firebird1.0.3使っています。
コマンドプロンプトで複数行のSQL文を打つ場合
途中で間違えた時(>CONというプロンプトが帰ってくる)に
キャンセルするにはどうしたらいいですか?
Ctrl+Cやったら接続が遮断されてしまいました・・・

34 :NAME IS NULL:04/12/18 14:59:46 ID:???

\c

35 :NAME IS NULL:04/12/18 15:04:26 ID:???
>>33
一般的なSQL構文と異なる、製品に依存するような質問は専用スレで聞いたほうがいいと思うよ。

Firebird関連スレ 
ttp://pc5.2ch.net/test/read.cgi/db/1057050009/l50

36 :NAME IS NULL:04/12/18 20:49:31 ID:???
>>34
できました。ありがとうございます。

37 :NAME IS NULL:04/12/19 21:49:55 ID:J0WodSf9
質問です。
VB6(DAO)で.mdbファイルにテーブルを作成する際、それと同時にフィールドの説明欄への
文字入力を行うためのSQLコマンドは存在するのでしょうか?

過去にどこかで見たような気がするのですが、必要になったとき探してみると見つからなくて…。


38 :NAME IS NULL:04/12/19 23:12:07 ID:???
一般的なSQL構文と異なる、製品に依存するような質問は専用スレで聞いたほうがいいと思うよ。

【まだまだ】Microsoft Access クエリ2【使える】
http://pc5.2ch.net/test/read.cgi/db/1089161114/

39 :NAME IS NULL:04/12/22 18:30:16 ID:???
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 と返したいのですが。
元のテーブルの行数は不定です。

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

40 :NAME IS NULL:04/12/23 00:20:49 ID:???
>>39
SQLで頑張らないでクライアント側で処理するのが吉。

41 :NAME IS NULL:04/12/23 14:30:46 ID:???
環境はOracle9iです。

日次の売上データがあります。
売上データから週次(日〜土)の統計値を抽出したいのです。

抽出したいのは、週ごとの売上の合計値、最大値、最小値、平均値です。

月次では簡単にできたのですが、週次うまくだとできません。
どなたか教えてください。


42 :NAME IS NULL:04/12/23 14:38:15 ID:???
月次を晒せ

43 :NAME IS NULL:04/12/23 15:20:20 ID:???
>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/週次うまくだとできません/週次だとうまくできません/

45 :NAME IS NULL:04/12/23 16:48:06 ID:???
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 とかつけて
演算対象とするのが一般的でしょうか?

わかりづらいかもしれませんがよろしくお願いします。


48 :NAME IS NULL:04/12/24 12:02:42 ID:???
グループ化された結果と商品マスタをJOINする
SELECT 商品マスタ.商品名,a.* FROM 商品マスタ
INNER JOIN (SELECT 商品コード,〜 FROM 売り上げデータ GROUP BY 〜) AS a
ON 商品マスタ.商品コード=a.商品コード

49 :NAME IS NULL:04/12/24 21:33:15 ID:???
>41,46

TRUNCATE(日付,'WW')

という手もあります。書式は間違っているかもしれません。


50 :NAME IS NULL:04/12/27 13:36:35 ID:???
select * from table as a,table as b,table as c
where a.col *= b.colの*=の意味はどう解釈したらよいですか?

51 :NAME IS NULL:04/12/27 14:04:17 ID:???
外部結合と解釈

52 :NAME IS NULL:04/12/27 14:08:02 ID:???
>51
ありがとうございました!

53 :NAME IS NULL:05/01/10 23:12:56 ID:???
Blobカラムに、バイナリデータを書き込みたいのですが
16進数で 5c,5c,27 (\\') というバイトの並びがあると
エラーが出てしまい書き込めません。
どうすればBlobにデータを書き込めるのでしょうか?


54 :NAME IS NULL:05/01/11 00:17:49 ID:???
>>53
DBMSと開発言語、それとDBアクセスに使ってるライブラリを明示しないと
誰も答えようがないぞ

55 :NAME IS NULL:05/01/11 09:37:39 ID:???
Accessのmdbです。
 ┏━━━━━┓  ┏━━━━━━━━┓          
 ┃部品     ┃  ┃品目- 品目_ 再帰 ┃   ┏━━━━━┓ 
 ┃----------┃  ┃----------------┃   ┃部品_1   ┃ 
 ┃部品コード ┠─┨親部品コード    ┃  ┃----------┃ 
 ┃…      ┃  ┃子部品コード    ┠─┨部品コード ┃ 
 ┗━━━━━┛  ┃員数         ┃  ┃…      ┃ 
             ┗━━━━━━━━┛  ┗━━━━━┛ 
                              
のようなリレーションシップになっており、[部品]=[部品_1]なのですが、
これを子部品が無くなるまで展開し尽くして集計するのは、
SQLだけでは無理だとは思うのですが、
具体的にはどのようにやるのが良いのかどうしても結論が出ません。
アドバイスいただけると助かります。

http://pc5.2ch.net/test/read.cgi/db/1057509675/192-

56 :NAME IS NULL:05/01/11 10:08:33 ID:???
>>55
隣接リストモデルの木構造を展開して部品リストを作りたいのだと思うのだけど、
SQLだけだと無理だなぁ。ストアドなどを使ってDBで展開するか、ホスト言語から
再帰的に問い合わせするかどちらかしかない。
ってことで、スレ違いかなー。

新スレに移ってからSQLの質問てあまりないな。

57 :NAME IS NULL:05/01/11 10:11:32 ID:???
>>56
ありがとうございました。

58 :56:05/01/11 10:15:20 ID:???
つっこまれる前に補足
SQL99には再帰的に呼び出すコマンドが追加されていたような希ガス。
DBMSによっては既にあるのかも。
あと、関数なんかで用意されていたりしたりする。

59 :NAME IS NULL:05/01/11 14:38:57 ID:???
ソフトウェア開発技術者試験のためにSQL勉強しなきゃならんのですが
おすすめの本とかある?
午後の試験でいつもSQLで点取り逃してるから勉強しようかと思うんだけど。
将来的にはSQL使わないから、初心者向けのでOKかなぁ

60 :NAME IS NULL:05/01/11 20:25:59 ID:???
>>58
これだな http://www.atmarkit.co.jp/fnetwork/tokusyuu/01sql99/sql99_1b.html

最新DBMSなら再帰SQLが使えるようになってきてるが
mdbじゃどう頑張っても無理な話。AccessVBAで何とかすることになるだろうな。

61 :57:05/01/11 20:47:03 ID:???
データモデリング勉強しても実装力が全然おっつきません。。。(TーT

62 :NAME IS NULL:05/01/11 22:35:09 ID:???
>>59
SQLが一番簡単なわけだが。

63 :NAME IS NULL:05/01/13 15:00:55 ID:???
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

64 :NAME IS NULL:05/01/13 15:03:08 ID:???
表がズレました スイマセン

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

65 :NAME IS NULL:05/01/13 15:11:23 ID:???
結果:
0001 AAAA IIII
0002 BBBB KKKK
0003 CCCC (null)
0004 DDDD (null)
0005 EEEE LLLL

こうなって欲しいんだけど
0003 と 0004が取得できません。
誰か教えてください エロい人

66 :NAME IS NULL:05/01/13 16:00:19 ID:???
Oracleは知らんけど、LEFT(RIGHT) JOIN 使わなきゃ駄目では?

67 :NAME IS NULL:05/01/13 16:58:43 ID:???
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


69 :NAME IS NULL:05/01/13 23:13:24 ID:???
>>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);

--思いつき。なんか冗長な気がしないわけでもない :-)

70 :NAME IS NULL:05/01/13 23:25:44 ID:???
>>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


73 :NAME IS NULL:05/01/14 12:23:02 ID:???
>>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...

76 :NAME IS NULL:05/01/14 15:12:25 ID:???
例えば、以下の構成のようなテーブルがあったときに、

ID AUT
15 片山恭一
11 宮部みゆき
11 我孫子武丸
11 梅原克文
4 京極夏彦

IDの重複しているレコードは無条件で最初の一行のみ選択し、
以下のような結果にしたいのです。

ID AUT
15 片山恭一
11 宮部みゆき
4 京極夏彦

この場合、どのようなSQLを組めばいいのでしょうか?
DBはSQLServerを使用しています。
ご教授お願いいたします。

77 :NAME IS NULL:05/01/14 16:43:10 ID:???
select id, min(aut) as aut from auttable group by id
もし順番が大事なら別のフィールドにシーケンス番号を振らないと保障できないですね。

78 :NAME IS NULL:05/01/14 16:59:48 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文のコメントアウトって
-- コメント
でよかったでしたっけ?

81 :NAME IS NULL:05/01/16 19:00:19 ID:???
そのくらい、いちいち質問するようなことじゃない。

82 :yo-ko:05/01/17 10:23:53 ID:1ElqsyMX
>>74
ですよね。
>>72
のようなことをするには、MySQLのバージョンを上げずには
出来ないのでしょうか?

83 :NAME IS NULL:05/01/18 18:23:58 ID:???
質問させて下さい。

select *
from test
where test.field not in (select 〜)

といったようなSQLがあって
サブクエリの実行結果が一件もヒットしないような条件のとき
これを、

select *
from test
where test.field is not null

と書き換えることは文法的に正しいでしょうか?
宜しくお願いします。

84 :NAME IS NULL:05/01/18 19:36:08 ID:???
>>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です
よろしくお願いいたします

86 :NAME IS NULL:05/01/22 18:54:06 ID:???
>>85
COUNT=COUNT+X

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...
じゃだめなんかと。

91 :NAME IS NULL:05/01/24 11:31:59 ID:???
全くの初心者で恐縮ですが、
number型の長さが10,0ってどういう意味ですか?

92 :NAME IS NULL:05/01/24 13:30:43 ID:???
有効桁数が全体で10桁で、小数点以下は0桁

93 :91:05/01/24 13:52:49 ID:???
>>92
ありがとうございます。助かりました。

94 :92:05/01/24 15:31:29 ID:jIzajTks
>>72
ってMySQL4.0系では出来ないんですかね?
副問い合わせを使わないでSQL文は書けないんですかね?

95 :NAME IS NULL:05/01/24 18:36:15 ID:???
んあ? 92は俺だ

96 :NAME IS NULL:05/01/25 07:38:06 ID:???
出勤と退勤を管理する仕組みを考えているのですが
うまいSQLが書けずに困っております。
お知恵を拝借できないでしょうか?

1.userテーブル
uid ユーザのユニークID
以下ユーザ情報

2.timeテーブル
uid ユーザ情報
date 日付
stime 出勤時間
etime 退勤時間

1.2のテーブルから、A日のユーザの出退勤情報を取得したいのですが、
その際にA日に出勤していないユーザの情報も取得したいと考えています。

先ほどouter joinしたものにwhereで is null かつA日であるもので抽出しても
以前に一度でも出退勤情報があるユーザが抜けてしまいorz...

cronであらかじめ当日分のデータをインサートするのは避けたいので
SQLのみで対応できないでしょうか?

97 :NAME IS NULL:05/01/25 10:51:27 ID:???
>>96
1のUID(+)=2のUIDで結合じゃないの?

98 :NAME IS NULL:05/01/25 12:47:54 ID:???
こんなじゃ駄目なんかな
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で解決できる?テーブル設計で対応しないとだめなのかな?


102 :NAME IS NULL:05/01/25 21:09:16 ID:???
テーブル設計

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
>>100
SQL文をおしえてくだされ。

105 :NAME IS NULL:05/01/26 11:49:50 ID:???
substring

106 :U ◆CZtFsGiu0c :05/01/26 12:19:57 ID:???
>>101
そういう場合は受注テーブルに単価をコピーするか、単価の履歴テーブル
を持つ、といった対応をする。どちらがいいかはケースバイケース。

107 :NAME IS NULL:05/01/26 13:33:24 ID:???
>>106
ですね。
基本的な仕様に合わせて選択するのが良いかと。

(マスターなどが間違っていても)その時点での単価というのを記録する必要がある
=履歴生成時点のデータが絶対の場合は前者、
あとの処理で過去のデータをその時点の情報で生成しなければならないのであれは後者。

だと思う。


108 :NAME IS NULL:05/01/27 15:53:15 ID:kk66tqqq
SQLテクニックの底上げも兼ねて
かんなり勉強させてもらってます。

name(text)
1,山田
1,山本
1,山下
2,小森
2,小林

というテーブルのデータを
1,山田 山本 山下
2,小森 小林
として取得するSQLは書けないでしょうか?


109 :NAME IS NULL:05/01/27 16:12:14 ID:???
ORACLEとかなら、Noに対する名称を全て連結するストアドファンクションを作成して逃げる

SELECT No, Func(No) FROM Hoge

110 :108:05/01/27 16:30:08 ID:kk66tqqq
すいません、環境書いていませんでした。
access2000です。
普通に作る場面ならストアドプロシージャに逃げるのですが
あまりプログラムでがんばりたくない場面なので、
SQLでの対応を模索中です。汎用SQLじゃ無理かな?


111 :NAME IS NULL:05/01/27 21:54:54 ID:???
無理

112 :NAME IS NULL:05/01/27 23:50:31 ID:???
>>110
AccessVBAで頑張ってくれ

113 :NAME IS NULL:05/01/28 01:12:57 ID:???
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 したいのです。。

どなたか御教授お願い致します


114 :NAME IS NULL:05/01/28 03:19:31 ID:???
>>113
rownum あるなら、 distinct はいらんのじゃ?

115 :NAME IS NULL:05/01/28 09:43:03 ID:kFFslgY7
select文where句で属性の違うパラメータを比較するにはどうすればよいでせうか?

116 :NAME IS NULL:05/01/28 09:54:45 ID:???
>>115
まず日本語の勉強を・・・・。
それで判るのはえすぱあですよ。

117 :U ◆CZtFsGiu0c :05/01/28 10:37:20 ID:???
>>113
どういうエラーが出ますか?

>>115
おそらくデータ型の異なるフィールドでの比較ではないかと思うのですが、
だとするとどちらかの型に合わせて変換する必要があるでしょう。

>>116
もし合ってたら、えすぱあに認定してください:-)


118 :NAME IS NULL:05/01/28 11:25:50 ID:kFFslgY7
>>117
あなたはえすぱあです。m(__)m
型にあわせて変換 はどうすればよいのでしょうか?DB2なんですが、いまひとつ方法がみあたりません。
DBをJOINしているのですが、それぞれのキー項目が片方は文字、片方が数字なんです。(T.T)

119 :U ◆CZtFsGiu0c :05/01/28 14:51:17 ID:???
>>118
マニュアルはないの? だったら、
http://publib.boulder.ibm.com/infocenter/db2help/index.jsp
から、参照情報 -> SQL -> 関数で変換関数を探しましょう。

120 :NAME IS NULL:05/01/28 15:11:33 ID:???
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>

121 :NAME IS NULL:05/01/28 15:22:45 ID:???
型は

122 :NAME IS NULL:05/01/28 15:47:39 ID:???
>>120
MySQLは使っていないのだけど、now()のところはシングルクォートて括らなくてもいいんじゃないかな?
TIMESTAMPを返す関数としてじゃなくて、文字列として認識されていそう。
もしくは CURRENT_TIMESTAMP に置き換えてみるとか。

123 :120:05/01/28 18:09:20 ID:???
すいません。列名のあとに型名いれてなかったとですorz

124 :NAME IS NULL:05/01/28 18:46:45 ID:???
>>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」を
すべて抽出したいです。

分かる方がいましたら、ご教授のほど、よろしくお願いいたします。

126 :NAME IS NULL:05/01/30 10:24:24 ID:???
俺はめんどくさいことしたくないので先に三日分の日付を抜き出す。

127 :NAME IS NULL:05/01/30 10:31:20 ID:???
>>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にするにはどうすればいいでしょうか

130 :NAME IS NULL:05/01/30 23:05:21 ID:???
それじゃ、「全く同じ内容」では無いのでは?

131 :NAME IS NULL:05/01/30 23:57:14 ID:???
>>129
何をしたいかよくわからないが、ひょっとして、

INSERT INTO Table1 SELECT * FROM Table2 WHERE user='hoge';
ってことなんだろうか?

132 :NAME IS NULL:05/01/31 00:02:47 ID:??? ?
複雑怪奇なSQLを見たいのですが、どこに行けば見れますか?

133 :NAME IS NULL:05/01/31 03:55:57 ID:J/9Z5Xf2
>>132
開発現場


134 :NAME IS NULL:05/01/31 15:28:31 ID:???
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 |        |
>+-----------------------+----------------+------+-----+----------------+----------------+

のように、デフォルトの値が変わらないのですが、
どこがまちがっているのでしょうか?

135 :NAME IS NULL:05/01/31 15:45:52 ID:???
・デフォルト値は定数でなければならない

136 :NAME IS NULL:05/01/31 15:54:32 ID:???
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 でかえってきます。
何がいけないのでしょうか? アドバイスお願いします。


137 :NAME IS NULL:05/01/31 15:58:25 ID:???
>>136
NULLはイコール比較できないというのは基本ですよ。
CASE文はイコール比較でしょ。

なので、SQLServerは詳しくないんだが、IsNullか何かでチェックじゃないのか?

138 :NAME IS NULL:05/01/31 16:01:47 ID:???
>>136
value = NULLだとNULLかどうかを判定できないのと同じことかと。
value IS NULLでなければダメ。isnull関数を使ってもいいかも。

139 :NAME IS NULL:05/01/31 16:02:42 ID:???
被っちまった。スマン。

140 :136:05/01/31 16:08:35 ID:???
ありがとうございます。

そういう事でしたか…。

ならば、という事で、

CASE (TBL_B.CODE IS NULL)
WHEN ...

と書いてみましたが、これでも駄目でした orz.

isnull 関数を勉強してみます。



141 :NAME IS NULL:05/01/31 16:15:42 ID:???
>>140
CASEの別の構文で

CASE
WHEN TBL.CODE IS NULL THEN 'FALSE'
ELSE ’TRUE'

でいけると思う。SQL鯖で可能かどうかは知らんが。

142 :NAME IS NULL:05/02/01 14:36:13 ID:???
マルチすみません。

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
);

144 :NAME IS NULL:05/02/06 10:46:14 ID:???


>>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
と言われてしまいました。なんでだろう。。。

ちと自分でも調べてみますが、
おわかりでしたら教えていただければ幸いです

146 :NAME IS NULL:05/02/06 12:24:40 ID:???
スマソ

CURRENT_TIMESTAMPでした。
http://www.postgresql.jp/document/pg801doc/html/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT

恥ずかしい...

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つもない場合には
ロックがかからないようでした。

お助けを。


149 :NAME IS NULL:05/02/07 20:34:03 ID:???
SQLによるアクセス手順ってどうゆうこと
なんでしょうか?

150 :NAME IS NULL:05/02/07 23:12:36 ID:nzLj4lY6
本を見ても簡単な例しかなく、SELECT文の原理が良く分かりません。SELECT文を勉強するための良いソースがあったら、教えてちょ。

151 :NAME IS NULL:05/02/08 19:13:58 ID:???
>>148
insertに対して
for updateしてもダメです。(だってfor updateなんだもん)
明示的にテーブルをlockしましょう。
どのモードが良いかはよくわからん。

152 :NAME IS NULL:05/02/09 19:39:51 ID:???
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);
です

154 :NAME IS NULL:05/02/09 20:15:16 ID:???
>>153
SELECT setval('favorite_group_favorite_group_id_seq', 16);

155 :152:05/02/09 21:23:47 ID:???
>>154さん
おお、ありがとうございます。

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

とやっているのですが、うまく逝きません
ご教授願えませんでしょうか?

158 :NAME IS NULL:05/02/10 16:37:22 ID:???
・DBは何か
・うまく逝かないとは何か

159 :NAME IS NULL:05/02/10 17:12:11 ID:???
>>158
DB:Oracle
うまく逝かない:SETがありませんとかなんとか

160 :NAME IS NULL:05/02/10 19:17:21 ID:???
普通に数件のデータを拾うSELECT文で、
WHEREを使わずに一件目のデータのみを抽出する方法はありませんでしょうか?

161 :NAME IS NULL:05/02/10 19:27:22 ID:???
>>160
で、数件の中のどれが一件目なのさ

162 :NAME IS NULL:05/02/10 19:45:21 ID:???
ORDER等をかけずに、
SELECT * FROM TABLE
等と書いた時に出てくる一件目です。
データが入力された順になるのかな?

163 :NAME IS NULL:05/02/10 19:51:54 ID:???
>>157
ACCESSのクエリをそのままOracleに持っていこうとしている感じですな

164 :NAME IS NULL:05/02/10 20:32:50 ID:???
>>162
入力順とかは保証されません。whereを使わないとで一件だけというのは無理。
取り出された行を他の言語で処理する必要があるでしょう。

165 :NAME IS NULL:05/02/10 20:50:02 ID:???
>164
うーん、そうですか・・・どうもです。
では、ORDER BY等をかけて、その一番最初の項目とかでも駄目でしょうか?

166 :NAME IS NULL:05/02/10 21:01:41 ID:???
>>165
ORDER BYで順番を決めたとしてもその一番目の一件だけというのは
where句や他の言語で処理して限定する必要があると思います。

167 :NAME IS NULL:05/02/10 21:08:13 ID:???
DBによってはTOPだのLIMITだのの指定でいけるだしょ。

168 :NAME IS NULL:05/02/10 22:01:01 ID:???
汎用ならカーソルか?

169 :NAME IS NULL:05/02/11 01:32:10 ID:???
>>157
UPDATE A SET A.数値A =
  (SELECT B.数値A FROM B WHERE B.Key = A.Key)
じゃなかったっけ

170 :NAME IS NULL:05/02/11 16:52:02 ID:???
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は、
どう書きましょう?

172 :NAME IS NULL:05/02/13 08:09:28 ID:???
>>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(サブクエリ)は使わないのがふつー。

174 :NAME IS NULL:05/02/14 10:11:44 ID:???
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板の書き込みから移動しました。

177 :NAME IS NULL:05/02/14 18:22:30 ID:???
ネタでも釣りでもなく真面目な質問です。

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 |
----------------------------------
を抽出することです。

179 :NAME IS NULL:05/02/14 21:08:54 ID:???
>>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型にして、数字での比較を行う手法もあるかなと思いました。
有難う御座いました。


181 :NAME IS NULL:05/02/14 21:56:05 ID:???
>>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の教本なのかなぁ・・・。
私の持っていた教本には載っていないし。)


183 :NAME IS NULL:05/02/14 22:36:53 ID:???
>>178
これを他のフィールドの分も書いてunionでくっつけてみたらどう?
select * from table
where x in (select x from table group by x having count(*) > 1)

184 :NAME IS NULL:05/02/14 22:52:24 ID:???
>>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からなのですが、この値はどのように取得すればいいでしょうか?

186 :NAME IS NULL:05/02/15 00:58:32 ID:???
>>178
(9,3,1)は抽出しなくてもいいの?

もし含めるなら、
select * from テーブル T
where exists ( select * from テーブル where x = T.x )
or exists ( select * from テーブル where y = T.y )


187 :NAME IS NULL:05/02/15 01:05:31 ID:???
>>185
まずinsertしろ。
話はそれからだ。

188 :NAME IS NULL:05/02/15 03:35:56 ID:+sDpnfE+
185です。
>> 187
それはわかるのだが、たとえばリレーションしていたとして、
次の挿入IDをinsert前に知りたいのですよ。


189 :NAME IS NULL:05/02/15 09:01:34 ID:???
リレーションだろうがなんだろうがinsert後にわかれば十分だろ。

190 :177:05/02/15 18:01:26 ID:???
>>184

回答ありがとうございます。
ある程度SQLについて理解ができました。

重ねて質問で申し訳ないのですが、
世の中にはいろいろな言語があると思うのですが、
SQLを選択する価値等をご教授いただけますでしょうか。

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

191 :NAME IS NULL:05/02/15 18:09:33 ID:???
>>190
価値っていうか、SQLを使いたくてDBを使うやつはあまりいないと思う。
ふつうはDBを使うためにSQLが必要になるのでは。

192 :NAME IS NULL:05/02/15 18:44:15 ID:???
>>190
>191に同意。SQLは目的じゃなくて手段だということ。

それをふまえてあえて言うならば、現在データを設計、抽出、管理する方法が
SQLが最も普及していること、情報量/サンプルが多いこと(=不明点の解決、トラブルシューティング
が比較的容易なこと)、SQLの基礎を押さえておけば、ある製品から別の製品に移ったときに
応用が利くことがあると思います。
たとえばSQLを一切扱えないRDBMSを扱っている場合、その製品をしきりに持ち上げている人がいるけれども、
結局情報量が足りなかったり、他のRDBMSを扱う段階になったときにスキルがほとんど役に立たずに結局苦労しています。

だけど、MySQL、Oracle、MSSQLなどを扱ったときには、基礎的なSQL文に加え、その製品独自の
機能を覚えなければならないし(これは負担はそう大きくないと思う)、それとは別にクライアントのUI
(Java, HTML, VB, C#, Delphiなど)を構成するための言語を別に覚えなければならないということもある。
FMだけで完結しないから。
これはこれでとても楽しいけどね。



193 :NAME IS NULL:05/02/15 18:46:50 ID:???
>>190
頭でっかちにならずに、適当な環境を作って試せば?
SQL以外のデータ操作ってオブジェクトマッピングとか、昔ならカード型DBとかの操作かな?
そういう選択肢を調べて自分でメリット感じないと、他人に聞いても理解できないよ。

194 :Oracleの質問です:05/02/15 21:58:38 ID:fRJPeq19
いつもお世話になっております。
当方かなりの初心者です。
質問なのですが、
SQLPLUSにて、テーブル定義の表示はDESCコマンドにて行いますが、
カラムのDefaultは表示されません。
すでに定義済みのDefault値を出力するにはどのようにしたら
よいのでしょうか?
宜しくお願いします。


195 :NAME IS NULL:05/02/15 22:11:34 ID:???
a


196 :NAME IS NULL:05/02/16 09:52:18 ID:???
>>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には、全てに値が入っている場合も有れば、どれかにだけしか値が入っていない場合も有る。

よろしくお願いします。




199 :NAME IS NULL:05/02/16 18:08:24 ID:???
>>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

201 :NAME IS NULL:05/02/16 18:20:29 ID:???
  ○|\
 ○| ̄ヒ|_

202 :NAME IS NULL:05/02/16 18:45:37 ID:/Ox5p2pE
>>199 有難うございました。 何とかできそうです。
SELECT 会社1 AS 会社, の様に指定するんですよね。

203 :NAME IS NULL:05/02/17 15:22:56 ID:???
>>192
ある意味それは正しいと思うが、SQLってどうも設計がぼろい
ような気がして好きになれない... DBMS使いたいからしょうが
なく使ってるけどもっとましなの作ってって感じだな。


204 :NAME IS NULL:05/02/17 16:31:56 ID:???
>>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


206 :NAME IS NULL:05/02/17 20:31:15 ID:???
そのパターンなら、分の部分が0のもんだけ取り出せばいいじゃん

207 :NAME IS NULL:05/02/17 21:38:51 ID:/WFLyCYA
>>206
すいません例が悪かったです。
このパターンならそうなんですけど実際には時間はバラバラなんです。

208 :NAME IS NULL:05/02/17 21:54:20 ID:???
んじゃあ、その場合の「一時間ごと」の定義は何なのよ。

209 :NAME IS NULL:05/02/17 22:16:25 ID:???
あるカラムの値を、おのおの同じレコードの別のカラムにコピーしたい、
つまり

a | b
---+----
1 |
2 |
3 |

となっているのを、

a | b
---+----
1 | 1
2 | 2
3 | 3

としたいのですが、a の定義が int, b の定義が varchar になっています。
このような場合、何かうまい方法はありませんでしょうか?

実は、b の値は a と必ずしも同一にする必要はなく、b の中で一意で
あれば OK (例えば重複しないランダム文字列)と言う状態ですので、
そちらの方法でも構いません。

質問の仕方等、まずかったらご指摘下されば幸いです。

210 :NAME IS NULL:05/02/17 22:36:52 ID:???
型変換してSETすればいいじゃん

211 :NAME IS NULL:05/02/17 23:02:00 ID:???
>>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



214 :NAME IS NULL:05/02/18 00:29:05 ID:???
「時」までの部分でグループ化し、各グループで分が最小の物を

215 :205:05/02/18 00:37:35 ID:???
>>214
なるほど。そうやればいいのですね。









ってSQLぜんぜん分からないっす・・・orz
勉強してきます。

216 :NAME IS NULL:05/02/18 09:26:41 ID:???
SQL以前にロジックの部分で、商と余りを上手く使って考えれば?
それをあとはSQLにするだけ。


217 :NAME IS NULL:05/02/18 11:13:14 ID:???
VARCHARで入っている各値の末尾に文字を付け加えたいのですが、
値を取って、付け加えて、格納すると言ったことは可能でしょうか?
>>209をパクらせてもらうと

a | b
----+------
1 | foo
2 | bar



a | b
----+------
1 | foo$
2 | bar$

と言った感じなのですが...


218 :NAME IS NULL:05/02/18 11:18:21 ID:???
可能。

219 :NAME IS NULL:05/02/18 12:02:43 ID:???
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



224 :NAME IS NULL:05/02/20 08:45:44 ID:???
>223
普通にグループ化してやればいいんじゃないのか?

SELECT KEY1,MAX(KEY2),MAX(KEY3)
FROM TABLE
GROUP BY KEY1

225 :NAME IS NULL:05/02/20 08:56:07 ID:???
あ、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てしまってごめんなさい


228 :NAME IS NULL:05/02/20 10:09:37 ID:???
うーん、「||」は単に文字列を結合してるだけだから、それに対応する文法を使えばいけると思います。「&」とかになるのかな?
えーっと、確認すると、
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のようです。これからテストデータを作って検証してみます。
ありがとうございました

231 :NAME IS NULL:05/02/20 15:29:34 ID:???
>>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
自己解決した〜。

カラム名 "編集文"

でした。
ダブルコーテーションがいるのか…。

235 :NAME IS NULL:05/02/24 10:41:51 ID:???
すべてのテーブルにdelete from tabale_nameかtruncate table table_nameを
かけたいのですが構文としてはどうなりますか?
ちなみにDBはSybase11です。
よろしくお願いします

236 :NAME IS NULL:05/02/24 14:03:31 ID:???
素朴な疑問なのですが、convert関数の数値→日付値の変換って、例えば
convert(datetime,36357)だと1999-07-18になりますよね。
これって、内部ではどのような計算が行われてるのでしょうか?
ご教授お願いいたします。


237 :NAME IS NULL:05/02/24 14:28:35 ID:???
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 です。
分かりにくくて申し訳ありませんが、よろしくお願いします。

239 :NAME IS NULL:05/02/24 14:37:47 ID:???
おぉーほんとだ!datediffで計算したら仰る通りの結果が出ました。
お陰様でスッキリしました。ありがとうございました。

240 :NAME IS NULL:05/02/24 15:20:49 ID:???
>>238
select distinct 人物 from 好物,食堂
where
好物.ジャンル=食堂.ジャンル
and
(A食堂='うまい' or B食堂='うまい')


241 :NAME IS NULL:05/02/24 15:43:11 ID:???
階層構造をDBに持たせたい時はどういう風にテーブルデザインすればいいですか?
例えばカテゴリ、サブカテゴリ、サブサブカテゴリとかがある場合とか。

242 :238:05/02/24 15:43:19 ID:x9bV7eQL
>>240
上手くいきました!
ありがとうございます!!!

243 :NAME IS NULL:05/02/24 15:50:42 ID:???
>>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;

・・・とかやってみたのですがダメでした。

245 :NAME IS NULL:05/02/25 02:15:43 ID:???
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);
じゃだめか?
試したことないけど

246 :NAME IS NULL:05/02/25 07:12:52 ID:???
>>245
試したことないけどそれは違うだろ。
それだと全デリのオカーソ。

247 :NAME IS NULL:05/02/25 10:43:30 ID:???
素直にデータ連番もって削除か、一端情報を取ってから削除じゃだめなんか?
または単純に一定期間保持にするとか。
件数で削除となると、1SQLで無理にやるぐらいなら一回削除点を取ったほうがいいと思うが。

248 :246:05/02/25 11:17:48 ID:???
スマソ。脊髄反射してますた。
>>245の上はOKっぽい。下はダメだろうけど。
試して無いがなぁー。


249 :244:05/02/25 11:28:08 ID:???
レスありがとうございます。
>245さんの上のやり方を実験してみます。

250 :NAME IS NULL:05/02/25 15:56:34 ID:???
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
文法あってるかどうかわかんないけど、こういうやり方しかないんですかねぇ


252 :NAME IS NULL:05/02/25 17:08:47 ID:???
>>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って、日付関連の関数がすごい貧弱だ・・・

254 :NAME IS NULL:05/02/25 17:43:09 ID:???
>>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の代替手段はあると思われるけどなぁ。


255 :NAME IS NULL:05/02/25 20:42:39 ID:???
>>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に更新したいのです。

どうか宜しくお願いいたします。



257 :NAME IS NULL:05/03/01 23:58:39 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ビギナー向けに教えてくだ祭

259 :NAME IS NULL:05/03/02 08:33:07 ID:???
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 と同じです。

分かり辛くて申し訳ないです。
更新系の文は部品ごとにばらして不必要列も取得してみてみると分かりやすくなると思います。

262 :NAME IS NULL:05/03/02 11:59:13 ID:???
>>256
同じ質問だからここに合流させときますね。
物凄い勢いで誰かが質問に答えるスッドレから合流っす
http://pc5.2ch.net/test/read.cgi/db/1056977791/644-654

263 :NAME IS NULL:05/03/03 23:59:11 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文作ることはできるのでしょうか.

264 :NAME IS NULL:05/03/04 01:01:43 ID:???
>サブクエリと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

265 :NAME IS NULL:05/03/04 13:04:21 ID:???
UNIONはともかくサブクエリが使えないときついな。
たんすを持ってる顧客を求めるのは簡単だから、not in か not exists
あたりと組み合わせればできるのだが。
サブクエリの代わりにViewを使えってというのは反則?

266 :NAME IS NULL:05/03/04 13:20:44 ID:???
EXCEPTとか

267 :NAME IS NULL:05/03/04 13:31:47 ID:???
面倒なので結合はしてないけど、コレでどうだ。
select 顧客ID from 顧客保持家具テーブル
group by 顧客ID having sum(case 家具ID when 3 then 1 else 0 end) = 0


268 :NAME IS NULL:05/03/04 17:14:57 ID:???
>>267
たんす -> 3
の部分のクエリを省略しちゃいかんな

269 :NAME IS NULL:05/03/04 18:39:35 ID:???
>>268
そこよりも顧客保持家具テーブルにレコードがない顧客の
扱いをつっこまれたらどうしようかと思ってましたよ。
UNIONは無しだけどEXCEPTはありっていうのが解答だったら
それはそれでなんか納得いかないですけどね。

270 :NAME IS NULL:05/03/04 19:31:25 ID:???
>264
 古い MySQL(サブクエリが使えない)だから、だったりして……

271 :NAME IS NULL:05/03/05 15:17:39 ID:???
>>269
MSSQLだと家具IDがNULLでもelseに該当します。ほかの処理系は知りません。
だめな場合もCOALESCE(読み方がわからない)やらを組み合わせれば大丈夫かも。

272 :NAME IS NULL:05/03/05 22:08:38 ID:???
サブクエリーを使わないでというのは納得できないんだが、
↓の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)


274 :NAME IS NULL:05/03/06 12:20:51 ID:???
NOT EXISTS以下がサブクエリじゃんって突っ込みは無しですか?

275 :272:05/03/06 17:34:45 ID:???
>>274
無しです。

サブクエリーが無いSQLは、1のギアしか無いマニュアル車に乗っているようなもんですよ!!(# ゚Д゚)


276 :NAME IS NULL:05/03/06 18:07:19 ID:???
はぁ?

277 :NAME IS NULL:05/03/06 18:13:03 ID:???
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

278 :NAME IS NULL:05/03/06 20:14:33 ID:???
こんだけ、みんなが親身になって考えてくれてるのに、何の反応を示さない恩知らずな>>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一発で打てるんでしょうか。


281 :NAME IS NULL:05/03/07 20:20:51 ID:???
日本語を学んでから出直せ

282 :NAME IS NULL:05/03/07 21:56:01 ID:???
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

こんな感じです。関数を使えるのでしょうか?


284 :NAME IS NULL:05/03/08 00:06:52 ID:???
mid()

285 :NAME IS NULL:05/03/08 01:31:13 ID:???
>>280
select (distinct AGE) from ...
そんなことよりGROUP BY の使い方が気になる。こういう使い方ってできるの?
>group by 1

286 :NAME IS NULL:05/03/08 09:13:23 ID:???
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
サブクエリャー!

289 :NAME IS NULL:05/03/08 16:40:32 ID:???
>>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したのか?

290 :NAME IS NULL:05/03/08 22:47:47 ID:???
テーブルの制約を追加・削除するとき、alter table文で制約名を指定しますが、
表の作成時に列制約で指定した制約では制約名が指定されていません。
この場合、制約の追加や削除はどのように行うのでしょうか。
特に、not null制約の場合は列制約のみでしか指定できないので、
どのように削除すればよいのでしょうか。お願いします。


291 :NAME IS NULL:05/03/09 09:46:57 ID:???
>>290
DBMS依存する可能性のある話はDBMSをきちんと書く。

で、削除って考えないで打ち消すような制約をかければいいんじゃないのか?

292 :258:05/03/09 16:24:45 ID:yL4n2lnv
以下のようなことを「SQL文のみ」で行いたいのですが、
どなたかご教授のほどお願い致します。

下記のような文字列があるとします。
aaa1bbb2ccc3ddd4
それを
1234
にしたいのです。

要するに数字だけを抜き出したいのですが
できますでしょうか。

oracle9iです。

293 :NAME IS NULL:05/03/09 16:37:10 ID:???
>>292
超無責任モードですが、正規表現でできないか?
REGEXP_REPLACEあたりで、数字以外を痴漢してしまう。


294 :292:05/03/09 16:45:50 ID:yL4n2lnv
>>293
早速のご回答ありがとうございます。
しかし残念ながらREGEXPなんとかはoracle10gからの機能のようです。
できそうだったのに悔しいです。
oracle9iです、すいません。

295 :NAME IS NULL:05/03/09 17:06:56 ID:???
>>292
translate('aaa1bbb2ccc3ddd4','acbdefg....','');
oracleにtranslateがあるかどうか知らんが。
あと、除外する文字にマルチバイトが出てくると現実的じゃないがな。

296 :NAME IS NULL:05/03/09 17:07:54 ID:???
>>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文字づつ順に切り出して数字だったら出力用変数に連結、それ以外は捨て。



300 :NAME IS NULL:05/03/09 23:05:17 ID:???
>298
検証するPL作るの面倒くさい?

301 :NAME IS NULL:05/03/10 00:28:36 ID:3kehkfpX
うちの会社のSEに
オラクルで、データ型がCLOBのフィールドに対して
LIKEで検索出来ないって言われたんですけどマジですか?

うちの会社のSEがヘボなのかオラクルがヘボなのか
どなたか教えてくださいm(__)m

302 :NAME IS NULL:05/03/10 00:41:11 ID:???
アゲちゃいました。。
本当は自分で検証したくて、オラクルのHPで
お試し版をダウンロードしようとしたら、3営業日かかると言われたので、
こちらで質問させてもらいました。
#なんて大名商売な会社なんだよ。。。
似たようなことは、BorlandのInterbaseってDBでも出来ることなんで
天下のオラクルで出来ないはずはない、、はず、、ですよね?

303 :301-302:05/03/10 00:59:00 ID:???
3営業日かかるって言われたのはうそでした。
一旦、ブラウザ閉じて、接続し直したらお試し版ダウンロードまでたどり着けました
でも、600Mのファイルをダウンロードなんて、、、、無理です。ゴメンナサイ

どなたかCLOBのフィールドに対してLIKE検索の可否を教えて下さい〜

304 :NAME IS NULL:05/03/10 01:14:22 ID:???
オラクルスレで聞けばいいんじゃないかな?

305 :301-302:05/03/10 01:23:40 ID:???
>>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|
+--------------+

308 :NAME IS NULL:05/03/10 21:44:00 ID:???
>>307
FULL OUTER JOIN


309 :NAME IS NULL:05/03/11 00:57:19 ID:???
外部結合という用語の定義に関して質問があります。
外部結合の左外部結合と右外部結合に関して、大多数の本には、
SELECT文のJOIN句の前(左側)に書くテーブルを優先するのが左外部結合、
SELECT文のJOIN句の後(右側)に書くテーブルを優先するのが右外部結合、
と説明されています。ところが、ある一部の本では、一対多のリレーションシップを
設定した場合に、一側のテーブルを優先する場合が左外部結合、多側の
テーブルを優先する場合が右外部結合と書かれています。
いったいどちらの定義が正しいのでしょうか?


310 :NAME IS NULL:05/03/11 10:15:31 ID:???
前者の説明で正しい。リレーションと外部結合は直接関係はない。
おそらく後者の言いたいことは一対多のリレーション関係を持つテーブルを結合する
場合は、一 left join 多 として結合することが多いということでしょう。

311 :NAME IS NULL:05/03/11 12:24:23 ID:???
>>310
わかりました。ありがとうございます。

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 自体について一番詳しい方が来られるのはここだと思って,書かせていただき
ました.ご意見,ご批判などを伺いたいと思います.


315 :NAME IS NULL:05/03/12 10:30:54 ID:???
同じものを2回ずつ指定するのがスマートじゃないがベンダー依存の部分を排除するとこんな感じ。
WHERE (user_id = ? OR ? IS NULL) AND (profession = ? OR ? IS NULL)
AND (age >= ? OR ? IS NULL) AND (age < ? OR ? IS NULL)

316 :NAME IS NULL:05/03/12 11:11:54 ID:???
これはちょっと面白いねえ。PreparedStatement は面倒なんで試してないけど、
普通のsqlで書いてみると、age < NULL みたいにNULLを指定した条件は確かに
無視されるよ。仕組みは良くわかんないけど。

>>315
ベンダ依存なの?これってSQL92だと思うんだが。


317 :NAME IS NULL:05/03/12 11:12:02 ID:???
>>313
user_idが5であとがnullだったら全件ヒットしない?

318 :NAME IS NULL:05/03/12 11:25:55 ID:???
>>316
おまいの使ってるDBMSはなんだ?少なくともOracle9では動かんぞ.
まあOracleは,結構特殊だったりするけど.


319 :NAME IS NULL:05/03/12 11:34:15 ID:???
BOOLEAN値はSQL99あたりからだったかな?
そのせいでまだサポートしてなかったりシノニムで済ませてる処理系が多い。
ただ IS [NOT] [FALSE|TRUE|UNKNOWN]はpostgreSQL独自だと思ったけど。

320 :316:05/03/12 11:36:49 ID:???
>>318
俺は PostgreSQL7.3だけど、Oracleで動かないのかよ、これ。まいったな。
どうみても基本的な構文じゃないか。


321 :NAME IS NULL:05/03/12 11:53:10 ID:???
>>319
Boolean 型は確かに,SQL99 からだ.
http://www.atmarkit.co.jp/fnetwork/tokusyuu/01sql99/sql99_1a.html

しかし,IS [NOT] (TRUE | FALSE | UNKNOWN) は,それとは関係無く SQL92 だ.
『プログラマのためのSQL(第2版)』第11章「評価述語」に,そう説明がある.
PostgreSQL 独自拡張ではない.


322 :NAME IS NULL:05/03/12 12:09:15 ID:???
>>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

いけるかも。ありがたく使わせていただきま。

323 :NAME IS NULL:05/03/12 12:29:50 ID:???
>>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
何故「そのままいただいちゃうとまずい」のかご教示いただきたく。

325 :NAME IS NULL:05/03/12 12:51:50 ID:???
>>324
すまん、俺が間違ってた。
false and unknown は falseだからいいのか。
false and unknown を unknownと勘違いしてました。

326 :312-314:05/03/12 14:02:59 ID:???
いろいろなご意見,ありがとうございます.
見慣れない構文なので,受け入れていただけるかどうか不安でしたが,
ご理解いただけたみたいで,大変ありがたいです.

私が今回の SQL に込めたかった主張は
「もっと積極的に,NULL と3値論理を使おうよ」ということです.

NULL の危険性を理解せずに,カラムに NOT NULL 制約をつけないのは論外
ですが,NULL を目の敵のように排除して,2値論理だけしか扱わないのも,
もったいないと思うのです.3値論理はそんなに難しいものではありませんし,
2値論理にはない便利さがあるのですから.


327 :312-314:05/03/12 14:05:37 ID:???
(   ) 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


328 :312-314:05/03/12 14:07:38 ID:???
上の SQL は,パフォーマンスは確かめてないので,自己責任で試してくだちい.

もう一つ,私の込めた主張は,
「ベンダはちゃんと,IS [NOT] (TRUE | FALSE | UNKNOWN) をサポートしてよ」
ということです.これがないと,3値論理をきちんと使えませんから.

私が試したのは Oracle9, MySQL4.1, PostgreSQL7.4 ですが,PostgreSQL しか
サポートしていませんでした.こんなに便利なのに,なんとも残念です.

とくにOracle! 再帰的SQL まで用意しているくせに,IS TRUE どころか USING
すら満足に動かぬ.優先順位というものがあるのじゃないかと思うのだけど.

他の DBMS はどうなんだろう?SQL-Server, Firebird なんかをお使いの方は
おられませんか?


329 :312-314:05/03/12 14:30:01 ID:???
PostgreSQL と Struts をお使いの方にだけ補足.

・PreparedStateMent に setInt すると,NULL を代入できません.
だから,数値も setString してやる必要があります.
この場合,比較が文字列比較になってしまいますから,きちんと数字で比較
されるよう,セットされた値をキャストしてやる必要があります.

age < ?::INTEGER

・空欄なら NULL をセットするようにするには,ActionFormBean の getter に
細工をしてやるのが便利です.

public String getAge() {
  return "".equals(this.age) ? null : this.age;
}

しばらくこのスレを離れます.次に来るのは遅くなるかもしれません.


330 :NAME IS NULL:05/03/12 15:30:05 ID:???
>>329
>PreparedStateMent に setInt すると,NULL を代入できません.
>だから,数値も setString してやる必要があります.
>この場合,比較が文字列比較になってしまいますから,きちんと数字で比較
>されるよう,セットされた値をキャストしてやる必要があります.

確実に遅くなるじゃん

331 :NAME IS NULL:05/03/12 15:37:48 ID:???
まあ何だANSI SQLはエスペラント語みたいなもんだな。
もっと下世話な例ではビデ倫みたいなのもで○○不可が売りになる。
>>329
PostgreSQLはよくわからなけどPreparedStatement#setNullじゃだめ?

332 :NAME IS NULL:05/03/12 18:11:45 ID:???
>>331
if 文を使いたくないから,この構文を導入したのに,値があるかどうかで
setInt() と setNull() をif文で切り替えるんなら,あんまり意味なくない?


333 :NAME IS NULL:05/03/12 19:16:02 ID:???
>>332
ActionFormはどっちにしろ文字型だからどうでもいいのですが、
PreparedStatementで数値の項目にsetStringするのはどうかといいたいのです。
暗黙に文字から数値の変換はやってくれてるようだけど、
これはベンダー依存ではないかといいたいわけです。
JDBCが仕様的にこの手の変換をサポートしてるならかまわないだけれどね。

334 :NAME IS NULL:05/03/12 20:24:07 ID:???
>>332
それもあるけど、問題なのは条件によってSQLを動的生成するのではなく
PreparedStatementを使いたいということらしいので
そこくらいはどうとでもなるだろう。
何ならnullかどうか判断してsetIntかsetNullか必要な方を使うメソッドでも作れば良いだけだし

335 :NAME IS NULL:05/03/13 03:03:25 ID:4M7LWvrN
ttp://www.ashisuto.co.jp/magazine/topic.php?A=17&B=183
この記事の中段下付近に CREATE VIEW と CREATE INDEX は置き換え可能
みたいなことが書かれているのですが今ひとつ理解できません。
どなたか解説してもらえないでしょうか?

336 :NAME IS NULL:05/03/13 03:52:20 ID:???
>>335
読んだけど全体的に何のことやらさっぱりだね。
何度か読み直して一部がなんとなく理解できる程度。

「理解できないのはあなたがバカだから私の提案する方法にしなさい」

って言われている気がしてきた。まぁ、それはそれでいいんだけどさ
◆本物のデータを集める◆の実例のところは一理あるかも知れんけど、
ニワトリとタマゴ的な問題で、一方の考え方を押し付けた感じがする。

スレ違いな反応でスマソ


337 :NAME IS NULL:05/03/13 10:35:50 ID:???
>>335
「抜粋・収録したものです」ってあるからライターの力量の欠如と見た。
アシストは汎用機向けのツールもつくってるから聴衆は汎用機の顧客で管理者クラスと思える。
特にVIEWをはじめ幾つかの用語がこの聴衆にわかりやすくするためにある前提で語られていて
一般的な用法ではないと思われるが、この要約ではその説明が省略されているように思える。
内容をよく理解せず抜粋して飛び飛びで文章をつないだ感じだ。

338 :NAME IS NULL:05/03/13 12:13:21 ID:???
>>335
T字形のおっさんだな。ここを読むと理解の助けになるかも。
ttp://www.sdi-net.co.jp/news-index01.htm
もともと癖の強い主張をしているだけあって、読んでも理解できない
部分もあるが。

「トラヴァーサル・テーブル」の項を読むと、最適化が弱かった時代の
古いRDBMSを相手に話しているのがわかる。

339 :NAME IS NULL:05/03/13 21:33:07 ID:???
>古いRDBMSを相手に話しているのがわかる。
納得しました。

340 :NAME IS NULL:05/03/14 09:31:44 ID:???
>>335
この部分だけ読むと意味不明だよな。
>>338さんの書いてるT型ER図ってのをすこし齧らんとわからん。

で、一応は理想的に最適化されたテーブルでは、その通りだとは思う。
あと、実装面でもクラスタ化されたIndexであれば実表参照しないので、=View実装とはなる。
しかも、Viewとちがって扱いやすいし早い。
(最近はViewに対するIndexとかあるからまた別な気もするが・・・。)

341 :312-314:05/03/14 11:03:36 ID:???
大変遅くなりました.少しだけ補足.

>>333
指摘はもっともですが,おっしゃっている内容は,実際と逆です.
PostgreSQL は String をセットされた場合,数値型に型変換はしません.
?::INTEGER は見慣れない構文ですが,これは Integer 型への明示的な
キャストです.PostgreSQL 専用の構文ですので,他のDBをお使いの方は
わかりづらかったかもしれません.

>>334
私の今回のプロジェクトは,あまり速度を必要としなかったので
記述の簡単さを考えてこのような書き方にしましたが,速度を考えた場合,
おっしゃる通り新しい関数を作って,それを実装した PreparedStatement の
子クラスを作るか,setBigDecimal() を使うかした方が良いでしょうね.


342 :312-314:05/03/14 11:56:56 ID:???
実は,私はあまり,実装の細かいところの話をするつもりはあまりなくて,
NULL と UNKNOWN を積極的に使うことによって,従来出来なかったことが
いろいろ出来るようになる,という話で盛り上がりたいと思っていたの
です.

残念ながら,それは私の力不足でうまく行かなかったようです.どうも,
私の出した例が,いずれもあまり説得的でなかったようですね.

私の例にとらわれず,今後どなたかがとても面白い利用法を思いつかれる
ことを期待します.

では,失礼します.

343 :NAME IS NULL:05/03/14 12:25:05 ID:???
>>342
奇しくも>>338のT字形のおっさんによればnull値は使うなってことになってる。

↓ここの十戒の(7)
ttp://www.sdi-net.co.jp/waseda-ext-note-20041203.htm

344 :NAME IS NULL:05/03/14 12:36:45 ID:???
T字形のおっさん(なんかこの呼称で定着しそうだが)の理論は個性的で面白いのだが、
おっさんの脳内にあるRDBMSの実装は相当古そうだから、具体的にこうすべし
こうするべからず的な部分はバイアスかけたほうがよさそうだぞ。

345 :NAME IS NULL:05/03/14 13:07:47 ID:???
まあ、設計手法は色々勉強しておいたほうがよいとは思う。
T字形を妄信するのもあれだが、いろんなエッセンスは自分で吸収すべき。
温故知新ってこともあるし、今でも通用する部分もあるし。

346 :NAME IS NULL:05/03/14 13:40:20 ID:???
標準化されたSQL使っててもDBMSによって最適化手法が
まったく異なるってのは罪だよなぁ。

347 :NAME IS NULL:05/03/14 15:15:04 ID:???
でもさ、基本的な考え方は同じでしょ?
基本は兎に角HDDアクセスさせないこと。


348 :NAME IS NULL:05/03/14 16:20:15 ID:???
DBMS毎に >HDDアクセスさせない SQLの書き方が異なるから困っとるっちゅうねん。

349 :NAME IS NULL:05/03/14 18:48:33 ID:???
それはSQLの書き方の問題か?
そもそもの設計レベルで大半は決まるものだと思うが。
SQLはその結果にすぎず、そこであまりにテクニカルなことしてるのは、設計が糞なだけ。

350 :NAME IS NULL:05/03/14 19:27:20 ID:???
DBMS毎に最適な設計が異なるから困っとるっちゅうねん。

351 :NAME IS NULL:05/03/14 19:55:01 ID:mCTqLZDk
・商品テーブル
商品コード、商品名、区分名
・テーブル1月
商品コード、商品名、売上
・テーブル2月
商品コード、商品名、売上
・テーブル3月
商品コード、商品名、売上

以上のテーブルで、3か月間の総売上数をだして、
区分別に並べ替えて、
それを売上が多い順に並べ替えかえるには
どんなSQL文になりますか?
商品コードでリレーション組んだらでいろいろしたんですが、
Error 3258がでる。。。どなたかお助けください。
ちなみに環境はAccess2003です。

352 :NAME IS NULL:05/03/14 20:24:01 ID:???
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

353 :NAME IS NULL:05/03/14 20:27:47 ID:???
Access使いはなぜか1月・2月・3月テーブルという分け方するやつらが多いな。
ビジュアルな環境で限られたデータを相手にするにはこっちのほうがわかりやすいのだろうか?

354 :NAME IS NULL:05/03/14 20:37:38 ID:???
>>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が欠けてしまいます。
正常に読み出しできる方法を教えていただけないでしょうか。

358 :NAME IS NULL:05/03/15 18:27:03 ID:???
>>357
それはJSPの表示の問題かと。javaの機能をそのまま使うならDecimalFormat、
JSTLならfmt:formatNumberをつかってね。

359 :NAME IS NULL:05/03/15 18:46:47 ID:???
数値のフォーマットをOracle側で処理したいなら
select TO_CHAR(数値フィールド, '990.99') from ...
これでNUMBER型から文字型に変わったので、java側でgetDoubleでなく
getStringで読み出すとよい。

360 :NAME IS NULL:05/03/15 20:15:15 ID:???
質問です。
オラクルにて、SQLで接続しているサーバーやユーザー名を表示することってできますか?
それと、テーブルの最終更新日等をSQLで表示することはできますか?

361 :NAME IS NULL:05/03/17 15:54:50 ID:uwK64/SN
初歩的なもので申し訳ないのですが質問させてください。

ttp://www.kogures.com/hitoshi/webtext/db-access-select/index.html
のサイトで練習問題を解いているのですが
例題4−3のGROUP BYの問題が分かりません。どなたか解説していただけませんでしょうか。
お願いします。

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形式のを入力する方法を教えていただけないでしょうか。

363 :NAME IS NULL:05/03/17 16:33:13 ID:???
>>362
× values (to_char('2005/
○ values (to_date('2005/

364 :NAME IS NULL:05/03/17 16:40:28 ID:???
>>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()って標準なのか?

367 :NAME IS NULL:05/03/17 17:05:01 ID:???
>>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;

のように条件で()を使うことはできるのでしょうか?

369 :NAME IS NULL:05/03/18 11:39:44 ID:???
>>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>う
| と出てくればよいんですが、

| そうではなく一行にまとめたいのですが

矛盾


373 :NAME IS NULL:05/03/18 11:59:50 ID:???
>>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 とか試したのですが
ダメでした。



375 :NAME IS NULL:05/03/18 12:20:54 ID:???
>>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で加工するしかないのかな?

379 :NAME IS NULL:05/03/18 20:12:26 ID:???
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;
なんてクソな事は避けたいのですが。

381 :NAME IS NULL:05/03/18 20:33:36 ID:???
'NOW'::timestamp + '-3 month'

382 :えせ壊人:05/03/18 20:36:54 ID:Jb7aT050
>>381
即レスありがとうございました。
そのやり方で実行できました。
シーラ本には『加算/減算ができます』と書いてあったのですが
制限があるのですね。

勉強になりました

383 :NAME IS NULL:05/03/18 22:03:35 ID:???
>>382
Select extract(year from('NOW'::timestamp - '3 month'::interval));

384 :プログラマ修行中:05/03/19 23:41:58 ID:KR4nK/+8
すいません(><)学生なのですがサブクエリの問題が分からないので教えていただけないでしょうか??
 次の問題からサブクエリを使ってSQL文を考えなさい。
  売れてない商品の商品コードを受注明細テーブルから抜き出し、商品テーブルからその条件に合う商品コードと商品名を取り出す。(商品コード11,13,34)
お願いします。。

385 :NAME IS NULL:05/03/19 23:47:08 ID:???
>>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
>>385さん 本当にありがとうございました!!

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つ以上含めないとか
コツかなんかありませんか?

ストアドを利用するのが一番ですか?
今回のプロジェクトは客先の要望でストアド禁止なんですが

388 :NAME IS NULL:2005/03/21 03:43:25(月) ID:???
>>387
例えば売上データの一覧表示したいときに
売上テーブルと商品テーブルと顧客テーブルは必要だから、
これだけで3テーブル結合しなきゃならんわな。
これに、顧客グループとか商品カテゴリなんて概念が入るとますます増える。

SQLを書いた本人が「なんでヒットしないかわからん」ってのは論外だと思うけど、
複雑さとか読みやすさって人それぞれだろうし、ケースバイケースなんじゃない。
結合するテーブル数やサブクエリの数じゃないと思う。

んで俺の場合なんだけど、良いか悪いかワカランが、VIEWを作りまくり。
とりあえず売上データ一覧ビューなんて作っておいて、必要に応じて
商品カテゴリと結合したり顧客グループと結合したり。さらにフルセットビュー
なんて全てを結合したビューを用意したりするからビューの入れ子なんてのもアリ。

ビューの入れ子をすると性能が落ちる処理系もある(あった?)みたいだけど、
一度に巨大なビューを作るより、小さなビューを入れ子にした方が、
OOPっぽくておつ? と勝手に思ってますがw。

なんか碇石みたいなものがあるのなら、俺も知りたい。

389 :NAME IS NULL:2005/03/21(月) 04:46:30 ID:???
>>388
つうか、そのためにVIEWが用意されていると思った。
DBMS毎に実装は異なるだろうけど、VIEWはCREATE文を発行したときは何もせず、
参照されたときに(その都度)それに相当するSQL文を生成して実行する。
だから、VIEWを使おうが使うまいがコストの違いは無視できる程度に収まる。

390 :388:2005/03/21(月) 05:35:04 ID:???
>>389
そうなんだけど、書籍などはVIEWの説明はあっても、事例などでVIEWを
利用しているものなんてあまり見ない。入れ子となるとなおさら。
まぁ、あまり多くの書籍を読んだわけじゃないからたまたまかもしれんが。

と、性能が落ちると書いたのは、入れ子を深くするとプランナかオプチマイザかが
うまく最良のプランをはじき出せなくなる(つうバグ?)ってのをどこかで読んだ記憶が
あるんだけど... どこにあったか忘れてしまった。

だもんで、VIEWの入れ子は好きなんだけど、なんとなく「邪道かも」って
心の奥底で引っかかっていたりする。気にしながら使い放題なんだけどなーw

391 :NAME IS NULL:2005/03/21(月) 08:11:30 ID:???
>387
そのSQLがどの程度複雑かどうかを
見せて貰えると何か改良点が分かるかも知れない。
ウチの場合レスポンス向上でどうしてもエグイSQLやストアドには
・全員目を慣らしておく
・ネストきっちり
・コメントたっぷり

392 :NAME IS NULL:2005/03/21(月) 12:01:49 ID:???
>>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をつかえば出来ると思うのですがうまくできません。
どうしたらいいのでしょうか?
もうしわけありませんがよろしくおねがいします。


396 :NAME IS NULL:2005/03/21(月) 20:14:32 ID:???
>>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')
のどの条件が成立していないのかがすぐに分からない
と言った方が適切ですか?


399 :NAME IS NULL:2005/03/21(月) 20:35:45 ID:???
>395
SELECT no, name, price
FROM テスト
UNION
SELECT '合計', '', SUM(price)
FROM テスト

こんなんでどうか?

400 :NAME IS NULL:2005/03/21(月) 21:53:09 ID:SQHNYrQE
>>399
ありがとう!!!!

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
以外で何かあればお願いします。

403 :NAME IS NULL:2005/03/22(火) 16:34:09 ID:???
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です。


405 :NAME IS NULL:2005/03/22(火) 17:49:14 ID:???
| Microsoft SQL Server の以前のバージョンでは、
| 左外部結合と右外部結合の条件は WHERE 句で *= 演算子
| および =* 演算子を使用して指定していました。

| SQL Server の今後のバージョンではこの構文は
| サポートしなくなる予定です。


406 :404:2005/03/22(火) 20:52:56 ID:???
>>405
情報ありがとうございます。非常に助かりました。

407 :NAME IS NULL:2005/03/22(火) 22:09:05 ID:???
全く意味がわかりません。

408 :NAME IS NULL:2005/03/23(水) 09:01:46 ID:???
きっとよくある質問だと思うんですけど、今 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

409 :NAME IS NULL:2005/03/23(水) 09:45:06 ID:???
>>408
itemsのrdf:li rdf:resource属性はitemのrdf:about属性と一緒だろ。
だからchannelテーブルのitemsはいらんわな。


410 :NAME IS NULL:2005/03/24(木) 00:15:22 ID:???
アホな質問で悪いのですが。
基本情報の参考書に書いてあるSQLが実際にどう表示されるか確認したので
学習用にデータベースソフトを導入したいと考えています。
んで、探したところGUIのは http://www.microsoft.com/japan/sql/evaluation/trial/2000/
ぐらいでした。 ↑のように余計な機能が沢山ついてなければ最高なのですが、そういうのないですか?


411 :NAME IS NULL:2005/03/24(木) 00:23:30 ID:???
あ、学習用に使う程度なのでフリーのものを探しています。

412 :NAME IS NULL:2005/03/24(木) 01:02:19 ID:???
>>411
基本情報の学習用ならこれがお薦め。
ttp://www.vector.co.jp/soft/dl/win95/edu/se256226.html

413 :NAME IS NULL:2005/03/24(木) 09:19:11 ID:???
MySQL,PostgreSQL,MSDE、どれでもいいんじゃないの?
最初はGUI使わずにCUIで兎に角やることをお勧めする。


414 :NAME IS NULL:2005/03/24(木) 20:35:08 ID:???
select a from test と
select count(*) from test の

件数が合わないのですが、なぜだかわかりますか?

条件などはつけてません

415 :410:2005/03/24(木) 21:20:06 ID:???
>>412
ty! とてもいいツールですね。こういうのを探していました。

>>413
アドバイス有難うございます。
今回は試験の時間まであまりないので↑のツールを使わせていただきます。

>>414
上はaという列を抽出。下は行数をカウントなので件数が合う合わないの問題ではないと思うのですが・・

416 :NAME IS NULL:2005/03/24(木) 21:27:21 ID:???
>>415

select a from test で 抽出された件数と
select count(*) from test で カウントされた件数が合わない

ってことです。

417 :NAME IS NULL:2005/03/24(木) 21:44:10 ID:???
まず、DBはなによ?
それからselect a from testの件数はどうやって拾ったの?

418 :NAME IS NULL:2005/03/24(木) 22:13:32 ID:???
aにnullデータが入ってるに1票

419 :NAME IS NULL:2005/03/24(木) 22:15:46 ID:nNtZMBKf
>>418
ガッ!

420 :NAME IS NULL:2005/03/24(木) 22:42:42 ID:???
mysqlで中央値の取り方を教えてください

421 :NAME IS NULL:2005/03/24(木) 22:47:02 ID:???
>>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

というようなテーブルを作成したのですが、どうしても作成できません。
だれか、良い結合方法はありませんか。

423 :NAME IS NULL:2005/03/24(木) 23:59:18 ID:???
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

424 :NAME IS NULL:2005/03/28(月) 13:02:50 ID:???
質問なのですが、例えば下記のようなデータがあって、

書籍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のレコードが複数存在する場合、出版日の降順にソートして
最後のレコードのみ選択」して集計するには、どの様にコーディングすればいいのでしょうか?
ご教授御願いいたします。

425 :NAME IS NULL:2005/03/28(月) 13:09:28 ID:???
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

428 :NAME IS NULL:2005/03/29(火) 18:18:49 ID:???
SQLServerで
Image型からText型のへ変換したいのですが、どうしたらいいのですか?

Image型に入っている 0x82A041 を
Text型に 'あA' と変換してインサートしたいのですが

最大サイズ8000の壁に当たってしまうのです。

どうやって変換したらよいのか教えてください。
宜しくお願いします。

429 :NAME IS NULL:2005/03/29(火) 20:29:48 ID:???
>8000の壁
はvarcharの制限じゃなかったっけ、textは2^31くらいまで大丈夫なはず。
その手の変換はプログラムでやるのが王道だと思います。

430 :NAME IS NULL:2005/03/31(木) 00:59:14 ID:???
>>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に時間がかかるなどということはありますでしょうか?

434 :NAME IS NULL:2005/04/02(土) 20:21:33 ID:???
>>433

INDEX が大きすぎるとか、表領域を拡大しているとか。



435 :NAME IS NULL:2005/04/02(土) 20:21:45 ID:qZMBbSse
すいません。。学校の問題が分からないので助けてください!!
 行の更新 UPDATEをやってるのですが・・。
問題 受注更新テーブルの受注日が1995年の運送料を100円増しに変更せよ。
     よろしくお願いします(><)

436 :NAME IS NULL:2005/04/02(土) 21:08:03 ID:???
過去の運送料を100円上げる意図がわからんな。

437 :NAME IS NULL:2005/04/02(土) 21:13:22 ID:a2Szs17Q
まあ学校の問題なんだし、そんなとこ突っ込まんでも。
update 受注更新テーブル set 運送料 = 運送料 + 100 where 受注年 = 1995
受注日の扱いは処理系の日付型の特性やテーブルに索引がついてるか否かで
書き方が違ってくるからここでは受注年にさせてもらった。

438 :NAME IS NULL:2005/04/02(土) 21:15:13 ID:???
あげちまったよorz
>>433
WEB以外からupdateの更新をかけた場合と比べてみては

439 :NAME IS NULL:2005/04/03(日) 16:01:59 ID:???
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を使用中です。設定はほぼデフォルトのまま。

445 :NAME IS NULL:2005/04/03(日) 23:59:48 ID:???
>>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です。

448 :NAME IS NULL:2005/04/04(月) 15:31:52 ID:???
1と2のレコードのどちらが最新なのかわからないだろ、それ。
伝票番号で見ればいいのなら、日付でグループ化して最大の伝票番号を。

449 :446:2005/04/04(月) 15:34:38 ID:???
分かりにくくてすみません、1と2は別の商品なのですが・・・

450 :NAME IS NULL:2005/04/04(月) 15:41:33 ID:???
あ、すまん。
んじゃあ商品コードでグループ化して売り上げ日のmaxだ。

451 :446:2005/04/04(月) 15:55:32 ID:???
できますた。
ありがとん

452 :NAME IS NULL:2005/04/06(水) 10:54:31 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%'


454 :NAME IS NULL:2005/04/06(水) 12:14:18 ID:???
>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

456 :NAME IS NULL:2005/04/07(木) 08:21:40 ID:???
>>455
動くんじゃないのか?
それで動かなかったらビューの意味が無いだろw


ビューの仕組みとしては、下記の通りのような感じだから全然OK

@「SUM(売上) AS 売上合計」を集計
Aその結果を一時領域に格納
B一時領域から売上合計>10000を抽出
C結果をユーザに返す

試しにOracle9i でやってみたけど、可能だったよ。


457 :NAME IS NULL:2005/04/07(木) 14:05:03 ID:???
sql初心者です。

SELECT * FROM a LEFT JOIN b ON a.1 = b.1 WHERE a.id = 'hoge'
の場合、JOINはWHEREで取得する前のテーブルに行われるのでしょうか。それとも
WHEREで抽出した結果のみに行われるのでしょうか。

もし、前者であった場合、無駄な負荷がかかると思うのですが、その場合はどのような
回避策がセオリーなのでしょうか。
WHEREで抽出したものを一度テンポラリテーブルに吐き出してそれに対してJOINするくらいしか
思いつきません・・・。

458 :U ◆CZtFsGiu0c :2005/04/07(木) 14:32:20 ID:???
>>457
心配しなくても、その程度の最適化はDBMSがやってくれる。
もし適切なプランが選択されないとしたら、SQLなりデータベース設計なり
を見直す必要があるけどね。

459 :457:2005/04/07(木) 15:16:17 ID:???
>>458
解答ありがとうございます。とりあえず最初はあまり気にせずいろいろしてみたいと思います。

460 :NAME IS NULL:2005/04/07(木) 15:20:37 ID:???
初心者でそこまで心配してくれればありがたいよなあ

461 :NAME IS NULL:2005/04/07(木) 16:33:28 ID:aFrI3lim
>>456
そうですよねぇ。でもこんな問題(下記URL)があったから
仕事で「ビュー作る→WHEREで抽出」なんて使いまくってるよ。ヤバイ!
・・・って心配になっちゃって(´д`;)

これ↓の問6の設問4です
http://zigen.cosmoconsulting.co.jp/images/QUS-H13SW-PM1.pdf

解答↓
http://zigen.cosmoconsulting.co.jp/images/ANW-H13SW-PM1.pdf

462 :NAME IS NULL:2005/04/07(木) 17:03:05 ID:???
>>461
情報処理の試験問題になってるということは、JIS SQL的にはそうなのでしょうね。
ただ実際問題としてWHEREとHAVINGの使い分けはシンタックスシュガーでしかない
ような気がするので、現実の実装ではほぼすべてで可ではないでしょうか。

463 :U ◆CZtFsGiu0c :2005/04/07(木) 18:06:38 ID:???
>>462
規格で決まっている、というよりは、このようなエラーが出る理由はこれ
これこうですよ、という回答を導き出す設問だと思う。もし単純にクエリ
に置換するようなRDBMSだったら確かにエラーになるだろうけど、現実の
RDBMSだったら普通は対応しているでしょう。
#じゃなきゃ派生テーブル(サブクエリ)でも同じエラーになりそう

WHEREとHAVINGは明確に違うので、シンタックスシュガーというのはどうかな。
問題は、仮想表であるビューを実表と同様に扱えるかどうか、ということ
でしょう。

464 :456:2005/04/07(木) 20:03:46 ID:???
>>461
そのDBMSでは対応していないというこを前提なんだろうなぁ・・・・。
漏れとしては、ちょっと納得いかないけどな。


465 :NAME IS NULL:2005/04/08(金) 21:19:51 ID:???
初歩的な事ですが調べてもわからなかったので教えて下さい。

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 '名古屋';
では検索されます。

対処方法はあるのでしょうか・・・
アドバイスありましたらお願いします。

466 :NAME IS NULL:2005/04/08(金) 21:30:12 ID:???
>>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
ってどこで確認すればいいですか?


468 :NAME IS NULL:2005/04/08(金) 21:55:01 ID:???
>>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を選んでました。

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


471 :NAME IS NULL:2005/04/12(火) 13:56:54 ID:???
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;


473 :NAME IS NULL:2005/04/12(火) 14:55:46 ID:???
>>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です。
やっぱできないのかな?


478 :NAME IS NULL:2005/04/15(金) 21:22:55 ID:???
1行ずつ回しながら1文字ずつ取得して…

479 :NAME IS NULL:2005/04/15(金) 21:25:09 ID:???
数字から始まるものは絶対数字、という保証があれば
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 ノ  | |   \_ノ  ノ /    フ ! (~~_,,,,/ノ/
 | |  | |   / /    | | .  し'  ノ ノ   | |       / /     | |   ̄
 \\ノ |  / /      | |___∠-".   | |      ノ /       ノ |  /(
  \_ノ_/ /     (____)     し'      ノ/      / /  | 〜-,,,__
     ∠-''~                        ノ/         (_ノ   〜ー、、__)

482 :NAME IS NULL:2005/04/15(金) 21:55:08 ID:???
aに0〜9以外が含まれている行を除外して
残りを集計すりゃいけるんじゃないの?

483 :NAME IS NULL:2005/04/15(金) 22:12:10 ID:???
>>477
SQLSERVERには正規表現の使える置換関数ってないの?
あるなら数値以外はゼロに置換して集計すればいいよね。

484 :NAME IS NULL:2005/04/15(金) 22:29:46 ID:hI+LPweD
ロジックなら簡単だがやはりSQL一発
でやりたい。やりたい

485 :NAME IS NULL:2005/04/15(金) 23:10:15 ID:???
select sum(cast(a as int)) from tblA where a not like '[^0-9]'

486 :NAME IS NULL:2005/04/15(金) 23:24:04 ID:???
まちがえた。'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


487 :NAME IS NULL:2005/04/16(土) 00:18:09 ID:???
>>477
テーブル設計者をぶちのめせ!


488 :NAME IS NULL:2005/04/17(日) 15:30:00 ID:O4OxBSDE
DB2は、SQLで書く
ものなんですか?


489 :NAME IS NULL:2005/04/17(日) 18:03:01 ID:???
>>487
きっと自分で自分をぶちのめすことになるんだろうな

490 :NAME IS NULL:2005/04/17(日) 23:42:04 ID:???
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の一番大きな行を返したいのです。

491 :NAME IS NULL:2005/04/17(日) 23:57:37 ID:???
>>490

SELECT col1,MAX(col3) FROM tab GROUP BY col1

しかし、ここで聞く前にまずは初歩のSQLの本を買って
勉強した方が良いんじゃない?

492 :NAME IS NULL:2005/04/18(月) 01:04:20 ID:???
以下の様なレイアウトのテーブルで
column `email` に重複した値を持つ row を全て表示したいのですが、
どうすればいいですか?

TABLE `list` (
  `id`, `name`, `email`
)

493 :NAME IS NULL:2005/04/18(月) 01:26:21 ID:???
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:???
>>493
ありがとうございます。

495 :NAME IS NULL:2005/04/18(月) 08:52:33 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
とするとエラーになってしまいます。





496 :NAME IS NULL:2005/04/18(月) 10:14:49 ID:???
>>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;


497 :NAME IS NULL:2005/04/18(月) 17:55:01 ID:???
>>495
それ、そもそも正規化が足りてない。
キーが何だか分からないが、部分関数従属か推移関数従属が残っているから
こういうことになる。
きちんと正規化して分割し、集計のSQLの結果と、分割後の表を結合して
結果を表示する。

498 :NAME IS NULL:2005/04/18(月) 22:21:52 ID:???
>>497
複合キーがメンドイのは確かだが正規化は関係ない気がするが。
無学な漏れにこの表のどこが部分関数従属でどこが推移関数従属か教えて欲しいな。

499 :NAME IS NULL:2005/04/19(火) 00:26:42 ID:???
>>496
ありがとうございます。うまくいきました!

500 :NAME IS NULL:2005/04/19(火) 00:33:02 ID:???
490みたいな事例ってこのスレで一番多いよね。

501 :NAME IS NULL:2005/04/19(火) 08:53:47 ID:???
>>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))という
書き方で正しいのでしょうか。


503 :NAME IS NULL:2005/04/19(火) 22:23:21 ID:???
しーけんす

504 :NAME IS NULL:2005/04/19(火) 23:37:56 ID:???
それだと同時に複数ユーザが実行したときうまくいかない。
シーケンスを自動生成する機能を使うか
自動で列の値を更新してくれる機能を使う

505 :NAME IS NULL:2005/04/22(金) 17:19:56 ID:???
SQL 文を発行して、帰ってきた row がいくつあるかってどうやって数えればいいんですか?
Count?

506 :NAME IS NULL:2005/04/22(金) 17:23:30 ID:???
>>505
select count(*) from ...
ttp://dev.mysql.com/doc/mysql/ja/counting-rows.html

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|
+--------------------------+

508 :NAME IS NULL:2005/04/22(金) 18:11:28 ID:???
こういうこと?
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年の両方に存在しているものを余すとこなく
表示したいのです。

510 :NAME IS NULL:2005/04/22(金) 19:29:31 ID:???
以下の様な 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
ありがとうございました。

516 :NAME IS NULL:2005/04/22(金) 20:56:22 ID:???
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
 );

ではダメなんですけれども…

517 :NAME IS NULL:2005/04/22(金) 21:29:20 ID:???
なぜにHAVING

518 :NAME IS NULL:2005/04/22(金) 21:30:19 ID:???
>>516
テーブル設計者を殺せ


519 :NAME IS NULL:2005/04/22(金) 21:31:31 ID:???
>>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'

でした。

521 :NAME IS NULL:2005/04/23(土) 00:37:29 ID:???
>>507
テストしてないけど
SELECT DISTINCT A.品名,B.数量1,C.数量1
FROM TABLE A,TABLE B,TABLE C
WHERE A.品名 = B.品名(+)
AND A.品名 = C.品名(+)

(+)は外部結合。

522 :NAME IS NULL:2005/04/24(日) 00:52:17 ID:???
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 の方が出来ません。
宜しくお願いします。

523 :NAME IS NULL:2005/04/24(日) 02:06:00 ID:???
>>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

です。

526 :NAME IS NULL:2005/04/24(日) 15:01:46 ID:???
>>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つにするということですか?

529 :NAME IS NULL:2005/04/25(月) 11:29:32 ID:???
>>528
FULL OUTER JOUIN では駄目なのかいや?


530 :507:2005/04/25(月) 11:45:08 ID:/d5cKyiI
>>529
私の使っているDB2ではなぜか FULL OUTER JOIN と指定することができません。

531 :NAME IS NULL:2005/04/25(月) 17:31:56 ID:???
失礼します。いきなりですが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);


これでうまく行きました。

533 :NAME IS NULL:2005/04/25(月) 22:28:33 ID:???
>>530
LEFT JOINとRIGHT JOINは使えるのか?
使えるのなら両方とってUNIONで連結すれば。

534 :NAME IS NULL:2005/04/25(月) 23:38:11 ID:???
>>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をソートして出力したいのですが…どうすればいいのでしょうか。

537 :NAME IS NULL:2005/04/27(水) 15:12:06 ID:???
>>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
まちがいました
>>535>>538

542 :NAME IS NULL:2005/04/27(水) 20:53:55 ID:I7MAuU2N
質問です。

Oracle8iで、joinを用いた結合はできるのですか?

今までは普通にwhere句で結合していたのですけど、
上司に「joinで結合したら?」と言われてしまいまして。
いろいろ試してはみたものの、どうも通らないので、
もしや8iではできないのでは?と。

どうぞご教授下さい_( 。_ 。)_

543 :NAME IS NULL:2005/04/27(水) 21:08:15 ID:???
>>542
できるよ。
それより、質問のしかたを考えなさい。
なんどもやりとりが必要な聞き方ではうざがられるぞ。

544 :NAME IS NULL:2005/04/27(水) 21:12:24 ID:???
後から後から小出しで条件がでてきそうだな。

545 :NAME IS NULL:2005/04/27(水) 21:19:47 ID:bfa/bL9M
>>543
おいおい・・・嘘をつくなよ。
標準規格SQL99は、Oracle9iから対応だろ。


546 :NAME IS NULL:2005/04/27(水) 21:32:21 ID:???
>>545
Oracleは知らんが、JOINはSQL92じゃなかったケ?

547 :NAME IS NULL:2005/04/27(水) 21:34:38 ID:???
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で試しました。

550 :NAME IS NULL:2005/04/27(水) 22:15:13 ID:???
>>548
その構文は9iから対応だったと思うよ。


551 :NAME IS NULL:2005/04/27(水) 23:35:46 ID:???
http://rina.jpn.ph/~rance/om/sql/9isql.html
http://www.seshop.com/se/edu/shikaku/omo/miti/silver_miti24.asp?educat=silver2
8iではやっぱりJOIN無理っぽいね

552 :542:2005/04/28(木) 00:15:32 ID:???
Oracle8iでこの構文は使えないようですね。

INDEXと絡めた使い方をどこかで見たような見なかったような気もするので、
一応そちら方面も調べてみます。

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

553 :NAME IS NULL:2005/04/28(木) 01:11:17 ID:yo9ktJF9
正規化についての質問です
社員番号
氏名
年齢
性別コード
性別
入社日
所属コード
部署名
資格名、

社員表・性別表・所属表・資格表に正規化しようと思うんですが、
社員ごとに資格を保有させるやり方がわかりません。
資格表はどう作ったらよいでしょうか?

554 :NAME IS NULL:2005/04/28(木) 01:49:49 ID:???
>>553
> 資格表はどう作ったらよいでしょうか?

資格のマスター表 (資格ID , 資格名)と
資格ID-社員番号マッピング表(社員ID, 資格ID)
を作れば良いんじゃない?

ところで性別表って何を入れる気なの?

555 :NAME IS NULL:2005/04/28(木) 01:56:44 ID:???
>>554
男、女、おかま、おなべ、不詳

556 :NAME IS NULL:2005/04/28(木) 08:45:16 ID:???
>>553
性別表なんて初めて聞いたw


557 :NAME IS NULL:2005/04/28(木) 09:06:08 ID:???
性別マスタなんて普通つくらんだろw

558 :NAME IS NULL:2005/04/28(木) 10:52:59 ID:???
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と社員番号をマッピングする表を作るんですね。
やってみます!性別表はなくても良かったですね(汗)

560 :NAME IS NULL:2005/04/28(木) 20:00:32 ID:???
table hoge (
  ID int(20),
  URLのMD5 varchar(32)
)
これで、`URLのMD5` の値が重複してる row を見つけ出したいんですが、
どうすればいいですか?

561 :NAME IS NULL:2005/04/28(木) 22:45:23 ID:???
自己結合で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;


564 :NAME IS NULL:2005/04/29(金) 01:42:58 ID:???
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:???
>>563-565
レスありがとうございます。
でもそれは試してたんですよ。このスレで似た様なの見つけてたから。
http://pc8.2ch.net/test/read.cgi/db/1103113155/493
でもダメ。出てこない。。
MySQL 4.1.7 のせいとか?他に何か当たるべき点があったら教えて下さい。

567 :NAME IS NULL:2005/04/29(金) 02:59:20 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 を作っておくと
速くなるよ、って言ってたから、よく考えずやってみたんだけど…

570 :NAME IS NULL:2005/04/29(金) 06:50:09 ID:???
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度発行して、再度試してみろよ。


573 :NAME IS NULL:2005/04/29(金) 09:13:22 ID:???
>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文になってたな。
当時は眠かったからなぁ・・・


576 :NAME IS NULL:2005/04/29(金) 18:12:03 ID:???
>>569
「眼で見た」っていうのはテーブル単体でselectしたのか?

MD5を持ってるテーブルに重複は無くても別のテーブルとjoinさせたときに
そっちに同じIDを持つレコードが複数あれば重複してるように見えなくも無い。

577 :569:2005/04/29(金) 20:11:03 ID:???
>>570-576
みなさんレスどうもありがとうございます。
572さんの言われた通り、同じ Insert を2度やってみたら
全ての確認用 SQL は通ったので、
“僕の眼で見た”って言うのが、間違いだったのだと思います。

もう一度 db 作り直してみますので、また何かあったら質問させて下さい。
ありがとうございました。

http://dev.mysql.com/doc/mysql/ja/show-database-info.html
「カーディナリティなし INDEX」っていうのは、
多分値の重複を確認しない、って言う事だと思います。

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);
です。

579 :NAME IS NULL:2005/04/30(土) 12:21:12 ID:???
>>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って連結主キーって許されていないんですか。

582 :NAME IS NULL:2005/04/30(土) 13:19:40 ID:???
>>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になってしまうんですが、やり方あってますでしょうか?

584 :NAME IS NULL:2005/04/30(土) 14:55:36 ID:???
>>583
TEST2 に not null 制約を付けてみるとか・・・・


585 :NAME IS NULL:2005/04/30(土) 15:12:12 ID:???
>>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
ありがとうございました。

587 :NAME IS NULL:2005/04/30(土) 15:23:47 ID:???
つうか、慣れてないなら、素直に「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になるのか教えてください。

591 :NAME IS NULL:2005/05/01(日) 18:03:33 ID:???
>>590
その時々に応じてSQL文を組み替えれば良いやん。


592 :NAME IS NULL:2005/05/01(日) 18:40:56 ID:???
>>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


599 :NAME IS NULL:2005/05/02(月) 14:39:58 ID:???
unionじゃいかんのか?

600 :597:2005/05/02(月) 16:02:34 ID:zNMKVUp2
>599
早いレスありがとうございます。

unionは別件で使ってみてレスポンスが遅かったため敬遠してましたが
一度試してみようと思います。


601 :NAME IS NULL:2005/05/02(月) 19:11:19 ID:???
union では駄目だろ。

union all でやれ。


602 :NAME IS NULL:2005/05/02(月) 19:46:48 ID:???
>>601
よく見ろ 1,20,120 の重複は取り除くのだからallじゃいかんだろう

603 :601:2005/05/02(月) 21:49:25 ID:???
>>602
cの列をよく見ろ。

a と b をグループ化して、cの合計を求めているんだから
union all で無いと求められない。


604 :NAME IS NULL:2005/05/03(火) 18:51:42 ID:???
ちょー基本っぽいですが、例えば以下の様な table があったとして、
日付毎の row の数を知りたいときはどうすればいいんですか?

table { id, date,.....}

605 :NAME IS NULL:2005/05/03(火) 19:03:09 ID:???
select date(A.date) as B, count(*)
from table as A
group by B
order by B

かな?

606 :NAME IS NULL:2005/05/03(火) 19:13:57 ID:???
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
じゃないので困ってます

607 :NAME IS NULL:2005/05/03(火) 20:40:58 ID:???
>>606
素敵じゃなくて泥臭いのなら思いつくけどw

608 :NAME IS NULL:2005/05/03(火) 21:47:05 ID:???
>>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は横への展開が苦手なんだよ。


612 :NAME IS NULL:2005/05/04(水) 07:49:26 ID:???
すいません。
どうしてもわからないので教えてください…
エクセルからマクロ組んでmdbファイルを使ってるのですが、
その時のSQLで「 like '%〜%' 」っていうSELECT文を使うと
結果が返ってくるはずの値でも、該当レコード0で返ってきてしまいます。
「%」の文字を使用せず、完全一致のもので検索すると
上手く行くのですが、これじゃぁ、部分一致の検索になりません。
どうにか部分一致の検索をしたいのですが…。

613 :NAME IS NULL:2005/05/04(水) 08:01:00 ID:???
>>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
>>615
マルチポストをするな


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をつけて
配列にするしかないかなと思ってますが・・・。

619 :NAME IS NULL:2005/05/06(金) 14:50:55 ID:???
>>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のほうで
強制的に配列処理して逃げることにしました。
次回以降似た事例があればご助言のとおりにしたいと思います。
明らかにそちらの方がきれいなやり方なんで。
それ以前に、本番一週間前にそんな変更入れるなよと思うんですが・・・。

623 :NAME IS NULL:2005/05/06(金) 18:31:57 ID:???
>>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以外で

626 :NAME IS NULL:2005/05/07(土) 18:44:42 ID:???
ランダムに生成するか、フリーの辞書かなにかをcvsに変換すりゃいいおはなし。

627 :NAME IS NULL:2005/05/07(土) 18:44:51 ID:???
YahooBBとか

628 :NAME IS NULL:2005/05/07(土) 18:57:10 ID:FpscRTiD
>>626
リアルなデータが欲しかったもので。
フリーの辞書って何ですか?

629 :NAME IS NULL:2005/05/07(土) 19:07:03 ID:???
テーブルで、主キー以外が同じデータのものを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形式でダウンロードするフリーウェアもあるみたいだし

631 :NAME IS NULL:2005/05/07(土) 20:06:18 ID:???
>>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 いらんな、すまん

633 :NAME IS NULL:2005/05/07(土) 20:43:37 ID:???
ありがとう。さっそくやってみます

634 :NAME IS NULL:2005/05/07(土) 21:43:09 ID:???
>>625
Amazon APIでデータを吸う。

635 :NAME IS NULL:2005/05/07(土) 22:00:20 ID:FpscRTiD
>>630
>>634
ちょいと参考にしてみます

636 :NAME IS NULL:2005/05/07(土) 22:34:34 ID:X72YLO1J
すいません。みなさんノートパソコンでACアダプタ接続して起動さすときは バッテリ入れてます?それともとってます?

637 :NAME IS NULL:2005/05/07(土) 22:37:47 ID:???
>>636
(゚Д゚)ハァ?


入れっ放しでいいよ。

638 :NAME IS NULL:2005/05/07(土) 23:03:09 ID:???
基本的に、AC 駆動の時はバッテリーを外しておいた方がいい。
バッテリーの寿命に影響する。

でも、せっかくの簡易 UPS だし (何回か救われた)、何より面倒だから、俺はつけっぱな。

639 :NAME IS NULL:2005/05/07(土) 23:25:04 ID:X72YLO1J
UPSってなんですか?(^o^;

640 :NAME IS NULL:2005/05/07(土) 23:25:06 ID:???
充電どーすんの

641 :NAME IS NULL:2005/05/07(土) 23:26:37 ID:X72YLO1J
そしたらバッテリはずしたままにしてコンセントを出かける時に抜いてもデータとかは消えないんですか?

642 :NAME IS NULL:2005/05/07(土) 23:38:17 ID:???
>>641
消えないけど、何でそんな事をSQLスレで訊くのかと・・・?

基本的にバッテリーは入れっ放しでいいよ。
最近は抜いたら起動出来ない機種も有ったと思うし・・・

643 :NAME IS NULL:2005/05/07(土) 23:44:00 ID:???
>>639
> UPSってなんですか?(^o^;

ググレ。
(つーか、SQL には関係ないけど、コンピュータつながりなんだから UPS ぐらい知っとけと思う。)

>>640
バッテリー使う前に充電するんだろ。

>>641
悪い、SQL や UPS の前に 「 日 本 語 」 を勉強してくれ。

>>642
何を持ってデータは消えないと言ってるの ?
>>641 の日本語はよくわからんが、少なくともシャットダウンについては言及してないから、稼動中かもしれないよ。
それでなくとも、スタンバイモードとかもあるしな。

644 :NAME IS NULL:2005/05/07(土) 23:48:28 ID:???
>>643
>バッテリはずしたままにしてコンセントを出かける時に抜いてもデータとかは消えないんですか?
コンセント抜くんだから稼動中じゃないでしょ?

645 :NAME IS NULL:2005/05/07(土) 23:57:29 ID:???
>>644
常識は通用しない。

質問者の書き込みから義務教育すら修了していないことは明らかだ。

646 :NAME IS NULL:2005/05/07(土) 23:59:39 ID:???
>>645
分かった分かった。
後は君にお任せします。

647 :NAME IS NULL:2005/05/08(日) 00:03:55 ID:???
>>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
現在存在するテーブルの一覧を表示するにはどうしたらいいんですか?

650 :NAME IS NULL:2005/05/08(日) 15:25:51 ID:???
>>649
SQLではないんじゃないか。コマンドでSHOW TABLESと
クエリ発行すると、結果を返すDBMSもあるけど。

651 :NAME IS NULL:2005/05/08(日) 15:43:25 ID:UZwAhcDm
>>649
DBMSを書きやがれ


652 :NAME IS NULL:2005/05/08(日) 15:56:05 ID:???
mysqlを使っています。
show tables;でできました。

653 :NAME IS NULL:2005/05/14(土) 15:28:24 ID:g1e6gXQ0
SQLを使う職種や企業でのセクションってどこなんですか?

うちの会社では管理部門にいる人間が使ってますが、
そこの人間に、お前VBAしか知らね〜のかよ。
そんなんじゃどこ行っても通用しね〜ぞ。
って言われました。

そんなにSQLって高度な知識を要するんですか?

654 :NAME IS NULL:2005/05/14(土) 15:55:55 ID:???
高度じゃないから、そのぐらい知ってろよって意味でしょうね。

655 :NAME IS NULL:2005/05/14(土) 16:21:19 ID:???
SQLも知らないのかよって言われたわけじゃないでしょ?

つうか、VBAしか知らねーのかよと言われて、何でSQLなんだろう・・・
この辺の思考回路がおかしい時点で、確かにヤバイんだろうけど・・・

ちなみに、SQLを使う職種は一般にPGやSEと呼ばれる人間。
素人でも使うことは使うが、データベース(OracleやらSQLServerやらDB2やらMySQLといったもの)を
使う人間。

セクションは関係無い。
管理部門だろうが、開発部門だろうが運用部門だろうが、開発者側の人間で
データベースを使うなら必須。

ちなみに、VBAしか知らないと何処行っても通用しないというのは同意。
じゃあ、何なら通用するのか?という疑問は、何処で通用したいかによる。
制御系・汎用機系・Windowsクライアント・Webアプリなどなど色々種類はある。
それぞれによって使う言語は違うし会社によっても違う。

SQLは高度かといえば、全然高度じゃない。
単純にデータベースの簡単な”操作”をするぐらいなら、この業界では”常識”に近いほど。

656 :NAME IS NULL:2005/05/14(土) 17:12:29 ID:???
>>653
業務系システムを開発しているならば、SQLの知識は最低限必要だと思うが?


657 :NAME IS NULL:2005/05/15(日) 13:34:17 ID:Y/+OVhbH
テーブルA
コード
個数
場所

テーブルB
・・・
コード
個数
場所

MSSQLを使用しています。
上記のようなテーブルがあり、
テーブルAの個数、場所を
テーブルAのコードと合致する
テーブルBの個数、場所を全て
テーブルAの個数、場所と同じに更新をさせたいのですが
一度に行う方法はありませんでしょうか?

最初は、テーブルAを一行ずつ更新をかけているときに
テーブルBも更新させていました;;

658 :NAME IS NULL:2005/05/15(日) 14:02:09 ID:???
>>657
テーブル構造を見直した方が良いよ・・・

659 :NAME IS NULL:2005/05/15(日) 14:12:33 ID:???
オレもそう思うけど・・・
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さんが作ったオブジェクトしか見られない権限の与えかたってありますか?

オブジェクトごとではできてもユーザごとで指定はできるんでしょうか?


663 :NAME IS NULL:2005/05/17(火) 21:28:50 ID:???
>>662
SQLでは難しいな

664 :NAME IS NULL:2005/05/18(水) 21:29:26 ID:???
初心者なんですが、課題で質問させてください

一つは、学生の属性に関するテーブル、もう一つはサークルの属性に関するテーブルである。
2つのテーブルに収録する項目は、
学籍番号、学生氏名、、所属サークルコード、サークル名、顧問名、サークル代表者の中から選ぶものとする。
同じ項目名を2つのテーブルに含めても良い。サークル代表者という項目には学籍番号を入力する。
学籍番号と所属サークルコードにはアルファベットが含まれる。
2つのテーブルのテーブル名は、「学生テーブル」と「サークルテーブル」とする。
なお、この2つのテーブルを利用した検索例としては、学生テーブルを使って、指定した学籍番号によってある学生を検索し、
その学生が所属しているサークル名、顧問名、代表者コードなどをサークルテーブルを使って検索する、などが想定される。
このときテーブルを作成するためのSQL命令を、テーブルごと記すとどうなるんでしょう?


665 :NAME IS NULL:2005/05/18(水) 21:55:32 ID:???
>>664
初心者じゃない生徒はかわいくないよね。

666 :NAME IS NULL:2005/05/18(水) 22:04:09 ID:???
>>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です。
よろしくお願いします。

670 :NAME IS NULL:2005/05/23(月) 11:22:04 ID:???
結合しなければいいんじゃないか?
文意からじゃなんで結合した上で、AA側だけ表示したいのか伝わらんよ。


671 :NAME IS NULL:2005/05/23(月) 11:34:40 ID:???
>>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レコードある以上デカルトにしかなりえませんね。
お騒がせしました。

673 :NAME IS NULL:2005/05/23(月) 17:33:22 ID:???
質問です。

SQLでSELECT文の結果に対して連番のテーブルをつけるような方法はないですか?


674 :NAME IS NULL:2005/05/23(月) 19:19:33 ID:???
>>673
CREATE TEMP SEQUENCE temp_seq;
SELECT nextval('temp_seq'),* FROM table;

675 :NAME IS NULL:2005/05/23(月) 20:48:59 ID:???
>>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

677 :NAME IS NULL:2005/05/23(月) 22:59:01 ID:???
質問です
二つのテーブルをつなげて
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
みたいにしたいのですが教えてください

678 :NAME IS NULL:2005/05/23(月) 23:22:00 ID:???
ゆにおん

679 :NAME IS NULL:2005/05/24(火) 03:22:18 ID:???
>>677
UNION ALLを使用しましょう。

680 :NAME IS NULL:2005/05/24(火) 06:53:19 ID:???
unionで

681 :NAME IS NULL:2005/05/24(火) 07:24:14 ID:???
UNIONがいいでしょう

682 :NAME IS NULL:2005/05/24(火) 07:39:24 ID:???
親切なんだか、不親切なんだか良くわからんヤシラが多いな。

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行で書く方法ありますか?


684 :NAME IS NULL:2005/05/25(水) 11:49:05 ID:???
>>683
そこにユニークな項目はあるのかな
あれば、
DELETE FROM table WHERE unique_key IN (SELECT unique_key FROM table ORDER BY xxx LIMIT 100 OFFSET 0)
とかできると思うけど

685 :NAME IS NULL:2005/05/25(水) 11:49:38 ID:???
あ、以外か。NOT IN で・・・

686 :NAME IS NULL:2005/05/25(水) 12:50:06 ID:???
つうか、DBMSに依存するだろ?この手の話題は。
きちんと何でやってるのか書けよ。

でもって、まあたとえそういうSQLがあったとしても使いたくはないわな。
なんか気分悪い。カーソルでループして削除でいいじゃん。

687 :NAME IS NULL:2005/05/25(水) 13:49:21 ID:???
>686
まあそう言うな。
SQLって言われただけで、MS SQL SERVERだと思ってるヤシもいるんだし。


688 :NAME IS NULL:2005/05/25(水) 14:30:34 ID:???
ここは基本的にSQL92なのでは
って質問者はそのつもりじゃないか・・

689 :NAME IS NULL:2005/05/25(水) 16:05:43 ID:???
>>686-687
次スレのテンプレに入れた方が良いな。
↓な感じでどうでっしゃろ?


質問する時のルール
1.DBMS名を明記すること
  (DBMSによってSQLの体系が微妙に異なり、使用可能な関数も違ってきます。)

2.結果を報告すること
  (回答者も自分のアドバイスが有効だったか気になります。)

3.問題が解決したら感謝の気持ちを示すこと
  (回答者は質問者の為に時間を割いてくれますし、励みになります。)


690 :NAME IS NULL:2005/05/25(水) 16:38:29 ID:???
>>689
あと、そもそものやりたいことを日本語で書くってのも欲しい。
根本的に間違った考え方をした挙句で、小難しいSQLをどうにかしたいって質問も多いから。
そんなことしなくてもこうで良いじゃん、ってありがちだし。

691 :NAME IS NULL:2005/05/25(水) 17:19:47 ID:???
テーブルのサンプルデータと期待する結果データも揚げてもらった方がいいかな。
文だけだと情報の小出しになったりするし、逆にいきなり長文書かれても読むのマンドクセ。

692 :NAME IS NULL:2005/05/26(木) 09:50:11 ID:???
誰か模範質問してくれるといいんだがw

693 :NAME IS NULL:2005/05/27(金) 01:48:49 ID:???
SQL Server 2000です。教えてください。
自己解決しました。
ありがとうございました

694 :NAME IS NULL:2005/05/29(日) 11:52:42 ID:???
最後、句点がない。減点 - 1 。

695 :NAME IS NULL:2005/05/30(月) 01:03:15 ID:???
ガビーン

696 :NAME IS NULL:2005/06/02(木) 01:38:48 ID:???
DBの設計に関しての初歩的な質問です。お手柔らかに宜しくお願いしま。

過去ログで3値論理を利用した問い合わせの方法を見ました。
>>312-343

やってみたのですが、検索対象のデータにNULLがあるとうまいこと行きませんでした。
考えてみれば当然ですが「NULL = '検索文字列'」はNULL(=not false)なのでヒットしてしまいます。
そこで最初から全カラムをnot nullにし、defaultを全部0や空文字列
にすることを考えました。
CSEなどのクライアントでもNULLと空文字列の見た目が紛らわしいと常々思っていたのもあります。
ネットで「可能な限りnot null制約を」と解説しているサイトもありましたが、
僕は一つ残らずnot nullにしてしまいたい勢いです。
このような設計は一般的に正しいでしょうか。ご助言よろしくお願いします。

697 :NAME IS NULL:2005/06/02(木) 01:46:26 ID:???
↓華麗なスルー

698 :NAME IS NULL:2005/06/02(木) 02:24:53 ID:???
>>696
それで問題がでないなら、
全列NOT NULLなのは、別に悪いことじゃないですよ。

ただ、多くの場合はどこかの表にどうしてもNULLを置いておきたい
(その方が自然な)列ができちゃう場合が多いですけど。

699 :NAME IS NULL:2005/06/02(木) 08:59:45 ID:???
たとえばその数値、未登録と0が入ってることを区別する必要ないんか?
あと日付とかも

700 :NAME IS NULL:2005/06/02(木) 09:49:40 ID:???
自然に考えるのが一番かと。
データの項目がある時点で不定ならば正にNULLなわけだし。
その不定っていう状態を、該当なしという状態に割り当てて特別なコードを割り当てることと、NULLってのも微妙にいみが変わる。

701 :NAME IS NULL:2005/06/02(木) 10:25:22 ID:???
そもそも「NULL = '検索文字列'」が思いつくことがおかしい

702 :NAME IS NULL:2005/06/02(木) 17:18:55 ID:???
3値論理の利用は学術的には面白そうだけど、なるほどこういう問題があるのか。
実用的には >>315 の方法が一番無難そうですね。

>>701
「NULL = '検索文字列'」というのは
「フィールド1 = '検索文字列'」でフィールド1に値としてNULLが
入っていた場合の事だと思うが。
>>697 見事にスルーされてる。

703 :NAME IS NULL:2005/06/02(木) 21:53:50 ID:???
>>698さん,>>699さん
なるほど、だめですね。NULL全排除は止めました。
文字列型では特に問題あるケースが思い当たらないですが、
どちらかというと空文字列のほうを排除したほうがいい気もしてきました。
考え中です。

>>700さん,>>701さん,>>702さん
説明べたですみません。702さんのおっしゃる通りです。
今のところ3値論理の活用方法が見出せません。

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

704 :NAME IS NULL:2005/06/02(木) 22:39:46 ID:???
>>703
3値論理の活用方法が見出せないなら、
逆にNOT NULL制約を活用しておいた方がいいんじゃね。

705 :NAME IS NULL:2005/06/02(木) 23:12:49 ID:???
NULL と 空文字の話が出ていますが・・・。 Oracle って NULL と 空文字を同一
視しませんか? SQL Server は NULL と 空文字を別のものとして扱ってくれるの
ですが・・・。Oracle で NULL と 空文字を区別する方法があったら教えてください。

706 :NAME IS NULL:2005/06/02(木) 23:20:56 ID:???
ばあちゃらちゅーをつかわない。

707 :NAME IS NULL:2005/06/03(金) 03:10:12 ID:???
>>696
>>314のリンク先でいう、未知と適用不能の4値論理があれば解決するんですけどね。

708 :705:2005/06/03(金) 22:57:19 ID:???
>>706
ばあちゃらちゅーを使わないって、代わりに何を使えばいいんでしょうか?
ばあちゃらわんですか? ちゃらですか?
そもそも、ばあちゃらちゅーとばあちゃらわんの違いが分かってないんですが。

709 :NAME IS NULL:2005/06/04(土) 11:02:41 ID:???
>>707
3値論理でもてあましてるのに4値だともうついていけないよ。

>>708
びぃろぶとちぃろぶおいときまちぇね

710 :NAME IS NULL:2005/06/04(土) 18:42:52 ID:???
ろぶだといんでっくす貼れなくないですか?

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でも問題ありません。
どうぞよろしくお願いします。

712 :NAME IS NULL:2005/06/05(日) 13:16:44 ID:???
>>711
定期的にこういう事したいやつ出てくるな…。
SQL で頑張るより、アプリケーション側でやった方がいいと思うが。

あと、三つまでのデータの選択は任意でいいのか ?

つまり、名称1に対して 400,300, 600 でも OK ?

713 :NAME IS NULL:2005/06/05(日) 13:20:57 ID:???
>>712
そこをなんとかお願いします。
アプリ側だと遅いのです。

3つまでのデータの選択は、
偶然検索された上位3件で問題ありません。
よろしくお願いします。


714 :NAME IS NULL:2005/06/05(日) 14:33:32 ID:???
>>713
リレーショナルデータベースの使い方を理解してないね。設計が悪い。
DB側でこねくり回してもコストはかかるよ。遅くなる。
あきらめてテーブル設計をやり直したほうがいい。

715 :NAME IS NULL:2005/06/05(日) 14:55:46 ID:???
私的なDBならテーブル設計変えられるんですけどね。
リレーショナルってこういうことできないんですね。
残念です。


716 :NAME IS NULL:2005/06/05(日) 15:06:11 ID:???
公的なDBにこういう設計持ち込んでるのもどうかと思うぞ。

717 :711:2005/06/05(日) 15:16:39 ID:???
DBの設計に問題はないと思いますが。
よくある 受注1−明細多 の場合も同じような設計になると思います。

問題は結果の出力方法にあると思います。
もしくは欲しい結果を生成できないリレーショナルDBにあると思います。

718 :NAME IS NULL:2005/06/05(日) 15:20:30 ID:???
>>717
だから、そういった結果はDBじゃなくて表示するクライアントで制御しろよ。


719 :711:2005/06/05(日) 15:30:04 ID:???
長々と付き合っていただきありがとうございました。

720 :NAME IS NULL:2005/06/05(日) 15:42:26 ID:???
>>717
例えば、TEBLE2に明細番号さえ振っていればVIEWを作って結合なんてことができる。
問題は欲しい結果を考慮してないテーブル設計にあると思う。

721 :NAME IS NULL:2005/06/05(日) 15:44:45 ID:???
哀愁漂わせてないで頑張れよ。

722 :まあ、TEBLE2 とか書いてる時点で釣りだと思うが…。:2005/06/05(日) 16:27:07 ID:???
>>720
そんな出力にべったり依存した設計もどうかと思うが…。

723 :NAME IS NULL:2005/06/05(日) 17:56:09 ID:???
>>711
最大3つというのはアプリで処理するのが普通。
ただ帳票作成ツールでこの手の帳票を作るのに、>>711のようなSQLの
結果を必要としてしまうケースがある。
一時表が使えるデータベースならストアドでカーソル使って順に処理
して結果を返せば対応できる。
帳票ツールの選択を誤ったというのはなしで(笑)

724 :NAME IS NULL:2005/06/06(月) 00:06:44 ID:???
>>711
DBを限定していいなら、再帰SQL(再帰照会)で書けば
SQLだけで実現できそうだけどね。
いや、俺は書けないけどね。

725 :NAME IS NULL:2005/06/06(月) 01:08:40 ID:???
DB限定ならほとんど実装されていなさそうな再帰SQL(RECURSIVE)より
OFFSETとLIMITを使ったほうが楽だろ。最大3つと限定されているし。

726 :NAME IS NULL:2005/06/06(月) 01:38:03 ID:???
>>713
>アプリ側だと遅いのです。
TABLE1を1件ずつ読んで、ID毎に毎回TABLE2にクエリーかけてたら遅いのは当たり前。
アプリ側で処理するときは、TABEL1と2を結合してID順にID, NAME, COSTで順次読み込み
IDが切り替わるごとに行換えの処理を行うとDB−>アプリ間のクエリは1回で済む。
RDB以前は普通に見られたコントロールブレイクという手法なのだが、
最近はあまり使わないのだろうか。

727 :NAME IS NULL:2005/06/06(月) 02:07:23 ID:???
COBOLerの本領発揮だなw

728 :NAME IS NULL:2005/06/06(月) 02:24:51 ID:???
最近勉強し始めた者ですが、MySQLのselect文について教えてください

select * from テーブル where フィールド like 変数
として

該当フィールドのデータが
「あいうえお」、「あい」
がある時
「あい」を選択したいのに「あいうえお」も選択してしまいます。
「あい」だけを選択したい場合はどう記述したらよいのでしょう?


729 :NAME IS NULL:2005/06/06(月) 02:33:08 ID:???
>>727
マッチングもアプリでやり始めたら真性COBOLerだなw
コントロールブレイクはたまに使うよ。

730 :NAME IS NULL:2005/06/06(月) 02:36:46 ID:???
>>728
where フィールド = 変数 じゃだめ?
MySQLのlikeって 'あい%' としなくても前方一致なのかな?

731 :NAME IS NULL:2005/06/06(月) 02:50:18 ID:???
>>730
素早いレスありがとうございます。

select * from テーブル where フィールド = 変数
とやってみましたが、エラー

select * from テーブル where フィールド == 変数
とやってみましたが、likeの時と同じでした

select文の所で制御するのが間違いなのでしょうか?


732 :NAME IS NULL:2005/06/06(月) 03:02:28 ID:???
「変数」とあるから何かの言語から使ってるのでしょうか?
SQL単体だと == なんて構文は存在しないはずなので、
前後のプログラムコードもアップしないと答えは出ない気がします。

733 :NAME IS NULL:2005/06/06(月) 03:13:57 ID:???
>>732

変数はブラウザから
sample.php?hensu=あい
でphpを呼び出しています。引継ぎ先は
select * from テーブル where フィールド like '%hensu%';
のようになっています。

たびたび申し訳ありません。

734 :NAME IS NULL:2005/06/06(月) 04:44:49 ID:???
>>733
sample.php?hensu=あい
と呼び出されたとき、最終的に発行されるSQLが
SELECT * FROM テーブル WHERE フィールド = 'あい';
となるようにPHPのコードを書き直せば桶。

735 :NAME IS NULL:2005/06/07(火) 04:55:27 ID:???
社員とゆー表(社員ID,名前、年収、課ID)と、組織とゆー表(課ID,課名、課長)があって
この2つの表から設計課に属する社員の社員IDと名前、課名を知りたい、これをSQLと
関係代数でやれとゆー問題が出たんですが、出来そうで出来ません。どなたか教えて
ください。設計課とゆーのは、組織とゆー表の課名の所にあります。お願いします。

736 :NAME IS NULL:2005/06/07(火) 05:09:01 ID:???
>>735
>この2つの表から設計課に属する社員の社員IDと名前、課名を知りたい

課名が知りたいって、設計課で抜き出すんだから、抽出された結果の課名は全部”設計課”じゃ?

737 :NAME IS NULL:2005/06/07(火) 05:21:59 ID:???
>>736
はい、導出表てゆーのはできたんですが、2つの表を使ってSELECTとかFROM
とかでやれってことだと思うんですが、何か順序みたいのがあるのか、それとも
結合とか射影とかを使うものなのかぜんぜんわからないんです。SQLと関係代数で
で記述しろって書いてあるんです。

738 :NAME IS NULL:2005/06/07(火) 06:00:17 ID:???
何がゆーたいのかゆーわからん。

739 :NAME IS NULL:2005/06/07(火) 06:08:44 ID:???
>>737
そうゆー質問はこうゆーところでやるより先生に確認する方が早い。そもそも宿題とゆーのは
自分でやるもので、分からないなら「こうゆー風に考えたけど出来なかった」と解答するのが
正しいあり方とゆーものだ。

740 :NAME IS NULL:2005/06/07(火) 06:10:58 ID:???
ゆー聞いちゃいなよ。

741 :NAME IS NULL:2005/06/07(火) 06:15:56 ID:???
>>738
すいません。うまく言えないのですが、表"社員”と表"組織”から、設計課に属する
社員の、社員IDと名前と課名を知りたい。この問合わせをSQLと関係代数で記述し、
結果を導出表として作成しろってゆー問題なんです。

742 :NAME IS NULL:2005/06/07(火) 06:20:13 ID:???
宿題の提出はいつまでなの?

743 :NAME IS NULL:2005/06/07(火) 06:20:38 ID:???
ゆー答えちゃいなよ。

744 :NAME IS NULL:2005/06/07(火) 06:29:53 ID:???
お前らホント使えねぇな

745 :NAME IS NULL:2005/06/07(火) 06:33:26 ID:???
>>739
そーですね、自分がまちがっておりました。ご指導ありがとうございます。

746 :NAME IS NULL:2005/06/08(水) 00:25:16 ID:xXW03fha
SELECT 社員.社員ID,社員.名前,組織.課名 FROM 社員とゆー表 社員,組織とゆー表 組織
WHERE 組織.課名 = '設計課'
AND 社員.課ID = 組織.課ID


747 :NAME IS NULL:2005/06/08(水) 08:38:19 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を書くのでしょうか?よろしくお願いします。

748 :NAME IS NULL:2005/06/08(水) 09:03:18 ID:???
>>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型にキャストするとか。
まぁ、全体の兼ね合いもあるだろうから一概にどうとは言えんが。

752 :NAME IS NULL:2005/06/08(水) 10:13:50 ID:???
うちでもTIMESTAMPでやってたのを不便だから
DATE と TIME にわけたものもあるよ
かなり扱いやすくなった。

753 :NAME IS NULL:2005/06/08(水) 11:55:56 ID:???
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
すいません。初めての書きこみテストです。

756 :NAME IS NULL:2005/06/08(水) 19:16:01 ID:???
>>755
「すみません」だろうが、ボケェ

757 :NAME IS NULL:2005/06/09(木) 10:15:47 ID:???
さんぺー師匠ならよし

758 :NAME IS NULL:2005/06/09(木) 13:19:44 ID:???
お餅も入ってベタベタと

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が作成したいのです。
ご教授お願い致します。

760 :NAME IS NULL:2005/06/09(木) 14:39:38 ID:???
>ご教授お願い致します。
教授は留守だ、ゼミ生のおいらが答えてやろう。
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の場合も情報をはじめから保持しておけば簡単に解決する。

761 :NAME IS NULL:2005/06/09(木) 14:59:26 ID:???
>>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つあるのですが、
今回の方法の応用で解決出来るかもしれません。
もし解決出来かった際には宜しくお願い致します。

763 :NAME IS NULL:2005/06/09(木) 15:51:28 ID:???
>>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
と順に結果を見ながら足していったらすぐ理解できると思うよ。

765 :NAME IS NULL:2005/06/09(木) 16:30:12 ID:???
私もデカルト積を自然結合と思ってましたよ。
調べてみると、
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の規約情報?みたいなのって皆さんどこで入手しているんでしょうか?
探せど一向に見つかりません・・・。

767 :NAME IS NULL:2005/06/09(木) 18:32:45 ID:???
mysql4.0.*を使用しています。
hoge (
id INT PRIMARY KEY,
person VARCHAR,
dttm DATETIME
)
こういうテーブルに対し、person毎にdttmが最新のレコードを返すようなSQLを書きたいです。
SELECT MAX(dttm) FROM hoge GROUP BY person;
だと最新レコードのIDがわからないのでだめでした。
すごく初歩的な質問かもしれませんが、どう書けば良いのでしょうか?


768 :NAME IS NULL:2005/06/09(木) 21:41:02 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です。

771 :NAME IS NULL:2005/06/09(木) 23:46:55 ID:???
>>769
携帯からなので、答えを示せなくて申し訳ないんですが。。 
よろしくお願いします 


772 :NAME IS NULL:2005/06/10(金) 01:13:57 ID:???
>>734
お礼が遅れましたが、教えていただいてうまく機能するようになりました。
教えていただいたことと、入門書を読み進めていくことで解決できました。
半ばあきらめかかっていたところを最後までやる気にさせていただいた
ことに大変感謝します。ありがとうございました。

773 :767:2005/06/10(金) 02:39:17 ID:???
>>768
ありがとうございます。
それだと、personごとの最新dttmはわかりますが、求めたいのは
そのdttmとpersonを持つレコードのidなのです。

774 :NAME IS NULL:2005/06/10(金) 06:27:33 ID:???
>>773
すまん、ボケてた。
SELECT DISTINCT ON (person) person,dttm,id FROM hoge ORDER BY person,dttm DESC;

775 :U ◆CZtFsGiu0c :2005/06/10(金) 12:27:35 ID:???
>>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:???
>>774
DISTINCT ONなんてあるのですねー!と思ったらMySQLにはありませんでした。orz
でもそれをヒントに検索してみたところ、
http://myna2.mysql.gr.jp/mysqlml/mysql/msg/8911
から始まるスレッドを見付けました。
SELECT SUBSTRING(MAX(CONCAT(dttm,id)),20) as id FROM hoge GROUP BY person;
なかなかに微妙な方法ですが…、現状だとこれが一番現実的のようです。

777 :NAME IS NULL:2005/06/10(金) 17:07:42 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


よろしくお願いします。

779 :NAME IS NULL:2005/06/11(土) 22:52:47 ID:???
一つのselectでは無理。


780 :778:2005/06/11(土) 22:52:49 ID:1Tj5SFGP
って書いておいて、もしかしたら>>767と同じ問いなのかな、、と思いました。
コレは運がいいかもしれません。ちょっくら実験してみます。

なにかアドバイスありましたら、引き続きよろしくおねがいします!

781 :NAME IS NULL:2005/06/11(土) 23:12:34 ID:???
>>780
基本的に同じだが、同月に同売上で売上トップが2店以上存在することを考えると
冗長気味なSQLになると思うよ。

782 :NAME IS NULL:2005/06/11(土) 23:14:07 ID:???
標準的なSQLだけでもサブクエリを使えば出来そうな気もするが
同率首位の場合どうするかが微妙だ。

783 :778:2005/06/12(日) 00:04:45 ID:m0JkroiI
みなさん反応をありがとうございます。

実は実際に扱っているデータは純粋に数値処理のデータで、
お店の売り上げデータとは関係無かったりします。
数千万行のデータでやっているので、なんとしてでも一発のクエリで
処理をしたくて、ここんとこずっと悩んでいました。

>>778の例だと、普通は
SELECT MAX(売り上げ) 〜略〜 GROUP BY 月
を一時テーブルに入れて、支店名・売り上げでJOINをすればいいのですが
数百〜数千万行の一時テーブルを作るのは現実的ではなく。。とりあえず
VIEWを作ってそれとJOINしていますが、自己JOINは試していませんでした。

あ、サブクエリ試してなかった・・・。 なんか知見が得られたら
報告します。引き続きアドバイスよろしくお願いします。

784 :NAME IS NULL:2005/06/12(日) 01:25:45 ID:???
Viewを重ねたりサブクエリで自己JOINした場合には、この手のクエリは内部的に
中間表が作られると思うから、一時表でもよいのではないだろうか。
どうしてもSQLでスマートに処理できない場合は、時系列でシーケンシャルに
読み込んで処理してみるのも一手だと思う。

785 :NAME IS NULL:2005/06/12(日) 03:05:45 ID:???
>>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を始めたばかりで調べても原因がよくわかりません。
どなたか分かる人がいらっしゃいましたら教えてください。
よろしくお願いします。

787 :NAME IS NULL:2005/06/12(日) 23:08:34 ID:???
'社員名称'という列名が無効なんだろうなあ。

788 :NAME IS NULL:2005/06/13(月) 00:55:38 ID:???
SQL始めたばかりで会社の社員マスタとかはいじらん方がいいと思われ。

SELECT 社員名 AS 社員名称
FROM 社員マスタ
WHERE 社員名 = 'A'

789 :NAME IS NULL:2005/06/13(月) 09:24:49 ID:???
masterのリストアをするときの方法を教えて下さい。
起動時に「-s」のパラメータ、という記述があったので、プロパティから
追加してみましたが、今度はDBとつながらず…orz


790 :NAME IS NULL:2005/06/13(月) 11:23:59 ID:???
>>789
MS SQL Serverスレの誤爆?
起動パラメータ-s はインスタンス名の変更
-m がシングルユーザーモード起動

791 :789:2005/06/13(月) 14:20:49 ID:???
>>790
「-s」は誤りです。「-m」ですね。

792 :NAME IS NULL:2005/06/14(火) 01:41:09 ID:???
>>791
ここはSQL一般のスレだからMS SQL Server固有の運用にかかわる質問はスレ違いってこと。
Agent止めてる?そいつがシングルユーザーモード唯一のユーザーになってログオンできないのでは。
他から接続がないのが保障できればAgentさえ止めれば通常モードでもリストアできたと思ったけど。

793 :NAME IS NULL:2005/06/14(火) 04:41:30 ID:???
>>746 関係代数は?

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の方が基本ぽい気がしたもので・・

795 :NAME IS NULL:2005/06/14(火) 10:53:57 ID:???
なんかSQLって言語とSQLServerって製品が違うってことが理解できてないお約束な初心者が連荘してるね。

796 :794:2005/06/14(火) 12:04:43 ID:FN/Zifsa
すいません。スレが違うようなので移動します><

797 :NAME IS NULL:2005/06/14(火) 19:47:02 ID:???
>>794
移動したようだけど、一応回答しておく。それらの違いはターゲット OS が
32ビットか 64ビットかという違い。64ビット版も開発とテストにしか
使用できないので注意しとけよ。実運用環境に配備したらアウト。

798 :NAME IS NULL:2005/06/14(火) 20:45:48 ID:???
ここで初めて質問させていただきます。

あるフィールドにおいて、重複したデータを
一つだけにする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

どうぞよろしくお願い致します。


799 :NAME IS NULL:2005/06/14(火) 21:45:53 ID:???
かけるよ。

800 :NAME IS NULL:2005/06/14(火) 22:15:08 ID:???
>>798
最近の質問はその手の物ばかりだということにはお気づきでしょうか?

801 :NAME IS NULL:2005/06/15(水) 00:16:11 ID:???
3回連続でほとんど同じ質問、、、流行ってるの?

802 :NAME IS NULL:2005/06/15(水) 07:28:21 ID:???
で、答えは?w

803 :NAME IS NULL:2005/06/15(水) 13:11:11 ID:???
>>802
その課題出した先生に訊けよ。

804 :NAME IS NULL:2005/06/15(水) 13:40:02 ID:???
そうか、みんな先生が同じなわけか。

805 :NAME IS NULL:2005/06/15(水) 16:42:37 ID:???
SELECT DISTINCT ファイル名,ID,更新日 FROM もとのテーブル

806 :NAME IS NULL:2005/06/15(水) 18:08:26 ID:???
>>767 から >>768 と同じ流れだな。続いて >>773 >>774 と同じ展開の予感。

807 :NAME IS NULL:2005/06/15(水) 19:49:25 ID:???
すまん、ボケてた。
SELECT ID,ファイル名,更新日 FROM もとのテーブル WHERE ID IN(SELECT DISTINCT ON(ファイル名)ID FROM もとのテーブル) ORDER BY 更新日

808 :NAME IS NULL:2005/06/15(水) 20:15:12 ID:???
まあ>>774だけでいけますけどね。

SELECT DISTINCT ON (ファイル名) ID,ファイル名,更新日 FROM もとのテーブル ORDER BY ファイル名,更新日 DESC;

809 :NAME IS NULL:2005/06/15(水) 20:22:12 ID:???
このスレはDBMSが限定されていない状況で方言使って答えるのはありなのか?

810 :NAME IS NULL:2005/06/15(水) 20:34:17 ID:???
>>807
Accessでやったら、構文エラーが出た。。。

811 :774:2005/06/15(水) 23:20:18 ID:???
真似るなよぉーんヽ(`Д´)ノウワァァン!!

>>809
俺はなるべく回避しているつもりだけド。

>>810
>>785の構文で逝ってみればどぉ。

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つくらいテーブルたどってます・・・。
 んー、こういう場合どうかけばいいのでしょうか?)

教えていただければ幸いです。


813 :NAME IS NULL:2005/06/16(木) 02:17:44 ID:???
がむばれ

814 :NAME IS NULL:2005/06/16(木) 02:20:34 ID:???
>>812
適当にMAXでも付けとけば
SELECT fuga_id, SUM(num) , MAX(city), MAX(city_kana)

815 :812:2005/06/16(木) 02:26:29 ID:???
>>814
おお、目からうろこ。はじめてしったそのやりかた。

ちなみにそれって定番手法すか?

816 :NAME IS NULL:2005/06/16(木) 03:36:29 ID:???
>>815
俺ならこうするが。
SELECT *,(SELECT SUM(num) FROM hoge WHERE fuga_id=fuga.id) FROM fuga;
大阪まででちゃうけど。

817 :U ◆CZtFsGiu0c :2005/06/16(木) 14:04:42 ID:???
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

818 :NAME IS NULL:2005/06/16(木) 14:46:55 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

819 :NAME IS NULL:2005/06/16(木) 20:12:43 ID:???
>>817 さんの、
SUM(num) num_total を SUM(num) AS num_total
にかえたら出ますね

820 :NAME IS NULL:2005/06/17(金) 17:11:27 ID:???
oracle8 でエクスポートを速くする方法ってありますようでしょうか?
宜しくお願いします。

821 :NAME IS NULL:2005/06/17(金) 17:43:09 ID:???
>>820
まずすれ違い。
次にマニュアル嫁。
最後に多分EXPORTで行うってのが間違い、バックアップ計画自体の見直しを。

822 :NAME IS NULL:2005/06/17(金) 21:31:33 ID:???
MySQLでSELECT文を投げる時、
「'」を「\'」でエスケープしても、「''」でエスケープしても
結果が返ってきてくれないんだけど、どうしたらいいですか?

823 :NAME IS NULL:2005/06/17(金) 21:59:38 ID:???
>>822
MySQLで文字列に ' や " を含める場合には、決まりごとを守る必要がある。
ttp://dev.mysql.com/doc/mysql/ja/string-syntax.html

824 :822:2005/06/17(金) 22:09:15 ID:???
>>822
一通り目を通してみたけど、そこにある書式通りには書いてると思うです。
SELECT * from bb where aa = 'Let''s';
とか
SELECT * from bb where aa = 'Let\'s';
では駄目でした。


825 :NAME IS NULL:2005/06/17(金) 22:34:11 ID:???
>>822
原因がどっちにあるのか判らないとしてもマルチはイヤずら。

826 :822:2005/06/17(金) 23:45:20 ID:???
>>825
うぁ、すいませんでした。
向うに書き込んで悩んでる間に、こちらで聞くのが相応しいような気がして
書き込んでしまいました。
板越えでも駄目だったのですね。
申し訳ありませんでした。
結局なにが原因だったのかわかりませんが、解決いたしました。
有難うございました。

827 :NAME IS NULL:2005/06/18(土) 14:07:34 ID:???
板どころか、2ちゃん以外でもマルチはマルチ

828 :NAME IS NULL:2005/06/20(月) 09:37:28 ID:???
質問はしたものの回答に期待なんかできないから
別のスレでも聞いてみるというところがこたえる気を無くさせる

829 :NAME IS NULL:2005/06/20(月) 18:39:07 ID:???
>>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検索する場合はどうすればよいのでしょうか?

832 :NAME IS NULL:2005/06/21(火) 19:54:14 ID:???
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の書き方で実現できるのでしょうか?


834 :NAME IS NULL:2005/06/21(火) 22:35:27 ID:???
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さんありがとうございます。
試してみます!

836 :NAME IS NULL:2005/06/21(火) 23:24:07 ID:???
対戦結果のリザルトを入れるのに良さそうなテーブルないっすか?

837 :NAME IS NULL:2005/06/22(水) 09:27:55 ID:???
>>836
ちらしの裏。

838 :833:2005/06/22(水) 10:25:29 ID:1PcqlwUc
834さんありがとうございました。
参考にします。

839 :NAME IS NULL:2005/06/22(水) 10:58:01 ID:???
837さんありがとうございました。
参考にします。

840 :NAME IS NULL:2005/06/22(水) 13:48:47 ID:???
すみませんが、教えてください。
テーブル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です。

842 :NAME IS NULL:2005/06/22(水) 14:04:19 ID:???
>>841
FULL JOIN

843 :NAME IS NULL:2005/06/22(水) 20:20:47 ID:nrsoLKzv
MySQLで
select エリア,店名,県名 from tab2 NATURAL JOIN tab1 order by table2.エリアID, 店名
というセレクト文があるのですが。
ここで県名の重複を排除したいのですけど。
DISTINCTを使えばいいのでしょうけど
どう表記すればいいのでしょうか?

844 :NAME IS NULL:2005/06/22(水) 20:42:58 ID:???
本当にもう、この質問ばかりだな。

845 :NAME IS NULL:2005/06/22(水) 21:00:25 ID:???
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
店名と県名には同一の名詞は無いんです。
コクヨ-東京都、ヤマハ-静岡県、凸版-東京都って感じです。
…あくまでも例です。

849 :NAME IS NULL:2005/06/22(水) 22:19:26 ID:???
>>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)


854 :NAME IS NULL:2005/06/22(水) 22:57:01 ID:???
>851
使ね


855 :843:2005/06/22(水) 23:09:42 ID:???
>>853
エラー吐いちゃいます。

856 :NAME IS NULL:2005/06/22(水) 23:23:36 ID:Xwpjr34c
だよね。
select句のcount(*)はいらないかも。
tab1、2の列関係がよくわからないのですよ。

857 :NAME IS NULL:2005/06/22(水) 23:40:57 ID:???
>>851
あのなぁ〜。
どういう基準でどちらを捨てるんだ?
両方とも捨てるのか?

ハッキリ言ってみんな呆れてるぞ。

858 :NAME IS NULL:2005/06/23(木) 00:30:48 ID:???
「みんな」とか言って勝手に不特定多数の名義で腐す奴に
ろくなこと言える奴はまずいないな、ホント。

859 :857:2005/06/23(木) 00:46:38 ID:???
>>858
つっこまれた本人だけど、正直同意w

ンでも、このスレでGROUP BY後の1行表示は俺も答えたし、
他の人も答えれる人は居る。どういう答えが欲しいのは概ね
分かってんだけど、質問の仕方が中途半端で小出し。

ちょっと遡ればヒントはたくさんある。俺でなくても呆れると思うが。

860 :840:2005/06/23(木) 00:48:06 ID:???
>>841
望みどおりのことができました。
ありがとうございました。

861 :NAME IS NULL:2005/06/23(木) 12:35:18 ID:???
>>843
>>689-691

862 :U ◆CZtFsGiu0c :2005/06/23(木) 13:46:05 ID:???
>>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'の条件でデータを削除)

この二つの結果の違いって何ですか?
ヒントが削除不整合って言われてもまったくわからないんですが…

864 :NAME IS NULL:2005/06/23(木) 14:42:01 ID:???
>>863

>>861


865 :863:2005/06/23(木) 14:46:41 ID:???
>>864
これはどうこうしたいじゃないのでDBMSに依存することもないだろうし…

866 :NAME IS NULL:2005/06/23(木) 14:56:55 ID:???
>>865
そもそも何がしたくて、何が不具合なの?
元文書は日本語じゃねーよ。

867 :NAME IS NULL:2005/06/23(木) 15:00:03 ID:???
>>850
ANSI SQL準拠の基準がいまだにわからない。
文法や構文が違っていても相当の機能があればよいのか、
それとも規格があいまいで実装で違いが出るのか。
準拠を満たしているといっても普通のプログラム言語の規格のような
ポータビリティは期待できないようだ。

868 :NAME IS NULL:2005/06/23(木) 15:05:53 ID:???
>>850
9i から準拠してる


869 :NAME IS NULL:2005/06/23(木) 15:24:03 ID:???
>>867
所詮"準拠"ですから。RS-232C準拠とか
結局は各マシンごとにチェックが必要でしたしね。


870 :NAME IS NULL:2005/06/23(木) 15:27:36 ID:???
>>863
他スレで宿題は・・とあしらわれてた人ですね。なぜ回答がつかないかといえば、
問いの内容をあなたが理解してなくて他の人も理解できないからです。
その設問にはあなたの使ってる教科書か出題者特有の約束事が含まれているよう
に思います。まずは設問を理解して設問の内容を正しく伝えられるように
なってから質問しましょう。

871 :NAME IS NULL:2005/06/23(木) 15:36:09 ID:???
>>870
変なところで改行するね、読んでて気持ちわる〜

872 :NAME IS NULL:2005/06/23(木) 15:51:02 ID:???
>>871
使ってるブラウザや2chビュアーの入力ボックスの幅に依存してるんだろ。

で、宿題は終わったのか?

873 :NAME IS NULL:2005/06/23(木) 16:29:17 ID:3ZmXJLi2
SELECT行の重複を防ぐのにDISTINCTがあり、
これは行全体なのですが、
ある列のみの重複を防ぐにはどうすればよいでしょうか。

DBはMSDEです。よろしくお願いします

874 :NAME IS NULL:2005/06/23(木) 16:46:48 ID:???
ぐるーぷばい。(なんとなく胡散臭い福岡弁)

875 :NAME IS NULL:2005/06/23(木) 17:59:08 ID:???
また同じ質問。
こうも同じ質問が続くってことはSQLの仕様が腐っているってことか。


876 :NAME IS NULL:2005/06/23(木) 18:27:20 ID:???
「同じ質問が続く」のは質問する香具師が腐ってるから。

877 :NAME IS NULL:2005/06/23(木) 19:40:16 ID:WtHH1CtQ
データバックアップする方法は?どうやるの?


878 :NAME IS NULL:2005/06/23(木) 19:41:44 ID:???
>>874
ありがとうございます。
同じ質問ですいませんでした

879 :NAME IS NULL:2005/06/23(木) 20:10:13 ID:???
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 | かなりエロ |

880 :NAME IS NULL:2005/06/23(木) 23:06:34 ID:???
>>879
>>711-726


881 :NAME IS NULL:2005/06/24(金) 00:39:12 ID:???
もうさぁ…
始めから「熟女 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じゃないです。というか、一般的なプログラミング技法として
どうするのかが知りたいと思ってます

885 :NAME IS NULL:2005/06/24(金) 14:49:07 ID:???
本屋の中の重複のない本の冊数を調べるにはどうしたら良いでしょうか。
  SELECT COUNT(*) FROM 本屋 GROUP BY 本の題名
とした場合、1ROWにつき重複された本の冊数が入って全体の重複の無い本の数が分かりません。

同一の本の重複を取り除きたいのでGROUP BYでなくても良いのかもしれませんが思いつきません。。

886 :885:2005/06/24(金) 15:10:37 ID:???
大事な事を書き忘れました。mysql4.0なのでサブクエリが使えません。

887 :NAME IS NULL:2005/06/24(金) 16:41:57 ID:???
>>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 出来るならば、その方が良いし。


889 :NAME IS NULL:2005/06/24(金) 19:41:26 ID:???
>>885
SELECT COUNT(*)
FROM 本屋
GROUP BY 本の題名
having COUNT(*)=1

あとは行数を数えれば

890 :NAME IS NULL:2005/06/24(金) 19:51:59 ID:???
>>887-888
双方のメリットがよくわかりました
ありがとうございました<m(_)m>


891 :NAME IS NULL:2005/06/24(金) 21:37:51 ID:???
MySQLadminがPC起動時に自動的にたちあがりタスクバーに常駐するのを
やめさせたいのですが、何か方法ありますか?

892 :NAME IS NULL:2005/06/24(金) 21:38:59 ID:???
スレ違い


893 :NAME IS NULL:2005/06/24(金) 21:40:17 ID:???
すみません

894 :NAME IS NULL:2005/06/24(金) 22:52:58 ID:???
>>889
Oracleなら、

SELECT COUNT(DISTINCT 本の題名)
FROM 本屋

とかも、できましたよね

895 :885:2005/06/25(土) 00:06:32 ID:???
やはり総数のカウントはサブクエリか外部でカウントするしかないのですね。。
プログラム側でカウントするか、サブクエリに対応したバージョンにサーバーを変更するか
検討してみます。

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

896 :NAME IS NULL:2005/06/27(月) 01:54:31 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を使って簡単にできたのですが。。。よろしくお願いします

898 :NAME IS NULL:2005/06/29(水) 23:43:33 ID:???
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'

899 :NAME IS NULL:2005/06/30(木) 00:07:05 ID:???
...つづき

2、は3が出来れば、できるはず。
4、は全てがTABLE Aに対するOUTER JOINと考えて良いのであれば
可能。


900 :NAME IS NULL:2005/06/30(木) 11:33:20 ID:PnJiH1Xi
SELECT where の文で 指定のカラムがない場合のエラー画面がでるのですが、
エラーだったら他の処理をさせたいのですが、どのような構文にすればよいのでしょうか?
環境は JSP oracle9i です。
よろしくお願いします。

901 :NAME IS NULL:2005/06/30(木) 12:20:05 ID:???
100%、(SQLの)構文の問題では無いだろ。

902 :NAME IS NULL:2005/06/30(木) 18:15:16 ID:???
>>900
初心者が問題の切り分けができないのは仕方ないだろうな。
SQLではなくてJSPの問題で、JSP のPageディレクティブでエラーページを指定するか、
<%@ page errorPage="error1.jsp" %>
スクリプトレットなら try catch で囲むかする。
これ以上の内容はWEB/JSP関連のところできいてみてね。

903 :NAME IS NULL:2005/06/30(木) 21:25:51 ID:???
>指定のカラムがない場合のエラー

なんでそんなもん出るんだよ

904 :NAME IS NULL:2005/07/01(金) 18:07:36 ID:???
ダイナミックにカラムが変わるテーブル・・・

905 :NAME IS NULL:2005/07/01(金) 18:13:17 ID:???
オブジェクト指向DB?

906 :NAME IS NULL:2005/07/02(土) 21:28:36 ID:???
等価結合をWHERE IN を使って書くことは出来ますか?

907 :NAME IS NULL:2005/07/04(月) 10:48:24 ID:???
>>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一発で出来るでしょうか?

909 :NAME IS NULL:2005/07/05(火) 17:49:06 ID:???
>>908
意味がわからんな。
サンプルデータと期待する結果サンプルも書いたほうがいいと思うよ。

LIMIT付きSELECT文を3つUNIONする感じなんかな?

910 :NAME IS NULL:2005/07/05(火) 19:10:57 ID:???
>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

といった感じの事がしたいのです。出来ますでしょうか?

911 :NAME IS NULL:2005/07/05(火) 21:16:52 ID:???
>>910
ユーザテーブルは置いといて、
各ショップの商品を2点ずつ引っ張り出せるSQLを
書ければいいのだがそれが出来ん(´・ω・`)
それが出来れば後は結合するだけなんだが...

912 :NAME IS NULL:2005/07/05(火) 21:55:15 ID:???
でけた。
条件として、同一ショップ内に同じ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

913 :NAME IS NULL:2005/07/05(火) 22:14:45 ID:???
あ、相関サブクエリはターゲットリストに書かず、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述語を使わずに結合してしまう手もあるがな。

914 :NAME IS NULL:2005/07/05(火) 22:18:40 ID:???
連投スマソ。
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);

915 :NAME IS NULL:2005/07/05(火) 22:54:49 ID:???
select * from チラシの裏

916 :NAME IS NULL:2005/07/06(水) 01:32:20 ID:???
>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
ここで何を評価してるのかワケワカラン

917 :NAME IS NULL:2005/07/06(水) 01:42:06 ID:???
prod_id順に連番つけてる。

918 :NAME IS NULL:2005/07/06(水) 02:03:56 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に詳しい人もいません。こうしたらいいというヒント
をご教授願います。

919 :NAME IS NULL:2005/07/06(水) 12:17:38 ID:???
>914
ありがとうございます。php等からループといった手段を出来れば使わない方向で
出来ないか試案していたのでとても助かりました。

920 :NAME IS NULL:2005/07/06(水) 13:18:49 ID:???
>>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:???
有難うございます。試してみます。

922 :NAME IS NULL:2005/07/09(土) 20:04:33 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です。


923 :NAME IS NULL:2005/07/09(土) 20:14:14 ID:???
>>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;


924 :NAME IS NULL:2005/07/09(土) 20:28:05 ID:???
>>922
dataカラムが1か0「しか」ないのならこんなのでも行けると思う。
1、0以外もあるのなら、>>923の仰せの通りで。
SELECT name,
COUNT(*) - SUM(data) AS '0の数',
SUM(data) AS '1の数'
FROM table1
GROUP BY name

925 :NAME IS NULL:2005/07/09(土) 21:18:35 ID:???
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
という感じのでどうかな?

926 :NAME IS NULL:2005/07/09(土) 23:07:46 ID:???


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:???
>>923-925
さっそくのレス、ありがとうございます。
解決することができました。

928 :NAME IS NULL:2005/07/09(土) 23:15:39 ID:???
>>926
SELECT * FROM Table_a AS Ta
WHERE EXISTS (SELECT * FROM Table_b WHERE cnt BETWEEN Ta.little AND Ta.big);

929 :NAME IS NULL:2005/07/09(土) 23:25:14 ID:???
>>926
これで出来ないかな。

SELECT DISTINCT ID
FROM TABLE_A, TABLE_B
WHERE TABLE_B.CNT BETWEEN TABLE_A.LITTLE AND TABLE_A.BIG


930 :NAME IS NULL:2005/07/09(土) 23:30:34 ID:???
てかよく926のやりたいことがわかるな・・・俺全然わかんねえ

931 :NAME IS NULL:2005/07/09(土) 23:44:34 ID:???
>>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

933 :NAME IS NULL:2005/07/09(土) 23:58:01 ID:???
なんかわからんけど、多分俺ならTABLE_Aは用意しない気がする。

934 :NAME IS NULL:2005/07/11(月) 21:35:15 ID:???
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

税額表を引くような処理とかいろいろあるじゃん

937 :NAME IS NULL:2005/07/13(水) 10:33:46 ID:???
会社のネットワークで、
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
スレ違い。

939 :NAME IS NULL:2005/07/13(水) 12:11:17 ID:???
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

940 :NAME IS NULL:2005/07/13(水) 12:34:09 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

941 :NAME IS NULL:2005/07/13(水) 12:35:02 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

942 :NAME IS NULL:2005/07/13(水) 12:35:48 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

943 :NAME IS NULL:2005/07/13(水) 12:36:15 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

944 :NAME IS NULL:2005/07/13(水) 12:36:35 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

945 :NAME IS NULL:2005/07/13(水) 13:51:30 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪


946 :NAME IS NULL:2005/07/13(水) 13:51:52 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪


947 :NAME IS NULL:2005/07/13(水) 13:53:05 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪


948 :NAME IS NULL:2005/07/13(水) 13:53:27 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪


949 :NAME IS NULL:2005/07/13(水) 13:53:51 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪


950 :NAME IS NULL:2005/07/13(水) 13:54:16 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪


951 :NAME IS NULL:2005/07/13(水) 14:57:52 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪


952 :NAME IS NULL:2005/07/13(水) 14:58:30 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪


953 :NAME IS NULL:2005/07/13(水) 15:15:23 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < カネネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪


954 :NAME IS NULL:2005/07/13(水) 20:58:19 ID:UecA1U0d
会社のネットワークで、
SQL2000サーバーに各端末から.MDBでデータ処理しています。

テーブルのレコードを変更したとき、他ユーザーが開いていますなどと称して、
競合で変更が更新されないことがあります。もちろん競合はない筈でも、この
メッセージがでて変更ができないことがあります。

この不具合の原因について、教えていただけないでしょうか。

955 :NAME IS NULL:2005/07/13(水) 21:54:35 ID:???
>各端末から.MDBでデータ処理しています。
やり方がいくつもあるから具体的に書かないと誰も答えようがない。

956 :NAME IS NULL:2005/07/13(水) 23:34:57 ID:vwRoK+XR
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

957 :NAME IS NULL:2005/07/13(水) 23:35:40 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < ウルセーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

958 :NAME IS NULL:2005/07/13(水) 23:36:03 ID:???
>>953
  ∧ ∧     ┌─────────
  ( ´ー`)   < ザマーミロ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

959 :NAME IS NULL:2005/07/13(水) 23:39:02 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

960 :NAME IS NULL:2005/07/13(水) 23:39:52 ID:???
>>954
  ∧ ∧     ┌─────────
  ( ´ー`)   < ウゼーンダヨ、あおってんじゃねえよ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

961 :NAME IS NULL:2005/07/14(木) 00:49:45 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

962 :NAME IS NULL:2005/07/14(木) 00:50:58 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

963 :NAME IS NULL:2005/07/14(木) 00:51:36 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

964 :NAME IS NULL:2005/07/14(木) 00:52:34 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

965 :NAME IS NULL:2005/07/14(木) 00:54:53 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

966 :NAME IS NULL:2005/07/14(木) 00:59:09 ID:???
 ‖| ‖|
 ‖| ‖|
 ‖| ‖| キキキキキキキ━━━━
 ∧∧∩
 (   )ノ
 |   |
 〜 |

967 :NAME IS NULL:2005/07/14(木) 00:59:52 ID:???
 ‖| ‖|
 ‖| ‖|
 ‖| ‖| キキキキキキキ━━━━
 ∧∧∩
 (   )ノ
 |   |
 〜 |

968 :NAME IS NULL:2005/07/14(木) 01:00:27 ID:???
 ‖| ‖|
 ‖| ‖|
 ‖| ‖| キキキキキキキ━━━━
 ∧∧∩
 (   )ノ
 |   |
 〜 |

969 :935:2005/07/14(木) 01:08:56 ID:???
>>938
ありがとう。やっぱりなにか工夫が必要なんですねぇ・・・。

970 :NAME IS NULL:2005/07/14(木) 08:12:03 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

971 :NAME IS NULL:2005/07/14(木) 08:20:16 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

972 :NAME IS NULL:2005/07/14(木) 08:21:18 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

973 :NAME IS NULL:2005/07/14(木) 20:01:00 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < カネネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪


974 :NAME IS NULL:2005/07/14(木) 22:13:47 ID:???
>>973
  ∧ ∧     ┌─────────
  ( ´ー`)   < 早くシネヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

975 :NAME IS NULL:2005/07/14(木) 22:33:35 ID:???
  ∧ ∧     ┌─────────
  ( ´ー`)   < シナネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

976 :NAME IS NULL:2005/07/14(木) 22:37:41 ID:???
>>975
  ∧ ∧     ┌─────────
  ( ´ー`)   < 今スグシネヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

977 :NAME IS NULL:2005/07/14(木) 22:39:35 ID:???
>>975
  ∧ ∧     ┌─────────
  ( ´ー`)   < 早くシネヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

978 :NAME IS NULL:2005/07/14(木) 22:40:12 ID:???
>>975
  ∧ ∧     ┌─────────
  ( ´ー`)   < イイヨモウ、生ナクテ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

979 :NAME IS NULL:2005/07/14(木) 22:40:43 ID:???
>>975
  ∧ ∧     ┌─────────
  ( ´ー`)   < 逝ってヨシ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

980 :NAME IS NULL:2005/07/14(木) 22:41:48 ID:???
>>975
  ∧ ∧     ┌─────────
  ( ´ー`)   < 楽ニナレヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

981 :NAME IS NULL:2005/07/14(木) 22:47:03 ID:???
>>975
  ∧ ∧     ┌─────────
  ( ´ー`)   < ザマーネェゼ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

982 :NAME IS NULL:2005/07/14(木) 22:47:31 ID:???
>>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
どなたか、よろしくお願いします。

986 :NAME IS NULL:2005/07/15(金) 01:05:13 ID:???
>>985
普通に連結させりゃいいんじゃないのか!?

987 :NAME IS NULL:2005/07/15(金) 01:05:23 ID:???
>>984
SELECT *,(SELECT min(code) FROM table_B WHERE B_date<=A_date) FROM table_A;

988 :NAME IS NULL:2005/07/15(金) 06:48:41 ID:???
>>983
  ∧ ∧     ┌─────────
  ( ´ー`)   < 煽りウゼーンダヨ、もう解決したんだよボケ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

989 :NAME IS NULL:2005/07/15(金) 06:49:01 ID:???
>>983
  ∧ ∧     ┌─────────
  ( ´ー`)   < 煽りウゼーンダヨ、もう解決したんだよボケ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

990 :NAME IS NULL:2005/07/15(金) 06:50:42 ID:???
>>983
  ∧ ∧     ┌─────────
  ( ´ー`)   < 煽りウゼーンダヨ、もう解決したんだよボケ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

991 :NAME IS NULL:2005/07/15(金) 07:41:55 ID:???
>>983
  ∧ ∧     ┌─────────
  ( ´ー`)   < 煽りウゼーンダヨ、もう解決したんだよボケ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

992 :NAME IS NULL:2005/07/15(金) 07:44:59 ID:???
>>983
  ∧ ∧     ┌─────────
  ( ´ー`)   < 煽りウゼーンダヨ、もう解決したんだよボケ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

993 :NAME IS NULL:2005/07/15(金) 07:46:55 ID:???
>>983
  ∧ ∧     ┌─────────
  ( ´ー`)   < 煽りウゼーンダヨ、もう解決したんだよボケ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

994 :NAME IS NULL:2005/07/15(金) 08:07:33 ID:???
>>983
  ∧ ∧     ┌─────────
  ( ´ー`)   < 煽りウゼーンダヨ、もう解決したんだよボケ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

995 :NAME IS NULL:2005/07/15(金) 08:08:20 ID:???
>>983
  ∧ ∧     ┌─────────
  ( ´ー`)   < 煽りウゼーンダヨ、もう解決したんだよボケ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

996 :NAME IS NULL:2005/07/15(金) 09:02:48 ID:9lsO3wW+
会社のネットワークで、
SQL2000サーバーに各端末から.MDBでデータ処理しています。

テーブルのレコードを変更したとき、他ユーザーが開いていますなどと称して、
競合で変更が更新されないことがあります。もちろん競合はない筈でも、この
メッセージがでて変更ができないことがあります。

この不具合の原因について、教えていただけないでしょうか。

997 :NAME IS NULL:2005/07/15(金) 09:48:20 ID:???
今だ! 997げっと♪
 ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄
  __∧∧__
/\(゚ー゚*)  \          (´´
\/| ̄∪ ̄ ̄|\     (´⌒(´
  \|____|≡≡≡(´⌒;;;≡≡≡
         (´⌒(´⌒;;

998 :NAME IS NULL:2005/07/15(金) 09:54:11 ID:???
ume

999 :NAME IS NULL:2005/07/15(金) 10:17:09 ID:???
999

1000 :NAME IS NULL:2005/07/15(金) 10:19:52 ID:N7gfngbO
おまんこ女学院

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

307 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)