データーベースのテストが水曜日にあります。 全くのチンプンカンプンで問題の意味すらわかりません・・ 門題は「単価が30000円以上で40000円以下の商品名と単価を 表示する命令」です!!これをSQL文にして欲しいのですが・・
シネ
between あたりを調べろ。
1は門題児です。
そんな単位、落としてしまえ! 来年もう一度頑張って、しっかり実力をつけなければ 学校に逝っている意味なんざねぇんだよ!
>>1 「して欲しいのですが」→「したいのですが」なら助けてやってもよかった。
もうダメ。
select 色 from うんこ;
drop table 商品マスター;
学校はわかる人中心に授業進めているんです・・ 私はちょー初心者で入学したからSQL言語って言われても? って感じなんです・・・ 一応、他の問題は何とかなりそうなんですけど、この問題は ムリなんです!! お願いします。何方かちゃんと教えて下さい!!
11 :
デフォルトの名無しさん :01/09/10 21:26
>>1 どんな教科書を使っているのか書け。 テスト前に問題がわかっているのは不思議だ。友達の答えをコピーしたほうが早いぞ。
マジレス。教官にわかるまで教えを乞え。
>>10 遅いんだバーカ
■■■■■■■■■■■■■■■■ 終 了 ■■■■■■■■■■■■■■■■
>>1 ふーん。明日『入門SQL』買ってきて読めば?
>>11 アイ・ティ・フロンティアの「データーベースソフトの活用」です。
この問題は教官オリジナルの問題なのですが、なぜこの問題が
テストの出るとわかったかと言うと、学校がドキュソなので
教官が出る問題を教えてくれたからです。
ちなみに友達も私同様、わからないみたいです・・
15 :
デフォルトの名無しさん :01/09/10 21:53
みんな、教えてやれよ!
荒らしたり煽ったりしたら
プログラム板のイメージが悪くなるだろっ!
えっお前が答えろって?
僕は
>>1 が言ってる意味がよくわからないんで答えないんです。
3で終わってる気もするが門題って変換どうやったのかの方が気になる
せめて
>>3 のキーワードを
>>14 の教科書とかで調べて、
わかったことを踏まえて質問しなおせばいいジャン
>>14
18 :
デフォルトの名無しさん :01/09/10 22:22
これで合ってるのかな SELECT 商品名, 単価 FROM Table WHERE (((値段)>30000 And (値段)<40000));
19 :
デフォルトの名無しさん :01/09/10 22:28
>>18 ありがとうございます!!助かりました〜☆
くだらない質問してすいませんでした・・
>>19 私ではありません・・
明日も違う科目のテストがあるので今日はもう寝ます。
ちなみに明日の科目は「Access」とシスアドです・・
21 :
まあまちなさい :01/09/10 22:40
違ってるね。
質問が普通でつまんない もっとネタなのかマジなのかの判断が難しいのが欲しいな
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
と検索される。
簡単すぎてつまらない、と言っているのにこの問題はないん じゃないか?
>>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 おっ、丁度帰ろうかなと思って覗いたら、
即レスありがとう。
ネストしなくても
select *
from テーブル
group by 管理コード
having count(*) > 1
と思ってたけど(一応確認済)、
何かやばい場合あったかな?
↑ group by 会社コード スマソ
>>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書く前に担当者に聞け
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文法準拠だけどね。
なるべくお金掛けたくないので、 フリーの環境を教材にしたいのですが・・・。 Windows/Cygwin環境辺りで 何か良いのがありましたらお願いします。 とりあえず明日参考書を買ってきます。
>>47 PC UNIXは貧乏な構成なら金かからんだろ。
何か1日見なかっただけでカナーリ展開してますね。 私にはサパーリわかりません・・ テスト今日なんですけど自分で考えてみました!! SELECT 単価 FROM 商品表 WHERE 単価 BETWEEN 30000 AND 40000 ですかぁ〜?もうわかりません・・・(涙) 午後からテストなのでまだ時間はあるのでレス下さい!!
シネ
>>43 正解!
しかしそれどころではなくなった。
N.YのWebサーバに繋がらない。
サーバの物理的な設置場所が日本側では
不明なので今調査中であるが、ちょっと
しゃれにならなくなっている。
(不幸中の幸いか担当範囲のN.YのDBサーバは別
だったらしく生きてた。しかしDBよりも動かす人
の方が心配だ。)
52 :
デフォルトの名無しさん :01/09/12 13:20
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 未確認だよ〜ん
結局、テストは記号で選択問題だったから多分出来ていたと思います!!
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で気の利いた入門書/入門サイトってありますか?
>>66 まあ、現時点ではSQLの方言があるので、しかたないでしょう。
>レコード絞込みの条件と結合の条件を両方 Where句に書いて
>評価順序 保証されるの?
保証されないし、順序が違っても問題ないのでは。
SQLの実行計画立てるときに、索引やデータ量によって異なる
順序で実行されるでしょうが、結果は同じでしょう。 きっと
>>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書いちゃいけないっていう意見もあるけど、
書けてしまう & 予期せぬ結果をもたらす ってのは問題かと。
>>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
>>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)
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]
)
id は予約語じゃないから、括弧いらないやね。 あとテーブル名も t じゃなくて t1 だね。 間違いだらけでスマン。
>>78 ダブルクォーテーションかな?
後で調べてみるね。
>>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
テーブル名、項目名は日本語がいい。 読みやすいし、予約語ともぶつからない。 (反対する人、多いと思うけど)
自分でつけたテーブル名じゃないんでどうしようもないんですよ。 厨房な質問でスマソ。
スマン。
>>82 =85
>>78 にも書いてるけど T-SQL ならカギ括弧付ければ逝ける。
SQL/92では定義されてないので、DBMS依存なんだと思う…。
>>80 のいうダブルクォーテーションは T-SQL ではダメだった。
>>84 激しく同意。
片手に印刷した対応表( EmpCode … 社員コード, Sales … 売上 )とか
持ってる人見るととても痛い。はじめから、「社員コード」、「売上」って
列名にしとけばいいのに。
thanx!!
>>87 ログにあったのね。
それくらい読めよ>俺
逝ってきます。
89 :
デフォルトの名無しさん :01/09/14 06:19
SQLでゲーム作れますか?
ゲーム作れるよ
>>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
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 ちゅうがくせい
発見!
寝ましょうね。明日のために
久しぶりにこのスレ見たケド、何かすごいですね・・ 私には何の事だかチンプンカンプン・・ 試験は何とか不可にはならなかったので安心しているところです。
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 )
下記のようなテーブルで特定の商品コードのレコードのうち、納品日時 が最新のもののコメントが取得したいんです。 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
>>112 レスありがとうです
たしかに取得したレコード全部使う必要はないですね。
ただソートするレコードが多いときは遅くなったりしませんか?
インデックス使えばいいんでしょうか、、、
DBMSの呼出時間を考えなければカーソルで全部のレコード見て
最大を取り出してもあまり変わらない?
>>111 SELECT コメント FROM 納品履歴 WHERE 商品コード='12345'
GROUP BY 商品コード HAVING 納品日時=MAX(納品日時)
ではどう?
>>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 商品コード; 先頭っていうのは確か先頭の行を取得する集合関数があったはず。
一行のSELECT文で結果を複数行持ってくる時に、 無条件に最初に引っ張ってきたレコードのみを 結果として受け取る方法はありますか? set rowcount 1 は使ってはいけないんです。TT
119 :
デフォルトの名無しさん :01/09/21 18:05
>>118 それなら
素直にカーソル使うしかないんじゃないかな。
なんでset rowcount使っちゃいけないの?
また0に戻せばいいじゃん。
自己解決。 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でも引っかからないなぁ・・・
どっかのベンダーの方言かな?
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しか触った事無いんで、間違ったらスマソ
>122 技術評論社「はじめてのSQL」
130 :
デフォルトの名無しさん :01/10/16 18:01
131 :
デフォルトの名無しさん :01/10/16 18:56
完全外結合って実現できているデータベースってあるの?
132 :
デフォルトの名無しさん :01/10/24 02:31
>>131 >完全外結合って実現できているデータベース
って何ですか?
全部の項目にFKでも張ってあるってこと?
>>128 すっかりあきらめて遅いままほっといてたよ!
ありがとう!勉強になったよ!
>>131 SQL ServerとPostgreSQLにはFULL OUTER JOINというキーワードがあるね。
SQL92準拠の振る舞いをするかどうかは知らない。
>>132 LEFT OUTER JOINとRIGHT OUTER JOINをUNIONしたようなもの。
>>134 >LEFT OUTER JOINとRIGHT OUTER JOINをUNIONしたようなもの。
ふんふん。勉強してみます。ありがとうございます!
(最後の「〜をUNIONしたようなもの。」のイメージがわかんないなー。)
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の名称と、'年月表示'列の型を書いてくれ。
お騒がせしました。 「.」 が式の中に紛れてました。 すいません。
;
っていうか、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
うちの会社ではエスキュールって呼んでますね
SQLって資格みたいのものは有るんですか?
習うより慣れろ。
152 :
デフォルトの名無しさん :01/10/27 16:14
習うより慣れろ。!
ワらうよりワれろ。
139です。 またまたお助けください。 select文で、表のカラムをbetween文のように、指定範囲で抜き出したい のですが、FORを使って変数を与えて抜き出すことはできますか? その場合はFOR文とselect文をどのように記載したらよいでしょうか?
>>154 まず、使用しているRDBの名称と、プログラミング言語を明記しよう。
それから、OSとミドルウェアを使ってるのならそれもね。
>>155 すいません。使用言語はJava、OSはWin系、RDBはAcsseceです。
それで、servlet内にSQLを組み込みます。
>>156 あー、その環境だと、俺にはアドバイスは出来ないな。
ただ、少なくともJDK(J2SDK)のバージョンくらいは書いたほうが良いと思われる。
>>157 申し訳ありません。JDKは、1.3.02です。が、組み込む以前に、
SQLでのFOR文が良く分かりません。
単独でまず、SQL文にFOR文を利用したいのですが、SQLでのFOR文の記述は
どのようにしたら良いでしょうか?
SQLでのFOR?ストアドプロシージャを使いたいの? でもDBはアクセスだって言ってるしな… もう少し具体的に、というか知りたいことを限定して書いたら?
>>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で解決出来そうなカンジ。
>>デフォルトの名無しさん様 有難うございます。が、テーブルの定義は何を書けば良いでしょうか? テーブル名 各月データ SQLサーバーです。 ごめんなさいよろしくお願いします。
>>162 おいおい、Accessじゃなかったのか?とかいう話はおいといて。
テーブルの定義は、
テーブル名:各月データ
カラム:
月 char
日 char
データ varchar
とか書けばよい。
>>デフォルトの名無しさん様 早速のご返事有難うございます。神様のような方です。感激です。 テーブル名:各月データ カラム名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 大物相手だな。がむばって教育して下さい。
>>デフォルトの名無しさん様 すいません。 カラム名が本当に「時間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 カーソル変数を引数に取るストアードプロシージャの話です。
>>デフォルトの名無しさん様 凄い事を聞いて申し訳ありません。 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 これは正規化以前の問題だな。
もしかして今回の話題の他にカラムがあって 実際には45ぐらいあるってこと? 時間nのカラムは31まであり それぞれ 取得年月日が2000-10-20ならば 時間1・・・10月20日 時間2・・・10月21日 ・・・ 時間31・・・11月19日 のデータということか?
おはようございます。本日もよろしくお願いします。
>>179 有難うございます。そうなんです。不必要なカラムが多いので
実際に抽出するのは、45のカラムのうち33カラムです。
>>178 すいません。データ=セル内のDATAと理解してました。
カラム名
時間1……時間31 セル内の値は(100.00 float型 )
取得年月 セル内は、全て表示は 2000-10-20 00:00:00ですが文字列(chara型)です。
シロート もういいから 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で値を取得すれば良い。 >本日もよろしくお願いします。 ふざけんな。
多分、あんたには分からんかもしれんから もう一度詳しく質問を書く。 各月データというテーブルの 時間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日 ” のデータということか? これでちんぷんかんぷんの回答だったら ネタとみなす。
>>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なんて 英単語わかれば簡単なわけよ
やっとスタートラインに立ったな。 時間とは勤務時間のことだろ。 やりたいことは、 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はできるんだろ?
スマソ 時間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だから) だった。。。
>>186 お疲れ。
シロート君はわかってくれてるのかな。
前にも書いたけど、付け加えるとするなら、開始年月日と期間に
よって、必要となるレコードが1レコードか、あるいは複数レコード
になる。
この「何レコード検索しなければならないのか」というのもJava側
のロジックで組まなければならない。
>>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;あ
>>188 ホントにそれでいいのか?って疑問はあるのだが、
本人が納得してるんだからそれでいいのだろう。
がむばれ。
>>189 仕様が曖昧。
日付1が2001-01-31だった場合は?
日付1が2001-11-30だった場合は?
>>192 申し訳ありません。
それについては、ADD_DATE("2001-01-31", INTERVAL 3 MONTH) などで
出る値、つまり、2001-04-30 を想定しています。
あと、レコードに登録されている日付はCURDATE()より
前であることが保証されています。
すみません、ADD_DATE じゃなくて DATE_ADD ですね。
>>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に質問を投げたほうがイイ
>>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 です。 皆様はこういう処理どうやってますか?
>>204 HTML内の特殊タグ内にSQL文1行だけ書いておくと、あとはフレームワークが
整形して出力してくれたりするので、できればロジック入れたくなかったので
す。
やはりあきらめてSession間で有効なオブジェクトに記憶させときます。
みなさまどうも。
206 :
デフォルトの名無しさん :01/11/05 21:15
>205 ああ、なるほど。 <!-SELECT * FROM なんとか> とかやると勝手にテーブルにしてくれるようなヤツですな。 確かにあれは便利。 T-SQLバリバリのストアドプロシージャ作ってやるとか・・・ それにしてもページごとにSQL発行するのと セッションオブジェクトに格納するのではどっちが重いのですかねえ。 あんまりセッションオブジェクトにデータを突っ込むと IISのメモリ食ってしょうがないっす。 セッションオブジェクトってなかなか消滅しないもんで・・・
>>206 HTTPは基本的にステートレスなプロトコルだし、ダイレクトに
ページに飛んでくる場合も考えると、ページごとに検索した
ほうがいいと思う。
ページ遷移を強制して、セッションオブジェクトを使っても、
次のページにアクセスするとは限らないしね。
208 :
204、206 :01/11/06 00:37
>207 せっかくセッションオブジェクトを用意しても 次のページ見てくれないとそれが無駄になるという・・・ だいたいちゃんとログアウトする奴なんぞおらんからのお ゴミセッションオブジェクトがどんどん増えていくという・・・鬱。 助けてガベージコレクタ!
Oracle8.1.6使ってるんですがSQLでテーブルの列数(項目数)を 取ってくる命令はないですか?
SELECT count(*) FROM ALL_TAB_COLUMNS A WHERE A.TABLE_NAME='テーブル名' AND A.OWNER='オーナー名' で持ってこれる。 もしかしたら専用ファンクション あるかもしれんけど、これで ファンクションを作ってもいいと思う。
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)とかでは取ってこれないのでしょうか?
>>211 列に別名を付ければ、通常の列と同じ方法で取得できる。
例えば"cnt"という名前にしたいのだったら、"as cnt"を追加する。
SQL = "select count(*) as cnt from ALL_TAB_COLUMNS A where A.TABLE_NAME = 'テーブル名'"
最初から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)
で支障がなければそれでかまわない。
もっと自分が最終的にしたいこと(ゴール)を
書かないと、回答がが無用になる可能性もあるから
注意しろよ。
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
>>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の環境なら通る。
select data1, data2 select sum(data2) の間違い(自爆) 何故一度で取らないといけないのかを聞きたかっただけ。 UNIONはソートが入るから遅い。
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です。 書き忘れました。申し訳ない・・・
>>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とかまで書かないと。
>>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さんのやり方で出来ました。 ありがとうございます! 並びに助言くれた皆様ありがとうございます! でも、帰れない。 量が多すぎる・・・
232 :
216です :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関数って使ったことないな。
'ゴラァ' || 'ごらぁ'
が普通かと。
>>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 プロパティを使用できません。
途中でボタンおしちまった 解説 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 使えないようです
>>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
SELECT distinct colA FROM tableABC の結果のようなテーブルに修正したいのです。 colAの値が重複している部分を削除して1行にしたいのです。 しかし、colBの値は気にしません。
重複して入ってる時点で屑とか思うの俺だけ?
漏れも思います。 郵○省の7桁郵便番号データなのですが…。
こんばんは。ikuです。 データを処理した日付をUDATEというフィールドへ下記の様に 入れてあげたいのですが 上手くいかないんです。 どうやれば上手くその日の日付がフィールドに更新されるのか 教えて下さい。(T□T) strSQL = "UPDATE D_PSMAN "; strSQL += "SET UDATE = 'Date(),";
>>253 みたことあるわ。
役人の作ったもんなんて、そんなもんだったよな。
テーブルにつっこむ前にperlかなにかで処理してあげるか、
カーソルループでも作ってうまく処理してやれ。
>>255 その方法わかりません。。ポインタだけでもお願いします。。
>>251 SQL一発では無理でしょう。ストアドプロシージャでも作るしかない
んじゃないか?
258 :
デフォルトの名無しさん :01/12/05 18:02
Sybaseよくしらんけど、内部selectとかつかえば一文でもできそうな気がするね。 Oracle/SQL Serverむけのなら、書こうと思えば書けるよ。 どっちかというとSQL Serverのと煮てるんだっけ?
>>258 はい。SQL Server系です。
といいますか、SQL Serverがsybase系です。。
自己解決しました。 DELETE FROM tableABC WHERE tableABC.colB NOT IN ( SELECT MIN(y.colB) FROM tableABC AS y WHERE y.colA = tableABC.colA ) (別板にてご教授いただきました…)
↑名前間違えました。。。 誤 - 257 正 - 259
>>260 大体あってるが、NULLの含まれるレコードに注意しな。
NULLを許していないならOK、気にしないでくれ。
>254 ネタ?
>>263 はい,質問です。
SQL文で更新する時に日付をUDATEというフィールドに
書き込みたいのですが・・・・・・
SYSDATEとか聞いたことない?
>>260 colA+colBでユニークなんですね。そうでなければまずいですよね?
>>264 使ってるRDBMSと開発環境を明示しましょう。
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は貼ってあるのか?
もちろん貼ってます。
>269 select top 3 monar from (select top 5 monar from Neko order by monar asc) order by monar desc
ところで、みんな、インデックスって「貼る」って表現する? 俺は「張る」。
SQL-Server 7.0なんですけど、 select datepart(hour, 日時) as A, count(*) from テスト group by A だと、列名 'A' は無効です。と叱られます。 group by にはいちいちdatepart(hour, 日時)と指定する必要が あるのでしょうか?
SQL-Server は知らんが group by 1 とかはできんのか?
あるんじゃない?
>>277 実はGROUP BY 1は怒られます。ORDER BY 1は怒られないのです。
いけてねーDBだよ・・・
こんなテーブルがあります。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文成功するはず。 テーブル見てるとそうじゃないようだが。
282 :
yayoi :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
すみません。質問なのですが、テーブルにまったく同じデータが複数件あって、 その中の1件だけUPDATEしたいのですが、どうすればよいですか? これわからないと、明日も残業なんです〜。
oidキーを使う。
>>297 >テーブルにまったく同じデータが複数件あって、
>その中の1件だけUPDATEしたいのですが
ORACLEだったらROWID指定すればいいんじゃない。
300 :
デフォルトの名無しさん :01/12/28 18:20
それ以前に、>297のDB構造って大丈夫か?って事がムチャ気になる。 単なる一時テーブルだったらまだ許せるが...
301 :
デフォルトの名無しさん :01/12/28 18:24
>>297 delete from テーブル名 where current of カーソル名;
これでできるかな
>>299 SQLサーバーでした。スミマセン…
>>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>
こら〜!! 真似して荒らすな!!
311 :
デフォルトの名無しさん :02/01/05 17:53
これからSQLの勉強を独学でしようかと思っているのですが、やっぱり学校とかで 学んだ方がいいと思いますか?家ではオラクルやSQLサーバー(個人で買うには高 い)がないので、実習ができないし・・・。 それとSQLって将来大丈夫ですか? COBOLみたいになったらちょっと・・・・
SQLで喰いたいのか (いや馬鹿にする訳では無いが 取り合えず本買ってフリーのDB叩いてみれば
313 :
デフォルトの名無しさん :02/01/05 18:49
314 :
デフォルトの名無しさん :02/01/05 18:55
315 :
デフォルトの名無しさん :02/01/05 21:26
316 :
デフォルトの名無しさん :02/01/05 22:17
>>315 そのSE、たぶんクソSEだ。
単一のベンダーを拠り所とするヤツって、思想的にダメ。
317 :
デフォルトの名無しさん :02/01/05 22:19
>>314 WebObjectsとRDBの連携って、どうなってんの?
SQLは書かないのか?
きょうびJDBC経由だったら、resultset作ってSQLぶん投げてるだろ。
つーかそれが普通。EJBだって結局はSQL書いてるよ。
>>317 知らないくせにえらそうだな。
WebObjects触ったら腰抜かすぞ!
SQLなんていらねーよ
>>311 Forte for java 3.0 CEとか入れるとPointBaseの機能限定版がついてくる。
SQLのドキュメント(英語)もついてきて、Javaとセットで勉強できるよ。
Javaいらん・・・?それはスマソ。
>>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)
>>323 ありがとうございます。
でもこれはfooがソートされていないと駄目なんですね。
fooもbarも特にソートされていない場合によい方法はないでしょうか?
それとfoo列とbar列を1つではなく2つ以上ずらすことも可能なものをできればお願い致します。
>>314 適材適所でしょ。
扱うデータが少なければオブジェクトも良し。
326 :
デフォルトの名無しさん :02/01/07 13:24
>>324 やりたい意味がよくわからんが、どうしてそんなことしたいの?
普通に全部取り出して、ロジックで処理したらだめなの?
SQLでは、シーケンスが保証されていないRDBMSを前提にしているから
基本的に「順番」という概念はない。
RDBMSに依存してもいいなら、出きるかもしれない。(出来ないかもしれない)
っつか、よく読んだらIDってのがあるのね。あほなこと言いました。
>>324 SELECT A.FOO, B.BAR
FROM TABLE1 AS A, TABLE1 AS B
WHERE A.ID = B.ID - 1;
英語を理解してればSQLほど簡単なもんはネェ。
SQLServerでoracleの「DESC」に相当するコマンドはあるのでしょうか(・・?
>>331 sp_columns<綴りあってるか?
333 :
デフォルトの名無しさん :02/01/10 10:04
SQLの仕様書ってどこで手に入るですか?
>>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? データが有るって事は既存システム?
>>347 Σ(゚д゚lll)ガーン
>>348 DAOの既存システムをADOで作り直すのでありんす。
>>345 ORACLEでいったら、rownum見たいなもんね! わしも知りたい
いつも一度ワークテーブルに
シーケンスを付けてやってる
結構面倒だ
>>350 あんたすごいよ。
ためしにrownum使ったら連番が振られたよ。
ありがとね。
以前、順序.nextval を埋め込む方法を取ろうとしたけど、初期化が面倒でやめた。
あっ 私は通りすがりの 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の考え方としては参考になると思うけど、実務で使うと えらい事になるかもしれない。
>>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の講習会行くと
アメリカ人講師はシィクルサーバと発音してるよ
えすきゅーえるって発音がめんどくちゃいからかなぁ それにしても仕様書…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;
>>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 のサブクエリーと関係ありますか?
>>382 とりあえずツッコミですが
ISOの書き方もサポートしてるはずです
OUTER JOINくらい知ってますがな
普段使い慣れてないので資料見ないと
構文をしっかり憶えてないだけ
ちゅーか批判するなら標準で書き直せちゅーねん
>>384 外部結合から勉強しましょうね!
例から説明すると
40|BB|(Null)
があるから外部結合にしてみました
>382 ぎゃくに標準のSQLしか使えないDBMSって...(w
できました!
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
>>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はユニークとする。
>>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との違いも教えテホスィー。
399 :
SQLビギナー :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
あら、何でおいらが文句言われるんだ? Oracleは (RIGHT OR LEFT)OUTER JOIN ON TABLENAME の構文をつかえないみたいだよ。(+)だけ。 外部結合の機能はちゃんとあるんだから、たんにSQL パーサだけ拡張すればいいだけだと思うんだが、何で サポートしてくれないんだろ?
>>401 ちょっとやってみたんですが、Oracle ではうまく行きそうな感じです。
ありがとうございました。
404 :
デフォルトの名無しさん :02/02/01 01:46
>>400 >
>>397 >オラクルマスターはDBの知識でSQLの勉強は関係ないヨ
>役には立つと思うけど
397はオラクルシルバーって言ってるので、
もろにSQLの知識の部分を問われるテストだと思われ。
DBの知識(というかオラクルの知識)も触り程度は範囲に入ってるけど。
ただ、高いの個人で受けるのはそんなにお勧めはしないが・・・
シルバー程度ならある意味実務でDBに触れている人ならちょっと
勉強すれば誰でも取れるし。持ってないけど。金が勿体ないから。
>外部結合の機能はちゃんとあるんだから、たんにSQL
>パーサだけ拡張すればいいだけだと思うんだが、何で
むしろ標準規格を(+)にして欲しい。
>>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って需要はあるんですか? 求人とか見ても他の言語に比べるとないような気がするんですが・・・。
おれの仕事はSQLメインですが何か?
>411 業務アプリケーションって言われるのは、たいがいSQLを使用しています 例でいうと、在庫管理・請求管理・ユーザ管理などなど 普通はプログラミング言語+SQLっす だから求人には書かないことが多いと思うっす
>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を使っています。
質問です。 Postgresを使っているのですが WEBでのページャー表示の方法がわかりません 例えば 1のリンクを押すと 1〜10件目の内容が表示 2のリンクを押すと11〜20件目の内容が表示 というようなものです。 参考になるHP等ありましたら教えてください。お願いします。
フェッチ
>422 SQLでは出来ないと思う、ユーティリティかなんかだな パッと考えただけだと、ACCESSでODBCで繋ぎ insert into ・・・ select をする >423 PostgreSQLなら、LIMITとOFFSETだな
426 :
sybase11.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
>426
さいべーすの構文知らないので細かいことはワカランですが
外部結合をみるとよろし
>>380 で限りなく似たのががいしゅつ
>428 ありがとうございます! それと外出ですみませんでした。
>428
>>380 を参考に from句の中に"(select select_list) table_alias"を
書いて試してみたのですが、SYBASEではエラーになってしまいました。
pdfのリファレンスを読んでみたのですが、どうもfrom句の中にselectを
使った仮想テーブル(?)はサポートしていないようです。
他にやり方を知っている方がいましたら教えてください。
431 :
デフォルトの名無しさん :02/02/05 01:51
create viewしてそっからselect。
>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やテンポラリは使わないで実現したいと思っています。 そうも言ってられなくなってきましたけど。(汗)
>432 >できれば明示的にviewやテンポラリは使わないで実現したいと思っています。 これだけだと単なる1行野郎だと思われてしまうので、補足(言い訳) させて頂きますと、テーブル設計しているのが私ではなく(顧客)、 アプリケーションで使用しているテーブルは例えテンポラリだろうと 仕様書に記述しておかなければならないので、この時期にその行程 に戻るというのは手続き上面倒なため、できれば既存のテーブルだけ で実現させたいと考えています。 結局は今頃こんなところでハマっている私のミスなんですけど。(__;
>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 要望が違ったのか?
>>425 やっぱり無理ですか・・・
Accessは使い慣れてないので
TBatchMove使うとか、その辺に
落ち着きそうです。
ありがとうございました。
>>425 >>427 ありがとうございます。
過去ログも一通り見たんですが、検索ワードが分からずに・・・
もうちょいWEB見てみます。ありがとうございました。
>>404 >むしろ標準規格を(+)にして欲しい。
3テーブルあってAB間外部結合 BC間内部結合
のとき結合順序によって結果が変わるので
結合順序を明記できるANSIの
(INNER ,LEFT OUTER,RIGHT OUTER) JOIN
のほうがいいと思うがどうよ。
(+)だって結合順序は明確です!
>434 すみません。 ここにアップしたサンプルはシンプルに説明しようとするあまり 問題の本質まで削ってしまっていました。 結局、434さんが示してくれたようなSQLを複数unionで つないで、それに対してorder byかけることによって目的を 達成できました。ってこれだけ書いても訳わからないですよね(汗) # unionの結果にorder byできることを知らなかったのが回り道の始まり(鬱 自分でもSQLの知識が浅いと思っています。仕事が落ち着いたら ここのスレもじっくり初めから読んでみたいと思います。 アドバイスをくれた皆様、ありがとうございました。
>437 普通DBMSを名乗るものには、ExplainPlan(実行計画)を 見るツールぐらいは有るだろ、そっちの方が明示的に見れるぞ
441 :
デフォルトの名無しさん :02/02/06 10:28
Outer Joinがわかりやすいとか ツールで見るのがいいとか もう、あほかばかかと(中略) おめえらAccessでDrag&Dropで結合しとけ
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でやっていますが、一般的な範囲と言うことで。 あんまり面白くないかな?
いまからSQLの勉強をしようかと思っているのですが,VBとSQLじゃやっぱ時代遅れ ですか?
>>442 有効率のMAXのレコードと可能回数のMAXのレコードをUNION
させただけのような気がするけど・・・違うの?
>>422 有効率の順位と可能回数の順位との平均を出して、基準以下を削除
>443 VBはともかく、SQLは今のところDBやる上で必須なのでやっておいて損は無いでしょう。 とりあえず、どっちもまだまだ現役なので時代遅れって事は無いと思うが。 ただ、いつまでもそれだけだと先が見えている事だけは事実。
>>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 が間違ってる。すいません。
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回持ってくるやり方の方が良いと思うぞ
>>452 の例も間違いだ
ID=4は抽出だろ?
有効率がID5のそれよりも大きい値だぞ。
まぁ、いいや。
SELECT *
FROM table1 t
where not exists
(select * from table1 where (a > t.a and b >t.b) ) ;
>>454 え?452の例だと、ID=4は捨てです。あれ?捨てですよ。明らかに。
すまそ。テストのクエリーをそのまま
貼っちまった。
SELECT *
FROM table1 t
where not exists
(select * from table1 where (有効率 > t.有効率 and 可能回数 >t.可能回数) )
説明は
>>442 の仕様通り
これで仕様を的確に書く必要がわかったろ?
(例が間違ってても、通じるということだ)
>>453 可能回数が全て26だったら、有効率が一番大きいレコードが
欲しいです。
>>454 「a」って?
>457 逆もあるだろ! 有効率が全部おなじ もしくは全部同じちゅーのも考えられるわ
>>455 またまたすまそ。
ID=5の有効率
110.5を100.5とまちがえとった。
でもクエリーはこれでOKよ。
>>456 うっ。すごい(w 多分正解です。きれいだなぁ。感動。
ありがとうございます。
>>453 今自宅なんで、ACCESSしかないんですが、FROM句の構文エラーです
がでちゃいますぅ。
>>458 有効率が同じ場合、可能回数が大きいほうが欲しいです。
全く同じ場合、両方欲しいです。
>457と>461の条件の時は、きびしいでしょ
>>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 はわざわざ悪例を出してくれたといえる。
>463 っていうか、朝一から OUTERだとかINNNERだとか考えてるんっすか? そんなに時間があるなら自分でお調べになった方がはやいのでは?
やっぱり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)が処理系だということに気が付くと、
アプリケーションエンジニアとして、ひとつステップアップしたと
いえるんじゃないかな。(ストアドや高度な結合を使いこなせて、
処理系としてのデータベースを利用できる人だよ)
>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 何を聞きたいのかいまいち分からないが ストアド使うのが一般的かな?
Postgresでランダムにレコードをとりだすことってできないんすか? 今、いったん、件数を数えてから、perlとかのrand関数つかってやってます。 Count()とrandom()あたりをつかうのかなぁ? わかるかた、教えてくださいませ。
>488 ランダムで取り出すって意図が分からないですが 適当に取り出すって意味なら ORDER BYをかげずに、取り出せば取得すれば良いんじゃないの? だからPostgresならLIMITとOFFSETで出来ないのか?
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前に戻るとか。
↑ちなみに8iですー
>496 FETCHしか無いから出来ないちゃうか? ちゅーかカーソルの明示的な移動って、 どういう使い方をするときに必要なのだ?
>>498 カーソルを返すストアドファンクションで、
中で%NOTFOUNDまでループさせた場合、
その後にカーソルをreturnするとエラーになっちゃうんです。
%NOTFOUNDの手前でとめればOKなんですけど。
そんで手前で止める為に予め件数を取得してないとならないのが 面倒なので、なんとかカーソル動かせないかなぁと思ったのです。
このスレって元々は単発質問スレ? 糞スレリサイクル大成功?
>499 FETCHする前に変数に、変数に入れておけば良いんじゃない? そしたら最後のレコードを取得できるんちゃう
504 :
デフォルトの名無しさん :02/02/22 10:40
「日付が最も大きいもののデータを抽出する」 という処理はどうやりますか?
505 :
496=499 :02/02/22 14:19
当方まだPL/SQLを始めて3日目なもので、
的はずれなこと言ってたらごめんなさい。
>>502 フェッチ前にカーソルの中身を%ROWTYPEの変数に渡す
ということでしょうか?
>>503 例外を返すのもやっぱりカーソルじゃないとならないから、
難しいのではないでしょうか。。。
自己レスなんだけど SELECT * FROM テーブル名 GROUP BY id HAVING MAX(date1)=MAX(date1) こんな感じでいいかね?
>504 日付降順に並べて1つフェッチしたら?
506のやり方は駄目でした。
>>507 実はSELECTではなくUPDATEをしたいのですが、
出来れば一回のSQLで抽出したいので、
WHERE区のなかで「日付フィールドが最大のもの」と
指定できればと思うんだけど。
ちなみにMYSQLなのでサブクエリーは使えないんです。
509 :
デフォルトの名無しさん :02/02/22 17:17
>>508 「日付フィールドが最大のもの」という言葉だけでは
"GROUP BY id" なんていう条件は予想もつかない。
説明を略しすぎてない?
>>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
・・・こんな感じになってます。
で、指定したIDの日付が最大のものを更新したいのです。 例えば、idが'yamamoto'でdate1が最大のもののdate1を更新したいのです。 説明不足で申し訳ない。
>505 そのとおり >504 基本中の基本だ。MAXあたりを調べな
513 :
デフォルトの名無しさん :02/02/22 22:29
Oracle のシーケンスを何箇所かで使っているアプリケーションを作ったんだけど、 シーケンスがないデータベースへ移植するための簡単な方法はないですか? SQL は外部定義になっているので SQL レベルで対応できればサイコーです。 思い付く方法といえば、ストアド作るか、シーケンス用のテーブル作って SELECT 〜 FOR UPDATE, UPDATE 〜 しかないです。どちらもコードの修正が必要 になっちゃいます。
>513 トリガーでやる
>>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'
>>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'
517 :
504ではないが :02/02/22 23:35
>>516 すげえ。
半信半疑で実行して見たら本当にできたよ。
MySQLでこんなことできるとは知らなかった……。
>>517 本当はnot exists文が使えると
分かりやすいんだが。
あと
>>515-516 の両方のレスで
where句の
b.id1 is null and
は
b.id is null and
の間違い(コピペ修正ミス)
ゴミン
>>518 でも
>>515 はできなかったよ。
ANSI92 では UPDATE で FROM って使えるの?
ANSIが、これほど頼りない言語も無いな。 かなり基本的な構文まで異なってる。
>>519 うっ!
スマソ、折れSQLSeverで試してた、
updateのfrom句はT-SQL専用だった。
(Oraもできないね)
ガセ言っちまった、ホントにゴミン。
逝ってくる・・・くしょぉ!
>>515 すばらしいです。SELECTの方はできるんですねー。
カナーリ勉強になりました。どうもです。
UPDATEの方は引き続き勉強してみます。
ちなみにSELECTの方は
>>111 の質問とかぶってるみたいでしたね。
もう一言。はやくMySQLは副問い合わせ対応にせれよ。
>>523 それは同意することにやぶさかではないが、とりあえず今回の場合は、
すなおに MAX DATE を取る SELECT を投げて、
その結果使って UPDATE
の二度手間でいいじゃん、と思うのはいけないことだろうか?
その方がわかりやすくていいじゃん。
無理に一つに書く必要がないなら。
>>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表にいれなくてむ、引数番目までそのカーソルをフェッチ
して返せば問題ないんでないの?
#つーかカーソルを戻り値として使う事なんてできるんだ。知らんかった。
#カーソルの閉じ忘れが怖そうだなぁ。
>>538 いえいえ、そうすると、「n番目から最後まで」の
行を返すことになっちゃうんですよね。カーソルってポインタだから・・・。
#呼び出しはJAVAでやってるから、
#そっちで対応すればいいのになぁ。。
540 :
デフォルトの名無しさん :02/02/27 23:12
トランザクトSQL DB2のコマンドセンター AS/400の対話型SQLも オラクルはNTでフリーソフトの画面からSQL文叩いてたよ。 (昔なのでウル覚え) ほとんどおなじだね。データ型が少し違うくらいだな。 元祖はIBMなん?
>>539 亀レススマソ。
ちょっと言葉足らずだったけど、フェッチした後変数に入れて返せばいいのに
と思って書いたんだけど・・・あくまで戻り値は「カーソル」なのね。
だったら、フェッチした行がユニークになる条件で、関数内でカーソルを
オープンしてそれを戻り値にすれば?
でも、それだとカーソルを閉じるタイミングが難しいねぇ。
>>537 >Postgresでdatetime型の値を扱うのですが、
>YYYY/MM/DDへのフォーマットはどうすればいいのでしょうか?
>
>オラクルではto_charやto_dateなどを使用していたもので。。。
同名の関数があります。
書式指定文字列はちょっと違うはずなので、
その辺はドキュメントみてちょ。
544 :
デフォルトの名無しさん :02/03/01 18:40
PL/SQLで質問です。 date型をGMT通算秒で表示したいのですがどうすればいいんでしょう?
「通算秒」という概念が良く分からんが、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が必要という前提で話を進めると、 商品名、型番などの商品に属する情報は商品テーブルだけに集める。 納品日、納品先、数量などの納品するという事実に属する情報は納品テーブルだけに集める。
あれ、数量はなかったか。
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に対応できません・・・(鬱 いい知恵があったらお願いします
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 を
多用すれば、取りあえずなんとかなる。
半角にしたけどいいね・・ こんなくらいの意味?もっとやっこしーの? 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 :と思ったが・・
失礼、>565 は >561 レス(わかるか・・) しかし、ほんとの問題は条件1じゃない? データ次第じゃあ、無限参照有り+重複参照有り、でしょ? テーブルAのテーブル仕様(論理的に)が面倒そう・・
567 :
デフォルトの名無しさん :02/03/11 12:49
レスさんくす>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一発では無理な気がしてきてしまった今日この頃・・・ 申し訳ない よろしくお願いします
>568 必ずしも数字ではないので・・・ 仮にchar(4) とした場合 NVL(xx,'zzzzz') 全角とかあってややこしいなら NVL(xx,'') で 逆順ソート。
>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 の様な結果だね・・・鬱だ
>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番のレコードを抽出というようなことはできますでしょうか? 要するに定義は 現会員、 現在サービスを利用している人 予約会員 現在サービスを利用していないが将来会員になる人 過去会員 現会員でなく予約会員でもないが過去にサービスを受けたことがある人。 異なるレコードのフィールドが関わってくるのですがこのような抽出って可能でしょうか。
>574 ORACLEは一応専門(じゃないといけない・・w) Start With (゚∀゚)!イイ 明日試す!
>>572 さんくす。へー、こんなのあるだ・・・知らなかった。
試してみたらホントにソートされて、ちょと感動。
でも、何に使うんだろう・・・
578 :
デフォルトの名無しさん :02/03/11 23:59
意味不明
579 :
デフォルトの名無しさん :02/03/12 00:28
>>575 会員の「山田」とかサービスの「XXX」とかは検索条件に全く現れないわけ?
案1 まず、ユニークキー項目がほしい。 次に、「現会員>予約>過去」の順にソートできるキーがほしい。 上記にて、 where key in (select max(会員種別) fro〜 が成り立つと思われますが、いかに? 案2 ・現会員クエリ ・予約会員クエリ(現会員クエリの名前を除く) ・過去会員クエリ(現会員・予約会員クエリの名前を除く) などを用意してつなげる (たぶんめちゃ重い) 眠い・・明日もこのスレ、ROMにきま〜す(ROM?)
>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
)
でいくと思う・・・多分
>>587 ちょうどORACLEです。やってみます。
ありがとう。
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使用時も良いんじゃない ほとんど一緒だけど
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の汚点。 おまえ、集計関数を使いたくない理由を明記して頂ければ幸いです。
>>608 >集合内の列値がすべて同じである場合、集計関数を使わなくても良い」という
>データベースはないものかのぉ…。これって当然の欲求じゃないのかな?
どっちにしろ一緒な事を記述しなきゃダメっしょ
「一緒だから勝手に集計しました」ってのも使いづらいと思うけど?
613 :
デフォルトの名無しさん :02/04/05 00:43
>>609 現在のデータベースで、
「Group By句にはselectする項目のうち、集計関数を使うもの以外の
すべてを書かないといけない」なんてことは分かってますよ。
でもさぁ、必然性のない集計関数を使わなきゃいけないっておかしいと思わない?
書き方を「覚えている」だけでは進歩しないと思うよ。
>>610 サブクエリがSQLの汚点というのは興味深いね。この話題とは
別に話をききたいな。サブクエリのどんなところがダメ?
こういった意見は聞いたことなかったので教えて欲しい。
この例で集計関数を使いたくない理由は…
「最大値が欲しいわけではないのに、集計関数Max()を使わなければいけないのは
とても気持ち悪いし、クエリの可読性をいちじるしく低下させている」からだよ。
>>612 なぜ、Group By に指定した列は集計関数を使わなくても良いのか?
…それは列値がすべて同じであることが明らかだからじゃないのか?
とすれば Group By にテーブルの主キー列をすべて指定した場合、
そのテーブルの列値はすべて同じであるわけだから、同様に
集計関数の使用を回避できてもいいんじゃないかってのがオレの疑問ね。
>>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が可能だとしたら、そのカラムが必ず同じ値になることを
指示するための予約語も必要だと思う。じゃないとやっぱり気持ち悪いよ。
ちなみにデータ型はテーブルではなくカラムの属性。
正直、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の履歴を確認すれば、
文脈も含めた構文エラーはチェックできるんだよね。
>>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 などの
フロントエンドを使って開発しているのか?
>>629 「生SQL」っていうのに同意。
ORACLEを使ったあと、ACCESSのテーブルやクエリを使うとなんか違和感があるがそ
のテーブルをSQLコードにするボタンを押すと、やっぱりSQL文がでてきて、「ああっ
やっぱりSQLなんだな〜」と思ってしまう。
632 :
デフォルトの名無しさん :02/04/07 21:37
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以外はあまり使ったことないんじゃない?
>>635 それがな、期待を裏切って悪いんだが、
Perl->PHP->MS-ASP->ColdFusion->Servlet&JSP&J2EEと地獄を見てきた後に
たどり着いた結果なんだよね。
WebObjectsより優れたツールがあれば、すぐにでも乗り換えるけど、無いんだよな・・・
ついでに書くと、初めからWOで、他のツール知らないと、WOの良さってわからないみたいだぞ。
悲惨なWO厨が暴れているスレはここですか? sage
SQLゴリゴリもいいし、WOでもいい。 目的に合わせてツールを選べ。 ただ正直、そろそろSQLゴリゴリからは解放されたいな・・・・・
SQLに代わる問い合わせ言語を開発しる・・・。 table_a カラ サイダイチ「update_dt」 ヲ センタク
そんなもんいらねーよ。 開発言語とシームレスに融合する環境がいい。 OODBとか、いいと思うが、いかんせん実績が見えないんだよな・・・
642 :
デフォルトの名無しさん :02/04/10 23:45
SQLServerってexceptがないらしいんですが、 それに変わる手段ってありますか?
700万が7万円ていったい・・・ ちょっと欲しいかも
645 :
デフォルトの名無しさん :02/04/11 11:57
>>644 差演算。Oracleでいうとminus。
>640 EnglishQuery?
SQLを簡単に書かせろって言ってた 604です。
一週間 九州出張行ってたんだけど あんまり盛り上がってないね。
>>634 WOの概要サンキュです。今ちょうどウェブフロントエンドの案件があるんで
WO考えてみます。
自己解決。 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のやり方きぼん。
654 :
デフォルトの名無しさん :02/04/12 22:39
おまいら!たまには政治にも目を向けてください。
>>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;
ってするのと、また結果違うの?
657 :
651=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);
とか。あんましエレガントじゃないねぇ。
>>658 あ、それもここにカキコする前に試してみた(笑)
けどやっぱり複数件とれちゃうでしょ?
余談なんだけどさ、DB自体は8i(8.1.7)なのよ。
んで、PRO*Cやってんだけどさ、PRO*Cのバージョンが
8.0.6なのよ。そんで8iから追加された機能がコンパイルのときに
エラーになっちゃうのよ。
本来使える機能が使えない歯がゆさったらないよ。
>>659 あ、同じく rownum=1 も追加ね。
で、PRO*C だったらふつーに fetch するのが一番エレガントじゃぁ・・・
SELECT * FROM TABLE1 WHERE 更新日付 IN (SELECT MAX(更新日付) FROM TABLE1) じゃダメなの?
>>660 > あ、同じく rownum=1 も追加ね。
あっ、それでいいのか!忘れてた・・・
> で、PRO*C だったらふつーに fetch するのが一番エレガントじゃぁ・・・
う〜ん、なんかfetchするのにループしないのが気持ち悪くて・・・
>>661 それ、658と同じだって(笑)
PRO*Cって、selectで複数件返って来てもエラーにならないオプションが あったような気がする。このスレ的には邪道なんだろうけど(w
664 :
デフォルトの名無しさん :02/04/16 22:06
行方向の並べ替えはORDER BYで出来ますが、 桁方向に並べ替えるにはどうすればよいのでしょうか?
>>664 まずは通常通り行方向に並べ替えて置いて、
おもむろにディスプレイを90度傾ける。
ネタだよね?
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ありますか?
677 :
oracleにて :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 いちおうこんな感じで出来るとは思うけど(環境が無いので未確認) 現実的では無いよね!
基本中の基本なんですがデータ結合したときfromの後の順番によってデータが 変わるんですか? AとBの表に品名という列があった時selectの所やwhereの所で書く時どっちでも良い のですか?
682 :
デフォルトの名無しさん :02/04/26 21:45
>>680 どっちでもいいよ。そのれべるの話なら。
実行計画とってみな。
>>680 昔のは、whereに複数条件が有る場合に
書く順番で速度は変わってたが、今では関係ない
>>682 のアドバイスのように実行計画とって研究してみな
>>679 面倒な・・・・。
SQL Server は知らないけど、
Oracle風に言えば、substr('000000000000' || no, -8)
みたいな事が出来るんじゃないかな?
>>678 Right('00000000' + no, 9)
初めてSQLやった頃ここでつまずいたっていう所教えて下さい. あとそれはどうやって克服したかも教えて下さい.
>>686 そんな事、忘れた(^^;
group by 周りは、ハマるんじゃないかなぁ。
俺は未だに update の構文があやふや・・・。
oracle , sybase ,informix .... 統一しろよ。
今独学でVBとSQLの勉強をしているんだけど、ある程度レベルが上がったら就職しようと 思っていますが,実際の所企業に就職するかそれとも派遣会社に行くか迷っています。 よいアドバイスがあれば聞かせてください. あっそれと独学だとどこまで勉強したらよいのかわからないので学校に行こうかとも 思っています.学校だと求人も来ているかも知れませんし. ちなみに自分は26歳です.
学校いくなら学校できくべし きくべし
その前に日本語の勉強をするべし。26でその作文は・・・
漏れがPLで、派遣会社から688みたいなやつ紹介されても使いたくないなぁ。 かといって、26歳で経験ありませんってのもだいぶ怖い。
>>688 まず、フリーウェア作って公開しる!
そのことを面接のときにもアピール! 派遣先に行ってもアピール!
そしたら、技術面では問題なし。認めてくれるでしょう。
まぁ、現場では技術だけでは生き残れないけどね。
とりあえず、ODBCで利用できるクエリアナライザもどきでも書いてみたら?
現場行っても使えるツール持ってると、結構評価されるよ。
>>688 って言うかさ、君はなんでデータベーススレとここで同じこと聞いてるのん?
まぁ、それは置いといてだね。年齢のこと考慮すると「学校に通う」選択肢は
キツイ。卒業する頃にはあなたより若い人と同列で品定めされるんよ?
勉強は職業人になったら終わりではないん。勉強せん人間は淘汰されるの。
そこんとこ加味して自分の進む方向を考えてみ?
実際の所26歳未経験のプログラマーってやばいですか? プログラマーのみなさんの勤めている所ではそういう人間は今までいましたか?
>>694 俺はよく見てないが、マ板にその類のスレがあったはずなので
そっちを覗いてみるのはどうだろうか。
PGじゃないが、30才未経験でエンジニアを目指して
いた人(独学でMCSE取ってきた)は、10社くらい面接で
落とされたということらしい。
んで、俺の会社に拾われたんだが、技術系の職は
得られずに、いきなりPMやらされてる。
とはいっても、開発のPMじゃないがな。
あんまり書くと、ばれるかもしれんのでここら辺で・・・・・
>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」技術評論社 なんかどうだ?
>>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.値
出来ました♪
>>706 さんどうもです!
でも速度はプログラム処理の方(意外と速かった)とほとんど変わらなかった・・・
まあ勉強になったので良しですね。
ちなみに人 = 'B' の条件を副問い合わせ部分に入れたりしてみました。
>>707 人、区分でグループ化した時、一つのグループのレコード数がかなり多くなる
ような場合じゃないと大して効果は無いかも。
あと、このケースの人 = 'B'はどの階層の副問い合わせに書いてもパフォーマンスは
変わらなかったりする。どこに書いてもインデックスが切ってあれば使ってくれるし。
オプティマイザって案外賢いんです。
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
ありがとう御座いました!! さよなら
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でわざわざ"さよなら"言う奴はめずらしいな。
>>711 WHERE句でbetweenを使うとパフォーマンスが落ちます。
もっとチューニングの勉強をしましょう。
>>713 おっしゃるとおり、分類A+分類Bが主キーです。
できました、ありがとう御座いました。
>715 Oracleの場合、betweenはオプティマイザが x >= 001003 AND x <= 0030001 に変換する、とマニュアルで読んだ覚えがあるけど。
だから変換する時間だけパフォーマンスが落ちるだろ。 ストアドプロシージャにすると.......う、俺もよく分かってない。シッタカ君だったのか(萎え)
>718 > だから変換する時間だけパフォーマンスが落ちるだろ。 それはそうだろう。だけどそんなのチューニングを語る上ではまあ微々たるものだと思うよ。 よほどオプティマイザの性能が低いってんならともかく。
初歩的な質問なんですが、宣言で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)とは全く意味が異なるので注意。
>>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してるんだ
って単純な事だと思うが
テーブルを書きます。 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 どなたか分かる方いませんか?
>>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の構文を理解していないのだと思われる
>734さん あれ、1番はできますか?min(所在地)だと出ない気がするんですが・・・。 合ってたら申し訳ありません.ふと思ったもので。 >729さん group byを使う時は表示させたいもの(selectの所)にはグループ関数か group byで指定したもの以外は入れちゃ駄目という決まりがあるのですよ. グループ関数というのは知っているとは思いますが,sum,max,min等の事です。 しかし裏技としてgroup by で指定したものと直接関係のあるものはmin,max などを使うと出来るのです.理由は長くなるので書きませんが。 例えば支店番号と支店名は直接繋がりがありますよね.こういう場合はmin,maxを 使うとよいというわけです. 読みズらい文章すみません.がんばってくだせえ。
質問があるのですが m01得意先、m02製品品目というテーブルがありこれらがそれぞれの品番という列で 参照整合性でつながっている場合,m01得意先を更新或いは追加した時 m02製品品目も変更されているのですか?
>>736 すべてのDBでは知らないが、ふつうはされない
>736 最終的には、2つのテーブルを結合して1つのテーブルとして見る訳でしょ? なら、両方が更新される必要は無いぞ。 逆に言えば、どちらも更新されなければならないなら正規化されていないという事に。
結果を以下のようにしてみたかったの! 受注_支店番号 | 支店名 | 所在地 ---------------+---------------+------------------------------- 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をインストールし接続しようとしても、 タイムアウトではじかれてしまいます。 「接続」を手動で行うと接続できる為、認証等は間違っていないと思われます。 申し訳ございませんが、同様な現象があったことがある方、対処方法をご存知の方 助言を頂けないでしょうか よろしくお願いします。
自己解決しました。 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 だ。 スマソ
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)<--これいらねぇな
>>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系は他に書き方が有るなら控えた方が良いよ。
テーブルが小さいうちは気にならないが、データが増えるとかなり遅いよ
有難う御座います。参考になりました.所でもう一つ質問なのですが データを抽出する時などの際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ではそういう概念は無意味な事は周知の通り。
>>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
アバヨ
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 たぶんダメ
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人とも売り上げた日のレコードしか返ってこないという事?
785 :
デフォルトの名無しさん :02/05/25 22:04
>>784 そうか、また勉強になった。サンクス
俺もデータベースの勉強するかな
786 :
仕様書無しさん :02/05/25 22:05
翔泳社のDBマガジンって、いいですか?>>ALL
787 :
デフォルトの名無しさん :02/05/25 22:11
>>786 翔泳社の本で勉強したらオラクルシルバー落ちたので良くない本だと思います。
スキーマ定義的には 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上でゴリゴリとくっつけるんだな。
パフォーマンスが悪くても、その機能が実装できないよりはいくらかましだろうて。
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文を作成すればよいのかわかりません。 キーがないので何をしたいのか意味不明かも しれませんがどなたか教えてさい。
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って定義されているんだっけ?
心配になって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などのコマンドが含まれています」
だってさ
>>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
みたいなかんじ。
>>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ってどうですか?
828 :
minamo :02/06/10 16:14
SQLの問題です。 複数のテーブルに同じキーが指定してある状態で 各テーブルのデータが揃っていないデータを挙げよ。 というSQLを組みなさい。
829 :
デフォルトの名無しさん :02/06/10 16:31
age
830 :
デフォルトの名無しさん :02/06/10 17:38
>>828 本当に問題をだしているのですか?
知っている人に教えて欲しいのとは違うのですか?
Accessで不一致クエリでもかいてオナってろ(ワラ
>>828 一致するキーを条件に抽出するだけだろ。
ひょっとして 「同じようなレイアウトのテーブルが複数あり、それぞれ 全フィールドを比較し一致しないレコードを抽出せよ」 じゃないの?w
834 :
minamo :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
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って何?
って、InterBase6って書いてあったな・・・・ INはつかえんのか? さすがにMAXは使えると思うんだが
>>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では確かできたよ。他は知らん。
ちっ。かぶった。 ついでにオライリ本みてみたけど、標準じゃないんじゃないかな。
>>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」みたいに いちいち""が必要。
そんな面倒な事せんでも、男は黙ってローマ字名。 つまり「AKUSESU]だよ。OK?
返答ありがd
>>855-858 なるほどねー。いろいろ試したら「session」もダメだったわ。
とりやえず列名accsとすることで回避しました。
860 :
デフォルトの名無しさん :02/06/20 15:37
>858 アンタ、気に入ったよ!
861 :
デフォルトの名無しさん :02/06/20 19:20
PostgreSQLとMySQLどっちがいいですか?
863 :
デフォルトの名無しさん :02/06/20 19:35
>>831 MySQL
参照整合性制約やストアドプロシージャなんぞいらん
すくなくともストアドプロシージャは欲しいだろ?
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)
できました。ありがとうございますた。( ゚∀゚)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使われちゃうん
でしょうか。だとしたらやばい場合ってけっこうありますよね?
>>881 >僕はオラクルしか知らないんですが、これってオラクル以外でも使えるものでしたっけ?
オラクルも知ってないんじゃ? rowidはオラクル固有です
一般的にはシーケンスを振ると思われます
IDENTITY(これはSQL鯖だけか?) nextvalなどでやるのだと思われます
手元にマニュアルが無いので調べようが無いですが
rowidはtruncateなどしない限りは、同一のは振られないはずです
最後に一言、キーワードを教えて貰ったら
ちょっとは自分で調べる癖をつけましょう!
>>882 お前、あほか? rowidについてはこいつの言ってることであってるじゃん。
なに怒ってんの?
>>881 お前さんの言うとおり。rowidをこういうときに使うのはやばい。
ある一点ではユニークだけど、時間軸で見るとユニークとは言えない。
>>883 >ある一点ではユニークだけど、時間軸で見るとユニークとは言えない。
自分でデリートしてインサートしたりして確認したことある?
かなーり繰り返さないと、その状況はあり得ないのでは?
怒ってんじゃなくて、教えてくんが好きじゃないの
>>878 のリンク先で同じ事書いてんのに関わらず、わかってないのがな
rowid 別にOracle固有ってワケじゃないよ。
>>884 かなりレアケースでも絶対に起きないといえなければ使っちゃいけない。
>>884 そんなおまえさんにもキーワードを教えてあげよう。
PCTFREE/PCTUSED
かなーりとかいう、量(回数)の大小ではない。
タイミングの問題だ。
>>887 データブロックのパラメータでしょ
簡単な説明だけど
PCTFREE:設定値に達した時に、そのデータブロックには挿入できなくなる
PCTUSED:PCTFREEに達したときにPCTUSEDまで空くまで、そのデータブロックに挿入できない
デフォルト値は忘れたが
ようは、データブロックの最大値(PCTFREE)に達して、
その中のデータの半分くらい削除(PCTUSED)したら一緒になる可能性がある
そこと関係があるとは気にしたことが無かったのは事実だけど
そんな事をことを言ったらシーケンスなども有限じゃん
そしたら論理削除フラグで付けるしかねーだろ
SQL文の事じゃないのでsage
889 :
デフォルト名無しさん :02/07/04 01:24
>>888 興味本位で聞く。
シーケンス最大値使い切れるか?
意見だと? ワクワク
Oracle のバインド変数みたいなのって Postgres にないのかな?
>>890 記憶域は有限なんだからどんな方法でID振ったところで
使い切る可能性は必ずある
とかいう客が多いんで、いつ使い切るのか計算させてる。 だいたいは1000億年以上先だったりする。
記憶域の心配して、あれこれ考える間に ハード&ソフトが進化してしまうよ
シーケンスを使い切るのはきっちり計算できるからデータ量考えたら 絶対使い切らないことは保証できるわな。
とりあえず、シーケンス使っておけば 間違いないだろう。 時間軸でのソートも出来るし。 一年3200万秒もないんだから、事実上使い切るのは無理。
SQL>CREATE SEQUENCE hoge; 順序が作成されました.
でもさー、空き番号があったら嫌だっていう客多くない? こっちの説明に耳かしてくれて、シーケンス使えるのって 大体1/3くらいかなぁ。
シーーケンスも有限だからって使わなければ
日付型って有限なんじゃないの?<調べてないから予測
そんな事を言ったらDB設計自体できなくなるんじゃない
実際さ、クラサバが流行始めた6〜7年前に流行ったマシン構成で、
(PenProでHD10GでNT3.51でORA7.3くらいかな?)
いまも現役稼働してるのって数多くはあるとおもう?
多少はあるとは思うが、移行作業の計画があるとかじゃない
ようは
>>895 だな
>>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
>>902 すまんね。質問しなおす。
「連番を確実に取る方法を教えて下さい」。
です。以上。
>>904 んじゃシーケンス以外なら
select max(seq)+1 form TableA
じゃないのか?
>>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 構文的に間違ってた!
適当に解釈してください
>>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。
経験者の方、お力添えをお願いします。
出かける時間だぁ(T-T) 宜しくお願いします>ALL
913 :
デフォルトの名無しさん :02/07/06 23:33
うーむ。 後から連番を埋めることに、どういう意味があるんだろう。
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に成功するまで繰り返さなきゃならない。
>>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;
>>921 違う。シーケンスだと値が飛ぶ可能性が高いが、
最大値を使えば既に飛んでない限り飛ばない。
>>922 エライ中途半端な理由だな!
同じ事を
>>905 で例を上げているのに違う言われたから
考えたのに...それで納得するなら、別に構わないんだが
>>921 ロールバック・コミットを併用したときも
一緒ですか?
>>923 すみません、
>>901 の時点でLOCK TABLEを知らなかったものですから。
>>905 では、ロックの処理がないため
>>920 と同じ内容を指してるとは思えなかったんですよ。
レスありがとうございます。(^^
925 :
デフォルトの名無しさん :02/07/12 14:39
SELECT A.名称 , B.名称 FROM 業務 AS A , 商品 AS B という風に使用したテーブルに順にABC…とふっていく ヤシがいます… なんと言ってやればいいのでしょうか?
927 :
デフォルトの名無しさん :02/07/12 16:12
>>926 よろしくない。
SELECT文も、場合によっては100行を超えるときもある。
後から読むと、ASなんか使うなってよってよく思う。
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 | ○ | +------+------+-------+ しかし結果は上記の通り、外部結合できておりません。なぜでしょうか? 厨レベルでまことに恥ずかしい限りですが、どなたかお助けください。
二重投稿すみません。半角スペース無効なの忘れてました。 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文をかけばよいのでしょうか?
自己レスです。簡単なことでした。逝ってきます…。 正解 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 なんて、常軌を逸している。
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はあるのだろうか?
はじめまして。 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';
>>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 と一緒でいけると思うが?
>>945 >>947 おまえらエロビデオのモザイクの中を想像する訓練が必要だな。
受注番号 商品コード
001 S001
001 S031
こーいうテーブルがあったら、おまえらのSQLじゃ1行目しか
検索条件に該当しないだろうが。
943は1行目と2行目を両方検索したいと逝ってるんだよ。
というか、943はさっさと詳細情報(エラーメッセージ、テーブル構造、etc..)を晒せ!!
気になるじゃねーかよ。
>>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 ア、ナ〜ルほど。
失礼。失礼。
ミニモミ。でハァハァしてきますわ。
>>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)
しかないので悪いが、どちらも
確認済。
s/ユニークの時に/ユニークでなければ
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に更新権限与えないでやる方法ないですかね?
だめかしら?
>>960 postgresは触ったことがないが、
この手の(隠蔽させる)方法として、
直接更新できないテーブルに対して
更新ストアドプロシージャを作成し、
そのストアドプロシージャに
更新させたいユーザに実行権限を
付与することで対応できると思う。
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しようとしてやめた記憶がある。 懐かしい。
>>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は何使ってる?バージョンは?
>>973 さんくす!
temp以下は思い浮かびませんでした。
今手元に環境がないので、明日早速やってみて
結果書きます。(このスレ残ってるかな?)
>>975 いくら何でも消えることはありえないだろうて。
「スレッド一覧はこちら」というとこクリックすれば絶対にある。
#実は俺も2chきて数ヶ月知らなかった・・・・(恥
>>972 レス、ありがとうございます。
実はPHPをつかってデータベースと接続しているのですが、
IEの設定により、タイムアウトが5分に設定されています。
5分間レスポンスがないと、「サーバに接続できませんでした」と
表示されるのです。レジストリの変更により、この設定は変えられるのですが、
すべてのPCのレジストリを変更するのも大変だし、
実行するSQLも変動するので、あらかじめ作成しておくこともできません。
出力ページをリフレッシュすることで回避できるかもしれないので、
試してみます。
できました!!! 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 )); でうまくいきました。
>>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 扱ってる内容が結構差別化されてるから分かれてた方がいいと思う。
というわけで誰か次スレ立てて〜
住み分けちゃんとできてるじゃん。たまにスレ違い質問が出るのはどこも一緒だし。 向こうの内容は自分的には必要無いから統合したら読みにくくなりそうだな。
>>987 むしろ製品固有スレにブランチを希望するのだが。
現存するスレ:PostgreSQL, MySQL, Interbase(Firebird), Access
建立してない:Oracle, MSSQLServer(MSDE), DB/2
結局、SQLゆうても標準SQL(ANSI SQL/92か?)に基づいているわけではないし。
製品固有のキツイ方言混じりのSQL文見せられてもなぁ、って想いがあるわけで。
# そもそも、ここは宿題の単発質問スレを成り行きで消化してただけじゃない?
まっ、放っておいてもスレ立てたい人が勝手に立てるでしょ 流れにまかせておけばいいんじゃない?
このスレまだ生きてる?
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!!!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。