SQL教えて〜!!

このエントリーをはてなブックマークに追加
データーベースのテストが水曜日にあります。
全くのチンプンカンプンで問題の意味すらわかりません・・
門題は「単価が30000円以上で40000円以下の商品名と単価を
表示する命令」です!!これをSQL文にして欲しいのですが・・
シネ
between あたりを調べろ。
1は門題児です。
そんな単位、落としてしまえ!
来年もう一度頑張って、しっかり実力をつけなければ
学校に逝っている意味なんざねぇんだよ!
>>5 激同。>>1 人脈ないなら実力つけろバーカ
>>1「して欲しいのですが」→「したいのですが」なら助けてやってもよかった。
もうダメ。
select 色 from うんこ;
drop table 商品マスター;
101:01/09/10 21:21
学校はわかる人中心に授業進めているんです・・
私はちょー初心者で入学したからSQL言語って言われても?
って感じなんです・・・
一応、他の問題は何とかなりそうなんですけど、この問題は
ムリなんです!!
お願いします。何方かちゃんと教えて下さい!!
11デフォルトの名無しさん:01/09/10 21:26
>>1
どんな教科書を使っているのか書け。

テスト前に問題がわかっているのは不思議だ。友達の答えをコピーしたほうが早いぞ。
マジレス。教官にわかるまで教えを乞え。>>10
遅いんだバーカ

■■■■■■■■■■■■■■■■ 終 了 ■■■■■■■■■■■■■■■■
13(・ε・):01/09/10 21:37
>>1
ふーん。明日『入門SQL』買ってきて読めば?
141:01/09/10 21:39
>>11
アイ・ティ・フロンティアの「データーベースソフトの活用」です。
この問題は教官オリジナルの問題なのですが、なぜこの問題が
テストの出るとわかったかと言うと、学校がドキュソなので
教官が出る問題を教えてくれたからです。
ちなみに友達も私同様、わからないみたいです・・
15デフォルトの名無しさん:01/09/10 21:53
みんな、教えてやれよ!
荒らしたり煽ったりしたら
プログラム板のイメージが悪くなるだろっ!

えっお前が答えろって?
僕は>>1が言ってる意味がよくわからないんで答えないんです。
3で終わってる気もするが門題って変換どうやったのかの方が気になる
17好感度アップ作戦:01/09/10 22:20
せめて >>3 のキーワードを >>14 の教科書とかで調べて、
わかったことを踏まえて質問しなおせばいいジャン >>14
18デフォルトの名無しさん:01/09/10 22:22
これで合ってるのかな
SELECT 商品名, 単価
FROM Table
WHERE (((値段)>30000 And (値段)<40000));
19デフォルトの名無しさん:01/09/10 22:28
>>18 は 1 なの?
201:01/09/10 22:38
>>18
ありがとうございます!!助かりました〜☆
くだらない質問してすいませんでした・・

>>19
私ではありません・・

明日も違う科目のテストがあるので今日はもう寝ます。
ちなみに明日の科目は「Access」とシスアドです・・
21まあまちなさい:01/09/10 22:40
>>20
>>18は間違ってるよ。。マジで。
違ってるね。
質問が普通でつまんない
もっとネタなのかマジなのかの判断が難しいのが欲しいな
24デフォルトの名無しさん:01/09/11 08:36
SELECT 商品名,単価
FROM table
WHERE 単価 BETWEEN 30000 AND 40000;
25デフォルトの名無しさん:01/09/11 15:42
between はインデックス無視するからやめときな。
<= >= 使え。
26デフォルトの名無しさん:01/09/11 16:00
↑スマソ、ガセだった。
実際、実行プラン試したら
betweenもインデックス読んでた。
ゴミン
27デフォルトの名無しさん:01/09/11 16:18
>>23
なら、問題だしてやる。
じゃあ、まず手始めに

管理番号(PK)
会社コード
担当者ID

のテーブルがある。

同じ会社コードデータが2つ以上存在する
データを選択するSQLを書け。
例:
管理番号 会社コード  担当者ID
   1 a1 x1
   2 a1 z1
   3 b1 y1

なら
管理番号  会社コード  担当者ID
    1 a1   x1
    2 a1   z1
と検索される。
簡単すぎてつまらない、と言っているのにこの問題はないん
じゃないか?
29sage:01/09/11 17:15
>>28
ん?この問題がまだ簡単すぎるのか、
それとも難しすぎたのかどっちだ?

話は変わるが、
自分で出しときながら言うのも何だが、
こういう問答は好きだな。
開発(中も後も)ユーザから色々な仕様
の検索が要求される。
SQL一発で持ってくることができれば
それだけPGMコードも簡単になる。
いつもPGMで結果セットを制御しようと
するプログラマには結構為になるスレに
なると思われ。
あっ、名前にsage書いちまった。
>>29
PGMってプログラムの略? はじめてみたよ!
32デフォルトの名無しさん:01/09/11 17:46
Oracleのサイトって
登録すれば、PDFのマニュアル一式DLできるのな〜
33デフォルトの名無しさん:01/09/11 18:56
>>27
select 管理番号,会社コード,担当者ID
from table
where 会社コード in (select 会社コード from table group by 会社コード having count(*)>1)
どうでしょう?
>>27それもまた門題ですね。
>>27
おっ、丁度帰ろうかなと思って覗いたら、
即レスありがとう。

ネストしなくても
select *
from テーブル
group by 管理コード
having count(*) > 1
と思ってたけど(一応確認済)、
何かやばい場合あったかな?

group by 会社コード
スマソ
3733:01/09/11 19:36
>>35
group by のときは「*」使えなかったような気がしますが...
あっ。ORACLE の SQL の場合です。
38デフォルトの名無しさん:01/09/11 22:20
>>37
ホントだ。Oracleで試したら、そうですね。
私はT-SQL(MSSQL、Sybase)で試しました。
なので、ネストした方が汎用的ですね。

じゃ、次の問題
難易度を低くます。

問題
>>27
と同じテーブルにおいて、
 管理番号(PK)
 会社コード
 担当者ID
現在そのテーブル情報に携わっている担当者
の数を知りたい。
もちろん、重複は1人とする。
そのSQL文を書け。
何を言ってるのかわかんないよ
GROUPなしでWHEREだけで済むやん
>38
SQL書く前に担当者に聞け
41デクノボウ:01/09/11 22:36
select 商品名,単価 from テーブル名 where 単価 >=30000 and 40000 <= 単価;
1さんこれで大丈夫ですよ
42デフォルトの名無しさん:01/09/11 23:03
>>38
>現在そのテーブル情報に携わっている担当者
>の数を知りたい。

悪い、書き方がまずかった
>>27
と同じテーブル
 管理番号(PK)
 会社コード
 担当者ID
において
現在、そのテーブル情報に格納されている担当者ID
の数(重複は1つとする)を知りたい。

それでもわからん者には

例:
管理番号 会社コード 担当者ID
   1     a1     x1
   2     a2     x2
   3     a3     x2
   4     a3     x3
   5     a3     x4
   6     a3     x2
重複は一人とする担当者IDの数は
x1、x2、x3、x4の=4つである。
その数を抽出するSQL文を書け。
43デフォルトの名無しさん:01/09/12 00:15
select count(distinct 担当者ID) from テーブル;
44デフォルトの名無しさん:01/09/12 02:21
データベースの仕事をすることになりました。
そこで、SQLを学習したいのですが、
最初は何から始めるべきですか?
45デフォルトの名無しさん:01/09/12 02:28
入門書を買う
マニュアルを読む
サンプルコードを動かして覚える
46デフォルトの名無しさん:01/09/12 02:44
>>44
MS-ACCESS のクエリーが学習に向いてると思う。
クエリーの設計画面とSQL文と実行画面 を行き来できるから。
ただし、MicrosoftのSQL文法準拠だけどね。
4744:01/09/12 03:07
なるべくお金掛けたくないので、
フリーの環境を教材にしたいのですが・・・。
Windows/Cygwin環境辺りで
何か良いのがありましたらお願いします。
とりあえず明日参考書を買ってきます。
>>47
PC UNIXは貧乏な構成なら金かからんだろ。
491:01/09/12 05:57
何か1日見なかっただけでカナーリ展開してますね。
私にはサパーリわかりません・・
テスト今日なんですけど自分で考えてみました!!

   SELECT 単価
   FROM 商品表
   WHERE 単価 BETWEEN 30000 AND 40000

ですかぁ〜?もうわかりません・・・(涙)
午後からテストなのでまだ時間はあるのでレス下さい!!

   
シネ
>>43
正解!

しかしそれどころではなくなった。
N.YのWebサーバに繋がらない。
サーバの物理的な設置場所が日本側では
不明なので今調査中であるが、ちょっと
しゃれにならなくなっている。
(不幸中の幸いか担当範囲のN.YのDBサーバは別
だったらしく生きてた。しかしDBよりも動かす人
の方が心配だ。)
52デフォルトの名無しさん:01/09/12 13:20
>>49
商品名はどこに行ったの?
>>49
商品表ってどこから持ってきたの?
54デフォルトの名無しさん:01/09/12 18:06
鯖も別の場所だったらしく無事だった。
回線が遮断されていただけだったらしい。
しかし明日もAM7時出勤...

ということで、新問題
以下の様なテーブルがある。

マスタテーブル
 テーブル名:m
  工場コード(PK)
  工場名

トランザクションテーブル
 テーブル名:t
  年月日(PK)
  工場コード(PK,FK:m1)
  生産高

テーブル:tにおける工場別の
生産高総合計を表示したい。
検索項目は
<生産地コード 工場名 生産高総合計>

また、テーブルmに登録されているが、
tに存在しない工場の生産高は0として
表示したい。
表示順は工場コードについて
昇順とする。

その仕様を満たす結果を返すSQLを書け。


mのデータ
工場コード 工場名
a1      元町     
a2      田原
a3      高岡
a4      三好

tのデータ
年月日   工場コード  生産高総合計
2001/08/01 a1       100
2001/08/01 a3       100
2001/08/02 a1       150
2001/08/02 a3       200

<検索結果>
工場コード 工場名 総生産高
a1      元町   250    
a2      田原    0
a3      高岡   300
a4      三好    0

DBMSにより違ったSQLとなるので
(もちろん汎用的にも書けますが)
使用DBMSをできるだけ明記して下さい。
↑例におけるtのカラムが生産高総合計
になっているが、生産高の間違い。
よって例をもう一回書くと

mのデータ
工場コード 工場名
a1      元町     
a2      田原
a3      高岡
a4      三好

tのデータ
年月日   工場コード  生産高
2001/08/01 a1       100
2001/08/01 a3       100
2001/08/02 a1       150
2001/08/02 a3       200

<検索結果>
工場コード 工場名 生産高総合計
a1      元町     250    
a2      田原      0
a3      高岡     300
a4      三好      0

ゴメソネ
56デフォルトの名無しさん:01/09/12 18:46
select t.工場コード 生産地コード,min(m.工場名) 工場名,sum(生産高) 生産高
from t,m
where t.工場コード=m.工場コード
group by t.工場コード
order by t.工場コード;

select m.工場コード 生産地コード,min(m.工場名) 工場名,NVL(sum(生産高),0) 生産高
from t,m
where t.工場コード(+)=m.工場コード
group by m.工場コード
order by m.工場コード;

ORACLE 未確認だよ〜ん
571:01/09/12 19:50
結局、テストは記号で選択問題だったから多分出来ていたと思います!!
58デフォルトの名無しさん:01/09/12 21:25
SQLまわりの気の利いた入門書ってどれ?
>>55
検索(表示)の指定も違ってました。
<工場コード 工場名 生産高総合計> ゴミソナサイ

>>56
レスありがとうございます。
minで工場名を一つに特定させる技もあるのですね。
m.工場名をgroup by に組み込む方法もありますね。
select m.工場コード 工場コード,m.工場名 工場名,NVL(sum(生産高),0) 生産高総合計
where t.工場コード(+) = m.工場コード
group by m.工場コード,m.工場名
order by m.工場コード;
かな。Oracle(8.15)で確認済です。
>>55
T-SQL (MSSQL or Sybase) の場合
(古いバージョンは使えないから気をつけて)
select m.工場コード 工場コード,m.工場名 工場名,coalesce(sum(t.生産高),0) 生産高総合計
from m,t
where m.工場コード *= t.工場コード
group by m.工場コード,m.工場名
order by m.工場コード
>>55
もう一つ外部結合、関数を使用しない方法
select m.工場コード 工場コード,m.工場名 工場名,sum(t.生産高) 生産高総合計
from m,t
where m.工場コード = t.工場コード
group by m.工場コード,m.工場名
UNION
select m.工場コード 工場コード,m.工場名 工場名,0 生産高総合計
from m
where not exists(
select * from s where s.工場コード = m.工場コード
)
order by 工場コード
という方法もあります。これがDBMSに依存しない方法です。
>>58
>SQLまわりの気の利いた入門書ってどれ?
やっぱ、各種ベンダーのマニュアル本かな。
がいしゅつだけど、Oracle,Sybaseならダウンロード
できるし。(SybaseはMSSQLほぼ(強調)互換)
あとは、こうやって、みんなといろんなケースを
遊びながら覚えていく方法が一番速いよ。
頭の体操にもなるしね。
>>61
スマソ sなんていうテーブルどこにもないね。
あと関数というのはDBMS依存関数のことだよ。

select m.工場コード 工場コード,m.工場名 工場名,sum(t.生産高) 生産高総合計
from m,t
where m.工場コード = t.工場コード
group by m.工場コード,m.工場名
UNION
select m.工場コード 工場コード,m.工場名 工場名,0 生産高総合計
from m
where not exists(
select * from s where t.工場コード = m.工場コード
)
order by 工場コード
これからはちゃんと校正するね。
あかん、頭がぼけてきた(今日寝てない)
これも一種の荒らしだな。

select m.工場コード 工場コード,m.工場名 工場名,sum(t.生産高) 生産高総合計
from m,t
where m.工場コード = t.工場コード
group by m.工場コード,m.工場名
UNION
select m.工場コード 工場コード,m.工場名 工場名,0 生産高総合計
from m
where not exists(
select * from t where t.工場コード = m.工場コード
)
order by 工場コード
これが正解
J.セルコ「SQLパズル」
これは勉強になった。残念ながらもう入手困難だろうけど。
入門書とはいえないかな(w
Select
 m.工場コード,
 Max(m.工場名) As 工場名,
 Sum(IsNull(t.生産高,0)) As 生産高総合計
From m
 Left Outer Join t
 On m.工場コード = t.工場コード
Group By m.工場コード
Order By m.工場コード

これが、SQL-92的に正解でわ?
Oracle使いは (*) とか *= とかヤメレ。
レコード絞込みの条件と結合の条件を両方 Where句に書いて
評価順序 保証されるの?
67デフォルトの名無しさん:01/09/13 00:20
postgresqlのSQLで気の利いた入門書/入門サイトってありますか?
6856:01/09/13 03:06
>>66
まあ、現時点ではSQLの方言があるので、しかたないでしょう。

>レコード絞込みの条件と結合の条件を両方 Where句に書いて
>評価順序 保証されるの?

保証されないし、順序が違っても問題ないのでは。
SQLの実行計画立てるときに、索引やデータ量によって異なる
順序で実行されるでしょうが、結果は同じでしょう。 きっと
69Error401:01/09/13 11:12
>>65
同じくジョー・セルコの
『プログラマのためのSQL』
ISBN4-89471-480-9

かなり実践的な内容になっているが、最初の一冊には厳しいかも。
SQLをさわった経験のあるプログラマは必読。
70デフォルトの名無しさん:01/09/13 11:40
>>68
たとえば、「生産高が 0 より大きい日のデータのみ集計する」という
条件を加えた場合 どーなるの?

Select (省略)
From m, t
Where t.生産高 > 0 And m.工場コード(+)=t.工場コード
Group By (省略)

(t.生産高 > 0) が先に評価されれば、目的通りだけど、
後ろの結合が先に評価されちゃうと、左外結合によって
できた t.工場コード == NULL というデータを持つ
レコードが t.生産高 > 0 という条件によって
切り捨てられるのでは?

「絞り込んでから結合する」のと「結合してから絞り込む」のでは
やっぱり結果が変わってくることってありますよね。
で、それらを Where句に and 使って並べて書くってことは、
評価順序が保証されてないわけだから、「絞り込んでから」なのか
「結合してから」なのかプログラマには分からんよね。

まぁ、そーいう へたれSQL書いちゃいけないっていう意見もあるけど、
書けてしまう & 予期せぬ結果をもたらす ってのは問題かと。
71Error401:01/09/13 12:14
>>70
>「絞り込んでから結合する」のと「結合してから絞り込む」のでは
>やっぱり結果が変わってくることってありますよね。

うんうん。

>で、それらを Where句に and 使って並べて書くってことは、
>評価順序が保証されてないわけだから、「絞り込んでから」なのか
>「結合してから」なのかプログラマには分からんよね。

今手元に資料が無いので確認できないけど、SQL92ではちゃんと
定義されてるはず。評価順序をコントロールできる。

SELECT ...
 FROM m
      LEFT OUTER JOIN t
      ON m.工場コード = t.工場コード
        AND t.生産高 > 0



SELECT ...
 FROM m
      LEFT OUTER JOIN t
      ON m.工場コード = t.工場コード
WHERE t.生産高 > 0
72デフォルトの名無しさん:01/09/13 14:28
やっぱり、外部結合の指摘されたか。
言い訳かもしれないけど、
outer joinも書こうかと思ったけど、
この問題の場合はいっしょだから書きま
せんでした。

Oracle、いつのバージョンから
SQL92の書き方がOKなった?
使えるとは知らなかったよ。

ちなみにOracleもMSSQLもSybaseも
外部結合と条件が混在した場合、
結合より前に(共に)条件が評価されます。
(11.9.3まではSybaseはSQL92の書き方は出来ない。)

でも指摘の通り、SQLからでは判別できないから
世の中はSQL92を勧めてるみたいですね。
>>71のように明確に記述できるしね。
73デフォルトの名無しさん:01/09/13 14:30
じゃぁ次の問題
テーブル :t1
id  (PK)
kind (PK)
desc
がある。
kindはチェック制約により'A'、'B'
の2種類しか格納できない様になっている。

このテーブルについて、kind が'B'というレコード
について検索したいが、idについて'A'しか存在し
ないレコードの場合は'A'を表示させたい。

idについて'A'、'B'の両方の種類が存在するレコード
も存在するし、'A'のみ、'B'のみのレコードも存在する。

この仕様を満たすSQLを書け。
74デフォルトの名無しさん:01/09/13 14:32
>>73の例
t1
id kind desc
1  A  aaaa
1  B  bbbb
2  A  xxxx
3  A  yyyy
3  B  zzzz
4  B  ssss

<検索結果>
id kind desc
1  B  bbbb
2  A  xxxx
3  B  zzzz
4  B  ssss
75Error401:01/09/13 14:54
>>72
>Oracle、いつのバージョンから
>SQL92の書き方がOKなった?

8iまではNGでは?
9i DatabaseのWPに「ANSI準拠の結合のサポート」とあるから、これじゃないかな。

8.1.6以降は触ってないから詳しくないけど。
>>72
とりあえず。

SELECT id, kind, desc
FROM t1
WHERE kind = (
SELECT MAX(kind)
FROM t1 as t1x
WHERE t1.id = t1x.id)
7776:01/09/13 15:11
s/72/73/
78デフォルトの名無しさん:01/09/13 19:39
>>76

そだね。

ところで、desc は予約語なんだけど エスケープする方法って
SQL/99 で定義されているんでしょうか? SQL/92 には見当たらず。

ちなみに MSSQL(T-SQL)ではカギ括弧を使います。

Select [id], kind, [desc]
From t
Where kind = (
 Select Max(kind)
 From t As t2
 Where t2.[id] = t.[id]
)
7978:01/09/13 19:43
id は予約語じゃないから、括弧いらないやね。
あとテーブル名も t じゃなくて t1 だね。
間違いだらけでスマン。
80Error401(=76):01/09/13 20:06
>>78
ダブルクォーテーションかな?
後で調べてみるね。
8156:01/09/13 21:14
>>70
あらまあ。確かに評価順序で結果が違いますねぇ。
なんとなく同じだと思い込んでたので、ちょっとショック。
82デフォルトの名無しさん:01/09/13 23:33
すいません、教えて欲しいんですが、
SQLのコマンド名と、同じ名前のテーブル名が使用されている場合、
どうやってそのテーブル名を指定すればよいのでしょうか?
具体的にいうと、「GROUP」という名前のテーブルがあって、
SELECT * FROM GROUP ORDER BY ...
ってやりたいんですけど、構文エラーになっちゃいますよね。

あと、SQLじゃないんですけど、ユニークキーってのは
UniqueKey1とUniqueKey2がユニークキーならば
UniqueKey1とUniqueKey2が、同時に重複することは無いって事で
いいんですよね?
GROUPって予約語だろ?
誰がそんな馬鹿なテーブル名つけたんだ(藁
84デフォルトの名無しさん:01/09/14 00:01
テーブル名、項目名は日本語がいい。
読みやすいし、予約語ともぶつからない。
(反対する人、多いと思うけど)
8582:01/09/14 00:14
自分でつけたテーブル名じゃないんでどうしようもないんですよ。
厨房な質問でスマソ。
>>82=85
T-SQL
スマン。

>>82=85

>>78にも書いてるけど T-SQL ならカギ括弧付ければ逝ける。
SQL/92では定義されてないので、DBMS依存なんだと思う…。

>>80のいうダブルクォーテーションは T-SQL ではダメだった。

>>84
激しく同意。
片手に印刷した対応表( EmpCode … 社員コード, Sales … 売上 )とか
持ってる人見るととても痛い。はじめから、「社員コード」、「売上」って
列名にしとけばいいのに。
8882:01/09/14 00:44
thanx!! >>87
ログにあったのね。
それくらい読めよ>俺
逝ってきます。
89デフォルトの名無しさん:01/09/14 06:19
SQLでゲーム作れますか?
ゲーム作れるよ
91Error401:01/09/14 09:01
>>87
ダブルクォーテーションは、識別子をあらわすものでした。

SQL92では、SQLキーワードを、例え区切り入りの識別子の一単語でも
(例えば、"foo table")使えないとありました。

また、将来に渡って、'_'で終わるSQLキーワードは無いので、
SQLキーワードを識別子に使いたい場合は、'_'を後ろに付けろともありました。

ま、個人的には使わないのが一番だと思うけど、あとから追加された
SQLキーワードと、以前作ったものがバッティングするという場合も
あるからね・・・。

descriptionなんか、ヤバそうだ。
92デフォルトの名無しさん:01/09/14 09:24
>>73の出題者です。
遅レスでゴミソ
あっ、DBMSでは予約語がカラム名に
なっちゃってたね。ゴメンネ
ちなみに、
T-SQL(MSSQL、Sybase)では
SET QUOTED_IDENTIFER ON
とコマンドして設定すれば「"」を
使用でき、"group"のようなテーブル、カラム
も作れる。
でもお勧めしないけどね。
選択する時も、コマンド打って、
「"」でくくらないといけないよ。

漢字(Wバイト)の名称のことだけど、
システム関連者がすべて日本人
使用OS(文字コード)が一つ
なら問題ないと思うけど。
純日本製のDBなんてあんまりないし
(HiRDBなんてそうなのかな)
見知らぬバグが潜んでいる可能性も
無きにしもあらずだからねぇ〜。
「障らぬ神にたたりなし」のような。。。
>>73
DBMSでは予約語がカラム名に
なっちゃってたね。
→DBMSによっては・・・
94デフォルトの名無しさん:01/09/14 20:29
>>92
余計なリスクを抱え込まないという姿勢には賛成だが
日本語 表名・項目名はすでにかなり浸透していて「見知らぬバグ」
に自分だけが遭遇する状態じゃないと思うんだけど、どう。
ずっと昔「表」という文字が含まれる表名で障害が出たことがあるので
確信はないんだけどね。
独学でSQLやってて自分のレベルが分からない人に自信を与えてくれる
・・・いいスレだ
96デフォルトの名無しさん:01/09/14 22:08
SQLの理論系でおすすめな本ありますか?
背景とかそゆのがわかる本きぼーんです
97デフォルトの名無しさん:01/09/14 22:13
>>96
理論系かどうかはともかく
「プログラマのためのSQL」J.セルコ著
は押えておくといいんじゃないかな
98デフォルトの名無しさん:01/09/16 11:34
データベースのはなかったけど、サーバのすべてというのがあったから読んだ。
良かった。
「"図解でわかる〜" また"猿でもわかる〜"たぐいのかよ(藁」
とか思ってた俺がアホだった。

http://www.amazon.co.jp/exec/obidos/search-handle-url/index=books-jp&field-author=%E5%B0%8F%E6%B3%89%20%E4%BF%AE/249-4535407-4869161
99デフォルトの名無しさん:01/09/16 11:35
100デフォルトの名無しさん:01/09/16 20:41
SELECT xxx AS yyy
の yyy に半角ピリオドを含む文字列を使いたいんだけど、どうしたらいいの?
101デフォルトの名無しさん:01/09/17 02:35
>>98 小泉さんは「図解でわかるデータベースのすべて」も出してますよ
おすすめです

「サーバのすべて」と間違えて「Linuxサーバーのすべて」を
買ってしまわないように注意
(「Linuxサーバーのすべて」と「Linuxのすべて」も違うよ)
102デフォルトの名無しさん:01/09/17 03:12
「図解でわかる SEXのすべて」

見開き2ページ1項目でビジュアル解説。一般ビジネスマンから技術者まで読める実践的入門書の決定版!

【目次】
第1章 SEXとは何だろう
第2章 SEXの基本
第3章 SEXの構造
第4章 SEXの表示
第5章 SEXとリンク
第6章 SEXとプログラミング
第7章 SEXとデータベース
第8章 SEXの応用と未来
>>102
ちゅうがくせい
発見!
寝ましょうね。明日のために
1041:01/09/18 19:31
久しぶりにこのスレ見たケド、何かすごいですね・・
私には何の事だかチンプンカンプン・・
試験は何とか不可にはならなかったので安心しているところです。
105デフォルトの名無しさん:01/09/18 20:16
SELECT * FROM SAGE.MONA
その昔accessのしごとで
テーブルの仕様書に
住所(1),住所(2),電話番号(1),電話番号(2)
とあったので、そのまま項目名に使ったら
SQLでエラーになったしまった。()はだめだよね
107デフォルトの名無しさん:01/09/19 00:16
_(アンダースコア)を使うと問題が出ないのでよく使います。(住所_1)
108デフォルトの名無しさん:01/09/21 10:43
テーブルA,Bとあって、
「Aのカラム1="0"」または「Aのカラム2="9999"」または
「Aのカラム3=Bのカラム3 かつ Aのカラム4=Bのカラム4 かつ Aのカラム5
がBのカラム5、カラム6の間」と言う条件のデータを抽出したいのですが
どのようにかけばいいのでしょうか?
109デフォルトの名無しさん:01/09/21 10:44
上の3番目の条件は「Aのカラム3=Bのカラム3 かつ Aのカラム4=Bのカラム4 かつ Aのカラム5
がBのカラム5、カラム6の間」に合わないデータです。
そのまま書けばいいじゃん。

a.col1 = '0' or
a.col2 = '9999' or
(
a.col3 = b.col3 and
a.col4 = b.col4 and
a.col5 between b.col5 and b.col6
)
111厨房:01/09/21 15:17
下記のようなテーブルで特定の商品コードのレコードのうち、納品日時
が最新のもののコメントが取得したいんです。

SELECT コメント FROM 納品履歴 WHERE 商品コード='12345' AND
納品日時=(SELECT MAX(納品日時) FROM 納品履歴 WHERE 商品コード='12345' GROUP BY 商品コード)

こんなSQLを作ってみました。
これでも一応動くんですがテーブルを2回走査していてすごく無駄なような気がします
もうちょっと効率の良い書き方ってあるんでしょうか?
それともDBMSがこれくらいは最適化してくれるんでしょうか?
一応SQL-Server2000です

商品コード 納品日時  コメント

12345 2001/09/20 OKだよ
12345 2001/09/22 駄目だだめだ
12345 2001/09/23 上司に聞いてきます
12345 2001/09/24 よっしゃ
11111 2001/09/20 あいうえお
11111 2001/09/20 あああああ
22222 2001/09/21 かきくけこ
22222 2001/09/21 いいいいい
112デフォルトの名無しさん:01/09/21 15:36
>>111
order by つかえば?
113111:01/09/21 15:56
>>112 レスありがとうです
たしかに取得したレコード全部使う必要はないですね。
ただソートするレコードが多いときは遅くなったりしませんか?
インデックス使えばいいんでしょうか、、、
DBMSの呼出時間を考えなければカーソルで全部のレコード見て
最大を取り出してもあまり変わらない?
>>111
SELECT コメント FROM 納品履歴 WHERE 商品コード='12345'
GROUP BY 商品コード HAVING 納品日時=MAX(納品日時)

ではどう?
115111:01/09/21 16:51
>>114 レスありがとうです でも動きません(悲)

>列 '納品履歴.コメント' は集計関数または GROUP BY 句に含まれていないので、選択リスト内では無効です。

それで試しに コメント を 納品日時 に変えてみたんですけど
こんどは下記のエラーがでてしまいました。

SELECT FROM 納品履歴 WHERE 商品コード='12345' GROUP BY 商品コード HAVING 納品日時=MAX(納品日時)

>列 '納品履歴.納品日時' は集計関数または GROUP BY 句に含まれていないので、HAVING 句内では無効です

いろいろやってみているのですが、、いまいち上手くいかないようです。
あきらめて商品コードの検索結果レコードから自分で最大日付を捜すので
我慢しようかと思えてきました、、、
116デフォルトの名無しさん:01/09/21 17:21
select 先頭(コメント)、 max(納品日時) from 納品履歴 商品コード = '12345' group by 商品コード;

 
117デフォルトの名無しさん:01/09/21 17:21
select 先頭(コメント)、 max(納品日時) from 納品履歴 商品コード = '12345' group by 商品コード;

先頭っていうのは確か先頭の行を取得する集合関数があったはず。
 
118333:01/09/21 17:40
一行のSELECT文で結果を複数行持ってくる時に、
無条件に最初に引っ張ってきたレコードのみを
結果として受け取る方法はありますか?

set rowcount 1
は使ってはいけないんです。TT
119デフォルトの名無しさん:01/09/21 18:05
>>118
それなら
素直にカーソル使うしかないんじゃないかな。
なんでset rowcount使っちゃいけないの?
また0に戻せばいいじゃん。
120111:01/09/21 18:32
はっ! >>118-119 どうも!
121333:01/09/21 19:45
自己解決。
select top 1 〜
とすればOKになりやした。
122デフォルトの名無しさん:01/09/28 14:18
SQLおすすめ本おしえて。
セルコのは持ってる
select 'SQL92 規格書'
124デフォルトの名無しさん:01/09/30 20:50
     ∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ( ´∀`)/<先生!また勉強しなおしですか?
 _ / /   /   \___________
\⊂ノ ̄ ̄ ̄ ̄\
 ||\        \
 ||\|| ̄ ̄ ̄ ̄ ̄||
 ||  || ̄ ̄ ̄ ̄ ̄||
    .||          ||
125デフォルトの名無しさん:01/10/01 19:00
「フル結合」と「片側結合」って何ですか?
>>125
うん?なんだろう?
完全外部結合(full outer join)と左(右)外部結合(left, right outer join)のことかな・・・。
googleでも引っかからないなぁ・・・
どっかのベンダーの方言かな?
>>125
体位の事だろ
128デフォルトの名無しさん:01/10/02 18:15
>>111
SELECT コメント FROM 納品履歴
WHERE 商品コード='12345'
AND 納品日時=(SELECT MAX(納品日時) FROM 納品履歴 WHERE 商品コード='12345' GROUP BY 商品コード)
より
SELECT a.コメント FROM
(SELECT コメント,納品日時
FROM 納品履歴
WHERE 商品コード='12345') a,
(SELECT MAX(納品日時) AS 納品日時
FROM 納品履歴
WHERE 商品コード='12345') b
where a.納品日時 = b.納品日時
の方が速いと思う。
でも、オレだったら挿入/更新をトリガにしたスナップショット
のテーブルを作っておくな。

ORACLEしか触った事無いんで、間違ったらスマソ
129 :01/10/16 15:27
>122
技術評論社「はじめてのSQL」
130デフォルトの名無しさん:01/10/16 18:01
>>128の表って更新可能なの?
131デフォルトの名無しさん:01/10/16 18:56
完全外結合って実現できているデータベースってあるの?
132デフォルトの名無しさん:01/10/24 02:31
>>131
>完全外結合って実現できているデータベース
って何ですか?
全部の項目にFKでも張ってあるってこと?
133111:01/10/24 02:37
>>128
すっかりあきらめて遅いままほっといてたよ!
ありがとう!勉強になったよ!
>>131
SQL ServerとPostgreSQLにはFULL OUTER JOINというキーワードがあるね。
SQL92準拠の振る舞いをするかどうかは知らない。

>>132
LEFT OUTER JOINとRIGHT OUTER JOINをUNIONしたようなもの。
135132:01/10/25 00:59
>>134
>LEFT OUTER JOINとRIGHT OUTER JOINをUNIONしたようなもの。
ふんふん。勉強してみます。ありがとうございます!
(最後の「〜をUNIONしたようなもの。」のイメージがわかんないなー。)
136素人:01/10/25 13:03
SQLで、列内の指定された年月情報を抽出したいんですが、
列内の年月表示が ex)1999-5-20 00:00 で記載されており
SELECT*FORM テーブル名 WHERE 年月表示=1999-5-20 00:00
又は
SELECT*FORM テーブル名 WHERE 年月表示='1999-5-20 00:00'
で抽出できません。誰かお力添えを頂きたく候。
>>135
PostgreSQLの場合(textは、可変長テキスト)
PostgreSQLはSQL92準拠の動きをするみたい。

create table t1 (code int, name text);
create table t2 (code int, name text);

insert into t1 values(100, 'aaa');
insert into t1 values(101, 'bbb');

insert into t2 values(100, 'ZZZ');
insert into t2 values(200, 'AAA');
insert into t2 values(201, 'BBB');
insert into t2 values(202, 'CCC');

select t1.code, t2.code, t2.name from t1 left outer join t2 on (t1.code = t2.code);
code | code | name
------+------+------
 100 | 100 | ZZZ
 101 |   |
(2 rows)

select t1.code, t2.code, t2.name from t1 right outer join t2 on (t1.code = t2.code);
code | code | name
------+------+------
 100 | 100 | ZZZ
   | 200 | AAA
   | 201 | BBB
   | 202 | CCC
(4 rows)

select t1.code, t2.code, t2.name from t1 full outer join t2 on (t1.code = t2.code);
code | code | name
------+------+------
 100 | 100 | ZZZ
 101 |   |
   | 200 | AAA
   | 201 | BBB
   | 202 | CCC
(5 rows)
>>136
使用しているRDBMSの名称と、'年月表示'列の型を書いてくれ。
139素人:01/10/25 13:59
お騒がせしました。
「.」
が式の中に紛れてました。
すいません。
140343:01/10/25 15:51
;
っていうか、Oracle 9i Databaseって、何気にCore SQL99準拠なんですね。
ショーック! SQLってシークェルって読むのか!
>>142
>シークェル
と言っている人は見たことがないっす。
僕は「えすきゅーえる」といってます。
"SQL pronounce sequel"で検索中。よくわからん。
http://www.itworld.com/nl/db_mgr/05142001/

<quote>
By the end of the System/R project,
IBM had implemented a language that supported System/R's
multi-table queries and multiple-user access called
the Structured English Query Language (SEQUEL).
The name later was shortened to Structured Query Language (SQL).
Today, we still pronounce the abbreviation as "sequel" because of
these early roots.
</quote>
リレーショナルデータベースは1970年にIBMサンノゼ研究所(現Almaden Research Center)に
所属していたE.F.コッド博士が発表した論文,"A Relational Model of Data for Large Shared Data Banks"
により原理が世に示された.同時期に概念設計されたデータベース操作言語がSEQUELである.

初めてのリレーショナルデータベースは1977年に完成したサンゼノ研究所のSystem Rで,
SEQUELのサブセットであるSQLが装備された.そうした経緯からSQLをシークウェルと読む習慣が残っている.
なるへそなるへそ。ほんじゃもうえすきゅーえるでええね。
148デフォルトの名無しさん:01/10/27 03:23
age
149 :01/10/27 12:36
うちの会社ではエスキュールって呼んでますね
150 :01/10/27 12:39
SQLって資格みたいのものは有るんですか?
151 :01/10/27 13:09
習うより慣れろ。
152デフォルトの名無しさん:01/10/27 16:14
習うより慣れろ。!
ワらうよりワれろ。
154シロート:01/10/29 21:24
139です。
またまたお助けください。
select文で、表のカラムをbetween文のように、指定範囲で抜き出したい
のですが、FORを使って変数を与えて抜き出すことはできますか?
その場合はFOR文とselect文をどのように記載したらよいでしょうか?
>>154
まず、使用しているRDBの名称と、プログラミング言語を明記しよう。
それから、OSとミドルウェアを使ってるのならそれもね。
156シロート:01/10/30 09:43
>>155

すいません。使用言語はJava、OSはWin系、RDBはAcsseceです。
それで、servlet内にSQLを組み込みます。
157155:01/10/30 13:41
>>156
あー、その環境だと、俺にはアドバイスは出来ないな。
ただ、少なくともJDK(J2SDK)のバージョンくらいは書いたほうが良いと思われる。
158シロート:01/10/30 15:15
>>157
申し訳ありません。JDKは、1.3.02です。が、組み込む以前に、
SQLでのFOR文が良く分かりません。
単独でまず、SQL文にFOR文を利用したいのですが、SQLでのFOR文の記述は
どのようにしたら良いでしょうか?
SQLでのFOR?ストアドプロシージャを使いたいの?
でもDBはアクセスだって言ってるしな…

もう少し具体的に、というか知りたいことを限定して書いたら?
160シロート:01/10/30 17:58
>>159さま
ご指摘ありがとうございます。
下記のような感じです。
<<カラム情報の取得を動的に行いたい>>
現在
  1 2 3 4 5 6 7 8 9 10・・・・・(日付)
5月あ か さ た な は ま や ら わ
6月a b c d e f g h i j
7月A B C D E F G H I J

のような表があり常にある日付より3日間のデータを取得したいのです。
ex)
5月4日ならば
4 5 6
た な は

のように、カラムを動的に指定したいです。
よろしくお願いいたします。
>>160
なんとなくわかった。
テーブルの定義を示してみそ。
プログラムでループしてもできるが、SQLで解決出来そうなカンジ。
162シロート:01/10/30 18:23
>>デフォルトの名無しさん様
有難うございます。が、テーブルの定義は何を書けば良いでしょうか?
テーブル名 各月データ
SQLサーバーです。
ごめんなさいよろしくお願いします。
>>162
おいおい、Accessじゃなかったのか?とかいう話はおいといて。
テーブルの定義は、

テーブル名:各月データ
カラム:
月 char
日 char
データ varchar

とか書けばよい。
164シロート:01/10/30 18:43
>>デフォルトの名無しさん様
早速のご返事有難うございます。神様のような方です。感激です。
テーブル名:各月データ
カラム名1:時間1.時間2.3.4.5.6.7.8.9.10.11.12…(chara型)
カラム名2:取得年月(1999-05-20 00:00:00)(chara型)
データ:例100.00 (float型)
165デフォルトの名無しさん:01/10/30 18:43
PL/SQLにおいてカーソルの引数の考え方を
簡単な例を用いて教えて下さい。
カーソル変数を引数に取るストアドの話で
その際、実パラメータ、仮パラメータが混同してしまうので、
明記して教えて欲しいです。
in,out,inoutなどのモードもよく判ってません。
お願いします.
>>164
テーブル構造サパーリ分からん。
>カラム名1:時間1.時間2.3.4.5.6.7.8.9.10.11.12…(chara型)
カラム名が1か?時間1...これはデータ?
カラム名2:取得年月(1999-05-20 00:00:00)(chara型)
ホントニcharか?
こりゃ>>163
大物相手だな。がむばって教育して下さい。
167シロート:01/10/30 20:50
>>デフォルトの名無しさん様
すいません。
カラム名が本当に「時間1」「時間2」……「時間31」なのです。
さらに、取得年月も同じく「chara型」です。私も泣きました。20日締めなので
一ヶ月の表示を全てワザワザcharaにしてます。
JAVAの方で変数を与え、かつそれでSQL文を囲んでループさせるのが簡単だと思
いますが……。でもそーすると、月がずれたら、さらに別のSQLを発行しなけれ
ばなりません。
何とか、「時間1」などのカラムを裏側でDATE表示に変換できればとも考えてます。
親身に有難うございます。
センセイに聞くのが一番イイと思うのだが。
>>167
時間1 char
時間2 char
...  char
時間31 char
取得年月日 char
データ float

という33カラムある構造なのかな?
いったい>>160の「表」はどういう風に入っているんだろう?

勘:FORループは使えないし、一つのSQLでの解決も出来ない。
  多分、Java側で動的にSELECT文を組み立てて、複数回
  SELECTし、Javaのロジックでデータを選択することになる。
>>165
カーソル変数を引数に取るストアードプロシージャの話?
それとも、カーソル定義でパラメータを使う方法?
どっち?
171デフォルトの名無しさん:01/10/30 23:39
>170
カーソル変数を引数に取るストアードプロシージャの話です。
172シロート:01/10/31 00:08
>>デフォルトの名無しさん様
凄い事を聞いて申し訳ありません。
33以上のカラムです。
学校の問題で、実際には従業員の給与を表示させている
DBのためカラム数は、約45。行数は、従業員の人数分×月数が、
永遠に続きます。ここから、指定した人のある月のDATEは簡単
に持ってこれるのですが、その部分から画面上にさらに選択した
日付け+α分をJSPに表示させます。JAVAでSQLを連発させるのは
可能か(出来る)と思いますが、SQLで解決できれば思い書き込
みました。噂で、一度SQLでその月のデータを作成し、別のSQL文
で行う(行と列の位置を入れ替える表を新規に作成しそこから抜く)
方法があると聞きましたが、その方法で可能ですか?
173デフォルトの名無しさん:01/10/31 01:04
性的SQLなんて、かんたんじゃん。バカみたい。
SPから動的SQLの結果をREF CURSORで戻すやりかたをおしえろよ。
ただしREF CURSOR の定義は
TYPE r IS REF CURSOR;
だからな。RETURN は付けるなよ。うひひ
174デフォルトの名無しさん:01/10/31 01:05
↑できるじゃん、。

TYPE r IS REF CURSOR RETURN table_r;
だよ。コンパイルと折らん愛飲だよ!!!
175デフォルトの名無しさん:01/10/31 01:06
くそぼけがぁ!!!!
>>165
まずは、マニュアルを読め。
Oracleのマニュアルは非常に出来がいいぞ。
んで、わからないことを質問すれ。
質問が抽象的すぎるので、出てくる回答はこんなもんだろう。
>>172
>一度SQLでその月のデータを作成し、

というのが良くわからんけど、行と列を入れ替える方法は存在する。

select time1, data from tbl
union
select time2, data from tbl
union
...
select time31, data from tbl
とすれば良い。

が、どう考えても遅いので、すなおにJavaで複数回SELECTしたほうが
速いと思う。
正規化しなかったDB設計者を呪え。
シロートよ、あんたは決して悪くないかもしれんが、
テーブル構造、全然分からん。
言うことがころころ変わって、むちゃくちゃだ。
>>167の説明じゃ誰が見ても33コのカラムだと思うぜよ。
一度
カラム名:時間1 時間2 時間3 ・・・時間n 取得年月日       データ
行1:   A   B   C     ZZ  1999-05-20 00:00:00  あ
・・・
行n    D   V   D     RW  2001-10-20 00:00:00  ぴゅ
と、テーブルのカラムと行についての具体的なサンプルを表示し、
どういう条件でどのような結果を取得したいかもう一度示すべし。

>>177これは正規化以前の問題だな。
179178:01/10/31 09:34
もしかして今回の話題の他にカラムがあって
実際には45ぐらいあるってこと?

時間nのカラムは31まであり
それぞれ
取得年月日が2000-10-20ならば
時間1・・・10月20日
時間2・・・10月21日
・・・
時間31・・・11月19日
のデータということか?
180シロート:01/10/31 10:08
おはようございます。本日もよろしくお願いします。
>>179
有難うございます。そうなんです。不必要なカラムが多いので
実際に抽出するのは、45のカラムのうち33カラムです。
>>178
すいません。データ=セル内のDATAと理解してました。
カラム名
時間1……時間31 セル内の値は(100.00 float型 )
取得年月 セル内は、全て表示は 2000-10-20 00:00:00ですが文字列(chara型)です。
181166=178=179:01/10/31 11:02
シロート
もういいから
select * from 各月データ の結果セット数行を
カラム名といっしょに示してくれ。
今回の33コのカラムだけでいいから。。。
折れらは表示の型なんて聞いていない。。。

あと折れの問いにも答えてくれ
時間nのカラムは31まであり
それぞれ
取得年月日が2000-10-20ならば
時間1という名のカラム・・・10月20日のfloat型データ
時間2という名のカラム・・・10月21日  ”
・・・
時間31という名のカラム・・・11月19日  ”
のデータということか?

最終的に、あんたが言う、動的にカラム数を変更したい場合は
DB鯖に投げるsql文において、select句のカラム数を
変更すればいいだけ。
実行して、格納されたResultSetのカラム数を調べて
そのカラム数分ループして
getStringでデータを取得せよ。
カラム数を調べる
int cols;
ResultSet rs = statement.executeQuery(SQL文);
ResultSetMetaData rsp = rs.getMetaData();
cols = rsp.getColumnCount();
あとは
while( rs.next() ) のループ内で
colsの数だけforで回し
getStringで値を取得すれば良い。

>本日もよろしくお願いします。
ふざけんな。
182181:01/10/31 11:09
多分、あんたには分からんかもしれんから
もう一度詳しく質問を書く。

各月データというテーブルの
時間nのカラムは31コあり 、
各月データテーブルのある行において、
取得年月日のデータが2000-10-20 00:00:00ならば 、
取得年月日のデータが2000-10-20 00:00:00と同行の
時間1という名のカラムのデータ・・・10月20日のfloat型データ、例:100.00
時間2という名のカラム・・・10月21日  ”
・・・
時間31という名のカラム・・・11月19日  ”
のデータということか?

これでちんぷんかんぷんの回答だったら
ネタとみなす。
183シロート:01/10/31 11:43
>>181
>>182 有難うございます。
各そのとおりです。ネタではないです。
SQL SELECT * FROM テーブル名 で取得するデータ
結果
処理年月 従業員番号   時間1  時間2 〜時間30 時間31 不要なカラム×15個
2000-05-20 00:00:00 AAAAAAAAAA  100.00 100.00 〜null 100.00  %%%
2000-05-20 00:00:00 bbbbbbbbbb  100.00 100.00 〜null 100.00  %%%
2000-05-20 00:00:00 cccccccccc  100.00 100.00 〜null 100.00  %%%
2000-05-20 00:00:00 dddddddddd  100.00 100.00 〜null 100.00  %%%
∫      ∫     ∫   ∫   ∫    ∫   ∫
2001-10-20 00:00:00 cccccccccc 100.00 100.00 〜100.00 100.00 %%%
2001-10-20 00:00:00 dddddddddd 100.00 100.00 〜100.00 100.00 %%%
このようになります。
184デフォルトの名無しさん:01/10/31 12:20
SQLなんて
英単語わかれば簡単なわけよ
185181:01/10/31 13:24
やっとスタートラインに立ったな。
時間とは勤務時間のことだろ。
やりたいことは、
2000/05/25
と型が分からんが、このように
日付情報を受け取ったら、
この場合 2000/05/25から3日間
時間4・・・5/25の時間
時間5・・・5/26
時間6・・・5/27

処理年月  従業員番号 時間4  時間5  時間6
2000-05-20 AAAAAA   8.00  7.45  8.50
・・・
2000-05-20 BBBBBB   8.00  8.45  7.50

っていう様に出力したいわけだな?

だから、日付が与えられたら
カラム:時間nのnについて計算して、3日分のselectメンバカラムを
作成すれば良い。
sql = "select 処理年月,従業員番号" +
時間"+ n + ",時間"+n + 1+",時間" + n + 2+
" from テーブル where 処理年月 = '"+nengetsu+"'";
nとnengetsuは与えられた日付情報から割り出せ。
nは日にちが20以上->同月の20日との
20日より小さい ->前月の20日との
の差数(前月とは必ず日付計算)- 1(20日が1だから)
nengetsuは "yyyy-mm-20 00:00:00"というformat
の文字列に変換する。
3日間というのも動的に行いたければ
select句の時間nの生成を
forでループして生成する。
このロジックをJavaに実装する。
Javaはできるんだろ?
186181:01/10/31 13:37
スマソ
時間6・・・5/25の時間
時間7・・・5/26
時間8・・・5/27

処理年月  従業員番号 時間6  時間7  時間8
2000-05-20 AAAAAA   8.00  7.45  8.50
・・・
2000-05-20 BBBBBB   8.00  8.45  7.50

与えられた日付において、
n=
日にちが20以上->同月の20日との
20日より小さい ->前月の20日との
の差数(前月とは必ず日付計算)+ 1(20日が1だから)

だった。。。
187177:01/10/31 14:45
>>186
お疲れ。
シロート君はわかってくれてるのかな。

前にも書いたけど、付け加えるとするなら、開始年月日と期間に
よって、必要となるレコードが1レコードか、あるいは複数レコード
になる。
この「何レコード検索しなければならないのか」というのもJava側
のロジックで組まなければならない。
188シロート:01/10/31 14:59
>>181
有難うございます。
取り合えず、
int n=0;
for(n=0;n<3;n++){
db.setString_SQL("SELECT '時間"+n+"',
'時間"+n+1+"','時間"+n+2+"'from table名 テーブル where
処理年月 = '2000-05-20 00:00:00'";")

で一度行いその後年月を動的にしてみます。
本当に有難うございました。
189デフォルトの名無しさん:01/10/31 18:46
質問させていただいてよいでしょうか?
MySQL と Perl DBI,DBD::mysql で勉強しています。
DATE型のフィールド"日付1"があって、CURDATE() がそれから
ちょうど3ヶ月、6ヶ月、9ヶ月・・・である行をSELECTしたいと思っています。
たとえば、"日付1"が2001-09-21だった時、
CURDATE() が 2001-12-21, 2002-02-21 ・・・ の時に WHERE で拾いたいのです。
何かいい方法は無いでしょうか?
drop table 俺の前頭葉
fじゃk;あkdぁ;じmz、ぇぢj;あ
191177:01/10/31 23:03
>>188
ホントにそれでいいのか?って疑問はあるのだが、
本人が納得してるんだからそれでいいのだろう。
がむばれ。
>>189
仕様が曖昧。
日付1が2001-01-31だった場合は?
日付1が2001-11-30だった場合は?
193189:01/11/01 02:29
>>192
申し訳ありません。
それについては、ADD_DATE("2001-01-31", INTERVAL 3 MONTH) などで
出る値、つまり、2001-04-30 を想定しています。
あと、レコードに登録されている日付はCURDATE()より
前であることが保証されています。
194189:01/11/01 02:36
すみません、ADD_DATE じゃなくて DATE_ADD ですね。
195186:01/11/01 10:24
>>177
そだね、検索開始が18日以上の場合、3日間の間に
日付について月度が繰り上がるね。
前月の末日について、30と31でMAX日数について場合分け
が必要だな。
それか、MAX日数で切れるようにするかだな。

>>188
折れは検索期間を動的に変更したい場合に、
select句の日付nについて生成するために
ループを使えと言ったのだけど。。。
クエリー全体をループさせてどうするつもりなのだ?
177同様、まぁいいか。

>>189
自分ならAP側で素直に再帰処理かけるかな。
>>193
MySQLは使ったことないんで書けるかどうかわからないけど、

MOD((日付1とCURDATEの差の月数),3)=0 AND
DATE_ADD(日付1,INTERVAL (日付1とCURDATEの差の月数) MONTH) = CURDATE()

みたいなのはどうだろう。
差の月数を求めるのはPERIOD_DIFFってなんかそれらしい関数を見かけたけど
結果をそのままDATE_ADDの引数にできるのかどうかはわからない。
結論:MySQLのMLに質問を投げたほうがイイ
198189:01/11/02 10:39
>>196
ありがとうございます。
日付1とCURDATEの月数差を求めるのに、
PERIOD_DIFF(DATE_FORMAT(CURDATE(),"%y%m"), DATE_FORMAT(日付1,"%y%m"))
になってしまう感じなので、かなりめんどくさいことに
なってしまいますが、それでいけそうです。
199デフォルトの名無しさん:01/11/05 19:07
PostgreSQL + JDBC で、SELECT ...... ORDER BY xx LIMIT 100 OFFSET 10
とかやっている箇所があるんですけど(結果の10row目から100rowだけ取り出す)、
LIMIT .. OFFSET .. は Postgres でしか使えないそうで。。

一般的にはどう書くんでしょうか?
ココの人にTSPのスレ立ててもらいたいにゃん。
>>199
一般的な書き方はありません(出来ない)。
>>199
MySQLには LIMIT offset,rows っていう書き方がありますね。Sybaseにはないようだ。

大量にSELECTして10行くらいずつ表示していく場合(imodeとか)どうす
るんですかね?
203デフォルトの名無しさん:01/11/05 19:48
>>199

Oracleだと、

SELECT .... WHERE なんだかんだ AND ROWNUM<100 ORDER BY xx

で、なんだかんだの部分が結果の10row目になるようにする、かな。
204デフォルトの名無しさん:01/11/05 20:16
いやはや、名スレですなあ。

>199
そんなにSQLにこだわらんでもいいような気が。
プログラムの方でカーソルで10個スキップしたのではいかんのかいな?

>202
imodeにかぎらずWebアプリだと、
大量にSELECT→小分けに表示とかやるときは
毎回ページ生成時にSQL発行するんでなくて
Cookieとかセッション使って、プログラム言語側で確保したバッファに
SELECTの結果を貯めて、そこから小出しに出すってのがよろしいのでは?
当方 VBScript(ASP) + ADO + MSSQL7 です。
皆様はこういう処理どうやってますか?
205199:01/11/05 20:38
>>204
HTML内の特殊タグ内にSQL文1行だけ書いておくと、あとはフレームワークが
整形して出力してくれたりするので、できればロジック入れたくなかったので
す。

やはりあきらめてSession間で有効なオブジェクトに記憶させときます。
みなさまどうも。
206デフォルトの名無しさん:01/11/05 21:15
>205
ああ、なるほど。
<!-SELECT * FROM なんとか>
とかやると勝手にテーブルにしてくれるようなヤツですな。
確かにあれは便利。
T-SQLバリバリのストアドプロシージャ作ってやるとか・・・

それにしてもページごとにSQL発行するのと
セッションオブジェクトに格納するのではどっちが重いのですかねえ。
あんまりセッションオブジェクトにデータを突っ込むと
IISのメモリ食ってしょうがないっす。
セッションオブジェクトってなかなか消滅しないもんで・・・
>>206
HTTPは基本的にステートレスなプロトコルだし、ダイレクトに
ページに飛んでくる場合も考えると、ページごとに検索した
ほうがいいと思う。
ページ遷移を強制して、セッションオブジェクトを使っても、
次のページにアクセスするとは限らないしね。
208204、206:01/11/06 00:37
>207
せっかくセッションオブジェクトを用意しても
次のページ見てくれないとそれが無駄になるという・・・
だいたいちゃんとログアウトする奴なんぞおらんからのお
ゴミセッションオブジェクトがどんどん増えていくという・・・鬱。
助けてガベージコレクタ!
209ななし:01/11/07 22:53
Oracle8.1.6使ってるんですがSQLでテーブルの列数(項目数)を
取ってくる命令はないですか?
SELECT count(*)
FROM ALL_TAB_COLUMNS A
WHERE A.TABLE_NAME='テーブル名' AND
A.OWNER='オーナー名'
で持ってこれる。
もしかしたら専用ファンクション
あるかもしれんけど、これで
ファンクションを作ってもいいと思う。
211ななし:01/11/08 10:03
SQL*PLUSで実行したら無事取得できました!
ありがとうございます。

それで、これをVB6で使用したいと思うのですが

Public cn As New ADODB.Connection
Dim SQL as String

SQL = "select count(*) from ALL_TAB_COLUMNS A where A.TABLE_NAME = 'テーブル名'"

この後の列数取得の記述がよくわかりません。
cn.execute(SQL)とかでは取ってこれないのでしょうか?
212VBを知らずにカキコ:01/11/08 14:18
>>211
列に別名を付ければ、通常の列と同じ方法で取得できる。
例えば"cnt"という名前にしたいのだったら、"as cnt"を追加する。

SQL = "select count(*) as cnt from ALL_TAB_COLUMNS A where A.TABLE_NAME = 'テーブル名'"
213210(&その他もろもろ):01/11/08 18:05
最初からADOで取得したいって言えよ。

それなら、
select(*) from テーブル where...
みたいなクエリーで
RecordsetのFieds.Countで取得できる。
どうせ、対象のテーブルnoデータ処理も
あるのだろう?

折れが書いたSQL(ALL_TABLE_COLUMNSを使用するSQL)
を使うなら、
212みたいにエリアス名でアクセスするのが最もわかりやすい
コードになるが、この場合対象フィールドが1つしかないの
は明白なので
Fields(0).Valueとフィールドインデックスでアクセスしても
いい思う。
>>212、ちなみにADOはVBだけでなくDelでも使える。

sql = "select count(*) from..."
rs.Open sql, cn, adOpenDynamic, adLockReadOnly, adCmdText
という方法もあり、こっちの方が細かな制御ができるが
set rs = cn.execute(SQL)
で支障がなければそれでかまわない。

もっと自分が最終的にしたいこと(ゴール)を
書かないと、回答がが無用になる可能性もあるから
注意しろよ。
214ななし:01/11/09 10:54
VBでも項目数取得できました。
・・・できたのですが、テーブルによって、なぜか

「戻り値が2倍になってしまうテーブルがあります。」

項目が10項目しかないのに20が返ってくるテーブルもあれば
ちゃんと項目数どおり返ってくるテーブルもあります。

何か書き方が悪いのかな〜??
fields(0)で取っているのですが。
215デフォルトの名無しさん:01/11/09 11:48
>>214
all_tab_columns見るならownerを指定しないと。
自分のスキーマにあるテーブルならuser_tab_columnsで。
216デフォルトの名無しさん:01/11/09 18:12
一つ伺いたいのですが、
レコードとその合計を同時に出すクエリーって無いですか?
今のところユニオンクエリーでやってるのですが、
ほとんど同じ文を2回書くのはなんだかなぁと思いまして。
SELECT data1 AS a, data2 AS b FROM table
UNION SELECT 'SUM' AS a, SUM(data2) AS b FROM table
って感じです。
select data1, data2, sum(data2)
ではいけない理由を書け。
218デフォルトの名無しさん:01/11/09 19:30
>>216
無理でしょ。それをやるのがOLAPだと思った。
union allするか、フロントエンドでがんばるか。

>>217
なにがやりたい?(w
>>216
たぶんそれしかないです。
>>217
そのSQLは通らない。全然違うぞ。
220213:01/11/09 19:50
>>214
215も言っているが、折れもオーナ指定は
例に書いたはずだ。

>>216
T-SQL(MSSQL,Sybase)なら
SELECT data1 AS a, data2 AS b
FROM table
COMPUTE sum(data2)
で可能。
但し、結果セットが複数になるので、
ADO、DAOの場合(使用方法が異なるが)
NextRecordSetが必要となる。
JDBCはnextResultSet

尾羅来るができるかは今試せない、スマソ。

>>219
from句を含めれば、T-SQLの環境なら通る。
221217:01/11/09 19:55
select data1, data2
select sum(data2)
の間違い(自爆)

何故一度で取らないといけないのかを聞きたかっただけ。
UNIONはソートが入るから遅い。
222217:01/11/09 20:15
>>220
Oracleも8iからできます。
ROLLUPとCUBEって奴。例はここ(探すの苦労した)
http://www.systech-i.co.jp/mailsrv/vol150.htm

これって使うのになんか制限あったような気がしたけど、なかったっけ?
手元にあるプロダクトでは全部動いてしまった・・・。
223帰りたいよ〜:01/11/10 20:30
教えてください!!!



----------------------------------------------------------------
SELECT COUNT(*)
FROM A_Tbl
WHERE BUMON_CD NOT IN (SELECT BUMON_CD FROM B_Tbl WHERE 以下略)


A_Tblのレコード数=10とする
----------------------------------------------------------------


たとえばこんな感じ



B_TblのBUMON_CDと合致しない
A_Tblの件数を取りたいのです

サブクエリの中身が有る場合は良いのですが
無い場合ちゃんと取ってこないのです

B_TblのBUMON_CDが無い場合はA_Tblの件数10件取ってきて欲しい所ですが、どうもダメみたい・・・


これをSQLだけで解決させるいい方法ってありますか?
(ループとか使わずにという意味)




文章が分かりづらかったらすいません・・・
とりあえず、RDBMSの種類とバージョンを書いとけ。
225帰りたいよ〜:01/11/10 21:13
223です

オラクル8です。

書き忘れました。申し訳ない・・・
226 :01/11/10 23:10
>>223
MINUS集合演算子使うのがいいんじゃない?

SELECT COUNT(*)
FROM (
SELECT DISTINCT BUMON_CD FROM A_Tbl
MINUS
SELECT DISTINCT BUMON_CD FROM B_Tbl
)
こんな感じ?実際に流してないけど…

NOT IN は != に展開されちゃうんで、
サブクエリの結果がNULLだと「WHERE BUMON_CD != NULL」
に展開されて値が不正になるのが問題だと思うよ.
「WHERE BUMON_CD IS NOT NULL」に展開してほしいけど
そこまでやってくれないみたい.
>>226
DISTINCTがあると駄目。多分。試してないけど。

>>225
Oracleの場合は、8.1.7とか8.0.4とかまで書かないと。
228 :01/11/11 00:40
>>227
8.1.7で試したけどDISTINCT付けてもOKだったよ.
もっとも重複しないのであればDISTINCTいらないけど.
あと、バージョンが古いと駄目な可能性はあるな…
229帰りたいよ〜:01/11/11 13:32
223です。
みなさんどうもありがとうございます。
今からやってみます。


ちなみにオラクルは8.05です。
書き忘れです。
すいません。
230デフォルトの名無しさん:01/11/11 14:01
まだ帰ってなかったのか(w

select count(*)
from a_tbl
where
not exists (
select *
from b_tbl
where
b_tbl.bumon_cd = a_tbl.bumon_cd
)
;
231帰りたいよ〜:01/11/11 16:15
223です。

ワーイ!
できた!
230さんのやり方で出来ました。
ありがとうございます!
並びに助言くれた皆様ありがとうございます!



でも、帰れない。
量が多すぎる・・・
232216です:01/11/12 13:24
皆さんありがとうございます。レスが遅れて申し訳ない。
じつはVB+ACCESSで、データグリッドに出す時に
    支店1 支店2  合計
商品1  10  15  25
商品2  12  16  28
小計   22  31  53
経費(−) 5   3   8
収支   17  28  45
って感じでデータグリッドに表示させたかったからです。
帳票を印刷するだけなら分ければいいのですが・・・
実際にはクロス集計や他のテーブルから支店毎の経費をUNIONで
くっつけたりしてるので効率が悪いのは承知の上です。
Oracle使いたい・・・
他のコンポーネントを使ったほうがいいかもという気がしてきました。
233デフォルトの名無しさん:01/11/15 18:50
クエリー生成クラスで、良いのを知っている人っています?
今は自力でやっているけど、もっといいのがあればなぁ。
234デフォルトの名無しさん:01/11/17 01:53
ACCESSで文字列を連結する関数ってあるんでしょうか?
OracleでいうところのCONCATみたいなやつ。
ちなみに・・・

CONCAT('ゴラァ','ごらぁ') ってやると

ゴラァごらぁ って、出力されます。

#というか、JetのSQLリファレンスはどこに行けばあるんじゃい!!!
>>234
関数じゃないけど
"ゴラァ" & "ごらぁ"
でいけると思うよ。

ちなみにOracleでも俺はCONCAT関数って使ったことないな。
'ゴラァ' || 'ごらぁ'
が普通かと。
236234:01/11/17 22:07
>>235

ども、うまくいきました。

最初

select 列名1 & 列名2 from hoge;

って、やったら「列名1列名2」と出てきてちょっと焦ったのですが、

select [列名1] & [列名2] from hoge;

とやったら、列の内容を連結してくれたので良かったです。
#純粋な文字列ではなく、全フィールドのデータに対して
#やりたかったのです。
237デフォルトの名無しさん:01/11/20 01:02
select 厨房 from 2ちゃんねる
 厨房
  1
  2

 
select distinct 自作自演 from 2ちゃんねる
239名無しさんに接続中…:01/11/20 19:54
すいません、ちょっと質問が・・・

カーソルをOPENした時点で結果セットに入った
件数って先にわかるんでしたっけ??

環境はOracleのPL/SQL or RDO・・・
知ってるかたがいらっしゃったら教えてください・・

宜しくお願いします。
>>239
PL/SQL→分からない。先に知りたければCOUNT(*)で件数を取る必要あり。
RDO→使用カーソルによる。以下ヘルプからの引用

RowCount プロパティの使い方
キーセット タイプまたは静的 rdoResultset オブジェクトが最初に作成される
場合、RowCount プロパティには次の値が設定されます。
 行が返される場合は結果セット内の行数。
 クエリーから行が返されない場合は 0。
 RowCount プロパティを使用できない場合は -1。
コードで RowCount プロパティを参照すると、rdoResultset オブジェクトに
完全にデータが取得されてから、アプリケーションに制御が戻ります。
動的カーソルの場合は、行数が変化するので、RowCount プロパティを使用でき
ません。また、前方スクロール タイプの結果セットの場合は、一度に公開され
る行は 1 行だけなので、同様に RowCount プロパティを使用できません。
241240:01/11/21 11:34
途中でボタンおしちまった

解説
rdoResultset オブジェクト内でアクセスされた行数を検出する場合、
または rdoResultset が行を返したかどうかを判定する場合は、RowCount
プロパティを使用します。RowCount プロパティは、すべての行がアクセス
されるまでは、クエリーで返される rdoResultset オブジェクトの行数を
表していません。すべての行がアクセスされた後で初めて、RowCount
プロパティは rdoResultset オブジェクト内の総行数を表すようになります。
RowCount プロパティを参照すると、MoveLast メソッドを実行した場合と同
じように、RDO は結果セット全体を取り出します。
ドライバおよびデータ ソースによっては、行数を取得できないことを示す-1、
または rdoResultset オブジェクトが行を返さなかったことを示す 0 が、
RowCount プロパティから返る場合があります。ドライバが行数を返せる場合、
RowCount プロパティは rdoResultset オブジェクト内の行数を返します。
rdoResultset オブジェクトに対して Requery メソッドを呼び出すと、
クエリーが最初に実行される場合と同様に、RowCount プロパティは再設定さ
れます。
242デフォルトの名無しさん:01/12/04 05:33
似たような情報がわけあって(?理由はよくわかんない)複数のテーブルに分散して
置かれています。

具体的には
a_table (id INT, name VARCHAR(100), kingaku INT) と
b_table (id INT, name VARCHAR(100), kingaku INT) があるという、
悲惨な状態です。

が、2つのテーブルの全ロウを眺めてみると、idはまったく重なっていないようです。

この2つのテーブルが、 さも一つのテーブルであるかのように扱って SELECT する
ことはできないでしょうか? WHERE kingaku < 1000000 の先頭100ロウを取り
出す、などの処理がしたいので、a_table, b_table 別々にクエリする方式では
やや面倒が多いのです。。。。

よろしくお願いします。DBMSはMySQLです。
>>242
MySQL って UNION 演算子は使えるの?
244デフォルトの名無しさん:01/12/04 11:57
>243
使えないようです
245243:01/12/04 12:51
>>244
そうすると泥臭いが作業用テーブルに両テーブルの内容をINSERTするしかないか?>識者
246デフォルトの名無しさん:01/12/04 16:25
>245
なるほど・・
ちなみに、UNION演算子が使用できる場合はどのようになるのでしょうか?
後学のため、教えていただけませんか?
>>246
MySQLは知りませんが、PostgreSQLならテーブル t1 が
a b
---
1 1
2 2

で、テーブルt2 が
a b
---
3 3
4 4
のとき
select * from t1 union select * from t2
を実行すると
a b
---
1 1
2 2
3 3
4 4
となります。
>>246
242みたいな条件なら
SELECT * FROM a_table UNION SELECT * FROM b_table
でqueryの和が取れる。WHERE kingaku < 1000000の先頭100行取りたいなら、
副問い合わせにして
SELECT * FROM
(SELECT * FROM a_table UNION SELECT * FROM b_table) AS union_table
WHERE kingaku < 1000000 LIMIT 100;
みたいな感じで使う。副問い合わせをVIEW(これもMySQLにはないんだっけ)にして
CREATE VIEW union_table AS SELECT * FROM a_table UNION SELECT * FROM b_table;
SELECT * FROM union_table WHERE...;
こうした方が楽かも。
>247,248
どうもありがとうございました。勉強になりました。
250デフォルトの名無しさん:01/12/05 16:59
Linux
sybase11.0.3

ある1つのテーブルの重複行を削除するSQL文が分からないので教えてください。
具体的には下記の処理がしたいのです。

tableABC
----------
colA colB
----------
10 AAA
10 XXX
20 BBB
30 CCC
30 YYY
30 ZZZ
40 DDD



tableABC
----------
colA colB
----------
10 AAA
20 BBB
30 YYY
40 DDD
251250:01/12/05 17:10
SELECT distinct colA FROM tableABC

の結果のようなテーブルに修正したいのです。
colAの値が重複している部分を削除して1行にしたいのです。
しかし、colBの値は気にしません。
重複して入ってる時点で屑とか思うの俺だけ?
253250:01/12/05 17:28
漏れも思います。
郵○省の7桁郵便番号データなのですが…。
254iku:01/12/05 17:52
こんばんは。ikuです。
データを処理した日付をUDATEというフィールドへ下記の様に
入れてあげたいのですが
上手くいかないんです。
どうやれば上手くその日の日付がフィールドに更新されるのか
教えて下さい。(T□T)
strSQL = "UPDATE D_PSMAN ";
strSQL += "SET UDATE = 'Date(),";
255252:01/12/05 17:54
>>253
みたことあるわ。
役人の作ったもんなんて、そんなもんだったよな。

テーブルにつっこむ前にperlかなにかで処理してあげるか、
カーソルループでも作ってうまく処理してやれ。
256253:01/12/05 17:59
>>255
その方法わかりません。。ポインタだけでもお願いします。。
>>251
SQL一発では無理でしょう。ストアドプロシージャでも作るしかない
んじゃないか?
258デフォルトの名無しさん:01/12/05 18:02
Sybaseよくしらんけど、内部selectとかつかえば一文でもできそうな気がするね。
Oracle/SQL Serverむけのなら、書こうと思えば書けるよ。

どっちかというとSQL Serverのと煮てるんだっけ?
259256:01/12/05 18:06
>>258
はい。SQL Server系です。
といいますか、SQL Serverがsybase系です。。
260257:01/12/05 19:41
自己解決しました。

DELETE FROM tableABC
WHERE tableABC.colB NOT IN (
  SELECT MIN(y.colB) FROM tableABC AS y WHERE y.colA = tableABC.colA
)

(別板にてご教授いただきました…)
261260:01/12/05 19:43
↑名前間違えました。。。

誤 - 257
正 - 259
>>260
大体あってるが、NULLの含まれるレコードに注意しな。

NULLを許していないならOK、気にしないでくれ。
>254
ネタ?
264iku:01/12/06 08:42
>>263
はい,質問です。
SQL文で更新する時に日付をUDATEというフィールドに
書き込みたいのですが・・・・・・
SYSDATEとか聞いたことない?
266257:01/12/06 12:09
>>260
colA+colBでユニークなんですね。そうでなければまずいですよね?

>>264
使ってるRDBMSと開発環境を明示しましょう。
267iku:01/12/06 13:05
266>>
環境はWindows2000proでSQLServer7.0です。
265>>SYSDATEですか?
今まで汎用機の開発でしたので初めて知り,
調べてみました。
下記で上手くいきそうです。
ありがとうございます。
SYSDATE 今の日付
ADD_MONTHS(sysdate, 4) sysdateから4ヶ月後(-をつけると前になる)
LAST_DAY(sysdate) sysdateの最後の日付
NEXT_DAY(sysdate, '木曜日') sysdateの次の木曜日
MONTHS_BETWEEN(sysdate, sysdate-400) sysdateからsysdate-400までの月数
>267
oracleではそうだけどSQL Serverにはsysdateは無いんじゃないか?
SQL Serverだとgetdate()だったと思う。

システム日付から4ヵ月後だと
select dateadd(mm, 4, getdate())
269この場合?:01/12/06 20:04
ただ一つの列、monar(int型)を持ったテーブルNekoがあります。
以下のようにデータが入っています。
1、3、4、5、9、10、13・・・(つまり連番でないという事を言いたい)

このテーブルから、monarを小さい順に並べたときの3個目から5個目までを
取り出したい。(4,5,9を取り出す)
この場合、サブクエリー使ったら結構時間かかるんですけど、もっと
いい方法はないのだろうか?Oracleなら便利な関数がありそうだが・・・?
monarにindexが貼ってありゃー、遅くもないだろ。
select monar from (select monar from Neko order by monar) where rounum between 3 and 5;
271この場合?:01/12/06 20:32
>>270
誤解表現すんまそ。SQL-SERVER 7.0なんです。
inner join に書き換えれ

indexは貼ってあるのか?
273この場合?:01/12/06 20:47
もちろん貼ってます。
>269
select top 3 monar from
(select top 5 monar from Neko order by monar asc)
order by monar desc
ところで、みんな、インデックスって「貼る」って表現する?
俺は「張る」。
276貼る:01/12/08 12:45
SQL-Server 7.0なんですけど、

select datepart(hour, 日時) as A, count(*)
from テスト
group by A

だと、列名 'A' は無効です。と叱られます。
group by にはいちいちdatepart(hour, 日時)と指定する必要が
あるのでしょうか?
277張る:01/12/08 13:16
SQL-Server は知らんが group by 1 とかはできんのか?
あるんじゃない?
279貼る:01/12/08 13:24
>>277
実はGROUP BY 1は怒られます。ORDER BY 1は怒られないのです。
いけてねーDBだよ・・・
280初心者:01/12/18 18:49
こんなテーブルがあります。T_nedan
id フィールドA フィールドB
1 100 100
2 200 500
3 300 700

このテーブルからフィールドBの値がフィールドA
の値の2倍以上のレコードを抽出したいのです。

つまりこのテーブルの場合2,3が抽出されます。

この場合SQL分は

select id from T_nedan where フィールドB > フィールドA*2

でいいんでしょうか?どうしてかうまくいかないのです。
初歩的なことでもうしわけありません。
281デフォルトの名無しさん:01/12/18 20:11
フィールドA,Bが数値データ型だったらそのSQL文成功するはず。
テーブル見てるとそうじゃないようだが。
282yayoi:01/12/20 10:12
超簡単な質問だと思いますが、教えてください。
予約管理表を作成するために、
スケジュールテーブルに顧客テーブルから顧客名を付加して
まるで一つの表のようにしたいです。
どのようにSQLを組めば良いのでしょうか?

スケジュールテーブルには
時間、レコード状態、顧客IDなどがあり、
顧客テーブルには
顧客ID、顧客名、住所などがあります。
>>282
顧客テーブルはマスタテーブルとし、顧客IDがそのテーブルの
主キーだと仮定したとして。
SELECT b.顧客ID,b.顧客名,b.住所,a.時間,a.レコード状態
FROM
(select * from スケジュールテーブル) a,
(select * from 顧客テーブル) a
where b.顧客ID = a.顧客ID
でいいんじゃないの?
なぜ派生テーブルを使う必要がある?

SELECT b.顧客ID,b.顧客名,b.住所,a.時間,a.レコード状態
FROM
スケジュールテーブル a, 顧客テーブル b
where b.顧客ID = a.顧客ID

じゃいかんのか?
285デフォルトの名無しさん:01/12/21 01:19
ACCESS2000でレコードの何行目から何行目までを抽出するとかってできますか?
IDのような行番号をあらわすフィールドは無いものとして。
286デフォルトの名無しさん:01/12/21 09:26
↑SQLステートメントの話です。
ACCESSスレへ逝け>285-286
SQLとしては、激しく既出で基本中の基本です。
288デフォルトの名無しさん:01/12/21 13:39
↑そこをなんとかヨロピク!
>>285
できません(きっぱり)。
先頭の*レコードを取得、というのなら、実装しているDBもありますが。
top と minus の組合せでできないかなぁ。
291デフォルトの名無しさん:01/12/22 10:16
>289って思いっきり厨房だね...
なんか自身たっぷりだし(ワラ
292デフォルトの名無しさん :01/12/22 10:25
Rubyなら出来ますよ
乗り換えてみてはいかがでしょうか
だからSQLでも出来るって
294デフォルトの名無しさん:01/12/22 12:10
>285
これ(>274)じゃ駄目なのか?
>285
いちおヒント。
あるフィールドの値を基準に順位付けして連番を振るという方法は知ってるよな?
(知らんなら検索して探して。いっぱい転がっているから。)
んで、連番さえ振ってしまえば後は...
296デフォルトの名無しさん:01/12/22 20:07
休出残業age
297みか:01/12/28 01:49
すみません。質問なのですが、テーブルにまったく同じデータが複数件あって、
その中の1件だけUPDATEしたいのですが、どうすればよいですか?
これわからないと、明日も残業なんです〜。
298高校生:01/12/28 02:01
oidキーを使う。
>>297
>テーブルにまったく同じデータが複数件あって、
>その中の1件だけUPDATEしたいのですが
ORACLEだったらROWID指定すればいいんじゃない。
300デフォルトの名無しさん:01/12/28 18:20
それ以前に、>297のDB構造って大丈夫か?って事がムチャ気になる。
単なる一時テーブルだったらまだ許せるが...
301デフォルトの名無しさん:01/12/28 18:24
>>297
カーソルを使えば
>>297
delete from テーブル名 where current of カーソル名;
これでできるかな
303みか:01/12/29 02:31
>>299SQLサーバーでした。スミマセン…
>>300そうなんです。私もおかしいと思うのですが、全体的に把握してるわけでもなく
リーダーに言われるがままに(仕様通りに)とりあえずやってるだけなんです。

>>301 >>302アドバイスありがとうございました!

で、結局レスを見る前に適当にやってしまいました。結果は、

SP内でまず、
1.対象のレコードを変数に格納。
2.対象レコード数のカウント。
3.対象レコード全件削除。
4.変数より[カウント−1]分をインサート。
5.更新分(一件)をインサート。

...ややこしいですね...スミマセン、ださくて...

私みたいなのがプログラマーと名乗るのもおこがましいことは重々承知
しております。レスくださった皆様ありがとうございました。
もっと勉強してきます。また教えてください!
304デフォルトの名無しさん:01/12/29 02:40
sybaseで、テーブルとかをexportして
再installして、でimportするのに
bcpっていうコマンドがあるよと聞いたのですが、
使い方が分からずで、

bcpって言うコマンドの使い方教えてください。
305デフォルトの名無しさん:02/01/04 22:51
そろそろ業務系の皆さんも仕事始めなんでageときますわ。
306名無しさん@XEmacs:02/01/05 00:17
UIで編集可能な項目が主キーだと更新がめんどくさいんだよぉ。

なんで人工キーつかわねぇんだ?

とか愚痴ってみる。
307(0^〜^0O)‏)^▽^(:02/01/05 00:41
>>304
他スレでも、聞いたロー?
漏れが答えてやったから見に行って来い
308(0^〜^0O)‏)^▽^(</b></font>:02/01/05 02:15
(0^〜^0O)‏)^▽^(</b></font>
309(0^〜^0O)‏)^▽^(:02/01/05 02:16
(0^〜^0O)‏)^▽^(</b><(0^〜^0O)‏)^▽^(/font>
310307:02/01/05 02:18
こら〜!!
真似して荒らすな!!
311デフォルトの名無しさん:02/01/05 17:53
これからSQLの勉強を独学でしようかと思っているのですが、やっぱり学校とかで
学んだ方がいいと思いますか?家ではオラクルやSQLサーバー(個人で買うには高
い)がないので、実習ができないし・・・。
それとSQLって将来大丈夫ですか?
COBOLみたいになったらちょっと・・・・
312仕様書無しさん:02/01/05 18:42
SQLで喰いたいのか (いや馬鹿にする訳では無いが
取り合えず本買ってフリーのDB叩いてみれば
313デフォルトの名無しさん:02/01/05 18:49
>>311
Windows使ってる?
ならば、MySQL for Win32がおすすめかも。
http://www.mysql.org
から、本体をゲト。
で、
http://www.hi-ho.ne.jp/tsumiki/
http://sql.jnts.ne.jp/
から、便利なツールをゲト。

PostgreSQL for Win32もあるんだけど、こちらは
Win環境ではまだまだって感じ。
MySQL-Max使えばトランザクションも使えるから、おすすめだ。
314デフォルトの名無しさん:02/01/05 18:55
>>311
SQL学ぶなら、
 http://www.rfs.co.jp/sitebuilder/sql/index.html
 http://www.ann.hi-ho.ne.jp/hirok/sql/
 http://www.kozupon.com/sql/sql1.html
 http://www.cskkansai.co.jp/drool/ogawa/01sql.html
 http://www.wakhok.ac.jp/DB/DB.html
あたりを参考に独学すれば?学校で学んでも、大したスキルは付かないと思う。
自分であれこれいじって苦労してものは、財産になるぞ。

SQLの将来ねぇ。当分は存続していくと思うけど、今後は、SQLは隠蔽されて、
オブジェクトにマッピングされたRDBを使ったりしていくような方向になるんじゃないかな。
この点、アポーのWebObjectsに含まれてるEnterprise Object Framework(EOF)ってやつは
10年くらい前から、SQLを意識させないRDBアクセスを実現してる。
ここ数年流行りのEJBなんかよりもはるかに洗練されてて効率高いぞ。
興味あったら検索してみな。

とはいえ、SQLを知っていると知っていないとでは、大違いだと思うから、やっといて損はない。
315デフォルトの名無しさん:02/01/05 21:26
SQLは将来もOracleが繁栄してる限り存在するでしょ
SEの方が言ってましたよ
Data BaseについてのHP造ってしまいました

http://users.goo.ne.jp/rdbms
316デフォルトの名無しさん:02/01/05 22:17
>>315
そのSE、たぶんクソSEだ。
単一のベンダーを拠り所とするヤツって、思想的にダメ。
317デフォルトの名無しさん:02/01/05 22:19
>>314
WebObjectsとRDBの連携って、どうなってんの?
SQLは書かないのか?
きょうびJDBC経由だったら、resultset作ってSQLぶん投げてるだろ。
つーかそれが普通。EJBだって結局はSQL書いてるよ。
318314じゃないけど:02/01/06 00:16
>>317
知らないくせにえらそうだな。
WebObjects触ったら腰抜かすぞ!
SQLなんていらねーよ
>>311
Forte for java 3.0 CEとか入れるとPointBaseの機能限定版がついてくる。
SQLのドキュメント(英語)もついてきて、Javaとセットで勉強できるよ。
Javaいらん・・・?それはスマソ。
320314:02/01/06 02:15
>>317
WebObjectsは、基本的にJDBC2.0準拠のドバイラ経由でRDBとやりとりをするぞ。
RDBのスキーマ情報を、リレーション含めてJavaのオブジェクト化するフレームワーク(EOF)がある。
で、そのフレームワークがSQLを生成して実際にRDBとやりとりをするが、開発者は基本的に
SQLを書く必要は無いのだ。ぜんぶJavaのメソッドを叩くことでRDBとやりとりできる。

んで、Webアプリなんかは、動的にWebのUIを生成する部分も全部ビジュアルに作れて、
なおかつRDBから取得したデータをWebに出力する場合の作業も、これらのメソッドや
フレームワークが提供するオブジェクトをビジュアルにUIに対して接続するツ-ルがあるから、
MS-ASPやColdFusion、JSP、Perl、PHPなんかでよく見られるSQLをUIやロジック中に
シコシコと入れなきゃいけない作業から、ほぼ完全に解放されるぞ。
もちろん、パフォチュー絡みで生SQL書きたい場合やストアドプロシジャ使いたい場合、これも可能。
EOFがRDBに投げているSQLも確認できるから、

「SQLありき」でアプリを構築するとゆーナンセンスなやりかたではなく、
「目的ありき」でアプリを構築して、結果として生成されてるSQLを見られるので、
そういう視点からのSQLの勉強にはいいかもしれない。
なにせ、EOF自体は10年以上前から存在する技術だから、枯れてていい感じ。
誰かCool:Plexとか使ってねぇかなぁ?
322デフォルトの名無しさん:02/01/07 11:00
id | foo | bar
------------
1 | A | a
2 | B | b
3 | C | c
4 | D | d
5 | E | e

こういうテーブルから

foo | bar
----------
A | b
B | c
C | d
D | e

というデータを取り出すにはどのようにやればよいのでしょうか?
要はfoo列とbar列を1つずらしたいのですが。
ちなみに id はユニークです。
323山神>322:02/01/07 11:23
SELECT Table1.Foo, Table1_1.Bar
FROM Table1, Table1 AS Table1_1
WHERE Table1_1.Foo = (select Min(Foo) from Table1 as Table1_2 where Table1_2.Foo > Table1.Foo)
324322:02/01/07 12:05
>>323
ありがとうございます。
でもこれはfooがソートされていないと駄目なんですね。
fooもbarも特にソートされていない場合によい方法はないでしょうか?
それとfoo列とbar列を1つではなく2つ以上ずらすことも可能なものをできればお願い致します。
>>314
適材適所でしょ。
扱うデータが少なければオブジェクトも良し。
326デフォルトの名無しさん:02/01/07 13:24
>>324
やりたい意味がよくわからんが、どうしてそんなことしたいの?
普通に全部取り出して、ロジックで処理したらだめなの?
SQLでは、シーケンスが保証されていないRDBMSを前提にしているから
基本的に「順番」という概念はない。
RDBMSに依存してもいいなら、出きるかもしれない。(出来ないかもしれない)
327326:02/01/07 13:27
っつか、よく読んだらIDってのがあるのね。あほなこと言いました。
>>324
SELECT A.FOO, B.BAR
FROM TABLE1 AS A, TABLE1 AS B
WHERE A.ID = B.ID - 1;
329322:02/01/07 14:06
>>328
できたました。ありがとうございます。
330&rle:02/01/09 01:17
英語を理解してればSQLほど簡単なもんはネェ。
SQLServerでoracleの「DESC」に相当するコマンドはあるのでしょうか(・・?
>>331
sp_columns<綴りあってるか?
333デフォルトの名無しさん:02/01/10 10:04
SQLの仕様書ってどこで手に入るですか?
334331:02/01/10 11:04
>>332 (・∀・)Thx!
>>330
それが英語圏の人間の奢りだというのに気づかないのか。
数式も読めないアフォ米国人のためになんで俺らがいらん苦労せにゃいかんのだ。
>330
なら何故にEnglishQueryなんてツールがあるのだろうか?
337デフォルトの名無しさん:02/01/10 18:41
PHPとMySQLを使っています。以下のQuery文について質問です。
select m.Name t.View from message AS m, thread AS t order by t.moddate desc

この message AS m って部分は何でしょうか?
m というテーブルは入ってませんです。
message に mっていう別名を付けているだよ。
339デフォルトの名無しさん:02/01/10 19:28
>>338
なんで別名なんて付けるんですか?
長い名前を何度も書かなくても済むようにですかね?
>>339
だいたいそんなかんじ。
項目名がダブってたりした時とかいろいろ有り難い。
341デフォルトの名無しさん:02/01/10 22:32
SQLってスィークェルって呼ぶ方が好きなんだけど、
通じない人が多いんだよなあ。
すきゅる
>>339
同じテーブル同士をJOINするときには、別名が必要。
>341
スクール水着
345デフォルトの名無しさん:02/01/14 22:09
select a,b,renban from table where ......

みたいな形式でselectするたびに結果に連番を振る方法はあるでしょうか?
(結果を取得する際にrenbanに1番目の場合は1,2番目なら2が入る。
renbanという列は存在しないものとする。)
sqlserverです。
SQLServer6.0をデータオブジェクトとして扱うには
何が必要なのでしょう?
Access2000(ADP作成時)とかVB6.0からだと
「そんな古いデータは使えねぇ。あきらめな」
ってなメッセージが出てきて難儀しております。
>>346
そんな古いデータは使えねぇ。あきらめな
>346
つぅかミドルは何よ?ADO?
データが有るって事は既存システム?
349346:02/01/15 13:30
>>347 Σ(゚д゚lll)ガーン
>>348 DAOの既存システムをADOで作り直すのでありんす。
>>345
ORACLEでいったら、rownum見たいなもんね!  わしも知りたい

いつも一度ワークテーブルに
シーケンスを付けてやってる
結構面倒だ
>>350
あんたすごいよ。
ためしにrownum使ったら連番が振られたよ。
ありがとね。
以前、順序.nextval を埋め込む方法を取ろうとしたけど、初期化が面倒でやめた。
352351:02/01/16 00:22
あっ 私は通りすがりの ORACLE 使いです。
353デフォルトの名無しさん:02/01/17 00:57
354デフォルトの名無しさん:02/01/17 16:41
連番って、まぁFAQだけど、なんで要るんだ?
なんかRDBの使い方間違ってないか?

こんな場合があるから要るんだっていう実例きぼんぬ
レポート印刷時に、一行の先頭に連番を振る要望はある。
「2ページの上から8番目の明細ですが・・・」っていうよりわかりやすいのは確か。
>>354
WEB関係でもありがち、一度に全行表示すると時間がかかるので
最新の1〜10行目を表示
次へのボタンで、11〜20行目を表示かな
連結系っていうのかな、FECTHだのMoveNextだの使わんでも
SELECTだけでデータを取ってこれて、それを貼っつけるだけで
アウトプットを作れてしまうようなものがあるよね。
例えばACCESSでクエリーをデータソースにしたレポートとか。

で、そのレポートに「行に連番つけてくれ」って言われたとき、
SQLだけで対応できたら楽かもしれない。
ACCESSの例だとロジック書いて連番振る事は一応可能だけど
結構制御が面倒だし。
>>354
まあ正直、「それSQLの役割か?プレゼンテーション側でできるべきだろ」
って思うケースもあるのは確かだね。

359デフォルトの名無しさん:02/01/19 11:01
お客の要望は出来ることならかなえる これ鉄則
>>356
PostgreSQLならoffsetとlimitで簡単指定。
なので、行番号はいらん。(行番号振りたいって話ならどうしょうもないが)
361デフォルトの名無しさん:02/01/19 15:57
>>360
「PostgreSQLなら」ってのは、いろんなDBMSがあるんだから
少なくともISOの規格では無いと思ってたが
362デフォルトの名無しさん:02/01/19 21:27
>>359
客が「SQLで連番振りたい!」というのか?(藁
>>362
要望が絶対無いと言い切れるか?
「連番なんか要らないじゃ無いですかぁ」言うのは簡単だけど

「出来ない」と「知らない」は違うぞ!

客から要望でなくても、
知ってることで処理を簡単に出来ることも多々あるし
>>363
問題はそれをSQLだけですべきかどうかだな。
連番くらいならとってきた後振ったほうが処理はわかりやすいと思うぞ。
>>364
だからロジックで埋め込めない場合もあるでしょ!
特に帳票系などレコードセットとかに入れたらOKなときとか

それでも後で付ければ良いジャンって思うかも知れないが
100万件ぐらい連番ふってみ、それなりに時間かかるっしょ

連番がどうとかを言いたいわけでは無く
SQLでもプログラムでも同じ事が出来るのなら
速くしたほうが良いでしょ
SQL側の機能として追加してくれたらいいな...に静かに一票。
367デフォルトの名無しさん:02/01/19 23:20
>353のリンク先に懇切丁寧に連番の振り方が書いてあるが
それじゃいかんのかい?
>>367
これは遅いですね!
まだワークテーブルに入れた方が速い
>367
割と昔から知られてる手法だけど、実際に使ってるケースは
どれくらいあるだろう。
自分自身を直積するような方法は、データ量の2乗に比例して
時間がかかるようになるのは当然だよね。1000件に連番振る
のに100万件のオーダーで処理するわけだ。
SQLの考え方としては参考になると思うけど、実務で使うと
えらい事になるかもしれない。
370山神:02/01/20 13:05
>>357
accessのレポート限定ならrunningSumプロパティを
使えばコードは不要ですが。
>>369
SQLで自己結合を取る方法なら
計算量は
ο(N**2)
にならざるをえないですね。
だから出力側でなんとかするのが本線かと思う。
371デフォルトの名無しさん:02/01/23 15:56
>>341 シークェルって、SQLの元になった言語の名前だよ?
ってレス遅すぎ

ところでSQLの仕様ってみんなどうやって確認してる?
372デフォルトの名無しさん:02/01/23 16:05
>>371
それは知ってるけど、MSのSQLServerの講習会行くと
アメリカ人講師はシィクルサーバと発音してるよ
373371:02/01/23 16:14
えすきゅーえるって発音がめんどくちゃいからかなぁ

それにしても仕様書…JISから買わなきゃだめなんかな
ってJISのサイト見たことないんだけど←だめだめですか?
クソスレ
>>373=371
えいちてぃーえむえるのほうがはつおんがむずかしい。。。
376デフォルトの名無しさん:02/01/29 12:00
同一テーブル内のデータを元にして、
新しいデータの生成はできますか?

a1 aaaaa1
a2 aaaaa2
a3 aaaaa3
を元にして、

b1 aaaaa1
b2 aaaaa2
b3 aaaaa3
を同じテーブル内にInsertしたいんですが。
377デフォルトの名無しさん:02/01/29 12:55
>>376
insert into tbl ( ... ) select ... from tbl;
378376:02/01/29 13:29
>>377
ありがとうございました。
基本的なコトでしたね
379デフォルトの名無しさん:02/01/30 18:18
TableA
C1|C2
-----
30|AA
40|BB
50|CC

TableB
C3|C4|C5
--------
30|10|aa
30|20|bb
30|30|cc
30|40|dd
50|30|ee
50|50|ff

から

C1|C2|C5
--------
30|AA|dd
40|BB|(Null)
50|CC|ff

を取り出すSQLって書けますか?
C1=C3で、C4の値が一番大きいレコードのC5を取り出す。
クエリーのレコード数=TableAのレコード数。
てのが条件です。
色々試したのですが出来なくて・・・。
教えて君でスミマセン。
select c.C1, a.C2, b.C5 from
(
select C1, max(C4) C4 from TableA a, TableB b
where a.C1 = b.C1
group by a.C1
) c, TableA a, TableB b
where a.C1 (+)= c.C1
and b.C1 (+)= c.C1

ORACLEの場合っすけど
こんな感じでいかへん?
381デフォルトの名無しさん:02/01/30 23:38
>where a.C1 (+)= c.C1
(+)ってなんですか?
>>381
外部結合演算子。Oracleのローカルルール。
Oracleは、外部結合の構文で標準SQLをサポートしてないのです。
OracleのSQLの仕様決めてる奴、死んで欲しいです。
383デフォルトの名無しさん:02/01/31 00:13

普通の'='じゃだめなんですか?
384デフォルトの名無しさん:02/01/31 00:19
「外部結合」っていうのはどれに掛かるんですか?
>>380のサブクエリーと関係ありますか?
385380:02/01/31 07:32
>>382
とりあえずツッコミですが
ISOの書き方もサポートしてるはずです

OUTER JOINくらい知ってますがな
普段使い慣れてないので資料見ないと
構文をしっかり憶えてないだけ
ちゅーか批判するなら標準で書き直せちゅーねん


>>384
外部結合から勉強しましょうね!

例から説明すると
40|BB|(Null)
があるから外部結合にしてみました
>382
ぎゃくに標準のSQLしか使えないDBMSって...(w
387379:02/01/31 10:46
できました!
Where句で副問い合わせできるのは教わってましたが
From句でできるのは知りませんでした。
そこに考えがいかなかった自分に鬱。
>>380さん、マジでありがとうございました!!

これで今まで33秒かかってた処理が14秒になりました。
それとプログラムもいじって4秒まで短縮。感動!
でもこういうのって評価には結びつかないんですよね。
自己満足にしかならないのがチョト悲しい。

外部結合はOUTER JOIN使うとなぜかエラーになっちゃいます。
書き方がいけないのかな?(+)使えるからいいんですが。
でも(+)って書き方の方が直感的だし、見た目もすっきりするから
いいですよねー。
388デフォルトの名無しさん:02/01/31 11:23
テーブルの結合ってJOINだっていうけど(言わないの?)、
select * from a,b where a.no=b.no
って書くのはJOINじゃないの?
なんかわけわかんねぇこと書いてます?俺。
なんかもう泣きそうだよ。
389デフォルトの名無しさん:02/01/31 11:26
以下のように2つのテーブルがあるとき、
テーブル2のpointをid毎に合計して、
テーブル1のpointにid別に足すというのを
一回のSQLでやりたいのですができますか?

「テーブル1」
id,name,point
aaa,田中,100
bbb,鈴木,200
ccc,山本,300

「テーブル2」
id,point
aaa,50
bbb,100
ccc,70
bbb,50
aaa,25
390379:02/01/31 12:03
>>383>>388

>>379の例で言うと、TableBにC3=40のレコードが無いため
ただのイコールだと結果は
C1|C2|C5
--------
30|AA|dd
50|CC|ff
となってしまいます。
レコード数=TableAのレコード数という条件なのでこれではだめです。
TableBに該当データが無くても、TableAのデータは得られるように
JOINとか(+)を使ってるわけです。
>388 それも一種のJOINだろ? ていうか何にこだわってんだ?
>>389
ORACLE限定だけどこれでいくと思う
SELECT a.id,a.name,a.point + NVL(b.point,0)
FROM
(SELECT id,sum(point) sd point from テーブル2 group by id) b,
テーブル1 a
Where a.id = b.id(+)

ただし、テーブル1のidはユニークとする。
393389:02/01/31 13:28
>>392
レスありがとうございます。

オラクル限定ですか。
書くの忘れてましたが、使っているのはMYSQL-3.23.45です。
やはりサブクエリが使えるDBMでないとできないのでしょうか。
394デフォルトの名無しさん:02/01/31 18:36
SQLserverで、
「SELECT SUM( aaa * bbb ) AS ccc FROM TEST_TABLE」
と実行すると「算術オーバーフロー」となってしまいます。
項目aaaとbbbが共にINTEGER型であるためにエラーが出ているのですが、
ここで定義しているcccに対して型指定は可能なのでしょうか?
395デフォルトの名無しさん:02/01/31 19:45
>>394
できない。
DBでIntger型を使おうとすること自体ドキュソ
>387
できたか! それは良かった
自己満足でもいいじゃん
これで外部結合の使い方わかったでしょ!

SQLの組み方次第でかなり高速になるし
イメージ通りにデータが取得出来るとプログラム書く量が少なくなるしね!
ついては多くのプログラムを任され、評価につながるかも知れないし


>394
確かSQL鯖の型変換は、ConvertかCASTだったはずなので

例えばだけど
SELECT SUM( Convert(numeric(10,0),aaa) * Convert(numeric(10,0), bbb) ) AS ccc FROM TEST_TABLE
でいかへんか?

numeric(10,0)ちゅーのは例だよ!
それでダメならSUMの上にもConvertをかけてみよう!

それでもダメならお手上げです
397たまごちゃん:02/01/31 22:55
SQLの勉強を独学で今しており、今度オラクルシルバーを取ろうとしています.
けどこれって勉強していて実務で役立ちますか?
僕は実務経験はないので就職にはやくだちますか?
398デフォルトの名無しさん:02/01/31 23:00
つか、SQLを勉強するってどゆこと?参考書で知識だけつけても意味なかろに。
SQLサーバーとかバカ高いんじゃ。オラクルも高い。
我々一般人がSQL勉強するときはどうすればいいんじゃろ?
アクセスVBAとの違いも教えテホスィー。
399SQLビギナー:02/01/31 23:43
id,no
aaa,1
bbb,2
ccc,3
ddd,4
eee,5

いうテーブルがあって、no の下位2ビットが 1 or 2 の場合だけ抽出したい場合、
どのように書けば良いのでしょうか?
400デフォルトの名無しさん:02/01/31 23:55
>>397
オラクルマスターはDBの知識でSQLの勉強は関係ないヨ
役には立つと思うけど
>>398
SQLを勉強するって、SQLの構文を勉強するって事だよね
じゃぁAccessで十分です。
VBAはあんま関係ないような。
401デフォルトの名無しさん:02/02/01 00:10
>>399
SELECT テーブル1.id
FROM テーブル1
WHERE id / 4 like '%.25' or id / 4 like '%.5'
ってだめかな。だめかも・・・(w
402382:02/02/01 00:32
あら、何でおいらが文句言われるんだ?

Oracleは
(RIGHT OR LEFT)OUTER JOIN ON TABLENAME
の構文をつかえないみたいだよ。(+)だけ。

外部結合の機能はちゃんとあるんだから、たんにSQL
パーサだけ拡張すればいいだけだと思うんだが、何で
サポートしてくれないんだろ?
403399:02/02/01 00:37
>>401
ちょっとやってみたんですが、Oracle ではうまく行きそうな感じです。
ありがとうございました。
404デフォルトの名無しさん:02/02/01 01:46
>>400
>>>397
>オラクルマスターはDBの知識でSQLの勉強は関係ないヨ
>役には立つと思うけど

397はオラクルシルバーって言ってるので、
もろにSQLの知識の部分を問われるテストだと思われ。
DBの知識(というかオラクルの知識)も触り程度は範囲に入ってるけど。

ただ、高いの個人で受けるのはそんなにお勧めはしないが・・・
シルバー程度ならある意味実務でDBに触れている人ならちょっと
勉強すれば誰でも取れるし。持ってないけど。金が勿体ないから。

>外部結合の機能はちゃんとあるんだから、たんにSQL
>パーサだけ拡張すればいいだけだと思うんだが、何で

むしろ標準規格を(+)にして欲しい。

405382:02/02/01 02:05
>>404
いやだからさ、標準化団体なんてどうせ一度決めたら融通利かない
お役所親父の集まりなんだろうから、OracleのSQLが両方サポートして
くれるのが一番ありがたいよ…

システムで使用するDBだけOracle以外のものと差し替えする羽目になった
時、使っていたSQL文を片っ端から書き換えていくのが面倒くさいんだよね…
あ、囲い込みの手段?ならある意味納得。
406デフォルトの名無しさん:02/02/01 02:19
>>404
結合条件と選択条件を明確にできるので標準SQLのほうがいい。
407デフォルトの名無しさん:02/02/01 08:06
OUTER JOINって、もしかして9iからか?
最近どっかで見かけた気がするんだけど?

>>406
>結合条件と選択条件を明確にできるので標準SQLのほうがいい。
んじゃ、INNER JOINとかも使うんか?
結構メンドイくて見づらいと思うんだけど?
408デフォルトの名無しさん:02/02/01 08:08
396でConvertを教えてくださった方、ありがとうございました。
できました。どうもです。
>406
なんで、そこまで標準にこだわってるのだ?

あくまでも私の個人的な感想ですけど
業務アプリケーションで考えれば、シェアの6〜7割はORACLEで占めてるんじゃ?
SQL鯖が2〜3割(多いような気がする)? その他(PostgreSQL・MySQL)が1割弱?

詳しく調べた訳じゃ無いので数値には突っ込まないでね!
影の標準じゃ?

どっちにしろ「SQL教えて〜」くるのは初心者(ORACLE・SQL鯖)だと思うし
410デフォルトの名無しさん:02/02/01 09:36
やっぱりOUTER JOIN使えないんだ・・・。
それしか教わってなかったので使おうとした時困った。

どっち使うかは好みなのでどっちでもいいと思う。
でも標準の書き方をサポートしないのはおかしい。
ユーザーの事を考えたらやるよね普通。

俺は(+)のほうが好きだけど。
411たまごちゃん:02/02/01 23:06
実際SQLって需要はあるんですか?
求人とか見ても他の言語に比べるとないような気がするんですが・・・。
>>411
他の言語って…一体何と比べてるの?
おれの仕事はSQLメインですが何か?
>411
業務アプリケーションって言われるのは、たいがいSQLを使用しています

例でいうと、在庫管理・請求管理・ユーザ管理などなど
普通はプログラミング言語+SQLっす
だから求人には書かないことが多いと思うっす
>>409
DB2をわすれるなよ・・・
416409:02/02/01 23:26
>415
その他に入るんじゃ<DB2
あとはBtrieveもね
417たまごちゃん:02/02/02 17:02
>414
SQL単品では役に立たないのですか?
今からSQL以外の言語も覚えようと思ったらどの言語がデータベースをより
生かせると思いますか?

あと  データベースをやるにはネットワークの知識も要りますか?
>>417
Javaでしょ。
Oracle8とか9とかはバリバリJava意識してるし。
>>417
DBは条件付問い合わせが可能なストレージサーバとして使用する
ことが多いから、ネットワークの知識もないといかん。
つうかキョウビ、スタンドアロンでDBなんぞ使わん。
>417
うーんSQL単体ではどうなのか?
オンリーじゃこの世代では無理でしょ

本職にしようと思うなら
悪いことは言わない他の職業を探した方が良いと思う
普通2〜3個の言語かけても不思議じゃない職業だから
421デフォルトの名無しさん:02/02/04 10:28
ていうかどんな言語のエキスパートでもSQL知らなければ役立たず。
普通の業務アプリ開発ではある意味必須のスキルだよ。
より生かせる言語ねえ・・・OracleDeveloperとか?使った事無いけど。
つーかなんかこだわる部分がズレてる気がする。目的は何なんだ。
SQLのみで仕事?DB管理者かな。もちろんDBの知識が必要になるけど。
でも専属のDB管理者置いてるのはよほど大きな企業だけじゃん?
あと金なくて業務アプリ発注できなくて直でDB操作してるとことか(藁
なにげにオススメなのはシステム屋じゃなくユーザーサイドでDB扱える人材。
これが結構重宝がられる。その場合はAccessVBAがいいかな。
422デフォルトの名無しさん:02/02/04 17:22
すみません。教えてください。
異なるデータベースファイルからの追加って、どう記述したらいいのでしょう?

 insert into {データベース1のテーブルA} select {データベース2のテーブルA} where 条件なんたら・・・

のような感じでやりたいのですが、できますでしょうか?
Del付属のInterbaseを使っています。
423keken:02/02/04 18:44
質問です。
Postgresを使っているのですが
WEBでのページャー表示の方法がわかりません

例えば
1のリンクを押すと 1〜10件目の内容が表示
2のリンクを押すと11〜20件目の内容が表示

というようなものです。

参考になるHP等ありましたら教えてください。お願いします。
424仕様書無しさん:02/02/04 18:52
フェッチ
>422
SQLでは出来ないと思う、ユーティリティかなんかだな
パッと考えただけだと、ACCESSでODBCで繋ぎ
insert into ・・・ select をする


>423
PostgreSQLなら、LIMITとOFFSETだな
426sybase11.9.2 for linux:02/02/04 22:33
SQLでハマっています。

親A, 子B(0〜nレコード)というテーブルがあるのですが

create table A (
id char(8)
)
create table B (
id    char(8),
link_id char(8), /* A.idとリレーション */
date  smalldatetime
)

目的:
 AとBを結合して値(A.id, B.date)を取得したい

条件:
1.BはB.dateが最も大きな値を持つレコードを引っ張ってくる
2.Bが無い場合はB.dateはnullでOK

よろしくお願いします。(__;
427デフォルトの名無しさん:02/02/04 22:41
>>423
360でがいしゅつ。
>426
さいべーすの構文知らないので細かいことはワカランですが
外部結合をみるとよろし
>>380 で限りなく似たのががいしゅつ
429426:02/02/05 00:01
>428
ありがとうございます!
それと外出ですみませんでした。
430426:02/02/05 01:38
>428
>>380を参考に from句の中に"(select select_list) table_alias"を
書いて試してみたのですが、SYBASEではエラーになってしまいました。
pdfのリファレンスを読んでみたのですが、どうもfrom句の中にselectを
使った仮想テーブル(?)はサポートしていないようです。

他にやり方を知っている方がいましたら教えてください。
431デフォルトの名無しさん:02/02/05 01:51
create viewしてそっからselect。
432426:02/02/05 03:55
>430
「from句にインラインビューを使えない場合は、相関サブクエリーを使う」
という情報を得たので試してみたのですが、3行目のカンマで構文エラー
になりました。;-(

select a.id, b.date from TableA a, TableB b
where a.id*=b.link_id and
exists (select id, max(date) from TableB
     where id=b.id
     group by id
     having max(date)=b.date)

これでいけそうな気がするんだけど…。

>431
レスありがとうございます。:-)
できれば明示的にviewやテンポラリは使わないで実現したいと思っています。
そうも言ってられなくなってきましたけど。(汗)
433426:02/02/05 04:19
>432
>できれば明示的にviewやテンポラリは使わないで実現したいと思っています。

これだけだと単なる1行野郎だと思われてしまうので、補足(言い訳)
させて頂きますと、テーブル設計しているのが私ではなく(顧客)、
アプリケーションで使用しているテーブルは例えテンポラリだろうと
仕様書に記述しておかなければならないので、この時期にその行程
に戻るというのは手続き上面倒なため、できれば既存のテーブルだけ
で実現させたいと考えています。
結局は今頃こんなところでハマっている私のミスなんですけど。(__;
434428:02/02/05 08:12
>432
んっ? そんなに難しいSQL書かなきゃいけないのか?
あぅFROM句のサブクエリ無いんですか
さいべーす=SQL鯖と仮定して(たしか6.5までは元が一緒のはず)

外部結合知らずの簡単な質問だと思って深く考えなかったっすけど
こんなもんで良いと思ってたんだけど

select a.id, max(b.date) from TableA a, TableB b
where a.id *= b.link_id
group by a.id

要望が違ったのか?
435422:02/02/05 08:26
>>425
やっぱり無理ですか・・・
Accessは使い慣れてないので
TBatchMove使うとか、その辺に
落ち着きそうです。
ありがとうございました。
436423:02/02/05 10:03
>>425
>>427
ありがとうございます。
過去ログも一通り見たんですが、検索ワードが分からずに・・・
もうちょいWEB見てみます。ありがとうございました。
437山神:02/02/05 10:41
>>404
>むしろ標準規格を(+)にして欲しい。

3テーブルあってAB間外部結合 BC間内部結合
のとき結合順序によって結果が変わるので
結合順序を明記できるANSIの
(INNER ,LEFT OUTER,RIGHT OUTER) JOIN
のほうがいいと思うがどうよ。
(+)だって結合順序は明確です!
439426:02/02/05 14:06
>434
すみません。
ここにアップしたサンプルはシンプルに説明しようとするあまり
問題の本質まで削ってしまっていました。
結局、434さんが示してくれたようなSQLを複数unionで
つないで、それに対してorder byかけることによって目的を
達成できました。ってこれだけ書いても訳わからないですよね(汗)

# unionの結果にorder byできることを知らなかったのが回り道の始まり(鬱

自分でもSQLの知識が浅いと思っています。仕事が落ち着いたら
ここのスレもじっくり初めから読んでみたいと思います。

アドバイスをくれた皆様、ありがとうございました。
>437
普通DBMSを名乗るものには、ExplainPlan(実行計画)を
見るツールぐらいは有るだろ、そっちの方が明示的に見れるぞ
441デフォルトの名無しさん:02/02/06 10:28
Outer Joinがわかりやすいとか
ツールで見るのがいいとか
もう、あほかばかかと(中略)
おめえらAccessでDrag&Dropで結合しとけ
442442:02/02/06 14:15
SQLはパズルっぽくって面白いっすね。おいらも好きです。
以前、出来るには出来たんだが、あんまりスマートでないような気がしてる問題をひとつ。

テーブル1
ID 有効率 可能回数
1   89.6  23
2   96.1  16
3   99.5  26
4  100.6  15
5  110.5  10

という風なデータがあります。IDはPKです。上記表は有効率でソートしてみました。
他の任意のレコードと比較し、「可能回数が少ないくせに、有効率も低いレコード」は消去したいのです。
上記例の場合、

ID 有効率 可能回数
1   89.6  23 ← ID=3のデータより劣るので削除
2   96.1  16 ← ID=3のデータより劣るので削除
3   99.5  26
4  100.6  15 ← ID=5のデータより劣るので削除
5  110.5  16

結果:
3   99.5  26
5  110.5  10

#結果として、有効率で降順にソートすると、可能回数が昇順になるはずです。
どうやったら抽出できますか?SQLは一発でおながいします。
Accessでやっていますが、一般的な範囲と言うことで。
あんまり面白くないかな?
443ずーる:02/02/06 16:26
いまからSQLの勉強をしようかと思っているのですが,VBとSQLじゃやっぱ時代遅れ
ですか?
>>442
有効率のMAXのレコードと可能回数のMAXのレコードをUNION
させただけのような気がするけど・・・違うの?
>>422
有効率の順位と可能回数の順位との平均を出して、基準以下を削除
>>442だったスマソ鬱
>443
VBはともかく、SQLは今のところDBやる上で必須なのでやっておいて損は無いでしょう。
とりあえず、どっちもまだまだ現役なので時代遅れって事は無いと思うが。

ただ、いつまでもそれだけだと先が見えている事だけは事実。
448442:02/02/06 18:17
>>444-445 例が悪かったですね。すいません。
テーブルが、
ID 有効率 可能回数
1   89.6  23
2   96.1  16
3   99.5  26
4  100.6  15
5  110.5  10
6  112.5   8

なら
ID 有効率 可能回数
3   99.5  26
4  100.6  15
5  110.5  10
6  112.5   8
の4レコードを抽出したいです。
全然、仕様が見えない。
対象テーブルにおいて、可能回数のMAX値を
持つレコード(この場合ID=3)の有効率(この場合99.5)
以上の有効率数値を持つレコードを抽出しろ
ということか?
しかしMAX値を持つレコードが複数あり、有効率が
それぞれ異なったらどうするのだ?
その場合は有効率が低い方を優先させるのか?
 しかし、これだと最初の442説明のID4は抽出
されてしまうので違うと思うが。。。

「可能回数が少ないくせに、・・・」
「くせに」なんていう言葉からどうロジックが組めるんだ?

もっと、仕様を的確に伝えてくれ。
抽出する場合の仕様は、削除対象を
伝えるのではなく、抽出すべき条件を
書いた方が伝わりやすい。
>441
おまえは単表でプログラムでも書いておけ
>>442 >>448
のサンプルと抽出結果が違うジャン
訳ワカランぞ
452442:02/02/06 22:18
すみません〜、説明へたくそで。
抽出すべき条件は、自分自身よりも、有効率と可能回数の両方が大きい
レコードが存在しないレコード、を抽出したいです。

しかも、>>442が間違ってる。すいません。

ID 有効率 可能回数
1   89.6  23 ← ID=3のデータより両方小さいので捨てる
2   96.1  16 ← ID=3のデータより両方小さいので捨てる
3   99.5  26 両方大きいものはないので、抽出
4  100.6  15 ← ID=5のデータより両方小さいので捨てる
5  110.5  16 両方大きいものはないので、抽出

です。ごめんなさい。すいません。申し訳ない。
>452

select distinct ID, 有効率, 可能回数 from
(
select * from
(
select max(有効率) 有効率, from Table
) a, Table t
where a.有効率 = t.有効率
union all
select * from
(
select max(可能回数) 可能回数, from Table
) b, Table t
where b.可能回数 = t.可能回数
)

ちゅーかさ、これじゃ無いかって>>444で言ってるんだけど?
ちがうのか?

同じ数値が複数出てきてもよいのかい?<わかりずらいな
例えばだが、可能回数が全て26だったら、全レコード出てきても良い?

最後に、有効率と可能回数の最大値を、それぞれ取ってるから
おなじIDが複数出てくる可能性があるので一番上にdistinctを付けてみたけど
こんな感じでいいのかい?


ようは最大値を持ってきたいんでしょ
パフォーマンスを考えると素直に
最大値を2回持ってくるやり方の方が良いと思うぞ
454449:02/02/06 22:53
>>452の例も間違いだ
ID=4は抽出だろ?
有効率がID5のそれよりも大きい値だぞ。
まぁ、いいや。

SELECT *
FROM table1 t
where not exists
(select * from table1 where (a > t.a and b >t.b) ) ;

455442:02/02/06 23:00
>>454 え?452の例だと、ID=4は捨てです。あれ?捨てですよ。明らかに。
456449:02/02/06 23:01
すまそ。テストのクエリーをそのまま
貼っちまった。
SELECT *
FROM table1 t
where not exists
(select * from table1 where (有効率 > t.有効率 and 可能回数 >t.可能回数) )
説明は
>>442の仕様通り
これで仕様を的確に書く必要がわかったろ?
(例が間違ってても、通じるということだ)
457442:02/02/06 23:06
>>453 可能回数が全て26だったら、有効率が一番大きいレコードが
欲しいです。

>>454 「a」って?
>457
逆もあるだろ! 有効率が全部おなじ
もしくは全部同じちゅーのも考えられるわ
459449:02/02/06 23:10
>>455
またまたすまそ。
ID=5の有効率
110.5を100.5とまちがえとった。
でもクエリーはこれでOKよ。
460442:02/02/06 23:10
>>456 うっ。すごい(w 多分正解です。きれいだなぁ。感動。
ありがとうございます。
>>453 今自宅なんで、ACCESSしかないんですが、FROM句の構文エラーです
がでちゃいますぅ。
461442:02/02/06 23:12
>>458 有効率が同じ場合、可能回数が大きいほうが欲しいです。
全く同じ場合、両方欲しいです。
>457と>461の条件の時は、きびしいでしょ
463山神:02/02/07 11:37
>>438
ANSIで

select T1.F1,T2.F1,T3.F1 from T1 left outer join
(T2 inner join T3 on T2.F1=T3.F1) on T1.F1=T2.F1



select T1.F1,T2.F1,T3.F1 from (T1 left outer join T2 on T1.F1=T2.F1)
inner join T3 on T2.F1=T3.F1

は(+)だとどういうふうに書き分けるのですか?


>>440
だから実行のPlanだけやのうて上記2つのSQLは
結果も違うのですけど。
というか誰もplanなんぞ問題にしてないですが。
464デフォルトの名無しさん:02/02/07 15:21
SQLServer2000SP1にて質問させてください。
ひとつのコードから、マスタテーブル内の対応する名称を取得する
というプレーンな情報取得についてなのですが、

1.外部結合によるオーソドックスな手法
2.ユーザー定義関数にコードを引数で渡し、
 関数内でマスタテーブルからデータを取得

おそらく1.のほうが早いんだろうとは思うのですが、
実際のところどうでしょうか?データ量にもよると
思いますが、どの程度のものなのでしょう?
データが取り揃わず検証できていない状況です。

ご経験ある方、お知恵をお借りできますか?
465デフォルトの名無しさん:02/02/07 15:56
>269、>285 とかと同じなんですが、

xx件目から、??件を取り出すという場合、基準になる項目が重複可能な場合、
クエリー結果に連番を振るという手段しかないんでしょうか?

select top 10 F1,F2 from
(select top 4010 F1,F2 from T order by F1 asc)
order by F1 desc

(↑>274を参考にしました)や、

select top 10 F1,F2 from T
where F1 >
(select max(F1) from
(select top 4000 F1 from T order by F1) tbl
)
order by F1

のような方法では正しい結果が取れません。
連番方式は激烈に遅いので、避けたいです。

やっぱり、F1項目+ユニーク数値 などのダミー項目を作っておくとか、
姑息な手段しかないのでしょうか?

スカッと一発で解決できるSQLを教えてください。

ちなみに、Access2000とか、SQL Server7.0/2000 を想定しています
466デフォルトの名無しさん:02/02/07 17:35
>>463
>select T1.F1,T2.F1,T3.F1 from T1 left outer join
>(T2 inner join T3 on T2.F1=T3.F1) on T1.F1=T2.F1

select T1.F1,T2.F1,T3.F1 from T1,T2,T3 where T1.F1 = T2.F1(+) and T1.F1 = T3.F1(+);

>select T1.F1,T2.F1,T3.F1 from (T1 left outer join T2 on T1.F1=T2.F1)
>inner join T3 on T2.F1=T3.F1

select T1.F1,T2.F1,T3.F1 from T1,T2,T3 where T1.F1 = T2.F1(+) and T2.F1 = T3.F1;
つかこれはエラーだな、これが通るRDBMSはあるのか?
Oracle SQLServer共にエラーが出た。

>だから実行のPlanだけやのうて上記2つのSQLは
>結果も違うのですけど。

何が言いたいのかよく分かりませんが、バカな私に説明していただけませんか?
というか、私はあなたのことかなりバカな人に見えるのですが。
>>463
Oraでいえば
T1.F1=T2.F1(+) and
T2.F1=T3.F1
>>463の前者、後者どっちの結果を
期待してるのか見分けがつかん!
ということだろ。
Oraは外部結合から評価するので、>>463の後者となる。
従って、結局全て内部結合で結合した結果セットと同じ
となる。

ちなみにMSSQL-ver6以前 Sybaseの場合
T1.F1*=T2.F1 and
T2.F1=T3.F1
はエラーになる。

Oraユーザで>>463の前者の様な結果セットに
意味があるのか?(実際出来ても意味無し。)
後者の結果で返ってくるなら、内部結合使って
そんな結合しねぇよ。なんていう反論も出そう
だから、結合順序のコントロールだけではなく、
SQL92仕様の結合は、「結合と条件を明示的に分け、
条件と結合の評価順序をコントロールできること」
に対して有意性があると言った方が説得力がある
と思う。
結合と条件について詳しくは>>71前後
から書いてあるから読ぬ。
しかし3テーブル間の外部結合利用による方法は
MSSQL-ver6以前 Sybase
T1.F1*=T2.F1 and
T2.F1*=T3.F1
Ora
T1.F1=T2.F1(+) and
T2.F1=T3.F1(+) -Oracle
が普通だわな
これは期待する結果は一つだ。
SQL92で検証してみな
select T1.F1,T2.F1,T3.F1 from
(T1 left outer join T2 on T1.F1=T2.F1)
left outer join T3 on T2.F1=T3.F1

select T1.F1,T2.F1,T3.F1
from T1 left outer join
(T2 left outer join T3 on T2.F1=T3.F1)
on T1.F1=T2.F1
で。
だから、上の>>467の理由と併せると、
Oraユーザにうまく浸透しないのだよな。

469デフォルトの名無しさん:02/02/07 18:34
>>467
>>463をどうよんでも
>SQL92仕様の結合は、「結合と条件を明示的に分け、
>条件と結合の評価順序をコントロールできること」
>に対して有意性があると言った方が説得力がある
に言及してるとは思えないですけど。

>>71には同意するけど、やはり通常の使い方ではOracle
の書式の方が分かりやすい。
JOINを使うと、>>463のようにぐちゃぐちゃになりがち
この点、>>463はわざわざ悪例を出してくれたといえる。
>>1
忙しいあなたのためのSQL入門
http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20011226/1/
>463
っていうか、朝一から
OUTERだとかINNNERだとか考えてるんっすか?
そんなに時間があるなら自分でお調べになった方がはやいのでは?
472ヤン:02/02/11 16:18
やっぱりSQLだけを覚えてても意味はないのですか?例えばJAVAなんかも覚えるとして、
そっちの言語もプロレベルまで覚えなきゃいけないのですか?それともある一定の、レベル
ぐらいでよいのでしょうか?
SQL だけ覚えてもそれを使う言語知らなきゃ意味ないと思われ
それともDBのチューニング一筋で生きてゆく?
>>464
定義関数使う方が圧倒的に遅いと思うよ。
定義関数も結局はスカラサブクエリということになるからね。

定義関数を書き下すと
Select
(Select FIELD_NAME From MASTER_TABLE Where CODE = ...)
From ...
になるわけでしょ?
つまり、レコードの数だけ (Select FIELD_NAME ...) を評価しないと
いけなくなる。この Select句に埋め込まれた(Select FIELD_NAME ...)を
スカラサブクエリと呼ぶんだけど、これはパフォーマンスを落とす顕著な
パターンなんだ。覚えておくといいよ。

475デフォルトの名無しさん:02/02/11 21:39
>>472
むしろ、プログラミング言語を深く学んだ方が良い。
アプリケーションエンジニアにとってもデータベースはできて当然という
方向になりつつあると思う。
データベースの取り扱いが格段に容易になってきたからね。
>475
>>アプリケーションエンジニアにとってもデータベースはできて当然という方向になりつつあると思う。
それは言えてる

ただ複雑なSQLを書けることによって
信じられないくらい簡単にプログラムを書くことが出来るように
なる場合がある。
477デフォルトの名無しさん:02/02/11 23:04
教えてください
Delphiで設定はわかるのですが、SQL文の書き方はわかりません
たとえばただ単にbeginとendの間に
 select〜
  From〜
を指定すると思うのですが、それだけでは当然エラーが出てしまいます。
それ以前のDelphiにSQLを使うという宣言が必要だと思いますが、それがわかりません
どうぞ教えてください。
478デフォルトの名無しさん:02/02/12 08:46
>>477
Delphiのコードに直接書くのではなくて、
TQuery 等の SQLプロパティに書いておきます。
プログラムの中で記述するには
Query1.SQL.Add('Select * from A');
みたいな感じで書くか、SQLを書いたテキストファイルを
Query1.SQL.LoadFromFile('TEST.SQL');
などとして読み込んでおきます。
実行はQuery1.ExecSQL;です。

つーか、サンプル見てね。
>>476
そうだね。データベース(SQL)を「引き出し」としか思っていなくて
プログラミング言語でなんでもかんでもロジックを実装してしまう
アプリケーションエンジニアが多いのも事実だね。
(レコードの単純な出し入れしかしない人だよ)

データベース(SQL)が処理系だということに気が付くと、
アプリケーションエンジニアとして、ひとつステップアップしたと
いえるんじゃないかな。(ストアドや高度な結合を使いこなせて、
処理系としてのデータベースを利用できる人だよ)
480464:02/02/13 21:27
>474
返事ありがとうございます。
圧倒的に遅いとのこと。なるほど
>Select
>(Select FIELD_NAME From MASTER_TABLE Where CODE = ...)
>From ...
と提示して頂けて問題なく理解できました。
となるとユーザー定義関数ってのは、
文字列操作や、そういったDBと絡まない
SQLにおいてのみ利用価値がある、
という認識でいいのでしょうかね。
CASE WHENやCONVERTってどうしても
SQLが煩雑になっちゃうからできれば
使いたいところです。

ありがとう。
>>480
ようは使い方だな。定義関数を使うと構造化できてクエリ全体を
見やすくできるから、使い方によっては非常に便利だ。
書き下したときに、どんなクエリになるか考えながら使えばいいと思うよ。
>464
特殊な例だったのかも知れませんが
トランザクションテーブルに名称を持たした事があるよ
483デフォルトの名無しさん:02/02/15 23:54
教えてください
Delphiで下記のように設定しても、表示はされるがSQLとしては何もおこりません
どこか間違っているのでしょうか?

begin
Database1.AliasName := 'ABC; // ODBCのデータソース名
Database1.DatabaseName := 'Aテーブル'; // DBのエイリアス
Database1.LoginPrompt := False; // DBのログインダイアログを抑制

Table1.DatabaseName := 'Aテーブル';
Table1.TableName := 'Aテーブル'; // MDB内に作ったテーブル名称

DataSource1.DataSet := Table1; // TTableコンポーネントを指定
DBGrid1.DataSource := DataSource1; // TDataSourceコンポーネントを指定
Query1.DataSource := DataSource1;

Query1.SQL.Add('SELECT *');
Query1.SQL.Add('FROM Aテーブル');
Query1.SQL.Add('ORDER BY タイトル DESC');

Database1.Open;
Table1.Open;
Query1.Open;
end;
>483
Delphiでいけ!
>>483
何をやりたいのかよくわからないんだけど、Query1の結果を表示したいだけなら
Table1 はいらないと思う。
DataSource1.DataSet := Query1;
DBGrid1.DataSource := DataSource1;
でいーんじゃない?
ま、Delphiスレで聞いたほうがいいでしょうsage
486デフォルトの名無しさん:02/02/17 20:28
初心者です。教えてください
例えば
Query1.SQL.Add('ORDER BY ID DESC');  並び替え
Query1.SQL.Add('DELETE FROM テーブル');  削除
みたいにSQL文で一つのクエリーに2つの命令って出来ますか?
>486
何を聞きたいのかいまいち分からないが
ストアド使うのが一般的かな?
488太郎:02/02/17 23:31
Postgresでランダムにレコードをとりだすことってできないんすか?
今、いったん、件数を数えてから、perlとかのrand関数つかってやってます。
Count()とrandom()あたりをつかうのかなぁ?
わかるかた、教えてくださいませ。
>488
ランダムで取り出すって意図が分からないですが
適当に取り出すって意味なら
ORDER BYをかげずに、取り出せば取得すれば良いんじゃないの?

だからPostgresならLIMITとOFFSETで出来ないのか?
490太郎:02/02/18 23:23
select * from テーブル limit 1 offset 0;
とかしても、きっと、一番最新のデータがとりだされるだけでした。
>490
だからランダムちゅー意図をハッキリせいって
たまたま最新レコードが最初にヒットししてるんじゃ?

limitの位置をずらせばランダムになるやんか
っと思うんだけど?
492デフォルトの名無しさん:02/02/21 21:53
並び替えの時に
Query1.SQL.Add('FROM AAA,BBB,CCC');
Query1.SQL.Add('WHERE AAA.ID = BBB.項目1');
Query1.SQL.Add('AND CCC.ID = BBB.項目2');
Query1.SQL.Add('AND …');

の後にORDER BY ID DESCを挿入すると思うのですが
普通に入れたらエラー(句にある複数のDテーブルを参照…)になってしまいます。
教えてください
493デフォルトの名無しさん:02/02/21 22:20
>>492
そりゃそうだろ。AAA.ID なのか CCC.ID なのか明示しなきゃ。
>492
デルファイのコードで書くなちゅーの
ここで質問するならSQLだけで説明して欲しいわ
495デフォルトの名無しさん:02/02/21 22:28
>>493
例えば
ORDER BY AAA.ID DESCですか?
496デフォルトの名無しさん:02/02/21 23:42
オラクルのPL/SQLについて質問なのですが、
Postgreみたいにカーソルの明示的な移動って出来ないのでしょうか
1row前に戻るとか。
497496:02/02/21 23:47
↑ちなみに8iですー
>496
FETCHしか無いから出来ないちゃうか?
ちゅーかカーソルの明示的な移動って、
どういう使い方をするときに必要なのだ?
499496:02/02/22 00:09
>>498
カーソルを返すストアドファンクションで、
中で%NOTFOUNDまでループさせた場合、
その後にカーソルをreturnするとエラーになっちゃうんです。
%NOTFOUNDの手前でとめればOKなんですけど。
500496:02/02/22 00:11
そんで手前で止める為に予め件数を取得してないとならないのが
面倒なので、なんとかカーソル動かせないかなぁと思ったのです。
このスレって元々は単発質問スレ?
糞スレリサイクル大成功?
>499
FETCHする前に変数に、変数に入れておけば良いんじゃない?
そしたら最後のレコードを取得できるんちゃう
>>499
例外処理で返すのは反則?
504デフォルトの名無しさん:02/02/22 10:40
「日付が最も大きいもののデータを抽出する」
という処理はどうやりますか?
505496=499:02/02/22 14:19
当方まだPL/SQLを始めて3日目なもので、
的はずれなこと言ってたらごめんなさい。

>>502
フェッチ前にカーソルの中身を%ROWTYPEの変数に渡す
ということでしょうか?

>>503
例外を返すのもやっぱりカーソルじゃないとならないから、
難しいのではないでしょうか。。。
506504:02/02/22 14:31
自己レスなんだけど

SELECT * FROM テーブル名 GROUP BY id
HAVING MAX(date1)=MAX(date1)

こんな感じでいいかね?
>504 日付降順に並べて1つフェッチしたら?
508504:02/02/22 14:42
506のやり方は駄目でした。

>>507
実はSELECTではなくUPDATEをしたいのですが、
出来れば一回のSQLで抽出したいので、
WHERE区のなかで「日付フィールドが最大のもの」と
指定できればと思うんだけど。
ちなみにMYSQLなのでサブクエリーは使えないんです。

509デフォルトの名無しさん:02/02/22 17:17
>>508
「日付フィールドが最大のもの」という言葉だけでは
"GROUP BY id" なんていう条件は予想もつかない。

説明を略しすぎてない?
510504:02/02/22 18:07
>>509
フィールドの構成は
id,date1
となっていて、idはユニークではなく重複がありえる。
date1は日付です。

例えば
id,date1
tanaka,2002-01-01
tanaka,2002-02-01
suzuki,2002-01-01
yamamoto,2002-01-01
yamamoto,2002-02-01
yamamoto,2002-03-01

・・・こんな感じになってます。
511504:02/02/22 18:11
で、指定したIDの日付が最大のものを更新したいのです。
例えば、idが'yamamoto'でdate1が最大のもののdate1を更新したいのです。
説明不足で申し訳ない。
512502:02/02/22 21:49
>505
そのとおり


>504
基本中の基本だ。MAXあたりを調べな
513デフォルトの名無しさん:02/02/22 22:29
Oracle のシーケンスを何箇所かで使っているアプリケーションを作ったんだけど、
シーケンスがないデータベースへ移植するための簡単な方法はないですか?
SQL は外部定義になっているので SQL レベルで対応できればサイコーです。

思い付く方法といえば、ストアド作るか、シーケンス用のテーブル作って
SELECT 〜 FOR UPDATE, UPDATE 〜 しかないです。どちらもコードの修正が必要
になっちゃいます。
>513
トリガーでやる
515 :02/02/22 22:44
>>504-511
>指定したIDの日付が最大のものを更新したいのです
select文は簡単だが、
副問い合わせができないと、
update文はきついな。
しかし、できないというわけではない

MySQLはANSI92だったな
テーブル名をtable1とすると、
update table1
set date1 = '2002-02-28'
FROM table1
LEFT OUTER JOIN table1 a ON (table1.id=a.id and a.date1 > table1.date1)
where
a.id1 is null and
table1.id = 'yamamoto'
516515:02/02/22 23:04
>>515
>select文は簡単だが
スマソ
副問い合わせができないと
selectもきついな
でも、515のようにすればできる。
SELECT a.*
FROM table1 a
LEFT OUTER JOIN table1 b ON (a.id=b.id and b.date1 > a.date1)
where
b.id1 is null and
a.id = 'yamamoto'
517504ではないが:02/02/22 23:35
>>516
すげえ。
半信半疑で実行して見たら本当にできたよ。
MySQLでこんなことできるとは知らなかった……。
518515:02/02/22 23:55
>>517
本当はnot exists文が使えると
分かりやすいんだが。
あと
>>515-516
の両方のレスで
where句の
b.id1 is null and

b.id is null and
の間違い(コピペ修正ミス)
ゴミン
519517:02/02/23 00:10
>>518
でも>>515はできなかったよ。
ANSI92 では UPDATE で FROM って使えるの?

ANSIが、これほど頼りない言語も無いな。
かなり基本的な構文まで異なってる。
521515:02/02/23 00:34
>>519
うっ!
スマソ、折れSQLSeverで試してた、
updateのfrom句はT-SQL専用だった。
(Oraもできないね)
ガセ言っちまった、ホントにゴミン。
逝ってくる・・・くしょぉ!
522504:02/02/23 16:55
>>515
すばらしいです。SELECTの方はできるんですねー。
カナーリ勉強になりました。どうもです。
UPDATEの方は引き続き勉強してみます。
ちなみにSELECTの方は>>111の質問とかぶってるみたいでしたね。
523504:02/02/23 16:57
もう一言。はやくMySQLは副問い合わせ対応にせれよ。
>>523
 それは同意することにやぶさかではないが、とりあえず今回の場合は、
すなおに MAX DATE を取る SELECT を投げて、
その結果使って UPDATE
の二度手間でいいじゃん、と思うのはいけないことだろうか?

その方がわかりやすくていいじゃん。
無理に一つに書く必要がないなら。
525517:02/02/23 21:19
>>524 同意。
ほんとうにあれだけのカラムしかないテーブルなら、yamamoto の最新日付は

SELECT MAX(date1) FROM table1 WHERE id='yamamoto' GROUP BY id;

でとれるよね。まあカラムはあれだけじゃないと思うけど。

本当にあれだけで、MAX(date1)をいちいち更新する作りなら、
どういうつもりで設計したのか小一時間(以下略)
まだSQLをコードに埋め込んでるやつらいるのかよ・・・鬱
>>526
私は Oracle+ACCESS で情報系システムを作っていますが、よろしければ
SQLをコードに埋め込まない方法について教えてください。
今は、もろに埋め込んでいますが、より良い方法があれば知りたいのです。
WOなら、SQL一切書かずにJDBC接続できますね。
>>528 ヤパーリWOの宣伝か。そんなことだろうとオモタヨ。
そのWOとやらがフリーでオープンソースで劇軽なら導入を検討させて頂きます。
>>529
どうせ使いこなせないと思うから、検討する必要すらないよ。
完全なる畑違い。
Perl/PHP/Ruby + PostgreSQL/MySQLでも使えば?
531デフォルトの名無しさん:02/02/25 23:56
oracle8iなのですが
DB表をカーソルからフェッチして、それをPL/SQL表に入れて
さらにそれを別のカーソルでオープンする、ということは可能でしょうか?

また、PL/SQL表のポインタを返すようなストアド関数は作成可能でしょうか?

宜しくお願いいたします。
532デフォルトの名無しさん:02/02/26 00:26
文字列結合の演算子||ってSQL92の標準規格だと思っているのですが違うのでしょうか?
SQL92の標準SQLについての解説しているようなページはないでしょうか?
どなたかご存知でしたら教えて下さい。
>>531
質問の答えとは全然違うので申し訳ないのですが・・・
最初のSQLを副SQLにして、次のSQLのFROM句にすることで解決できませんか。
534デフォルトの名無しさん:02/02/26 12:43
>>533
ありがとうございます。
ですが、ちょっとそれが難しいんです。

やりたいことは、戻り値がカーソルであるストアド関数で

1.引数が0のとき :DB表をSELECT → カーソルでOPENし、
そのままRETURNする
2.引数が1以上のとき:DB表をSELECTし、そのリザルトの中で
「引数番目に出現した行のみ」をカーソルでRETURNしたい

なのですが、2ができなくて困っています。
global temporary tableを使えば可能ですが、
createはするなと言われてしまっています。。。。
535デフォルトの名無しさん:02/02/26 12:44
↑つづき
カーソルでなくても、何か他のものでRETURNできれば良いのですが
1と2で戻り値が異なってはいけない、とも言われているので・・・。

宜しくお願いします。
536デフォルトの名無しさん:02/02/26 12:45
↑訂正
戻り値 ×
戻り値の型 ○
537デフォルトの名無しさん:02/02/26 13:41
質問です。

Postgresでdatetime型の値を扱うのですが、
YYYY/MM/DDへのフォーマットはどうすればいいのでしょうか?

オラクルではto_charやto_dateなどを使用していたもので。。。

宜しくお願いします。
538デフォルトの名無しさん:02/02/27 10:40
>>534
>「引数番目に出現した行のみ」をカーソルでRETURNしたい
「のみ」なんだろ?
別にPL/SQL表にいれなくてむ、引数番目までそのカーソルをフェッチ
して返せば問題ないんでないの?

#つーかカーソルを戻り値として使う事なんてできるんだ。知らんかった。
#カーソルの閉じ忘れが怖そうだなぁ。

539534:02/02/27 10:48
>>538
いえいえ、そうすると、「n番目から最後まで」の
行を返すことになっちゃうんですよね。カーソルってポインタだから・・・。

#呼び出しはJAVAでやってるから、
#そっちで対応すればいいのになぁ。。
540デフォルトの名無しさん:02/02/27 23:12
トランザクトSQL
DB2のコマンドセンター
AS/400の対話型SQLも
オラクルはNTでフリーソフトの画面からSQL文叩いてたよ。
(昔なのでウル覚え)

ほとんどおなじだね。データ型が少し違うくらいだな。
元祖はIBMなん?
541538:02/02/28 10:37
>>539
亀レススマソ。
ちょっと言葉足らずだったけど、フェッチした後変数に入れて返せばいいのに
と思って書いたんだけど・・・あくまで戻り値は「カーソル」なのね。
だったら、フェッチした行がユニークになる条件で、関数内でカーソルを
オープンしてそれを戻り値にすれば?
でも、それだとカーソルを閉じるタイミングが難しいねぇ。
>>540
s/ウル覚え/うろ覚え/
>>537
>Postgresでdatetime型の値を扱うのですが、
>YYYY/MM/DDへのフォーマットはどうすればいいのでしょうか?
>
>オラクルではto_charやto_dateなどを使用していたもので。。。

同名の関数があります。
書式指定文字列はちょっと違うはずなので、
その辺はドキュメントみてちょ。
544デフォルトの名無しさん:02/03/01 18:40
PL/SQLで質問です。
date型をGMT通算秒で表示したいのですがどうすればいいんでしょう?
545578:02/03/01 18:56
「通算秒」という概念が良く分からんが、NEW_TIMEっていう関数を
使えばGMTに変換は可能だぞ
546デフォルトの名無しさん:02/03/01 23:48
C言語とかだとtime_tに入れるやつだよね。
たしかグリニッジ標準時間で1970年1月1日 0時0分0秒からの
経過時間を秒で表現するやつっしょ?
でもoracleで使えるのかな?
アホがおる
…しかし1はこんな展開になるなんて予想だにしなかっただろう…
549デフォルトの名無しさん:02/03/07 02:03
月曜から初のプログラムというものに挑戦してます。
言語はjava(jdk1.2.2)で、oracle8を使用しています。

T_SYOUHIN
型番 商品ID 納品日
111 aaaa 20020101
222 bbbb 20020104
333 cccc 20020201

T_NOUHIN
型番 商品名 納品先
111 あああ 北海道
111 あああ 東京
333 ううう 静岡



の様な感じでデータが入っており、型番をキーに
日付で絞り込み、データを取得する。というものです。

連結をせず、T_SYOUHINのみ日付で絞り込んで
データを取得する事は出来たのですが、
条件式にT_SYOUHIN.型番=T_NOUHIN.型番(+)を追加すると
データを取得出来ないのです。
本を見ながら書いたソースを下に記しますので
どなたかヒントを与えて下さい!お願いします。

sql = "";
sql = sql + "SELECT * FROM T_SYOUHIN AS T1,T_NOUHIN AS T2";
sql = sql + " WHERE (T1.納品日 >= " + 20020101 + ")";
sql = sql + " AND (T1.納品日 >= " + 20020131 + ")";
sql = sql + " AND T1.型番 = T2.型番(*)";
550デフォルトの名無しさん:02/03/07 02:40
>>549
これはソースコードからのコピペかい?そうじゃないみたいな感じだけど・・・

>sql = sql + " AND T1.型番 = T2.型番(*)";
なんで(*)なの? (+)じゃないのかい?

後、以下はJavaの文法的にもおかしいが、SQL的にも意味が?
>sql = sql + " WHERE (T1.納品日 >= " + 20020101 + ")";
>sql = sql + " AND (T1.納品日 >= " + 20020131 + ")";

Javaで文字列に数値を足したらたぶんコンパイルエラーで怒られると思うぞ。
それと2002年1月1以降で、かつ、2002年1月31日以降って
要するに1月31日以降ってことになるから、
後半は、>=じゃなくて<=の間違いじゃないのか?(1月1日〜31日)
551デフォルトの名無しさん:02/03/07 03:08
とりあえず、作ろうとしているSQLをsqlplusから
叩いてちゃんと動くかどうか確認してからだな。
552デフォルトの名無しさん:02/03/07 11:57
とりあえずテーブルの構成から改善

型番だけで商品を特定できるのなら商品IDは不要。
商品IDがないと商品を特定できないのなら納品テーブルには型番ではなく商品IDを置く。

商品IDが必要という前提で話を進めると、
商品名、型番などの商品に属する情報は商品テーブルだけに集める。
納品日、納品先、数量などの納品するという事実に属する情報は納品テーブルだけに集める。
553552:02/03/07 12:02
あれ、数量はなかったか。
554節子:02/03/08 00:53
DROP、DROP〜♪
555デフォルトの名無しさん:02/03/08 00:54
そもそもSQLって何?
Structed Query Language
でいいのかな?
1の書き込みからは想像もできないような良スレになったね〜
>Javaで文字列に数値を足したら
>たぶんコンパイルエラーで怒られると思うぞ。
いや、Javaは文字の結合として、できてしまうのだよ。
VB(msgbox "1" + 3 で 4という表示なる)
よりはまともな仕様だと思うが、
こんな書き方はしない方がいいな。



ま、VBでも文字列の結合に+は使っちゃイカンというのは定説ですけどね。
>>556
惜しい。
「Structured Query Language」だよ。
マジで困ってます・・・

oracle8使用のPL/SQLで以下のテーブル構成から下記の条件をつけて
親、子のアイテム構成順にソートしたいのですが 上手くいきません
ヘルプ お願いします


テーブルA                       テーブルB
親(PK) 子(PK) パターン(PK)            アイテム 優先パターン
----- ------ -----------          ----  ---------
A_1   B_1    000                A_1   000
A_1   B_2    000                B_1   111
B_1   C_1    111                B_2   444
B_1   C_2    111
B_2   D_1    333
B_2   D_2    333
B_2   C_3    444
C_3   D_1    555
C_3   D_2    555

条件1                         条件2
出力は親子の構成順とする            アイテムに複数のパターンがあり
例:A_1  B_1                    優先パターンが存在する場合は
  B_1  C_1                     そのパターン以下の構成を先に
  B_1  C_2                    出力する
  A_1  B_2                    例:B_2に対してパターンが複数
                               存在しているので
                               B_2 D_1:B_2 D2のレコード
                               よりB_2 C_3以下の構成を
                               先に出力する

条件1に関してはStart With 〜を使用してなんとかなるのですが
条件2に対応できません・・・(鬱

いい知恵があったらお願いします
562節子:02/03/09 01:16
>>561
DROP,DROP〜♪
563デフォルトの名無しさん:02/03/09 01:20
>>555
SEQUEL(Structured English QUEry Language)
 ↓
SQL(Structured Query Language)
564デフォルトの名無しさん:02/03/09 01:58
>>561
条件2が何を言ってるのかワカランけど、
Oracle だったらFROM句問い合わせと union を
多用すれば、取りあえずなんとかなる。

565ハンチク:02/03/11 12:20
半角にしたけどいいね・・
こんなくらいの意味?もっとやっこしーの?

select a.own, a.child, a.ptn
from tableA a, tableB b
where a.own = b.item(+)
and a.ptn = b.ptn(+)
order by a.own,NVL(b.ptn,99999),a.child

こんな結果でる(ownに条件つけりゃ・・)
own  child ptn  nullcvt
A_1  B_1  000  000
A_1  B_2  000  000
B_1  C_1  111  111
B_1  C_2  111  111
B_2  C_3  444  444 <こいつがほしいんかい?
B_2  D_1  333  99999 <これより先に
B_2  D_2  333  99999 :と思ったが・・
566ハンチク:02/03/11 12:24
失礼、>565 は >561 レス(わかるか・・)

しかし、ほんとの問題は条件1じゃない?
データ次第じゃあ、無限参照有り+重複参照有り、でしょ?
テーブルAのテーブル仕様(論理的に)が面倒そう・・
567デフォルトの名無しさん:02/03/11 12:49
>>561
>>565のテーブルからSTART WITHで出してやればいい
もう解決かな
568561:02/03/11 14:35
レスさんくす>562>564>565>566>567

>566
テーブル仕様については論理的には問題がないようになってます
無限参照になるようなデータは存在しないです

引っ張り出すソート順なんですが
Start withで参照した順番を基準にしたいんです

テーブルAをstart with 「A1」で引っ張ると

親(PK) 子(PK) パターン(PK) 
----- ------ ----------
A_1   B_1    000    
B_1   C_1    111    
B_1   C_2    111
A_1   B_2    000    
B_2   D_1    333
B_2   D_2    333
B_2   C_3    444
C_3   D_1    555
C_3   D_2    555

こんな感じになりますよね?

例えが悪かったのですがパターンについては必ずしも
数字ではないので・・・
要するにBテーブルを参照して優先パターンを保持している
アイテムがあった場合(この場合B2)B2のptn444以下の全構成を
先に出してもって来たいのです(説明苦手で分かりづらくてすまん・・・)

要するに結果はこんなソート順にしたい
親(PK) 子(PK) パターン(PK) 
----- ------ ----------
A_1   B_1    000    
B_1   C_1    111    
B_1   C_2    111
A_1   B_2    000    
B_2   C_3    444 \
C_3   D_1    555   ここと
C_3   D_2    555 /
B_2   D_1    333 \
B_2   D_2    333 /この部分が入れ替わる

勿論これは簡略した例えであってテーブルAにもっと多数のデータが存在した
場合全てのデータにおいて優先ptnの判別は行われなくてはならない
SQL一発では無理な気がしてきてしまった今日この頃・・・

申し訳ない よろしくお願いします
569ハンチク:02/03/11 14:52
>568 必ずしも数字ではないので・・・
仮にchar(4) とした場合 NVL(xx,'zzzzz')
全角とかあってややこしいなら NVL(xx,'') で 逆順ソート。
570ハンチク:02/03/11 15:24
>568
んでロジックなんやけど、

1. A_1   B_1    000 <- これを読んだ後、
2. B_1   C_1    111 <- は新しい読み込みがいらんか?
3. C_1   D_1    xxx <- さらに新しく読んで・・・
4. D_1   E_1    ooo <- この時点で E_1 が無いとしよう。

4の後に、3の次レコードをどうやってとってくるか?
また、その後2,1の続きをどうするか?
深さに制限がないなら、全部カーソル開けないし・・
現レコードを保持してて、次は「それ以後」を条件で再読み込み?

[ろじっく]
XR read -> A_1 B_1
XR      sub -> B_1 C_1
__           B_1 C_2 ..end
_R read -> A_1 B_2
XR      sub -> B_2 C_3
XR           sub -> C_3 D_1
__                C_3 D_2 ..end
_R           B_2 C_1
__           B_2 C_2 ..end
XR read -> A_1 B_3 ...

再起呼び出しモジュール編んで、「R」のたびにSQL発行,以外に思い付かない・・
深さが10くらいまでなら カーソル配列10もっとくけど・・
それでも「X」のたびに発行・・

自分、Unix-C( Pro-C )とVBでのOracle専門なんです。
PL/SQLってどこまでできるの?

嗚呼!最後がマジ質問になってしまった・・長くて失礼。

>567 居る? PL/SQLは任せた(w
すみません。START WITH って何ですか?
それを指定すると >>568 の順になるってのが、
どーやってもわかんない
>571

Strat with は階層問い合せです
表が階層データを保持しているときに使います

Start with 句で階層問合わせのルート行を指定して
Connect By 句で 階層問合せの親子の関係を指定します

テーブルAの例の場合

SELECT 親,子,パターン
FROM テーブルA
START WITH 親='A1'
CONNECT BY PRIOR 子=親

でSQLを実行すると>578の様な結果になります
573デフォルトの名無しさん:02/03/11 22:13

失礼 >568 の様な結果だね・・・鬱だ
574561:02/03/11 22:18

>570

専門外なのに手を煩わしてマジですまん

私もPl/SQL自体始めて半年も経ってないのであまり詳しくない・・・
でも見ている限りやはりワークテーブルが必要な感じがする

ロジック的に一行一行並べ替えるしかないんだろうか・・・
575デフォルトの名無しさん:02/03/11 23:07
Accessを使用していて次のような抽出がしたいのです。

会員 サービス 開始日 終了日
(1) 山田 XXX 199501 199612 (過去会員)
(2) 山田 XXX 200101 200112 (過去会員)
(3) 山田 XXX 200201 200206 (現会員)
(4) 山田 XXX 200209 200303 (予約会員)

テーブルが上記のような構成の時、現行会員という条件で3番のレコードのみを抽出。
3番のレコードを持たないときに予約会員という条件で4番のレコードのみを抽出
3番、4番がないときに過去会員1,2番のレコードを抽出というようなことはできますでしょうか?

要するに定義は
現会員、 現在サービスを利用している人
予約会員 現在サービスを利用していないが将来会員になる人
過去会員 現会員でなく予約会員でもないが過去にサービスを受けたことがある人。

異なるレコードのフィールドが関わってくるのですがこのような抽出って可能でしょうか。
576ハンチク:02/03/11 23:10
>574
ORACLEは一応専門(じゃないといけない・・w)

  Start With (゚∀゚)!イイ

明日試す!
>>572
さんくす。へー、こんなのあるだ・・・知らなかった。
試してみたらホントにソートされて、ちょと感動。

でも、何に使うんだろう・・・
578デフォルトの名無しさん:02/03/11 23:59
意味不明
579デフォルトの名無しさん:02/03/12 00:28
>>575
会員の「山田」とかサービスの「XXX」とかは検索条件に全く現れないわけ?
580ハンチク:02/03/12 01:12
案1
まず、ユニークキー項目がほしい。
次に、「現会員>予約>過去」の順にソートできるキーがほしい。

上記にて、 where key in (select max(会員種別) fro〜
が成り立つと思われますが、いかに?

案2
・現会員クエリ
・予約会員クエリ(現会員クエリの名前を除く)
・過去会員クエリ(現会員・予約会員クエリの名前を除く)
などを用意してつなげる
(たぶんめちゃ重い)

眠い・・明日もこのスレ、ROMにきま〜す(ROM?)
581ハンチク:02/03/12 01:15
>580
ユニークキーいらんかった・・
key -> 会員種別

・・鬱だ、おやすみなさい
>575
月次締め処理みたいなのを作り
現会員に1
予約会員に2
過去会員に3
ってフラグをふりソートするってのはどう?

テーブルの定義に疑問が残るが
UNIONの連続でも似たような事は出来るぞ


583デフォルトの名無しさん:02/03/12 10:19
575です。レスをつけてくれた方々ありがとうございます。
あんまり投稿がながくならないようにと必要十分なものをと思ったのですが
もちろんフィールドも絞込条件もほかにたくさんあるのですが躓いているところは

会員 サービス 開始月 終了月
山田 プール 199901 199912 #1
山田 プール 200101 200106 #2
山田 プール 200201 200206 #3
山田 プール 200209 200203 #4
山田 ジム 200201 200206 #5
山田 ジム 200209 200203 #6
佐藤 プール 200209 200203 #7
佐藤 ジム 200201 200212 #8

スポーツジムの会員リストのようなものです。
現会員 現在サービスを受けている人
予約  現会員でなく未来にサービスを持っている人
過去  現会員でも予約会員でもない人

上記のような場合たとえば今日200203の現会員の抽出で3, 5, 8のレコードを抽出したい。
山田さんも佐藤さんも現会員なので予約、過去リストには出てきません。

やはり地道に予約のときは現会員を消す、過去会員は現会員予約会員を消すという方針でいこうと思います。
おっしゃるようにめっちゃ遅くなりそうですが、、、。
584デフォルトの名無しさん:02/03/12 12:39
>>583
ひとつのテーブルがあって、そこから現会員リスト、予約会員リスト、過去会員リスト
をそれぞれ出力したいってことかな。

BETWEEN とか LEFT JOIN とか組み合わせれば普通のクエリーでさっくり取り
出せそうな *気が* するけど。どんなのを試した?
585デフォルトの名無しさん:02/03/12 15:27
583>575です。
結局テーブルはさわらずに過去、予約出力の際、現会員でもあるときは処理をとばす
という風にして対処しました。レスを下さった方々ありがとうございます。

>BETWEEN とか LEFT JOIN とか組み合わせれば普通のクエリーでさっくり取り
>出せそうな *気が* するけど。どんなのを試した?
私もはじめはそんな*気が*したのですがたとえば585のようなテーブルの時に現会員を抽出使用とすると
1, 2, 3, 4 => 3 ; 5, 6 => 5; 7, 8 => 8
の3本のレコードにしたいのですがこれが過去、予約になると全部消えちゃうことになる

というあたりで挫折しました。
586デフォルトの名無しさん:02/03/12 15:59
UPDATE 表1
SET Count = ( SELECT COUNT(*)
FROM 表2
)

表1のCountフィールドに表2のレコード数を
アップデートしたいのですが、このままだと
オーバーフローしそうなので99999より大きかったら
99999を記録したいです。
どうすればOKですか?
おしえて。
>>586
ORACLE限定、しかも動作は保証しないが
UPDATE 表1
SET Count = ( SELECT DECODE(SIGN(COUNT(*) - 99999),1,99999,COUNT(*))
FROM 表2
)
でいくと思う・・・多分
588586:02/03/12 16:17
>>587
ちょうどORACLEです。やってみます。
ありがとう。
589586:02/03/12 17:52
>>587
成功♪ サンクス!
590デフォルトの名無しさん:02/03/12 18:55
存在するテーブルの名前が欲しいんですが、どうすればいいですか?
ORACLEならALL_TABLESあたりをキーにググれ。
ツーか、マニュアル全部嫁。

>>591
ありがと&スマソ。ざっと探しはしたけど見つからなかったので…。
593デフォルトの名無しさん:02/03/19 09:23
Oracle8.0.5使ってマス。8.1.7が手元にあるんですが
↑と比べてどんなメリット(デメリット)があるのでしょう?
スレ違い?
>593
思いつくままに列挙します(間違ってるかもしれませんが)

メリット
JAVA対応かな?<おおきなメリットとは思えない
INSERT時にORDER BYが使えた

デメリット
クライアントツールがWindows95にインストール出来ない


列挙しようと思ったがあまり思いつかなかった
>INSERT時にORDER BYが使えた
これは何の役に立つの?
そいあ、VIEW にも ORDER BY が使えるのね・・・変なの

INSERT に ORDER BY が使えると、
「とにかく入るだけデータを入れたい」って時には便利かも。
や、そんな場面があるかどうか知らないけど
>595-596
insert〜selectに限っての話じゃないんだけど、サブクエリ
(インラインビューと言った方が適切か?)でorder byが使えると、
rownum使って並び順に連番がつけることができたりする。
#「SQLで連番」は結構永遠のFAQだったりするよね
>595
rownum以外にもnextval使用時も良いんじゃない
ほとんど一緒だけど
599595:02/03/21 01:15
>>596-598
なるほど。597のは便利そうだね。
600デフォルトの名無しさん:02/03/23 19:48
ちょっと教えてください。
AテーブルとBテーブルがあります。
hoge_CDでマッチングしてBの条件にヒットしたらAのテーブルのデータを
削除するSQLが書きたいのですが、皆さんならどんなSQLを書きますか?
とゆうかそんなことって実際に出来るのでしょうか?
>600
内容がいまいち理解できなかったけど
解釈間違い/DBの違いによる使えない構文があるかも知れないけど

1.delete a from TableA a, TableB b where a.hoge_CD = b.hoge_CD and b.条件 = ???
2.delete a from TableA a where a.hoge_CD in (select b.hoge_CD from TableB b where b.条件 = ???)
3.delete a from TableA a where exists (select * from TableB b where b.条件 = ??? and a.hoge_CD = b.hoge_CD )

このどれかちゃう?
やってることは同じだと思うけど
(確認してないから細かいツッコミしないでね)
602デフォルトの名無しさん:02/03/23 21:40
ぬをっ!!!
実は誰も見てなかったら独り言みたいでハズかしいなぁー
なんて思ってました。
SQLっていろいろな使い方があるんですね。
もちっと勉強してみます。
ちなみに1で問題解決でした。
2や3も使えそうですが、未チェックです。
ありがとう
m(__)m
>>601
>1.delete a from TableA a, TableB b where a.hoge_CD = b.hoge_CD and b.条件 = ???
これだと なんとなく「TableB」からも削除されそうな気がして気持ち悪いのはオレだけ?
まぁ気持ちの問題だけどね(特にdeleteだから)
604デフォルトの名無しさん:02/04/03 12:58
最近、このスレ落ち込んでて寂しいね。
で、ちょっと質問。

Select
 商品マスタ.商品コード,
 商品マスタ.商品名称,
 Sum(売上データ.売上金額)
From 売上データ
 Left Outer Join 商品マスタ On 売上データ.商品コード = 商品マスタ.商品コード
Group By 商品マスタ.商品コード

この問い合わせがエラーになるのだよ。
商品名称に集計関数がついてないとか文句言われてね。
はぁ?って感じですよね。
ちゃんと商品マスタ.商品コードを主キーにしてるし。
売上データ.商品コードは外部キーになってる。

このクエリがちゃんと通るちゃんとしたRDBMSってないですか?
>>604
はぁ?は君です。
第三正規形とかご存じ?
606デフォルトの名無しさん:02/04/03 16:38
>>605
第三正規形になってると思うんだけど???
商品マスタ
 商品コード
 商品名称
売上データ
 売上日など
 商品コード
 売上金額
 数量などなど

>>604のクエリが通らないのもはぁ?だけど >>605の書いてることもはぁ? だね。

それが出来ないからと言って、どーだというの
Select
 商品マスタ.商品コード,
 商品マスタ.商品名称,
 売上データ.売上金額
From
 (Select 商品コード,Sum(売上金額) From 売上データ Group By 商品コード) As 売上データ
  Left Outer Join 商品マスタ On 売上データ.商品コード = 商品マスタ.商品コード
でいーじゃん。
608デフォルトの名無しさん:02/04/03 17:18
>>607
あぁ、すまん。ちょっと問題を省略しすぎたな。
たしかに提示した質問の範囲では君の回答で良いと思うよ。
(サブクエリにするのは記述が冗長だが論理的できれいだね。)

だが、売上データに時系列項目(売上日付)があって
Group By 売上日付, 商品コード としたい時はどうしたらいいのかな?
(途中で質問に条件を付加するのは失礼だとは思うが、
実務で実際 遭遇しやすいケースだと思う。時系列と商品での集計)

やっぱり、Max(商品名称) を使いたくない場合は、
Select句に相関サブクエリを書くしかないのかな?

Select
 商品コード,
 (Select 商品名称 From ...),
 Sum(売上金額)
From ...

「集合内の列値がすべて同じである場合、集計関数を使わなくても良い」という
データベースはないものかのぉ…。これって当然の欲求じゃないのかな?
609デフォルトの名無しさん:02/04/03 23:40
Group By句にはselectする項目のうち、集計関数を使うもの以外の
すべてを書かないといけないんじゃないか?
俺はそう覚えていたけど?
610デフォルトの名無しさん:02/04/04 01:07
>608
SQL-92で書け。あいまい・・以下略(w
さぶっクエリーの何処が論理的できれいなんですか?
そんな物があること自体、RDBの。。つうかSQLの汚点。
おまえ、集計関数を使いたくない理由を明記して頂ければ幸いです。
611ふんがぁ:02/04/04 01:17
>>609
そのとおりです。あたりまえですね。
>>604
あんたがちゃんとしなよ。
>>608
>集合内の列値がすべて同じである場合、集計関数を使わなくても良い」という
>データベースはないものかのぉ…。これって当然の欲求じゃないのかな?

どっちにしろ一緒な事を記述しなきゃダメっしょ
「一緒だから勝手に集計しました」ってのも使いづらいと思うけど?
613デフォルトの名無しさん:02/04/05 00:43
>>609
現在のデータベースで、
「Group By句にはselectする項目のうち、集計関数を使うもの以外の
すべてを書かないといけない」なんてことは分かってますよ。
でもさぁ、必然性のない集計関数を使わなきゃいけないっておかしいと思わない?
書き方を「覚えている」だけでは進歩しないと思うよ。

>>610
サブクエリがSQLの汚点というのは興味深いね。この話題とは
別に話をききたいな。サブクエリのどんなところがダメ?
こういった意見は聞いたことなかったので教えて欲しい。

この例で集計関数を使いたくない理由は…
「最大値が欲しいわけではないのに、集計関数Max()を使わなければいけないのは
とても気持ち悪いし、クエリの可読性をいちじるしく低下させている」からだよ。

>>612
なぜ、Group By に指定した列は集計関数を使わなくても良いのか?
…それは列値がすべて同じであることが明らかだからじゃないのか?
とすれば Group By にテーブルの主キー列をすべて指定した場合、
そのテーブルの列値はすべて同じであるわけだから、同様に
集計関数の使用を回避できてもいいんじゃないかってのがオレの疑問ね。
614612:02/04/05 07:39
>>613
GROUP BYに付けられる構文が関係してるのかな?

having句があるからか?
ROLLUPがあるからか?

不確定予測でスマン

一見したときGroup byに項目たんないよ!言おうと思ったけど
結構、根深い疑問だったのね!
自分としても興味深いので、なんか教えてね
615デフォルトの名無しさん:02/04/05 10:15
で、みんなはどうやってんの?
(1) 集計関数をトリッキーに使う max(商品名称)
(2) ひたすら列挙 Group By 商品コード, 商品名称, ...
(3) 相関サブクエリ Select (Select 商品名称 From ...) ...
(4) その他
616デフォルトの名無しさん:02/04/05 11:06
(4)Group By をSELECTの番号で書く
これって、もしかしてOracleだけかな?
617デフォルトの名無しさん:02/04/05 13:40
>>616
で、この例の商品名称に相当する列番号を Group By に書くの?
であれば、いまの話題では (2) に含まれるんじゃないかな。
618デフォルトの名無しさん:02/04/05 15:07
>>617
ひたすら列挙するのが「気持ち悪い」という理由だから、
番号だと、多少気持ち悪さが緩和されない?
#緩和されないか(w
619デフォルトの名無しさん:02/04/05 21:05
プログラマのためのSQLによると
「GROUP BY句は、FROMとWHERE句の結果を使います。」らしい。

だいたい、テーブルの属性とSQLは関係ないんじゃないの?
SQLだけ見たら明らかに >>604 のは気持ち悪いよ。
UDB使ってる人っていないんですか?
621デフォルトの名無しさん:02/04/05 23:22
>>619
「SQLだけ見たら…」というのには同意できないなぁ。
たしかに、あの問い合わせだけでは「商品名称」の列値がすべて同じであることは
分からないからよね。でも、SQLを書く人間と実行するエンジンには分かってるんじゃない?

たとえば、文字型にしか適用できない関数、数値型にしか適用できない関数が
存在するでしょ? それで人はテーブルの属性を知っていて適宜SQLを書いてるわけ。
つまり、「テーブルの属性とSQLは関係ない」とは言い切れないのね。

ところで、君のところではテーブルの主キーが
何かもわからないでSQLを書いてるわけ?
622デフォルトの名無しさん:02/04/06 00:47
cygwin の postgresql (setup.exe から直接バイナリダウンロードして、
利用しているもの)の、データベースの諸準備するコマンド「initdb」で、

creating directory /var/pgsql... ok
creating directory /var/pgsql/base... ok
creating directory /var/pgsql/global... ok
creating directory /var/pgsql/pg_xlog... ok
creating directory /var/pgsql/pg_clog... ok
creating template1 database in /var/pgsql/base/1...

ってところで止まってしまうけど、これはどうにかならないんですかね。
623デフォルトの名無しさん:02/04/06 02:17
>>621 で言っているのは実行時のエラーだからデータ型も関係ある。
それは理解できるけど。
GROUP BYの問題はSQL文自体の構文的なエラー(論理的な矛盾)でしょ?
もし >>604 のようなSQLが可能だとしたら、そのカラムが必ず同じ値になることを
指示するための予約語も必要だと思う。じゃないとやっぱり気持ち悪いよ。

ちなみにデータ型はテーブルではなくカラムの属性。
624 :02/04/06 02:28
正直、SQL は理屈が単純なほど良い。
いろんな例外を設けても話がややこしくなるだけで、
構造的な記述の原則を崩してまで実装する利点があるとは思われない。

>>604 の言うことは良くわかるし、誰もが一度は「ん?」と思った
事だろうとは思うが、SQL を習熟するうちに消化してしまっている
事だとおもう。
625デフォルトの名無しさん:02/04/06 02:51
>>623
構文的なエラー(論理的な矛盾)というのがちょっと納得できないなぁ。
フィールドの型に合わない関数を使ってしまうというのも、
文脈を間違えているわけだから、構文的なエラーだと言えるよね。
(そして、文脈違いということはクエリからは読み取れないというのがミソだ)

それと、「同じ値になることを指示するための予約語」は必要ないと思う。
現在だってクエリからだけでは読み取れないさまざまな要素があるんだからさ。

さっき話した数値型にだけ適用できる関数もそうだよね。
それらの関数を使うときに、与える列の型が「必ず数値型である」ことを
示すための指示子を書くかい? 書かないだろう?
それは書いてる人は「数値型」だと知っているし、エンジンも実行時に検査を行うからだ。
つまりクエリを見るだけでは エラーが発生するかどうかは分からない、というのは今でも一緒。

Group By についても同じように実装できるはずじゃないかな。
クエリを書く人は「主キー列をすべて書く」という行為を考えて行うことができる。
エンジンはあるテーブルの主キー列がすべて Group By に指定されているか
検査することができる。ほら、同じように実行時エラーで対応できるじゃないか!

というか誰も現状の制限に不満を持っていないのかい?
・最大値が欲しいわけでもないのに Max() を使わなければならない
・集計軸でもない列をひたすら列挙しなければならない
626デフォルトの名無しさん:02/04/06 11:04
>>624
SQLは理屈が単純なほど良い、というのにはちょっとだけ同意。
でもそれってアセンブラやCなどの低級言語と同じで文法仕様はすごく小さくて
すぐに覚えられるんだけど、ロジックを組むときにひたすらコードを
書かなきゃいけないってのと通じるものがあると思わない?

「最大値が欲しいわけでもないのに記述しなければいけないMax()関数」
「理屈の単純さ」というか「小さな文法仕様」によって、
使用者に不便を強いてるように思える。
そろそろ、使い手にやさしい構文拡張をして欲しいんだけどな。
このGroup Byの場合は、いままでの構文に影響を与えないから、
既存のコードはちゃんと動くんだしね。

ちなみに、SQLを見ただけでは構文としての正しさが分からないという意見が
あったけど、実はそうではなかった。
フィールドの型を「文字型」にするか「数値型」にするか…
テーブルの主キー列を何にするか…
これって以前にすべてSQL(DDL)でデータベースに伝えてたことじゃないか!
DDLも含めて適用したすべてのSQLの履歴を確認すれば、
文脈も含めた構文エラーはチェックできるんだよね。
627 :02/04/06 12:01
>>626
前半部分に返信するが、それは SQL で吸収しなくてはならない事では無い
と思うよ。
628デフォルトの名無しさん:02/04/06 12:36
SQLはデータベースをCPUと見立てるとアセンブラに似てますね!
CPUベンダーごとに命令が微妙に異なったり
特定CPUには特殊な機能があったり
歴史的事情がいつまでも尾を引いてたり
〜系、というのがあったり

アセンブラプログラマの皆様、ご苦労様です。
629デフォルトの名無しさん:02/04/06 20:37
>>627
なるほどね。そういう考え方もあるだろう。
SQLをあくまでも低レベルインターフェイスとして位置付ける、という考えだよね。
でも、オレはSQLを十分な高レベルインターフェイスとして位置付けているんだ。
理由は…
(1) 各データベースでSQLが拡張された現在、SQL(ストアド含む)で実装できないビジネスロジックはほとんどない。
(2) SQLの上位層でSQL以上に論理的問い合わせを行えるものが存在しない(と思っている)。

ADOやJDBCなんかはSQLの問い合わせ結果をオブジェクトにマッピングして
操作できるという面で一部 SQLよりも高レベルインターフェイスと言えると思うけど、
結局、ADOもJDBCもデータ問い合わせには「生SQL」を使っているという現実がある。
で、その「生SQL」を書いているのは僕ら人間なんだよな。

>>627 はどんな手法を使ってるの?
もし高レベルインターフェイスでなにかを記述して、
それが勝手にSQLに展開される(Maxとか自動で付く)というのであれば、便利そうだ。
630デフォルトの名無しさん:02/04/06 20:40
>>629の補足。
>>627 はもしかして SQL を直接書かずに Access などの
フロントエンドを使って開発しているのか?
631::02/04/06 23:48
>>629
「生SQL」っていうのに同意。
ORACLEを使ったあと、ACCESSのテーブルやクエリを使うとなんか違和感があるがそ
のテーブルをSQLコードにするボタンを押すと、やっぱりSQL文がでてきて、「ああっ
やっぱりSQLなんだな〜」と思ってしまう。
632デフォルトの名無しさん:02/04/07 21:37
>>629
WebObjectsではだめ?
633デフォルトの名無しさん:02/04/07 22:44
>>632
WebObjectsはかなり評判いいみたいだね。
DBノウハウのスレでも、かなり高評価だ。

で、DBノウハウのスレを読む限り( それ以外 WOに関する知識なし )、
WebObjectsってフレームワークとして完成されすぎてる気がする。
UIからすべて持ってしまっているイメージを持っているんだけど。

汎用言語(Java, VB, VC)からWebObjectsとやらを利用して
アプリケーション開発ってできるの?
WebObjectsってインターフェイス(ミドルウェア)じゃないんじゃない?
634デフォルトの名無しさん:02/04/07 23:15
WebObjectsは、こんな構成。
オブジェクト指向を、非常にきれいな形で具体化した統合ソリューションだな。
誤解を恐れずに書くと、JBuilderとかForte for JavaみたいなIDEに、
DB連携可能なWebオーサリングツールと、RoseをわかりやすくしたRDBハンドリングツール、
運用環境を含めたイメージか。

・統合開発環境
  ・Java2対応
  ・開発用IDE
  ・分間50トランザクションまでの簡易運用環境(動作テスト用)
  ・JDBC2対応のRDBMSを自動解析し、Javaのオブジェクトにマッピングさせるツール(ビジュアルツール)
  ・DBと連携したWebインタフェースを作るためのビジュアルツール
    (DB接続はDrag&Drop。フェッチ条件、ソート条件等諸々の設定をオブジェクトに埋め込める)

・負荷分散 / 障害復旧性を備えた運用環境
  ・同時アクセス数無制限の運用環境。Java2環境なら基本的になんでもOK。
  ・1サーバ1ライセンス。1CPUあたりなんてケチなライセンス形態無しの大盤振る舞い。
  ・負荷分散はWO任せ。わざわざ負荷分散を考慮したコード修正不要
  ・Webベースの運用ツールに、統計ツールなども含む。

・各種ウレームワーク
  ・WebObjects Framework:
    1995年あたりから存在する、HTTPハンドリング用フレームワーク。
    セッション制御とかも全自動。
  ・Foundation Framework:
    コレクション系の処理が充実。すべてのフレームワークの基礎。
  ・Enterprise Object Framework:
    NeXTSTEP時代から存在し、金融系システムなどで信頼性を磨いた、WOの神髄。
    DBやLDAPなどのデータソースアクセスの効率化では、神の領域。SQL不要の開発が可能。
    J2EEも.NET(比較対照としては不適切だが)も、これには遙かに及ばない。

これ使っちゃうと、SQLをWebテンプレートやロジックに埋め込んだり、セッション制御コードや
ページ遷移処理をゴリゴリ書くのがばかばかしくなってくる。

お値段は、ちょっと前までは\700マソだったんだが、今は1/100の\7マソ。
635デフォルトの名無しさん:02/04/07 23:30
>>634

WebObject以外はあまり使ったことないんじゃない?
636634:02/04/07 23:44
>>635
それがな、期待を裏切って悪いんだが、
Perl->PHP->MS-ASP->ColdFusion->Servlet&JSP&J2EEと地獄を見てきた後に
たどり着いた結果なんだよね。
WebObjectsより優れたツールがあれば、すぐにでも乗り換えるけど、無いんだよな・・・
637634:02/04/07 23:46
ついでに書くと、初めからWOで、他のツール知らないと、WOの良さってわからないみたいだぞ。
悲惨なWO厨が暴れているスレはここですか?

sage
SQLゴリゴリもいいし、WOでもいい。
目的に合わせてツールを選べ。

ただ正直、そろそろSQLゴリゴリからは解放されたいな・・・・・
SQLに代わる問い合わせ言語を開発しる・・・。

table_a カラ サイダイチ「update_dt」 ヲ センタク


そんなもんいらねーよ。
開発言語とシームレスに融合する環境がいい。
OODBとか、いいと思うが、いかんせん実績が見えないんだよな・・・
642デフォルトの名無しさん:02/04/10 23:45
SQLServerってexceptがないらしいんですが、
それに変わる手段ってありますか?
700万が7万円ていったい・・・
ちょっと欲しいかも
>>642
except?
エクスポートのこと?
645デフォルトの名無しさん:02/04/11 11:57
>>644
差演算。Oracleでいうとminus。
>640
EnglishQuery?
647604:02/04/11 20:50
SQLを簡単に書かせろって言ってた 604です。
一週間 九州出張行ってたんだけど あんまり盛り上がってないね。

>>634
WOの概要サンキュです。今ちょうどウェブフロントエンドの案件があるんで
WO考えてみます。
648642:02/04/11 22:01
自己解決。
exceptに変わる演算子はないようなのでサブクエリでやった。
649デフォルトの名無しさん:02/04/12 13:28
アアアアアアアアアアア
>>647
WOの開発って、WinNT/2K/XPでも可能だ。
Mac嫌いにもおすすめできる。俺もWinXPで開発。運用はSolaris。

ただ、開発環境のIDE自体は、Mac版のほうが充実してるんだよな・・・
651デフォルトの名無しさん:02/04/12 22:11
Oracle8でさ、更新日付が一番最近のレコードを一行だけ取り出す
うまい方法ってない?今やってるのがソートかけたものを一行Fetchする
やり方なんだけど、SQL一発でエレガントに取り出せないものかね?
8i以上ならサブクエリでORDER BYかけたものをrownum=1で
selectってできるんだけどさ。
652デフォルトの名無しさん:02/04/12 22:33
>>651
ORDER BYをrownumのやり方きぼん。
653:02/04/12 22:33
654デフォルトの名無しさん:02/04/12 22:39
おまいら!たまには政治にも目を向けてください。
655651:02/04/12 23:02
>>652
Oracle8i以上
select *
from ( select *
     from TABLE1
    order by 更新日付 desc )
where rownum = 1

8はサブクエリでorder by が使えないので不可
656デフォルトの名無しさん:02/04/12 23:08
>>655
それ、普通に
select * from TABLE1 where rownum=1 order by 更新日付 desc;

ってするのと、また結果違うの?
657651=655:02/04/12 23:16
それですむんならいいんだけど、
rownum=1っていうのはorder byよりも前に評価されてしまうので、
必ずしもソートで一番上にきたデータとは限らないんだよ
658デフォルトの名無しさん:02/04/12 23:24
>>657
なるほど。今、検証してみたけど、そうなのね。



ところで更新日付が最新って、仕様で制限が無ければ
複数件ヒットしてしまうような気がする。
そういう前提だったら、
select * from table1
where 更新日付 = (select max(更新日付) from table1);

とか。あんましエレガントじゃないねぇ。
659651:02/04/12 23:35
>>658
あ、それもここにカキコする前に試してみた(笑)

けどやっぱり複数件とれちゃうでしょ?

余談なんだけどさ、DB自体は8i(8.1.7)なのよ。
んで、PRO*Cやってんだけどさ、PRO*Cのバージョンが
8.0.6なのよ。そんで8iから追加された機能がコンパイルのときに
エラーになっちゃうのよ。
本来使える機能が使えない歯がゆさったらないよ。

660658:02/04/12 23:40
>>659
あ、同じく rownum=1 も追加ね。

で、PRO*C だったらふつーに fetch するのが一番エレガントじゃぁ・・・
SELECT * FROM TABLE1 WHERE 更新日付 IN
(SELECT MAX(更新日付) FROM TABLE1)
じゃダメなの?
662651:02/04/13 00:11
>>660

> あ、同じく rownum=1 も追加ね。
あっ、それでいいのか!忘れてた・・・

> で、PRO*C だったらふつーに fetch するのが一番エレガントじゃぁ・・・
う〜ん、なんかfetchするのにループしないのが気持ち悪くて・・・

>>661
それ、658と同じだって(笑)
PRO*Cって、selectで複数件返って来てもエラーにならないオプションが
あったような気がする。このスレ的には邪道なんだろうけど(w
664デフォルトの名無しさん:02/04/16 22:06
行方向の並べ替えはORDER BYで出来ますが、
桁方向に並べ替えるにはどうすればよいのでしょうか?
>>664
桁方向ってあんた...。
>>664
ワロタ。
>>664
まずは通常通り行方向に並べ替えて置いて、
おもむろにディスプレイを90度傾ける。
ネタだよね?
>>664
今度の Oracle は、COLUMN-ORDER BY 句が使えるよ。
詳細は、こっち → http://pc.2ch.net/test/read.cgi/perl/958633101/27
670664:02/04/17 00:33
667さんの意見が参考になりました。
やってみます。ありがとうございました。
671デフォルトの名無しさん:02/04/18 20:26
お願いします!pg_dumpについて教えてください。

たとえば、
pg_dump dbname > name.out
とした場合、name.outにはdbnameのテーブルやデータ、スキーマ、
すべてが含まれているんですか?

もうひとつ、-tオプションでテーブルを指定して
そのテーブルのデータやスキーマを含めるには他にどんな
オプションが必要なのか教えてください。

初歩的な質問ですみません。
672デフォルトの名無しさん:02/04/18 22:21
 お前ら当然glogin.sqlには

 set sqlprompt "SQLキタ━(゚∀゚)━"

 って書いてますか。
673デフォルトの名無しさん:02/04/18 23:01
>>672
ふつう。
set sqlprompt "C:\WINDOWS>"
では?
>>672
それにするとSQLがきまくります・・・(泣
675デフォルトの名無しさん:02/04/25 15:14
オラクルの SYSDATE と同じような使い勝手をしたくて
SQLサーバーでPostgres を使って時間を表示するのはいいのですが
'YY,MM'などの設定の仕方が良くわかりません。

ヘルプを見ても引っかからないので宜しくお願いします。
676デフォルトの名無しさん:02/04/25 19:52
MySQLインストールしました。
んで基礎的なことを学びたいんですが、
よいHPありますか?
677oracleにて:02/04/25 20:16
やっぱさ、login.sqlは接続先ごとにプロンプト変えるよな。
テストと本番で変えるようにしたら
どっちがどっちだか分からなくなることがなくなったよ。
678デフォルトの名無しさん:02/04/26 17:26
int型の数値を、足りない桁をゼロで埋めた文字列として取得する方法は無いでしょうか?
VBのFORMAT関数みたいな奴...
Google検索では複雑なストアド書いて対応している例しか見つかりませんでした。

SQLServer2Kです。
そうなんですよね!
ORACLEなら、lpadだったと思うけど
SQL鯖は無いんだよね

SELECT
CASE
WHEN LEN(no) = 1 THEN '0000' + no
WHEN LEN(no) = 2 THEN '000' + no
WHEN LEN(no) = 3 THEN '00' + no
WHEN LEN(no) = 4 THEN '0' + no
WHEN LEN(no) = 5 THEN '' + no
END
FROM TABLE

いちおうこんな感じで出来るとは思うけど(環境が無いので未確認)
現実的では無いよね!
680しゅばい:02/04/26 20:43
基本中の基本なんですがデータ結合したときfromの後の順番によってデータが
変わるんですか?
AとBの表に品名という列があった時selectの所やwhereの所で書く時どっちでも良い
のですか?
>>676
http://www.mysql.gr.jp/を覗いてみてはいかがでしょうか
まだ完全形ではないですが日本語訳ドキュメントがあります。
682デフォルトの名無しさん:02/04/26 21:45
>>680
どっちでもいいよ。そのれべるの話なら。
実行計画とってみな。
>>680
昔のは、whereに複数条件が有る場合に
書く順番で速度は変わってたが、今では関係ない

>>682のアドバイスのように実行計画とって研究してみな
>>679
面倒な・・・・。
SQL Server は知らないけど、
Oracle風に言えば、substr('000000000000' || no, -8)
みたいな事が出来るんじゃないかな?
>>678
Right('00000000' + no, 9)
686しゅばい:02/04/28 16:34
初めてSQLやった頃ここでつまずいたっていう所教えて下さい.
あとそれはどうやって克服したかも教えて下さい.
>>686
そんな事、忘れた(^^;
group by 周りは、ハマるんじゃないかなぁ。

俺は未だに update の構文があやふや・・・。
oracle , sybase ,informix .... 統一しろよ。
688しゅばい:02/04/29 16:29
今独学でVBとSQLの勉強をしているんだけど、ある程度レベルが上がったら就職しようと
思っていますが,実際の所企業に就職するかそれとも派遣会社に行くか迷っています。
よいアドバイスがあれば聞かせてください.
あっそれと独学だとどこまで勉強したらよいのかわからないので学校に行こうかとも
思っています.学校だと求人も来ているかも知れませんし.
ちなみに自分は26歳です.

学校いくなら学校できくべし
            きくべし
その前に日本語の勉強をするべし。26でその作文は・・・
漏れがPLで、派遣会社から688みたいなやつ紹介されても使いたくないなぁ。
かといって、26歳で経験ありませんってのもだいぶ怖い。
>>688
まず、フリーウェア作って公開しる!
そのことを面接のときにもアピール! 派遣先に行ってもアピール!
そしたら、技術面では問題なし。認めてくれるでしょう。
まぁ、現場では技術だけでは生き残れないけどね。

とりあえず、ODBCで利用できるクエリアナライザもどきでも書いてみたら?
現場行っても使えるツール持ってると、結構評価されるよ。
>>688
って言うかさ、君はなんでデータベーススレとここで同じこと聞いてるのん?
まぁ、それは置いといてだね。年齢のこと考慮すると「学校に通う」選択肢は
キツイ。卒業する頃にはあなたより若い人と同列で品定めされるんよ?
勉強は職業人になったら終わりではないん。勉強せん人間は淘汰されるの。
そこんとこ加味して自分の進む方向を考えてみ?
694しゅばい:02/04/30 22:24
実際の所26歳未経験のプログラマーってやばいですか?
プログラマーのみなさんの勤めている所ではそういう人間は今までいましたか?
>>694
俺はよく見てないが、マ板にその類のスレがあったはずなので
そっちを覗いてみるのはどうだろうか。

PGじゃないが、30才未経験でエンジニアを目指して
いた人(独学でMCSE取ってきた)は、10社くらい面接で
落とされたということらしい。
んで、俺の会社に拾われたんだが、技術系の職は
得られずに、いきなりPMやらされてる。
とはいっても、開発のPMじゃないがな。
あんまり書くと、ばれるかもしれんのでここら辺で・・・・・
696678:02/05/08 17:40
>685
おおっ、ありがとうございます。
がんばってストアド書いていたんですが、こちらの方が
シンプルなので使わせて頂きます。

>686
私もグループ化周りで混乱しました。
Accessのクエリビルダでデザインして、そこからどんなSQLが
生成されるのか、どんな結果セットが返るのかを何回も繰り返して
いるうちに慣れました。
Accessのクエリビルダは便利だよね

クエリのSQLびゅー
698デフォルトの名無しさん:02/05/09 11:43
人|区分|名前|値|
A |1 |ああ|1 | 左のような表から
B |1 |いい|2 | 人=Bで区分ごとに値が一番小さいレコードの
B |1 |うう|3 | 区分・名前・値
B |2 |ああ|4 | |1 |いい|2 |
B |2 |いい|5 | |2 |ああ|4 |
B |2 |うう|6 | |3 |ああ|7 |
B |3 |ああ|7 | を取得するにはどう書けばよいのでしょうか?
C |1 |いい|8 | よろしくお願いします。
C |3 |うう|9 |
699デフォルトの名無しさん:02/05/09 15:54
sqlの勉強するのに良い参考書あるいはお薦めの参考書あったら
教えて下さい。
700デフォルトの名無しさん:02/05/09 15:58
SQL文ってプログラム内から呼び出すときに、
あまりにも長いと駄目なんでしょうか?
たとえば、一行をいっぺんにUPDATEしようとすると
更新されず小分けにするとOKなんです

>>699
SQLで検索しろ!
>>698
select 区分, 名前, 値 from 表 where 区分 = 'B' and 値 = min(値)
group by 区分
>>698
select 区分, 名前, 値 from 表 where 区分 = 'B'
group by 区分 having min(値) = 値
>>698
select 区分, 名前, 値 from 表 where 人 = 'B'
group by 区分 having min(値) = 値
>>699 「改訂新版 はじめてのSQL」技術評論社 なんかどうだ?
705698:02/05/09 17:08
>>701-703
ありがとう。でも出来なかったです。
ループ内なのでSQLでなんとかしたかったですが
とりあえずプログラム処理でやっちゃいます。
>>705
select
a.人, a.区分, b.名前, a.値
from
(select 人, 区分, min(値) 値 from 表 group by 人, 区分) a,
表 b
where
a.人 = 'B' and
b.人(+) = a.人 and b.区分(+) = a.区分 and b.値(+) = a.値
707698:02/05/09 20:05
出来ました♪ >>706さんどうもです!
でも速度はプログラム処理の方(意外と速かった)とほとんど変わらなかった・・・
まあ勉強になったので良しですね。
ちなみに人 = 'B' の条件を副問い合わせ部分に入れたりしてみました。
708706:02/05/09 21:31
>>707
人、区分でグループ化した時、一つのグループのレコード数がかなり多くなる
ような場合じゃないと大して効果は無いかも。

あと、このケースの人 = 'B'はどの階層の副問い合わせに書いてもパフォーマンスは
変わらなかったりする。どこに書いてもインデックスが切ってあれば使ってくれるし。
オプティマイザって案外賢いんです。
709 :02/05/10 23:23
where A or B という検索条件の場合、
C言語の if 文のように、最初の A が合致したら B の判定はパスされますか?
つまり、合致する率の高い方から記述した方が効率は上がるのでしょうか?
710デフォルトの名無しさん:02/05/11 00:48
例えば、こんなデータがあったとします。

 テーブル名:TABLE_AAAA

 分類A 分類B 値
 ----------------
  001  0001  aa
  001  0002  bb
  001  0003  cc
  002  0001  dd
  002  0002  ee
  002  0003  ff
  003  0001  gg
  003  0002  hh

この分類Aと分類Bのコードの関係は親子関係になっています。

このデータから、3レコード目のcc〜7レコード目のggまでを取ってくるSELECT文はどのように書けば
良いのでしょうか?
711デフォルトの名無しさん:02/05/11 01:02
>>710
普通は、このような用途がある場合、分類Aと分類Bを分けずに1つにするのではないでしょうか。

select 値 from テーブル where 分類AB between 0010003 and 0030001;

もっとテーブル設計の勉強をして下さいお願いします。vvv

712710:02/05/11 01:05
ありがとう御座いました!!
さよなら
713デフォルトの名無しさん:02/05/11 01:06
Oracleだと
SELECT
値, to_number(分類B*10000) + to_number(分類A) x
FROM TABLE_AAAA
WHERE x >= 001003 AND x <= 0030001

かな?
それからこのテーブルの主キー条件が不明瞭だが、
分類A+分類Bで主キーという事でいいかい?
714仕様書無しさん:02/05/11 01:11
>>712
2chでわざわざ"さよなら"言う奴はめずらしいな。
715713:02/05/11 01:16
>>711
WHERE句でbetweenを使うとパフォーマンスが落ちます。
もっとチューニングの勉強をしましょう。
716710:02/05/11 01:22
>>713
おっしゃるとおり、分類A+分類Bが主キーです。
できました、ありがとう御座いました。


>715
Oracleの場合、betweenはオプティマイザが
x >= 001003 AND x <= 0030001
に変換する、とマニュアルで読んだ覚えがあるけど。
718713:02/05/11 02:02
だから変換する時間だけパフォーマンスが落ちるだろ。
ストアドプロシージャにすると.......う、俺もよく分かってない。シッタカ君だったのか(萎え)
>718
> だから変換する時間だけパフォーマンスが落ちるだろ。
それはそうだろう。だけどそんなのチューニングを語る上ではまあ微々たるものだと思うよ。
よほどオプティマイザの性能が低いってんならともかく。
720:02/05/11 11:15
初歩的な質問なんですが、宣言でchar(4)やnumber(4)とすると4バイトまで
宣言できますが,もしchar,numberのようにバイトを指定しなかったとしたら
何バイトまで使えるのですか?
721デフォルトの名無しさん:02/05/11 15:24
SQL Server 2000 のロールアップ集計について質問です。
商品分類ごとに小計を出したい、ただし商品分類に属している商品名称が
ひとつの時は小計を表示しない(つまり明細が複数あるときだけ小計を出す)。
以下のような問い合わせを書きました。

Select 商品分類, 商品名称, 売上金額
From 売上データ
Group By 商品分類, 商品名称 With Rollup
Having Not (Grouping(商品名称) = 1 And Count(*) = 1)

これでうまくいったのですが、商品名称を商品コードにすると
小計が表示されませんでした。列の型が関係あるのでしょうか?
商品コードにすると With Rollup で生成された行に対する Count(*) が
常に 1 になっているようです。BooksOnlineを見ましたが、
Count(*) がどのような値を返すかは、記述してありませんでした。

どなたか分かる方いませんか?
>>720
そもそも、number(4)って 4バイトって意味なのか?
723デフォルトの名無しさん:02/05/11 15:35
>>720
それぞれのDB環境によって違うでしょう。
マニュアルで確認しよう。
あくまでも、予想なのだが
varcharと同じと考えるとそうかもね
ただ、number(4)だから
0から9999までの10進数しか扱えないと思われる
あくまでもいい加減な答えをしてみるテスト
>>720
oracleなら
charはchar(1)といっしょ
numberは小数点とかの位置、桁数がわからないとき
とかに使うんじゃなかったっけ。
ストアドの宣言ならテーブルの型使っとけ。
>>720
オラクルで、numberはnumber(38)のはず
バージョンによっては、違うのかもしれないが
>726
精度・位取りを省略すると浮動小数点数扱いになるよ。
最大精度は確かに38桁だけどnumber(38)とは全く意味が異なるので注意。
728726:02/05/13 02:38
>>727

嘘を言ってしまったようで申し訳ない。
なので、早速実験してみた。
R8.1.7 FOR WINODWS (OTN TRIAL版)

CREATE TABLE nichan(
FIELD1 NUMBER
);

SELECT TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_SCALE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'NICHAN';

TABLE_NAME COLUMN_NAME DATA_TYPE DATA_LENGTH DATA_SCALE
------------- ---------------- --------------- ----------- ----------
NICHAN FIELD1 NUMBER 22

って、ここでつまってしまった・・・・・
テーブルの定義情報が書かれたディクショナリーって、
ほかに何かあったけか?

DATA_LENGTHはバイト数のような気がするので、
そこら辺の事を調べたらわかるのかもしれないが・・・・
領域計算の資料探せばわかるかな?
729デフォルトの名無しさん:02/05/16 02:03
SQLの GROUP BY節 で筆問があります。
テーブルが1つに対してのGROUP BY節は出来るのですが、テーブルが2つになると
うまくできません。

どなたか分かる方いませんか?
>>729
・具体的なテーブルの構造
・最終的に欲しいデータ形式
・いま自分が書いているSQL
の3点を晒せ

俺もSQL勉強中だから一緒に悩んでやる(w
>>729
あとエラーメッセージを書け

どっちのテーブルの項目をGROUPしてるんだ
って単純な事だと思うが
732729:02/05/16 21:25
テーブルを書きます。
TABLE ->受注
受注_支店番号|受注_部品番号|価格|リード・タイム|受注数
-------------------------------
51 |124 |25 |5 |400
51 | 125 | 0.55 | 5 | 0
51 |134 | 0.4 | 5 |500
51 |135 | 0.39 | 5 |1000
51 | 221 | 0.3 | 10 | 10000
51 | 231 | 0.1 | 10 | 5000
52 | 105 | 7.5 | 10 | 200
52 | 205 | 0.15 | 20 | 0
52 | 206 | 0.15 | 20 | 0
53 | 124 | 1.35 | 3 | 500
53 | 125 | 0.58 | 3 | 200
53 | 135 | 0.42 | 3 | 1000
53 | 222 | 0.25 | 15 | 10000
53 | 232 | | 15 | 0
53 | 241 | 0.08 | 15 | 6000
53 | 134 | 0.38 | 3 | 200

TABLE -> 支店
支店_支店番号 | 支店名 | 所在地 | 支店コード
---------------+----------------+---------------------------
51 | DEFECTO PARTS | 16 JUSTAMERE LANE, TACOMA WA | 20
52 | VESUVIUS INC. | 512 ANCIENT BLVD., POMPEII NY | 20
53 | ATLANTIS CO. | 8 OCEAN AVE., WASHINGTON DC | 10
54 | TITANIC PARTS | 32 SINKING STREET, ATLANTIC CITY NJ | 30
57 | EAGLE HARDWARE | 64 TRANQUILITY PLACE, APOLLO MN | 30
61 | SKYLAB PARTS | 128 ORBIT BLVD., SYDNEY AUSTRALIA | 10
64 | KNIGHT LTD. | 256 ARTHUR COURT, CAMELOT ENGLAND | 20

2つのテーブルを使って支店_支店番号を受注_支店番号に変えてそれをGROUP BY節
にする事です。

SELECT 受注_支店番号,支店名,所在地 FROM 受注,支店 GROUP BY 受注_支店番号;

以下のエラーが出ます。
ERROR:
Attribute 支店.支店名 must be GROUPed or used in an aggregate function

どなたか分かる方いませんか?
733730:02/05/17 00:55
>>732
すまんが、何が言いたいのかよくわからん。
いま書いているSQL文を見る限り

select 支店_支店番号,支店名,所在地 from 支店

というSQL文と732の書いているSQL文は何も違わないきがする
テーブルを書いたのと同じように、最終的に欲しいデータを
(言葉でなく)データで書いてくれるのなら、もうちょい考えてみるぞ。

ひょっとして、受注のあった支店番号/支店名/所在地が欲しいのならば

select 支店_支店番号,支店名,所在地
from 支店
where 支店_支店番号 in (select distinct 受注_支店番号 from 受注)

で、出来るはずだが・・・・
むりやりgroup byを使うならば副問い合わせ部分を
select 受注_支店番号 from 受注 group by 受注_支店番号
にすればOKかな
>>732
むりやりやるなら>>731の例や
1.SELECT 受注_支店番号,min(支店名),min(所在地) FROM 受注,支店 GROUP BY 受注_支店番号;
2.SELECT 受注_支店番号,支店名,所在地 FROM 受注,支店 GROUP BY 受注_支店番号,支店名,所在地;
で出来ない訳は無い

ようは、グループ関数を使わない項目は、GROUP BYのリストに記述しなければならない

いちばん問題なのは、GROUP BYの構文を理解していないのだと思われる
735ヤン:02/05/17 13:32
>734さん
あれ、1番はできますか?min(所在地)だと出ない気がするんですが・・・。
合ってたら申し訳ありません.ふと思ったもので。

>729さん
group byを使う時は表示させたいもの(selectの所)にはグループ関数か
group byで指定したもの以外は入れちゃ駄目という決まりがあるのですよ.
グループ関数というのは知っているとは思いますが,sum,max,min等の事です。
しかし裏技としてgroup by で指定したものと直接関係のあるものはmin,max
などを使うと出来るのです.理由は長くなるので書きませんが。
例えば支店番号と支店名は直接繋がりがありますよね.こういう場合はmin,maxを
使うとよいというわけです. 読みズらい文章すみません.がんばってくだせえ。
736ヤン:02/05/17 13:37
質問があるのですが
m01得意先、m02製品品目というテーブルがありこれらがそれぞれの品番という列で
参照整合性でつながっている場合,m01得意先を更新或いは追加した時
m02製品品目も変更されているのですか?
>>736
すべてのDBでは知らないが、ふつうはされない
>736
最終的には、2つのテーブルを結合して1つのテーブルとして見る訳でしょ?
なら、両方が更新される必要は無いぞ。

逆に言えば、どちらも更新されなければならないなら正規化されていないという事に。
739729:02/05/17 20:02
結果を以下のようにしてみたかったの!
受注_支店番号 | 支店名 | 所在地
---------------+---------------+-------------------------------
51 | DEFECTO PARTS | 16 JUSTAMERE LANE, TACOMA WA
52 | VESUVIUS INC. | 512 ANCIENT BLVD., POMPEII NY
53 | ATLANTIS CO. | 8 OCEAN AVE., WASHINGTON DC

これをGROUP BY節で。
(なぜこれをしたいと思ったのは、2つのテーブルを使ってGROUP BY節文が出来るのか? と思ったからである)

SQLは一ヶ月前からはじめたので、GROUP BYの構文をあまり理解していない部分があると思うます。(ただいま勉強中である)

今いくつかSQL文が出ているのを試してみます。
>>739

> 結果を以下のようにしてみたかったの!
なら、>>733 で良いと思うが ?

GROUP BY って、グループ化して各々のグループに対して処理するもん
だよ。例えば、支店毎の売上を求めるなら...

SELECT 受注_支店番号,SUM(価格 * 受注数) AS 売上 FROM 受注
 GROUP BY 受注_支店番号;

とかのように使う。(あってる ? 試してないからちと不安)
741デフォルトの名無しさん:02/05/17 20:57
>>739

select 支店_支店番号 as 受注_支店番号, 支店名, 所在地 from 支店
where 支店_支店番号 in ( select 受注_支店番号 from 受注)
>>741
SELECT DISTINCT 受注_支店番号,支店名,所在地 FROM 受注,支店
 WHERE 受注_支店番号 = 支店_支店番号;
とかやるとやっぱり、遅いのかなぁ ?
select
支店_支店番号 as 受注_支店番号,
支店名,
所在地
from 支店
where
exists ( select 1 from 受注 where 受注_支店番号 = 支店_支店番号)
;
なんて書き方もあるけど、なんか余り意味の無いSQLだなぁ。
744デフォルトの名無しさん:02/05/21 12:37
group byでグループ化した時、havingとwhereの違いについて教えて下さい.
having に書いてよい事とwhereに書いてよい事は違うのですか?
745デフォルトの名無しさん:02/05/21 16:22
サーバー:Windows2K & SQLServer2K
クライアント:Win98 & Access2002(再配布版ADPファイル)

上記の構成でクライアントのADPファイルを立ち上げると、
NT等は直接サーバーに繋がってくれましたが、
Win98で試したところタイムアウトしてしまいます。
Win98にSQL Enterprise manegerをインストールし接続しようとしても、
タイムアウトではじかれてしまいます。
「接続」を手動で行うと接続できる為、認証等は間違っていないと思われます。

申し訳ございませんが、同様な現象があったことがある方、対処方法をご存知の方
助言を頂けないでしょうか よろしくお願いします。
746745:02/05/21 16:51
自己解決しました。
OSに依存していると勘違いをしていましたが、
単に名前解決を行っていなかったのが原因でした。
お騒がせして申し訳ございませんでした。
自己解決時のフォローを入れるようなまともな人を久々に見た...
感動をありがとう。
748デフォルトの名無しさん:02/05/21 19:22
>>744
HavingはGroupBy後の結果のrowに対して条件判断

なのでたとえば
select employCode, count(*)
from employee
group by employCode
having count(*) > 100
は成り立つが
select employCode, count(*)
from employee
where count(*)
group by employCode
は成り立たない。おけ?
749デフォルトの名無しさん:02/05/21 19:23
後の例は
select employCode, count(*)
from employee
where count(*) > 100
group by employCode
だ。
スマソ
750:02/05/22 10:43
m02製品品目を品目マスタ、t03出荷を出荷マスタとし出荷実績のない製品を表示
したいのですが,
select
m02製品品目.品番,
m02製品品目.品名
from
m02製品品目
where
not exists(
select
m02製品品目.品番
from
m02製品品目,t03出荷
where
m02製品品目.品番=t03出荷.品番); だとレコードがでないのです。existsを
つかって求めたいのですが,どこが間違っているのでしょうか?
>>750
だーかーら、何でExistsがそんなに好きなの?
select m02製品品目.品番, m02製品品目.品名
from m02製品品目
where m02製品品目.品番 not in(
select t03出荷.品番, count(*)
from t03出荷
group by t03出荷.品番
having count(*) > 0)<--これいらねぇな
752751:02/05/22 17:01
>>751
うへ間違えた
select m02製品品目.品番, m02製品品目.品名
from m02製品品目
where m02製品品目.品番 in(
select t03出荷.品番
from t03出荷
group by t03出荷.品番
having count(*) > 0)
>>750
not existsの中の、
m02製品品目とt03出荷のテーブルの結合意味ある?

select
a.品番,
a.品名
from
m02製品品目 a
where
not exists(
select
b.品番
from
t03出荷 b
where
a.品番=b.品番


しかしexists系は他に書き方が有るなら控えた方が良いよ。
テーブルが小さいうちは気にならないが、データが増えるとかなり遅いよ
754:02/05/23 10:58
有難う御座います。参考になりました.所でもう一つ質問なのですが
データを抽出する時などの際fromの所にはそのデータを抽出する際
(select,where,order,group by等の所に表名を書いた時)に使う表名
をすべて書くとを思っていたのですが、この考えは間違っているのでしょうか?
>>754
間違っている。貴方はエラーをおそれて副照会に表をつっこんだのだろうが、
せっかく主の表と副の表が結合していたところが、副の表同士の結合になってしまった。
最大5文字の文字列が入るフィールドHOGEがあって
レコードにそれぞれ"3333"、"11111"、"222"が入っています。
これをORDER BY句でソートすると、当然

11111
222
3333

の順に並ぶのですが、これを、数値の小さい順

222
3333
11111

と並ぶようにするにはどうしたらいいんでしょうか?
>756

Oracle なら ORDER BY TO_NUMBER(HOGE)
Access なら ORDER BY Val(HOGE)

でいけるんちゃう?

SQL鯖は知らん。
>>757
即レスありがとうございます
DBはローカルのParadoxテーブルです。

いま、ORACLEで試したところ、TO_NUMBER(HOGE)でうまく表示されました。
が、Paradoxではエラーになってしまいました。
759デフォルトの名無しさん:02/05/23 20:20
テーブル A に "ID" というフィールドがあって、
テーブル A そのものを
この ID について降順に並び替えたものに書き換えたいのですが、
これは SQL 文の範疇でしょうか?
MySQL + PHP なのですが、実現する方法を教えて下さい。
>>759
一体何がしたいのだ?
表示するときにID順にしたいだけなら ORDER BY ID とかつけたらよろし。
>>760
降順だから
ORDER BY ID DESC
だべ

>>759
せめてSELECT文の基本構文くらい
マニュアルで調べろ
>>758
それやるとINDEXが使われなくなる罠無い?
ナムサン・ナムサン・ナムサン
764デフォルトの名無しさん:02/05/24 00:46
SQLを使う仕事ってどんなものがあるのですか?
       |
  \       /

―     ○     ―         ^^

  /        \                   ^^
       |
                  ∧∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
                  ( ゚Д゚)っ< やっぱプログラマが一番使うんじゃねーのか
                ゚ ⊂ /\ \________
   ゚      。      。 ゚ ソ  ノ  ゚      。
⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒
⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒






>764
主に業務システム構築っすね。
あとデータベース保守とか。
>>760, >>761

>>759は Order By field Desc くらいは知ってるだろ。
それで、「降順に書き換えたい」って言ってるから降順にしたものを
もとのテーブルに格納したいんじゃねーの?

で、結論はデータを突っ込んだ順序通りに Select されるとは限らないので、
毎回 Order By field Desc しなさいってこった。
ディスク上での物理的な配置を降順にしたいって事だろ。
テーブル=Excelのワークシート、と思ってる人にありがちなパターンかも。
RDBではそういう概念は無意味な事は周知の通り。
769761:02/05/24 20:39
>>767
なるほどね!
テーブル全体って事ね
>>760の「降順」って言葉かあるのに
昇順でやってるからおもわず

んで関係ないけど、
SQL鯖ならクラスタインデックスを作成すれば
SELECTするときに必ず昇順にはなる
「create crasterd index」スペルは間違ってるかも?
>>769
最近のDBだとビューにもOrder Byが記述できるんで、
Order By 付きの更新可能ビューを書いといて,
それに対して、更新・参照するという手もあるな。
771デフォルトの名無しさん:02/05/25 16:42
質問させてもらいます。
Table1(Suzuki)
Date   Uriage
---------------

Table2(Sato)
Date   Uriage
---------------

今SuzukiとSatoという2つのテーブルがあります。
それぞれ日付は連続していないで個人の売上があった日のみ登録してあります。
また、双方ともDate,Uriageというフィールドを持っています。

この両者を結合させて
Date   Suzuki.Uriage   Sato.Uriage
------------------------

という結果を得たい時に発行すべきSQL文を教えてください。
両者とも売上の無い日も空欄で良いので日付を連続して結果に返してほしいのです。

よろしくお願いします。
>>両者とも売上の無い日も空欄で良いので日付を連続して結果に返してほしいのです。

この条件がある以上は、この情報だけでは...たぶん出来ないな
おれが技を知らないだけかも知れないが
縦方向に表示するためには、データの中に必ず無ければ出ないっと認識している
ようはカレンダーテーブル見たいのがあればOK

1ヶ月限定とかで、横に出すのは出来なくはない

TANTOU,1,2,3,4,5,6,7,8,9,10・・・・・・・
-----------------------------
Suzuki
Sato

みたいな感じで
>>771
そもそもそのスキーマおかしい。設計からやり直し。
そんでそのテーブル構成の結合構文では、>>771の意図している出力結果は出ない。
レポート用に日付を格納できるテーブルを作ってExcelで適当に10年分ぐらいデータ作って入れとく。

そんで次のSQL
SELECT Calendar.Date, Suzuki.Uriage, Sato.Uriage
FROM Calendar LEFT OUTER JOIN Suzuki ON Calendar.Date = Suzuki.Date
LEFT OUTER JOIN Sato NON Calendar.Date = Sato.Date
ORDER BY Calendar.Date

アバヨ
>>771
少なくとも使用DBくらい書けよ
775デフォルトの名無しさん:02/05/25 21:42
みなさんありがとうございました。
使用DBはMSのSQLサーバです。

実は納期が一週間後なんです・・・

ところで、少なくともどちらか一方が売り上げた日を含む
レコードを作成する事はできますか?

Table1(Suzuki)
Date      Uriage
---------------
1999/12/03  30,000
1999/12/05  23,000
1999/12/23  40,000


Table2(Sato)
Date      Uriage
---------------
1999/12/01  50,000
1999/12/07  16,000
1999/12/30  20,000

だとしたら

Date      Suzuki.Uriage      Sato.Uriage
------------------------
1999/12/01  (NULL)  50,000
1999/12/03  30,000  (NULL)
1999/12/05  23,000  (NULL)
1999/12/07  (NULL)  16,000
1999/12/23  40,000  (NULL)
1999/12/30  (NULL)  20,000

このような結果を得たいのです。

776デフォルトの名無しさん:02/05/25 21:44
結果は(NULL)ではなくゼロになって返ってくるとさらに嬉しいのですが・・・・

泣きたいほど追い込まれている私ですがDBって面白いですね。
一応業務系PGを2年やっててDBに触った事がないって終わってますね(涙
777デフォルトの名無しさん:02/05/25 21:52
横から悪いけど

Select Suzuki.data, Suzuki.Uriage, Sato.Uriage
where Suzuki.Data = Sato.Date;

だとどういう結果が帰って来る?ほとんど素人だが採点頼む。
778デフォルトの名無しさん     :02/05/25 21:55
>>777
スリーセブン、くそっ!
>>777
たぶんダメ


select
Date,
CASE WHEN hito = 'Suzuki' THEN ISNULL(SUM(Uriage), 0) END SuzukiUriage,
CASE WHEN hito = 'Sato' THEN ISNULL(SUM(Uriage), 0) END SatoUriage
from
(
select 'Suzuki' hito, Date, Uriage from Table1
union all
select 'Sato' hito, Date, Uriage from Table2
) a
group by Date, hito
order by Date

こんな感じだと思う
780デフォルトの名無しさん:02/05/25 21:57
>>779
なんでダメ?多分エラーにはならず結果は帰ってくると思うけど
これだと何が帰ってくる?

手元にSQLないからわからん
>>777
FROM が無いとか、Suzuki.Data などと言うフィールドは無いと言う
レベルのエラーは別として、鈴木さんと佐藤さんが同一日に売上を
上げたレコードだけ返ってくると思う。
782デフォルトの名無しさん:02/05/25 21:59
みなさんありがとうございます。
なかなか779さんのSQLは複雑ですね。。。
さっぱり解かりません。
これから徹夜で勉強します。(涙
783デフォルトの名無しさん:02/05/25 22:01
>>781
ほぅ、勉強になった。サンクス
要するに鈴木さんと佐藤さんの2人とも売り上げた日のレコードしか返ってこないという事?
784779:02/05/25 22:03
>>777
だいたいのことは>>781の言うとおり

外部結合にしても駆動表にない日付のは出ないから
785デフォルトの名無しさん:02/05/25 22:04
>>784
そうか、また勉強になった。サンクス
俺もデータベースの勉強するかな
786仕様書無しさん:02/05/25 22:05
翔泳社のDBマガジンって、いいですか?>>ALL
787デフォルトの名無しさん:02/05/25 22:11
>>786
翔泳社の本で勉強したらオラクルシルバー落ちたので良くない本だと思います。
788779:02/05/25 22:12
スキーマ定義的には

Hito Date Uriage
-----------------
Suzuki 1999/12/03 30,000
Suzuki 1999/12/05 23,000
Suzuki 1999/12/23 40,000
Sato 1999/12/01 50,000
Sato 1999/12/07 16,000
Sato 1999/12/30 20,000

こうあって有るのがベスト?
まずサブクエリの中で、そういう風に作り替えてる

あとは、
1カラム目に日付
2カラム目に鈴木さんの売上
3カラム目に佐藤さんの売上
ってやってるだけっす


まぁ実際SQL文を出してワカランのなら
簡単には理解できないと思われます


あっ環境が無いので確認してないから、
間違えてるかも知れないけど
遠からずは無いと思う
頑張ってください
789デフォルトの名無しさん:02/05/25 22:19
>>786
使えん。Oracle、SQLサーバマガジンの間違いじゃないのって言いたくなる。
これからDBはじめる初心者にはいいかも。
>>775
完全外結合が使えるデータベースならこれでいいだろ。
データベースがおちんぽで完全外結合ができないってんなら、
>>779 の方法使うのもひとつの手だと思う。

Select
 IsNull(Table1.Date, Table2.Date),
 IsNull(Table1.Uriage, 0),
 IsNull(Table2.Uriage, 0)
From Table1 Full Outer Join Table2 On Table1.Date = Table2.Date
>>775
納期が迫っているのなら、SQL一発で抜き出すのは
ある程度のところで諦めて、何回かSQLを発行して
その結果をPG上でゴリゴリとくっつけるんだな。

パフォーマンスが悪くても、その機能が実装できないよりはいくらかましだろうて。
>>782
ところで徹夜で勉強してわかったのか?
793デフォルトの名無しさん:02/05/28 17:01
下記の二つの「科目テーブル」と「点数テーブル」から

ある人物が最高得点を取った科目数を出したいのですが、どのようにすれば
良いか教えていただけないでしょうか?

KAMOKU
CODE KAMOKU
0001 国語
0002 数学
0003 物理
0004 史学

POINT
CODE NAME KAMOKU POINT
0001 山田 0001 95
0002 遠藤 0001 85
0003 菊地 0001 60
0004 山田 0002 60
0005 遠藤 0002 90
0006 山田 0003 59
0007 遠藤 0003 70
0008 菊地 0003 95
0009 山田 0004 75

受験科目数は

SELECT COUNT(DISTINCT NAME) FROM POINT WHERE NAME = "山田"

でできたと思うんですが


最高得点回数についてどなたかアドバイスいただけませんか?
>>793
質問意味不明
出力結果求む

もちろんMAXでやれば良いんじゃない?
ってだけじゃ無いよなぁ


>>SELECT COUNT(DISTINCT NAME) FROM POINT WHERE NAME = "山田"
これだと必ず1になるんちゃう? DISTINCT いらないんちゃう?
SELECT NAME, COUNT(*)
FROM POINT
WHERE
( KAMOKU, POINT ) IN (
SELECT KAMOKU, MAX(POINT)
FROM POINT
GROUP BY KAMOKU
)
GROUP BY NAME;

こんなかんじ?
>>795
これは構文エラーだべ
INは複数の項目は出来ないべ

意図としてることが合ってれば
SELECT NAME, COUNT(*)
FROM POINT p, (SELECT KAMOKU, MAX(POINT) POINT FROM POINT GROUP BY KAMOKU) a
WHERE p.KAMOKU = a.KAMOKU
AND p.POINT = a.POINT
GROUP BY NAME;

こうかな?
POINTって項目とテーブルに使われているのが気になるが
>>796
>>少なくともOracleは795-796両方OKだよ。
1) where exists (select ...)
2) where (col1, col2...) in (select ...)
は同じ結果を返すように作れるけど、2)の場合はサブクエリを先に評価
するようにオプティマイザを誘導できたりして、サブクエリで絞込みの大半を
行うようなケースで便利だったりする。
798デフォルトの名無しさん:02/05/29 09:27
質問です。
数値型のデータにTO_CHARを使用したところ、空白が混ざってしまいます。
例: TO_CHAR(1,'00000000') → 「 00000001」
みたいな感じです。
どなたか、原因と回避方法をご存知ないでしょうか?
>>798
TO_CHAR(1,'FM00000000')
ヘルプないのけ?
800デフォルトの名無しさん:02/05/29 10:45
--テーブルA--
-------------
NO  name
-------------
001 山田
002 山本
003 田中
-------------


--テーブルB--
-------------
NUM name2
-------------
555 よん
666 ご
777 ろく
888 なな
999 はち

-------------

を結合して

---------------------
NO  name NUM name2
---------------------
001 山田 555 よん
002 山本 666 ご
003 田中 777 ろく
      888 なな
      999 はち
---------------------

という表を作成したい場合、
どのようなSQL文を作成すればよいのかわかりません。
キーがないので何をしたいのか意味不明かも
しれませんがどなたか教えてさい。

>>800
結合の意味知ってる?
802デフォルトの名無しさん:02/05/29 11:07
>>801
すいません、理解できてないと思います。
ただ一時的にこういうこういう表を作成したいのですが
無理なんでしょうか???
803デフォルトの名無しさん:02/05/29 13:34
ここで扱ってるのは実践的な内容っぽいのでスレ違いかもしれないんですが
教えてください。
GRANTやREVOKEってDMLですか?DCLですか?
本やWebサイトによって違っていてあれー?という感じです。
COMMITやROLLBACKもDCLの仲間になってたり、Oracleの本では
DDL・DML・DCLとは別にトランザクション制御文になってるし…

実際に使うときは区別したりしないのかなと思うのですが
どうも気になって…。
>>803
MSSQLServerにはDCLないぞゴラァ!(w
というわけでさ、MSの場合は GRANT/REVOKE をDDL扱いにしてますぞぃ

そもそも SQL/92規格にDCLって定義されているんだっけ?
805804:02/05/29 14:18
心配になってMSのサイト覗いたらDDL/DML/DCLと区分けされてやんの
マニュアル古いのかぁ?。。。
>>803
つう訳でオイラもわかんなくなってきたぞぃ
806デフォルトの名無しさん:02/05/29 14:24
>>803-804
オライリの本には
「SQL92ではSQLを大きくDML、DDL、DCLの3つのカテゴリに分けていました。(略)
 SQL99では7つのCoreカテゴリがあり、SQLで利用できるコマンドの種類の
 一般的な枠組みを提供しています」ってあるよ
ちなみに「DCLには権限関係のGRANTやREVOKEなどのコマンドが含まれています」
だってさ
807804:02/05/29 14:49
>>806
どうもありがとうございます。
DDL/DML/DCLの区分けは ANSI SQL86から始まってるのね、知らなかった。
808デフォルトの名無しさん:02/05/29 14:59
そういえば規格書って見たことなかったな・・・
でっかい図書館に行けばあるんかな?
>>804
begin trans / commit trans / rollback trans
の事じゃ無いのか?

>>808
SQL92の本は売ってたよ(かなり前に購入した記憶あり)


DDL/DML/DCLの区別は
オラクルマスターのシルバーで必須っす
810デフォルトの名無しさん:02/05/30 03:27
ID | Favorite | name
------------------
1 | Car | Skyline
1 | Food | Curry
2 | Car | March
3 | Car | Mini
3 | Sport | Baseball
4 | Food | Water
4 | Sport | Soccer
4 | Car | K-Truck

のようなテーブルから、

ID | Favortite | name | Favorite | name | Favorite | Name
--------------------------------------------------
1 | Car | Skyline | Food | Curry | |
2 | Car | March
3 | Car | Mini | Sport | Baseball
4 | Car | K-Truck | Food | water | Sport | Soccer

のように、ID1つに対し1行にまとめたいのですが、どう記述していいのかわかりません。
"Favorite"は最大3つとして、全員が入力していない可能性があります。
>>810
カラムへの展開はどうしてもデッドになるけど。
select
ID,
max(decode(Favorite, 'Car', Name, null)) FavCar,
max(decode(Favorite, 'Food', Name, null)) FavFood,
max(decode(Favorite, 'Sport', Name, null)) FavSport,
from tbl
group by
ID
みたいなかんじ。
812810:02/05/30 11:09
>>811
できました。ありがとうございます。
Decode()が味噌だったんだ。と思ったらmaxもしなきゃ出力されないんですね。
で、うちはオラコーではないので書き換えてみました。

select ID_USER,
max(CASE
WHEN Favorite = 'Car' THEN Name
ELSE null
END) FavCar,
max(CASE
WHEN Favorite = 'Food' THEN Name
ELSE null
END) FavFood,
max(CASE
WHEN Favorite = 'Sport' THEN Name
ELSE null
END) FavSport
from t_favor
group by ID_USER
813デフォルトの名無しさん:02/05/30 15:49
今オラクルマスターのゴールドの勉強しているんだけど、シルバーもっていたら
実務でもある程度は通用しますか?それともゴールドくらいきっちり持っていないと
駄目ですか?
814デフォルトの名無しさん:02/05/30 15:51
シルバーは駄目っすね。ゴールドくらいはできて普通。
らしい。私はシルバーしか持ってないけど。
世の中、資格保有していなくともソツなく仕事をこなす人が存在する
そんなもんさ

アンタら資格にとらわれすぎ。。。とか言ってみる
>>815
しかし、一旦職場から離れると能力を評価する基準・売り込むツボとしては■は大切だといってみる
資格の有無でなく、内容というか知識の話をしてるのではないの?
座学の知識より実体験(実務)から得られる知識のほうが遥かに有効だ。

と、教えられる人間はいないのかね?最近は

>>815殿が述べている点については同意いたしまするよ
sqlplus で
select 'ABC&DEF' from dual;

みたいな事をやりたいんだけど、&を普通に表示する
にはどうすれば良いのでしょうか?
select 'ABC' || '&' || 'DEF' from dual;
>>820
おお、なるほど。 chr(38) とかやってて助長だなぁ
とか思ってたけど、一文字だと普通に & で解釈される
のね。もっと単純に、オプションで&を解釈しないように
できればベストだけど、これでも良いや。
さんくす
助長
犯罪を冗長する
824デフォルトの名無しさん:02/06/02 02:39
初心者です。PostgreSQLで同じカラムを連結させた文字列をつくりたいのですが、どのようにしたら良いのでしょうか。

以下のようなテーブルで、TYPEを条件に「犬猫ハムスター」「猿人」「象」というような結果を出したいのですが…さっぱり分かりませんでした。よろしくお願いします。

ANIMAL

CODE TYPE NAME
0001 A 犬
0002 A 猫
0003 A ハムスター
0004 B 猿
0005 C 象
0006 B 人

横に結合させる項目数の最大を決める必要がある!
グループ(TYPE)ごとの連番があればなお楽

770くらいからのレスを読んでわからないなら
プログラムで書いた方がええと思う
id | text
--------+--------------------------------------
1 | いのうえようすいイノウエタロー

っつーのを
select id, translate(text,'いのうえようすい,'ほげほげ')
from song
where id = 1

ってやってもダメなんだけどポスグレに replace みたいな関数無いのかな?
文字列を置き換えるんじゃなく「文字列長」を置換するの!!
827デフォルトの名無しさん:02/06/10 01:22
独習SQLってどうですか?
828minamo:02/06/10 16:14
SQLの問題です。

複数のテーブルに同じキーが指定してある状態で
各テーブルのデータが揃っていないデータを挙げよ。

というSQLを組みなさい。
829デフォルトの名無しさん:02/06/10 16:31
age
830デフォルトの名無しさん:02/06/10 17:38
>>828
本当に問題をだしているのですか?
知っている人に教えて欲しいのとは違うのですか?
Accessで不一致クエリでもかいてオナってろ(ワラ
>>828
一致するキーを条件に抽出するだけだろ。
ひょっとして

「同じようなレイアウトのテーブルが複数あり、それぞれ
 全フィールドを比較し一致しないレコードを抽出せよ」

じゃないの?w
834minamo:02/06/10 19:22
具体的な例を出そうか…

商品テーブル(商品番号、商品名)
在庫テーブル(商品番号、在庫数)

というテーブルがあり、

商品テーブル
商品番号 商品名
100    RedHat Linux
200    Windows2000
300    WindowsXP

在庫テーブル
商品番号 在庫数
100    3000
300    2500

というデータがあるとき、各テーブルに共通しない商品番号 200 の商品だけを
抽出するSQLを組み立てる。
835デフォルトの名無しさん:02/06/10 20:29
基礎じゃん
836デフォルトの名無しさん:02/06/10 20:30
特定条件を満たすレコード群の中で、あるフィールドの値が最大のもの、
を探すクエリーを書くのに少々悩んでいます。

●データ定義

CREATE TABLE MyTable (
  keyVal INTEGER NOT NULL,
  datVal INTEGER NOT NULL
);

INSERT INTO MyTable VALUES ( 1, 1);
INSERT INTO MyTable VALUES ( 2, 2);
INSERT INTO MyTable VALUES ( 3, 3);
INSERT INTO MyTable VALUES ( 4, 1);
INSERT INTO MyTable VALUES ( 5, 2);
INSERT INTO MyTable VALUES ( 6, 3);
INSERT INTO MyTable VALUES ( 7, 1);
INSERT INTO MyTable VALUES ( 8, 2);

●操作

SELECT * FROM MyTable t1 WHERE NOT EXISTS (
 SELECT * FROM MyTable t2 WHERE t2.keyVal > t1.keyVal
   AND t2.keyVal < 7 AND t2.datVal < 3
)
AND t1.keyVal < 7 AND t1.datVal < 3;

●結果
   KEYVAL    DATVAL
============ ============
      5      2

やりたいのは、keyVal < 7, datVal < 3 という条件を満たしつつ、
その中で keyVal が最大のレコードを取り出すという操作です。
上記の SELECT でちゃんと動きますが、
< 7 と < 3 の条件が NOT EXISTS の内外に二重に存在するのが
どうもスマートでないように思えてなりません。
何かもっとシンプルなやり方はないものでしょうか?
現在使用しているRDBMSはInterBase6です。
having count(*) = 1
838836:02/06/10 22:46
SELECT * FROM MyTable t1 WHERE SINGULAR (
 SELECT * FROM MyTable t2 WHERE t2.keyVal >= t1.keyVal
   AND t2.keyVal < 7 AND t2.datVal < 3
);

この形に落ち着きました。
>834
831が答え書いてるし、835が真実を語ってる
840デフォルトの名無しさん:02/06/11 10:28
SELECT [在庫].[商品番号]
FROM 在庫 LEFT JOIN 商品 ON [在庫].[商品番号] = [商品].[商品番号]
WHERE ([商品].[商品番号] Is Null)

 基 礎 じ ゃ ん

>>836

こっちの方が、きれいじゃない?

SELECT * FROM MYTABLE
WHERE KEYVAL IN (SELECT MAX(KEYVAL)
              FROM MYTABLE
              WHERE KEYVAL < 7 AND
                   DATVAL < 3)

とりあえず、ORACLEで確認したどす。
パフォーマンスはわかりません。
ちなみに、DBって何?
843842:02/06/12 02:42
って、InterBase6って書いてあったな・・・・

INはつかえんのか?
さすがにMAXは使えると思うんだが
844836:02/06/12 04:08
>>842
あ、その書き方の方が遙かに素直でいいですね。
InterBaseでもINもMAXも使えます。
INを使わず=で結んでも構いません。
指摘さんくすです:)
845デフォルトの名無しさん:02/06/12 17:04
プライマリキーのインデックスって明示的に作る必要がありますか?
内部で自動生成されてるからいらない説と
当然つくるべし説を聞いたことがあって悩んでいます。
846デフォルトの名無しさん:02/06/12 17:58
>>845
まずほとんどのRDBMS実装では必要ありません。
「当然つくるべし説」をいっているやつはあやしい。
どっちも同じ事言ってるんじゃないか?
「当然つくるべし。まぁ、普通は自動生成されるけど。」
>>844
SQL Serverなら明示的に作る価値がある場合もある

でも、つくるべし説を唱えている大抵のやつは
index名を自分で決めた物にしたいから程度の
理由な気がする・・・・
849デフォルトの名無しさん:02/06/17 17:03
select文でテーブルを作る「create table テーブル名 as selectなんとか」って
PostgreSQL以外でもできますか?
これって標準SQLなのかな。
Oracleはできる。SQL鯖はダメでした。
>>849
Oracleでは確かできたよ。他は知らん。
852851:02/06/17 17:33
ちっ。かぶった。
ついでにオライリ本みてみたけど、標準じゃないんじゃないかな。
>>850

SQL鯖は
「create table テーブル名 as select....」は出来ないけど
代わりに
「select 項目1, 項目2.... into テーブル名 from なんとか」
って書き方は出来る
854デフォルトの名無しさん:02/06/18 14:15
シツモンヌ。
オラクル8iで「access」という列名を含むテーブルを
作成しようとしたが、できなかった。
「access」のところで、「ORA-00904: 列名が無効です。」と出る。
なんで?
855デフォルトの名無しさん:02/06/18 15:41
>>854
SQLの予約語だから。
selectって名前の列、紛らわしくて作らないし、作れないでしょ、それと同じです。
>>854
ライバル商品だから。

というのは冗談でOracleの予約語でしょ。
855補足
どうしても作りたきゃ""で囲って下さい。
「create table TBL1 ("access" char(10))」 みたいな感じ。

ただし、こうするとselect時にも「select "access" from TBL1」みたいに
いちいち""が必要。
858山太郎:02/06/18 16:03
そんな面倒な事せんでも、男は黙ってローマ字名。
つまり「AKUSESU]だよ。OK?
859854:02/06/18 19:50
返答ありがd>>855-858
なるほどねー。いろいろ試したら「session」もダメだったわ。
とりやえず列名accsとすることで回避しました。
860デフォルトの名無しさん:02/06/20 15:37
>858
アンタ、気に入ったよ!
861デフォルトの名無しさん :02/06/20 19:20
PostgreSQLとMySQLどっちがいいですか?
>>861
使い分けろ
863デフォルトの名無しさん:02/06/20 19:35
>>831
MySQL
参照整合性制約やストアドプロシージャなんぞいらん
>>863
んな訳ねーだろ
すくなくともストアドプロシージャは欲しいだろ?
>>861

http://pc.2ch.net/test/read.cgi/tech/1008316065/l50
で聞いてみたら?

そういえば、Postgreのスレってどこかにあるのか?
PostgreSQL
http://pc.2ch.net/test/read.cgi/php/989375812/
PostgreSQL or MySQL
http://pc.2ch.net/test/read.cgi/unix/955533785/
MySQLってどうよ
http://pc.2ch.net/test/read.cgi/tech/1008316065/

他にもあるかもしれないけど。
こう見てみるとDBの話題ってどこの板が最適なんだろうなぁ。
まだあった
MySQL vs PostgreSQL
http://pc.2ch.net/test/read.cgi/php/989341364/

ちょっとずれるかもしれないけど
PHP + PostgreSQL
http://pc.2ch.net/test/read.cgi/php/983128806/
PHP + MySQL
http://pc.2ch.net/test/read.cgi/php/983250751/
869デフォルトの名無しさん:02/06/23 10:20
sqlserver2000ですが、replaceって、NULLに対してできます?

select replace(a,NULL,"mona") from table; みたいに。

事情があって、しばらく実験できません。
870デフォルトの名無しさん:02/06/23 11:00
>>869
通常なら
select isnull(a,'moma') from table;だべ
871デフォルトの名無しさん:02/06/23 11:15
>>869
ダブルクォーテーションでくくんなよ。

SELECT case when a is NULL then 'mona' else a end FROM table;


872デフォルトの名無しさん:02/07/01 19:38
すいません。SQL教えてください。。
今2つのテーブルがあるとします。

tableA
colA colB
---- ------
1   001
1   002
1   003
2   001
2   002
2   003


tableB
colC colD
---- ------
1   001
1   002
1   003
2   001
2   003



tableAにあって、tableBにないデータを取り出したいのです。。
(ここでは colAが「2」colBが「002」)
一応自分でもいろいろ考えてみたのですが、
・where (colA , colB) not in (select 〜〜)等、whereの後に複数カラムを指定できない。
・minus句が使用できない
という状態で行き詰まってます。。何か良い書き方ありますでしょうか。

Linuxでsybase-ase-11.0.3使ってます。よろしくお願いします。
873デフォルトの名無しさん:02/07/01 20:07
>>872

select *
from tableA a
where not exists(
 select *
 from tableB b
 where b.colC = a.colA
 and b.colD = a.colB)
874872:02/07/01 20:45
できました。ありがとうございますた。( ゚∀゚)v
875デフォルトの名無しさん:02/07/01 21:56
質問です。
番号 担当
10 担当
10 主任
10 課長
10 社長
ってセレクト文で書くと、select 番号、担当 from 表名でこの文を
10 担当 主任 課長 社長
ってな感じで出したいんですけどうしたらいいですか?
もしかしたら、言葉が足りないかもしれまが列で出てきたのを行であらわす方法
っていったほうがいいかもしれませんが、教えてください。
横展開するには、キーワードと最大個数が決まっている必要がある
この条件ではSQL一発では出来ない
よってプログラムでやった方が簡潔に行える
877デフォルトの名無しさん:02/07/02 16:39
すんません、オラクル8iなんですけど。
新しいレコードをinsertするときに、ユニークなIDを振るんですが、
このユニークIDを自動的に振ってくれるような機能はないですか?
それとも、そのテーブルをselectして、使われてないIDを自分で
探す必要がありますか?
879デフォルトの名無しさん:02/07/02 19:49
>>878
SQLを使ってはできないつーことですか?
>>877
rownumかrowidだな

select rowid , * from tableAとか
881デフォルトの名無しさん:02/07/02 20:01
>>880
どうも教えてくれてありがとうございます。僕はオラクルしか
知らないんですが、これってオラクル以外でも使えるもの
でしたっけ?
ところで、普通それぞれのレコードにIDみたいなのふりますよね。
普通っていうか、それが一般的だと思ってたんですが。
でもそういうことをしないで、かわりにrowidとか使う、っていうのは
一般的なんでしょうか。
rowidとかそのまま使ったら、その行にあるデータが削除されて、
またそこに別のデータがinsertされたら、同じrowid使われちゃうん
でしょうか。だとしたらやばい場合ってけっこうありますよね?
882880:02/07/02 20:44
>>881
>僕はオラクルしか知らないんですが、これってオラクル以外でも使えるものでしたっけ?
オラクルも知ってないんじゃ? rowidはオラクル固有です
一般的にはシーケンスを振ると思われます
IDENTITY(これはSQL鯖だけか?) nextvalなどでやるのだと思われます

手元にマニュアルが無いので調べようが無いですが
rowidはtruncateなどしない限りは、同一のは振られないはずです


最後に一言、キーワードを教えて貰ったら
ちょっとは自分で調べる癖をつけましょう!
>>882
お前、あほか? rowidについてはこいつの言ってることであってるじゃん。
なに怒ってんの?

>>881
お前さんの言うとおり。rowidをこういうときに使うのはやばい。
ある一点ではユニークだけど、時間軸で見るとユニークとは言えない。
884880:02/07/02 22:15
>>883
>ある一点ではユニークだけど、時間軸で見るとユニークとは言えない。
自分でデリートしてインサートしたりして確認したことある?
かなーり繰り返さないと、その状況はあり得ないのでは?

怒ってんじゃなくて、教えてくんが好きじゃないの
>>878のリンク先で同じ事書いてんのに関わらず、わかってないのがな
rowid
別にOracle固有ってワケじゃないよ。
>>884
かなりレアケースでも絶対に起きないといえなければ使っちゃいけない。
>>884
そんなおまえさんにもキーワードを教えてあげよう。
PCTFREE/PCTUSED

かなーりとかいう、量(回数)の大小ではない。
タイミングの問題だ。
>>887
データブロックのパラメータでしょ
簡単な説明だけど
PCTFREE:設定値に達した時に、そのデータブロックには挿入できなくなる
PCTUSED:PCTFREEに達したときにPCTUSEDまで空くまで、そのデータブロックに挿入できない

デフォルト値は忘れたが
ようは、データブロックの最大値(PCTFREE)に達して、
その中のデータの半分くらい削除(PCTUSED)したら一緒になる可能性がある

そこと関係があるとは気にしたことが無かったのは事実だけど


そんな事をことを言ったらシーケンスなども有限じゃん
そしたら論理削除フラグで付けるしかねーだろ


SQL文の事じゃないのでsage
889デフォルト名無しさん:02/07/04 01:24
>>888
興味本位で聞く。
シーケンス最大値使い切れるか?
>>889
自分も使い切ったことはない
しかし>>886の意見だと
意見だと?
ワクワク
Oracle のバインド変数みたいなのって
Postgres にないのかな?
>>890
記憶域は有限なんだからどんな方法でID振ったところで
使い切る可能性は必ずある
とかいう客が多いんで、いつ使い切るのか計算させてる。
だいたいは1000億年以上先だったりする。
記憶域の心配して、あれこれ考える間に
ハード&ソフトが進化してしまうよ
シーケンスを使い切るのはきっちり計算できるからデータ量考えたら
絶対使い切らないことは保証できるわな。
897889:02/07/06 01:19
とりあえず、シーケンス使っておけば
間違いないだろう。
時間軸でのソートも出来るし。
一年3200万秒もないんだから、事実上使い切るのは無理。
SQL>CREATE SEQUENCE hoge;

順序が作成されました.
でもさー、空き番号があったら嫌だっていう客多くない?
こっちの説明に耳かしてくれて、シーケンス使えるのって
大体1/3くらいかなぁ。
シーーケンスも有限だからって使わなければ
日付型って有限なんじゃないの?<調べてないから予測
そんな事を言ったらDB設計自体できなくなるんじゃない


実際さ、クラサバが流行始めた6〜7年前に流行ったマシン構成で、
(PenProでHD10GでNT3.51でORA7.3くらいかな?)
いまも現役稼働してるのって数多くはあるとおもう?
多少はあるとは思うが、移行作業の計画があるとかじゃない
ようは>>895だな
901889:02/07/06 11:18
>>899
連番を取る方法かぁ・・・。
簡単な方法、思いつかないなぁ。
どなたか、簡単な方法があればご教授ください。m(_ _)m
>>901
質問の意味が良くワカラン
CREATE SEQUENCE じゃないんの?

話の流れからだと空き番号を見つける方法を聞いてるようにも思うので

select a.recnum from
(select rownum recnum, seq from Table order by seq) a
where a.r <> a.seq
and rownum = 1
もしくは
select min(a.recnum) from
(select rownum recnum, seq from Table order by seq) a
where a.r <> a.seq

こんな感じなんじゃないかな?
あっ書き間違えた
where a.r <> a.seq  →  where a.recnum <> a.seq
904889:02/07/06 21:57
>>902
すまんね。質問しなおす。
「連番を確実に取る方法を教えて下さい」。
です。以上。
>>904
んじゃシーケンス以外なら
select max(seq)+1 form TableA
じゃないのか?
906889:02/07/06 22:09
>>905
え〜とゴメンなさい。説明が足りませんでした。
その連番を後々INSERT文でキーとして使う場合を想定してください。

シーケンス使っちゃ連番にならないしなぁ・・・。
どうやるんだろ?
>>905
連番 (=番号が飛んでいない) じゃないと嫌だってさ。
>>906
削除する時に本当にレコードを削除しないで、削除フラグだけ立てとく。
インサートする時まず削除フラグが立っていてシーケンスが最小のものが
あったらそのレコードを書き換える。
削除フラグが立っているレコードが無ければ、本当にインサートする。

って言うのはどう ?
909デフォルトの名無しさん:02/07/06 22:16
空き番号見つけるのと最大を見つけたら
組み合わせたら出来るじゃないの?

insert into TableB values(seq)
select nvl(min(a.recnum), select max(seq)+1 form TableA) seq from
(select rownum recnum, seq from TableA order by seq) a
where a.recnum <> a.seq

未確認だからどうかワカランが!
>>909
構文的に間違ってた!
適当に解釈してください
911889:02/07/06 23:08
>>910
適当に解釈したけど、こういうこと?

create table test
(
num number primary key,
other varchar2(10)
);
insert into test (num,other)
select
nvl(max(num)+1,1) new_key,
'適当' new_val
from test;

読み取り一貫性を考えると
ちょっと不安、このSQL。
経験者の方、お力添えをお願いします。
912889:02/07/06 23:20
出かける時間だぁ(T-T)
宜しくお願いします>ALL
913デフォルトの名無しさん:02/07/06 23:33
うーむ。
後から連番を埋めることに、どういう意味があるんだろう。
914909:02/07/07 00:35
insert into test (num,other)
select
nvl(min(a.recnum), select max(seq)+1 form test) num,
'適当' other
from
(select rownum recnum, num from test order by num) a
where a.recnum <> a.num


こんな感じじゃない
連番の方が何かと都合がいいのは確か。
trigger 使っちゃ駄目なの?
917デフォルトの名無しさん:02/07/09 23:23
age
trigger使うってどうすんの? なんかいい方法があるのかな。
919デフォルトの名無しさん:02/07/10 23:06
>>911

最初からテーブルロックしとくのが一番安全だと思うよ。

別トランザクションが直前にINSERTしてたときは、そのトランザクションが
完了するまでロックされるし、COMMITした場合は一意制約に違反するから
INSERTに成功するまで繰り返さなきゃならない。
920889:02/07/11 11:00
>>914
nvl関数にSelect文って使えるんですか?

>>916
なんでも有りって事でお願いします。

>>919
ありがとうございます。勉強になります。
これなら連番を確実にとれますね(^^

create table test
(
num number primary key,
other varchar2(10)
);
LOCK TABLE test
IN EXCLUSIVE MODE ;
insert into test (num,other)
select
nvl(max(num)+1,1) new_key,
'適当' new_val
from test;
>>920
それだとシーケンス使うのと一緒だべ
922919:02/07/11 22:41
>>921
違う。シーケンスだと値が飛ぶ可能性が高いが、
最大値を使えば既に飛んでない限り飛ばない。
923909:02/07/11 23:00
>>922
エライ中途半端な理由だな!
同じ事を>>905で例を上げているのに違う言われたから
考えたのに...それで納得するなら、別に構わないんだが
924889:02/07/11 23:39
>>921
ロールバック・コミットを併用したときも
一緒ですか?

>>923
すみません、>>901の時点でLOCK TABLEを知らなかったものですから。
>>905では、ロックの処理がないため
>>920と同じ内容を指してるとは思えなかったんですよ。
レスありがとうございます。(^^
925デフォルトの名無しさん:02/07/12 14:39
SELECT A.名称 , B.名称
FROM 業務 AS A , 商品 AS B

という風に使用したテーブルに順にABC…とふっていく
ヤシがいます…
なんと言ってやればいいのでしょうか?
>>925
几帳面でよろしい。
927デフォルトの名無しさん:02/07/12 16:12
>>926
よろしくない。
SELECT文も、場合によっては100行を超えるときもある。
後から読むと、ASなんか使うなってよってよく思う。
928タスケテ:02/07/12 17:21
Oracle 8i から PostgreSQL 7.2.1 への移行ではまっています。

TABLE1 TABLE2
+------+------+-------+ +-----+------+-------+
| KEY1 | KEY2 | NAME | | ID1 | ID2 | VALUE |
+------+------+-------+ +-----+------+-------+
| 100 | 100 | hoge | | 1 | 1 | ○ |
| 200 | 1 | A | | 2 | 2 | ○ |
| 200 | 2 | B | | 3 | 3 | × |
| 200 | 3 | C | +-----+------+-------+
| 200 | 4 | D |
+------+------+-------+

Oracle 8i でのSQL

SELECT
TABLE1.KEY2, TABLE1.NAME, TABLE2.VALUE
FROM
TABLE1, TABLE2
WHERE
TABLE1.KEY1 = 200 AND TABLE2.ID1(+) = TABLE1.KEY2 AND TABLE2.ID2(+) = 2
ORDER BY
TABLE1.KEY2

抽出結果
+------+------+-------+
| KEY2 | NAME | VALUE |
+------+------+-------+
| 1 | A | |
| 2 | B | ○ |
| 3 | C | |
| 4 | D | |
+------+------+-------+

これを PostgreSQL 7.2.1 用に書き換えました。

PostgreSQL

SELECT
TABLE1.KEY2, TABLE1.NAME, TABLE2.VALUE
FROM
TABLE1 LEFT OUTER JOIN TABLE2 ON (TABLE2.ID1 = TABLE1.KEY2)
WHERE
TABLE1.KEY1 = 200 AND TABLE2.ID2 = 2
ORDER BY
TABLE1.KEY2

抽出結果
+------+------+-------+
| KEY2 | NAME | VALUE |
+------+------+-------+
| 2 | B | ○ |
+------+------+-------+

しかし結果は上記の通り、外部結合できておりません。なぜでしょうか?
厨レベルでまことに恥ずかしい限りですが、どなたかお助けください。
929タスケテ:02/07/12 17:33
二重投稿すみません。半角スペース無効なの忘れてました。
Oracle 8i から PostgreSQL 7.2.1 への移行ではまっています。

TABLE1          TABLE2
+------+------+------+  +----+------+-------+
| KEY1 | KEY2 | NAME |  | ID1| ID2 | VALUE |
+------+------+------+  +----+------+-------+
| 100 | 100 | hoge |  | 1 | 1  | ○  |
| 200 | 1  | A  |  | 2 | 2  | ○  |
| 200 | 2  | B  |  | 3 | 3  | ×  |
| 200 | 3  | C  |  +----+------+-------+
| 200 | 4  | D  |
+------+------+------+

Oracle 8i でのSQL

SELECT
 TABLE1.KEY2, TABLE1.NAME, TABLE2.VALUE
FROM
 TABLE1, TABLE2
WHERE
 TABLE1.KEY1 = 200 AND TABLE2.ID1(+) = TABLE1.KEY2 AND TABLE2.ID2(+) = 2
ORDER BY
 TABLE1.KEY2

抽出結果
+------+------+-------+
| KEY2 | NAME | VALUE |
+------+------+-------+
| 1  | A  |    |
| 2  | B  | ○  |
| 3  | C  |    |
| 4  | D  |    |
+------+------+-------+

これを PostgreSQL 7.2.1 用に書き換えました。

PostgreSQL

SELECT
 TABLE1.KEY2, TABLE1.NAME, TABLE2.VALUE
FROM
 TABLE1 LEFT OUTER JOIN TABLE2 ON (TABLE2.ID1 = TABLE1.KEY2)
WHERE
 TABLE1.KEY1 = 200 AND TABLE2.ID2 = 2
ORDER BY
 TABLE1.KEY2

抽出結果
+------+------+-------+
| KEY2 | NAME | VALUE |
+------+------+-------+
| 2  | B  | ○  |
+------+------+-------+

しかし結果は上記の通り、外部結合できておりません。なぜでしょうか?
厨レベルでまことに恥ずかしい限りですが、どなたかお助けください。
Tableが2つ(バッチ用、マスタ用)あってマスタ用への変更を
バッチ用に書き込んでいます(マスタへの変更なし)

バッチ用
ID,変更フラグ,名前,情報1,情報2

マスタ用
ID,名前,情報1,情報2

最新の情報一覧を見たいので
バッチ用にIDがあればそのレコードのID,名前,情報1,情報2、
なければマスタ用のID,名前,情報1,情報2を
表示するにはどのようなSQL文をかけばよいのでしょうか?
931928=929:02/07/12 20:43
自己レスです。簡単なことでした。逝ってきます…。

正解
SELECT
 TABLE1.KEY2, TABLE1.NAME, TABLE2.VALUE
FROM
 TABLE1 LEFT OUTER JOIN TABLE2 ON (TABLE2.ID1 = TABLE1.KEY2 AND TABLE2.ID2 = 2)
WHERE
 TABLE1.KEY1 = 200
ORDER BY
 TABLE1.KEY2
932デフォルトの名無しさん:02/07/14 21:17
ORACLEを使用していますが、テーブルの列が多い場合に、
SQL文が長くなりすぎてエラーとなってしまうのですが、
回避する方法はありますでしょうか?
(select * from AAAとすると、DATE型の書式を指定できない
ため以下のようにしてみました)

(SQL文)
select A001,A002,TO_CHAR(A003,'YYYY/MM/DD'),TO_CHAR(A004,'YYYY/MM/DD'),
A005,A006,(省略),A100 from AAA;

(テーブルのイメージ)
A001 CHAR
A002 CHAR
A003 DATE
A004 DATE
A005 CHAR
A006 CHAR
(省略)
A100 CHAR
>>932
テーブルの構造を変える。列数 100 なんて、常軌を逸している。
934932:02/07/14 21:39
932です。
列数は、ちょっとおおげさに書きすぎました。
実際には、30〜40くらいなのです。

業務によって違うとは思いますが、列数は
どのくらいで設計すべきなのでしょうか?
>>934
30〜40でも多くない?なんか古いシステムからそのままフォーマット
持ってきて使っているのでは?どっかにテーブル仕様書アップしてみな。
明日まで暇なんで見てやるよ(親が危篤で田舎に帰ってきたが持ち直した
もんでねぇ。忌引が有給になってしまったい)


正規化するだけがテーブル設計で良いとは限らない
ってのも本当だな

だから注意して見るしかない!
937デフォルトの名無しさん:02/07/15 16:11
どっちかというとたかだか30〜40の列数でエラーになるほうが
おかしくないか?
いま手元にあるテーブルの仕様書見ると余裕で50列とか70列
とかあったりするけど別にエラー起きてないし。
つぅかエラーメッセージは?
939デフォルトの名無しさん:02/07/16 00:15
>>932
出力後のカラム名が、例えば「DECODE ( name, NULL, 'ななし', ・・・・・・ )」と長い文字に
なった場合エラーになることがあります。
SELECT ながーーーいカラム名 AS a FROM table
とかにすれば解決。

ところで、MicrosoftAccess2002のSQLで
大文字小文字を区別するのってどうやるの?
SELECT name FROM table WHERE name = 'nanashi'
で、nanashiはヒットさせたいが、NANASHIはヒットさせたくない
>>939
テーブルの列が多いのでは無くてSQL文が長いだけではない?
Viewを作るか集計用のテーブルを作っておくか考えたらどう?

941デフォルトの名無しさん:02/07/16 22:45
agetageyou
果たしてこのスレにPart2はあるのだろうか?
943KYO:02/07/21 03:15
はじめまして。
SQLでつまってます。

select * from 受注テーブル where 受注番号 in (select 受注番号 from 受注テーブル where 商品コード='S001');

これを実行するとエラーになるんですが・・・
ちなみにWHERE句で書くと、同じ受注番号を持つ(ユニークキーではないので)ほかのデータが
表示されないのでだめなんです。
どうか助けてください。
>>943
とりあえずエラーメッセージくらい書けや
>>943
なんでサブクエリにしてるのだ?
inの中だけでいいんちゃう?
>>943
select * from 受注テーブル where 受注番号 in
(select 受注番号 from 受注テーブル 受注テーブル2 where 受注テーブル2.商品コード='S001');

かな。あと、Oracleだったらテーブル名、カラム名をダブルコーテーションで囲む。
エラーメッセージがないからなあ。カーソルを使ってないで複数行帰ってきた、とか言ったら頃す(w

>>945
受注番号がユニークでない(明細行があるのかな?)って言ってるから外れだよな。
947通りすがりの人。:02/07/21 15:54
>>943

ちょっと脱線。
このSQLと何が違うの?

select * from 受注テーブル
where 商品コード='S001';

948943:02/07/21 17:03
>>946
なんで違うのだ?>>947と同じ意味合いなんだが

>>select * from 受注テーブル where 受注番号 in (select 受注番号 from 受注テーブル where 商品コード='S001');

>>946でも良いのだが、普通書き換えるなら
select a.* from 受注テーブル as a , 受注テーブル as b where a.受注番号 = b.受注番号 and b.商品コード='S001';
でもいけるはずだ!しかし意味無いので
>>947と一緒でいけると思うが?
949944:02/07/22 05:29
>>945 >>947
おまえらエロビデオのモザイクの中を想像する訓練が必要だな。

受注番号 商品コード
001     S001
001     S031

こーいうテーブルがあったら、おまえらのSQLじゃ1行目しか
検索条件に該当しないだろうが。
943は1行目と2行目を両方検索したいと逝ってるんだよ。

というか、943はさっさと詳細情報(エラーメッセージ、テーブル構造、etc..)を晒せ!!
気になるじゃねーかよ。
>>946
group byくらい使おうや
>>943
特にそのSQLは間違っていない。
使ってるDBは多分、サブクエリの使えないMySQL
じゃないのか?
MySQLなら、
>>948
select a.*
from 受注テーブル as a , 受注テーブル as b
where a.受注番号 = b.受注番号 and b.商品コード='S001';
で正解のはずだ。
>>948は何故か意味が無いと言っているが)
これはきちんと>>943のSQLが期待する結果セット
を返す。
952通りすがりの人。:02/07/23 01:05
>>949
ア、ナ〜ルほど。

失礼。失礼。
ミニモミ。でハァハァしてきますわ。
953948:02/07/23 08:33
>>951
>>select a.*
>>from 受注テーブル as a , 受注テーブル as b
>>where a.受注番号 = b.受注番号 and b.商品コード='S001';
>>で正解のはずだ。

受注番号がユニークで無ければダメだな
きっと2件あったら4件でて来てしまうな
>>953
厳密には受注番号だけでなく
受注番号+商品番号でユニークの時に
重複検索されるのだが、
その場合は、distinctを付け加えれば
回避できる。

テーブルt1
C1 C2 C3  C4
10 1 S100 あああ
10 2 S101 いいい
20 2 S100 えええ
20 3 S100 けけけ
30 1 S103 かかか

select distinct a.*
from t1 as a ,t1 as b
where a.c1 = b.c1 and
b.c3 = 'S100'
でお望みの
C1 C2  C3  C4
10 1  S100 あああ
10 2  S101 いいい
20 2  S100 えええ
20 3  S100 けけけ
が検索される。
今、accessとDB2(という鬱DB)
しかないので悪いが、どちらも
確認済。
955954:02/07/23 10:00
s/ユニークの時に/ユニークでなければ
956超弩級初心者:02/07/23 12:15
OracleからPostgresへの移植で詰まってます。

UPDATE TABLE SET SEQ = DECODE(SEQ, 2, 1, 1, 2)
WHERE ID1 = 10 AND ID2 = 100 AND SEQ IN (2,1)

ID1, ID2, SEQがユニークキーに指定されており、上記はOracleにて
SEQの1と2を入れ替えるためのSQLです。

Postgres(7.2.1)用に以下の通り書き換えました。

UPDATE TABLE SET SEQ = (CASE WHEN SEQ=2 THEN 1 WHEN SEQ=1 THEN 2 END)
WHERE ID1 = 10 AND ID2 = 100 AND SEQ IN (2,1)

しかし、「Cannot insert a duplicate key into unique index」とお叱りを受けました。
値が同時に入れ替えられず、「ユニークキーは重複できませんぜ、ダンナ」と言われているような感じです。

これを回避するにはどのようなSQLを書けばいいでしょうか?
私の頭では、SQLを3回に分けるといった非効率なものしか思い浮かびません。
どなたかエレガントなSQLをご教示くださいませ。
SELECT コーン
FROM うんこ
WHERE 食DATE=( CurrentDate( ) - Day(1) )
958デフォルトの名無しさん:02/07/26 23:07
ある抽出条件(条件1)ででてきたレコード群に対し、さらに抽出条件(条件2)を
課すにはどうすればいいですか?

select * from (select * from TBL1 where 条件1) where 条件2

等と言った感じにするのですか?
select * from TBL1
where 条件1 『and』 条件2
Postgresで試したのですけど、トリガーを使用するとき、
ユーザZでTable Aに更新かけられたとき、Table Bを更新するようなトリガーで
Table Bに更新権限がないってエラーになるんですけど、
Table Bに更新権限与えないとだめですか?
そういうもんですか?
Table Bに更新権限与えないでやる方法ないですかね?
961960:02/07/28 02:21
だめかしら?
>>960
postgresは触ったことがないが、
この手の(隠蔽させる)方法として、
直接更新できないテーブルに対して
更新ストアドプロシージャを作成し、
そのストアドプロシージャに
更新させたいユーザに実行権限を
付与することで対応できると思う。
963一緒に考えてくさい:02/07/28 14:51
SQLでBank Of England(方式)で為替の持高を算出したいと思っています。

条件分岐というのでしょうか?大きいほうの値を採用する方法と
from文のサブクエリを二つ平行につかう点が難点かと考えています。

後者くらいはうまくいきそうな気がするんですが、いまのところうまくいってません。
データベースはオラクルです。

具体的には…

データの格納されているテーブル
通貨   数量
USD 1000
EUR 500
EUR -1100
USD -800
USD 200
これを通貨毎・符号毎に集計して
A. select 通貨, sum(数量) from テーブル group by 通貨 having sum(数量)<0
B. select 通貨, sum(数量) from テーブル group by 通貨 having sum(数量)>0

通貨毎に絶対値の大きい符号の側を採用して、それらを合計する
select 最大値( abs( A.sum( 数量)), abs( B.sum( 数量))) from A, B where A.通貨 = b.通貨

ほしい結果は2300

あるファイルのアクセス履歴を取っているんですが、
過去にアクセスがなくその日初めてアクセスがあったユーザーの人数を知りたいんです。

1日 Aさん
2日 Bさん、Cさん
3日 Aさん、Dさん
4日 Aさん、Bさん、Cさん、Dさん

SQL文実行↓

1日 1人
2日 2人
3日 1人
4日 0人

かなり悩んでます。2ヶ月くらい
965デフォルトの名無しさん:02/07/30 20:23
>>964

テーブルをALOGレコードを
DAY MEMBER
1 A
2 B
2 C
3 A
3 D
4 A
4 B
4 C
4 D
だとしたら

SELECT DAY, COUNT(*) FROM
(SELECT MIN(DAY) DAY, MEMBER FROM ALOG GROUP BY MENBER) SALOG
GROUP BY DAY.
でどうかな

>>963
Bank Of England方式ってなに?
サンプルデータ、どこをどう足しても2300にならないのだけど?
966デフォルトの名無しさん:02/07/30 21:09
Ωは?
967デフォルトの名無しさん:02/07/30 23:14
965>>
当初、私もMIN関数を使っていたのですが
データの件数のせいかもしれませんが
すべてのユーザーについて、MIN関数を使うとべらぼうに遅いです。

最小である必要はなく、過去にユーザーデータがあるかどうかをみて
あった時点でそのデータは数えない。

これですべての行を調べなくてもすむんじゃないかと思うのですが、
実際にSQLを書こうとすると、どう書いていいのか分からないのです。
968デフォルトの名無しさん:02/07/31 21:35
このスレまだあったんだ。
2getしようとしてやめた記憶がある。
懐かしい。
これ次スレ立てる必要ある?
こっちに統合しちゃっていいような気がする
http://pc3.2ch.net/test/read.cgi/tech/1020158297/l50
>>967
普通のRDBMSでは「数えない」なんて事が無理な以上、あなたの希望する事は無理。
971デフォルトの名無しさん:02/08/01 00:18
すみません、教えてください!!!
Oracleで、2つのテーブル間の差分更新をしたいと考えています。
具体的には、

テーブルfoo
ID C1 C2  C3
0 あ 111 AAAA
1 い 222 BBBB
2 う 333 CCCC
3 え 444 DDDD

テーブルbar (更新される側)
ID C1 C2  C3  C4
0 あ 111 AAAA あああ
1 い 222 BBBB いいい
2 う 888 CCCC ううう
3 え 999 DDDD えええ
(実際は、片方はDBリンクしているテーブルなので、こんな変な構造
なのです)

とあった場合、それぞれの行でC1,C2,C3を比較して、異なっている行
(例ではID=2,3)の値を、foo側の値で更新したいのです。

よろしくお願いします。
>>967
「ユーザが見つかった時点で処理終了 (次のユーザ処理へ)」 みたいなのは、SQLじゃ無理でないですか?
漏れはそういったSQL記述ができるRDBMS知らないです。 あるのかな?
RPGとかCOBOLなら書けますが、もしかしたら >>965さん のSQLの方が速いかも。
>>971
試してないけど

update bar(bar.ID, bar.C1,bar.C2,bar.C3) values(select foo.ID, foo.C1, foo.C2, foo.C3
                        from foo, bar
                        where foo.ID = bar.ID and
                           (foo.C1 != bar.C1 or
                           foo.C2 != bar.C2 or
                           foo.C3 != bar.C3)) temp
where bar.ID = temp.ID

って、どうだろう?
是非とも結果を希望!
>>976
そーいう時のためにストアドプロシージャという物がある。
OracleならPL/SQL、SQLサバならT-SQL

っていうか、group byで激遅なのはINDEXが
きちんと使えていない証拠。
(または、使えるINDEXが無い)
きちんと実行計画見たか?
RDBは何使ってる?バージョンは?
975971:02/08/01 01:23
>>973
さんくす!
temp以下は思い浮かびませんでした。
今手元に環境がないので、明日早速やってみて
結果書きます。(このスレ残ってるかな?)
976973:02/08/01 01:29
>>975
いくら何でも消えることはありえないだろうて。
「スレッド一覧はこちら」というとこクリックすれば絶対にある。
#実は俺も2chきて数ヶ月知らなかった・・・・(恥
>>972
レス、ありがとうございます。
実はPHPをつかってデータベースと接続しているのですが、
IEの設定により、タイムアウトが5分に設定されています。
5分間レスポンスがないと、「サーバに接続できませんでした」と
表示されるのです。レジストリの変更により、この設定は変えられるのですが、
すべてのPCのレジストリを変更するのも大変だし、
実行するSQLも変動するので、あらかじめ作成しておくこともできません。
出力ページをリフレッシュすることで回避できるかもしれないので、
試してみます。


978971:02/08/01 14:47
できました!!!
update (select foo.C1 foo_C1,foo.C2 foo_C2,foo.C3 foo_C3,
        bar.C1 bar_C1,bar.C2 bar_C2,bar.C3 bar_C3,
        foo.ID foo_ID,bar.ID bar_ID
    from foo,bar
    where foo.ID = bar.ID and
       foo.C1 <> foo.C1 or foo.C2 <> foo.C2 or foo.C3 <> foo.C3 ) temp
   set bar_C1 = foo_C1,bar_C2 = foo_C2,bar_C3 = foo_C3
   where foo_ID = bar_ID;
だと、
『ORA-01779: 複数表にマップする列を変更できません』
でしたが、
UPDATE bar test
   SET (C1,C2,C3) =
     (SELECT C1,C2,C3
      FROM foo
      WHERE ID = test.ID AND
        (C1 <> test.C1 OR
         C2 <> test.C2 OR
         C3 <> test.C3 ))
  WHERE ID IN (
        SELECT foo.ID
        FROM foo,bar
        WHERE foo.ID = bar.ID and
           (foo.C1 <> bar.C1 OR
           foo.C2 <> bar.C2 OR
           foo.C3 <> bar.C3 ));
でうまくいきました。
979973:02/08/03 01:47
>>978
うまくいって、よかったね。
というか、おれはなんというSQL文を書いていたのだろうか。
INSERT文とUPDATE文が混ざってるよ。。。。。
マジ、寝ぼけるのもほどがある。
鬱・・・
980デフォルトの名無しさん:02/08/05 22:55
質問なんですが、

INTO :HAF.共通部.削除不可フラグ,
:HAF.共通部.システム日,
FROM HAFRDB.HAFTBL

という文があるのですが、この「:」は何を意味しているのでしょうか?
また、

WHERE 会社コード = :HAF.キー部.会社コード
AND 業務キー = :H業務キー

なんてのもあります。
参考書やネットで調べてみたのですが、わかりません…
どなたか教えてください。お願いしますm(_ _)m
>>963
よく解らんけど

select sum(数量)
from (
select 通貨,max(abs(数量)) 数量
from tbl
group by 通貨
)

じゃだめ?

>>964
Oracleは

select 日付,count(*)
from tbl a
where
not exists (
select *
from tbl b
where
b.名前 = a.名前 and
b.日付 < a.日付
)
group by 日付

とやった時は数えてないっぽいんだけど、一時表作るのと結合、
どっちが速いかってのは微妙だなぁ。>>965のが速い気がする。

>>978
DBリンク越しに結合すると強烈に遅いことが有るんで、全体に
占める更新対象の割合が小さい時は、絞込みに集合演算子使う
いいかも。
Oracle8です
数値項目で値がNullの場合、自動的にゼロを取得するようにするには
どうしたら良いのでしょうか。
よろしくお願いします。
983デフォルトの名無しさん:02/08/06 12:14
>>969
扱ってる内容が結構差別化されてるから分かれてた方がいいと思う。
というわけで誰か次スレ立てて〜
こっちと統合するんじゃないの?どうせ住み分けできてないし。
データベース Part2
http://pc3.2ch.net/test/read.cgi/tech/1020158297/
>>982
NVL
986982:02/08/06 13:26
>>985 ありがとうございます!
住み分けちゃんとできてるじゃん。たまにスレ違い質問が出るのはどこも一緒だし。
向こうの内容は自分的には必要無いから統合したら読みにくくなりそうだな。
>>987
むしろ製品固有スレにブランチを希望するのだが。
現存するスレ:PostgreSQL, MySQL, Interbase(Firebird), Access
建立してない:Oracle, MSSQLServer(MSDE), DB/2

結局、SQLゆうても標準SQL(ANSI SQL/92か?)に基づいているわけではないし。
製品固有のキツイ方言混じりのSQL文見せられてもなぁ、って想いがあるわけで。

# そもそも、ここは宿題の単発質問スレを成り行きで消化してただけじゃない?
まっ、放っておいてもスレ立てたい人が勝手に立てるでしょ
流れにまかせておけばいいんじゃない?
このスレまだ生きてる?
>>988 を訂正

現存するスレ
ORACLE & SQL Server
http://pc3.2ch.net/test/read.cgi/tech/1008908462/l50

ORACLE
http://pc3.2ch.net/test/read.cgi/tech/1010400855/l50

要するに、それなりに名前を聞くDBで個別スレが無いのはDB2だけだと。
もし次スレをたてるやつがいたら、ここら辺の関連スレの
リンクぐらいは張っておいて欲しいなぁ。
992ペーパープラチナ:02/08/07 01:11
1000間近ですな。
993デフォルトの名無しさん:02/08/07 01:15
100000000000000000000 - 10000000000000000000
994デフォルトの名無しさん:02/08/07 01:15
1000
995デフォルトの名無しさん:02/08/07 01:15
1000
996デフォルトの名無しさん:02/08/07 01:15
1000

997デフォルトの名無しさん:02/08/07 01:16
1000
998デフォルトの名無しさん:02/08/07 01:16
1000
 
999デフォルトの名無しさん:02/08/07 01:16
1000


1000デフォルトの名無しさん:02/08/07 01:17
1000!!!!            
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。