トップページ⇒tech
1001コメント392KB

SQL教えて〜!!

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

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

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

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

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

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

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

のテーブルがある。

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

なら
管理番号  会社コード  担当者ID
    1 a1   x1
    2 a1   z1
と検索される。
0028デフォルトの名無しさんNGNG
簡単すぎてつまらない、と言っているのにこの問題はないん
じゃないか?
0029sageNGNG
>>28
ん?この問題がまだ簡単すぎるのか、
それとも難しすぎたのかどっちだ?

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

ネストしなくても
select *
from テーブル
group by 管理コード
having count(*) > 1
と思ってたけど(一応確認済)、
何かやばい場合あったかな?
0036デフォルトの名無しさんNGNG
↑
group by 会社コード
スマソ
003733NGNG
>>35
group by のときは「*」使えなかったような気がしますが...
あっ。ORACLE の SQL の場合です。
0038デフォルトの名無しさんNGNG
>>37
ホントだ。Oracleで試したら、そうですね。
私はT-SQL(MSSQL、Sybase)で試しました。
なので、ネストした方が汎用的ですね。

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

問題
>>27
と同じテーブルにおいて、
 管理番号(PK)
 会社コード
 担当者ID
現在そのテーブル情報に携わっている担当者
の数を知りたい。
もちろん、重複は1人とする。
そのSQL文を書け。
0039デフォルトの名無しさんNGNG
何を言ってるのかわかんないよ
GROUPなしでWHEREだけで済むやん
0040デフォルトの名無しさんNGNG
>38
SQL書く前に担当者に聞け
0041デクノボウNGNG
select 商品名,単価 from テーブル名 where 単価 >=30000 and 40000 <= 単価;
1さんこれで大丈夫ですよ
0042デフォルトの名無しさんNGNG
>>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文を書け。
0043デフォルトの名無しさんNGNG
select count(distinct 担当者ID) from テーブル;
0044デフォルトの名無しさんNGNG
データベースの仕事をすることになりました。
そこで、SQLを学習したいのですが、
最初は何から始めるべきですか?
0045デフォルトの名無しさんNGNG
入門書を買う
マニュアルを読む
サンプルコードを動かして覚える
0046デフォルトの名無しさんNGNG
>>44
MS-ACCESS のクエリーが学習に向いてると思う。
クエリーの設計画面とSQL文と実行画面 を行き来できるから。
ただし、MicrosoftのSQL文法準拠だけどね。
004744NGNG
なるべくお金掛けたくないので、
フリーの環境を教材にしたいのですが・・・。
Windows/Cygwin環境辺りで
何か良いのがありましたらお願いします。
とりあえず明日参考書を買ってきます。
0048デフォルトの名無しさんNGNG
>>47
PC UNIXは貧乏な構成なら金かからんだろ。
00491NGNG
何か1日見なかっただけでカナーリ展開してますね。
私にはサパーリわかりません・・
テスト今日なんですけど自分で考えてみました!!

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

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

   
0050デフォルトの名無しさんNGNG
シネ
0051デフォルトの名無しさんNGNG
>>43
正解!

しかしそれどころではなくなった。
N.YのWebサーバに繋がらない。
サーバの物理的な設置場所が日本側では
不明なので今調査中であるが、ちょっと
しゃれにならなくなっている。
(不幸中の幸いか担当範囲のN.YのDBサーバは別
だったらしく生きてた。しかしDBよりも動かす人
の方が心配だ。)
0052デフォルトの名無しさんNGNG
>>49
商品名はどこに行ったの?
0053デフォルトの名無しさんNGNG
>>49
商品表ってどこから持ってきたの?
0054デフォルトの名無しさんNGNG
鯖も別の場所だったらしく無事だった。
回線が遮断されていただけだったらしい。
しかし明日も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をできるだけ明記して下さい。
0055デフォルトの名無しさんNGNG
↑例における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

ゴメソネ
0056デフォルトの名無しさんNGNG
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 未確認だよ〜ん
00571NGNG
結局、テストは記号で選択問題だったから多分出来ていたと思います!!
0058デフォルトの名無しさんNGNG
SQLまわりの気の利いた入門書ってどれ?
0059デフォルトの名無しさんNGNG
>>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)で確認済です。
0060デフォルトの名無しさんNGNG
>>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.工場コード
0061デフォルトの名無しさんNGNG
>>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に依存しない方法です。
0062デフォルトの名無しさんNGNG
>>58
>SQLまわりの気の利いた入門書ってどれ?
やっぱ、各種ベンダーのマニュアル本かな。
がいしゅつだけど、Oracle,Sybaseならダウンロード
できるし。(SybaseはMSSQLほぼ(強調)互換)
あとは、こうやって、みんなといろんなケースを
遊びながら覚えていく方法が一番速いよ。
頭の体操にもなるしね。
0063デフォルトの名無しさんNGNG
>>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 工場コード
これからはちゃんと校正するね。
0064デフォルトの名無しさんNGNG
あかん、頭がぼけてきた(今日寝てない)
これも一種の荒らしだな。

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 工場コード
これが正解
0065デフォルトの名無しさんNGNG
J.セルコ「SQLパズル」
これは勉強になった。残念ながらもう入手困難だろうけど。
入門書とはいえないかな(w
0066デフォルトの名無しさんNGNG
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句に書いて
評価順序 保証されるの?
0067デフォルトの名無しさんNGNG
postgresqlのSQLで気の利いた入門書/入門サイトってありますか?
006856NGNG
>>66
まあ、現時点ではSQLの方言があるので、しかたないでしょう。

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

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

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

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

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

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

まぁ、そーいう へたれSQL書いちゃいけないっていう意見もあるけど、
書けてしまう & 予期せぬ結果をもたらす ってのは問題かと。
0071Error401NGNG
>>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
0072デフォルトの名無しさんNGNG
やっぱり、外部結合の指摘されたか。
言い訳かもしれないけど、
outer joinも書こうかと思ったけど、
この問題の場合はいっしょだから書きま
せんでした。

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

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

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

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

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

この仕様を満たすSQLを書け。
0074デフォルトの名無しさんNGNG
>>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
0075Error401NGNG
>>72
>Oracle、いつのバージョンから
>SQL92の書き方がOKなった?

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

8.1.6以降は触ってないから詳しくないけど。
0076デフォルトの名無しさんNGNG
>>72
とりあえず。

SELECT id, kind, desc
FROM t1
WHERE kind = (
SELECT MAX(kind)
FROM t1 as t1x
WHERE t1.id = t1x.id)
007776NGNG
s/72/73/
0078デフォルトの名無しさんNGNG
>>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]
)
007978NGNG
id は予約語じゃないから、括弧いらないやね。
あとテーブル名も t じゃなくて t1 だね。
間違いだらけでスマン。
0080Error401(=76)NGNG
>>78
ダブルクォーテーションかな?
後で調べてみるね。
008156NGNG
>>70
あらまあ。確かに評価順序で結果が違いますねぇ。
なんとなく同じだと思い込んでたので、ちょっとショック。
0082デフォルトの名無しさんNGNG
すいません、教えて欲しいんですが、
SQLのコマンド名と、同じ名前のテーブル名が使用されている場合、
どうやってそのテーブル名を指定すればよいのでしょうか?
具体的にいうと、「GROUP」という名前のテーブルがあって、
SELECT * FROM GROUP ORDER BY ...
ってやりたいんですけど、構文エラーになっちゃいますよね。

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

>>82=85

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

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

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

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

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

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

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

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

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

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

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

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

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
)
0111厨房NGNG
下記のようなテーブルで特定の商品コードのレコードのうち、納品日時
が最新のもののコメントが取得したいんです。

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 いいいいい
0112デフォルトの名無しさんNGNG
>>111
order by つかえば?
0113111NGNG
>>112 レスありがとうです
たしかに取得したレコード全部使う必要はないですね。
ただソートするレコードが多いときは遅くなったりしませんか?
インデックス使えばいいんでしょうか、、、
DBMSの呼出時間を考えなければカーソルで全部のレコード見て
最大を取り出してもあまり変わらない?
0114デフォルトの名無しさんNGNG
>>111
SELECT コメント FROM 納品履歴 WHERE 商品コード='12345'
GROUP BY 商品コード HAVING 納品日時=MAX(納品日時)

ではどう?
0115111NGNG
>>114 レスありがとうです でも動きません(悲)

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

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

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

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

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

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

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

set rowcount 1
は使ってはいけないんです。TT
0119デフォルトの名無しさんNGNG
>>118
それなら
素直にカーソル使うしかないんじゃないかな。
なんでset rowcount使っちゃいけないの?
また0に戻せばいいじゃん。
0120111NGNG
はっ! >>118-119 どうも!
0121333NGNG
自己解決。
select top 1 〜
とすればOKになりやした。
0122デフォルトの名無しさんNGNG
SQLおすすめ本おしえて。
セルコのは持ってる
0123デフォルトの名無しさんNGNG
select 'SQL92 規格書'
0124デフォルトの名無しさんNGNG
     ∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ( ´∀`)/<先生!また勉強しなおしですか?
 _ / /   /   \___________
\⊂ノ ̄ ̄ ̄ ̄\
 ||\        \
 ||\|| ̄ ̄ ̄ ̄ ̄||
 ||  || ̄ ̄ ̄ ̄ ̄||
    .||          ||
0125デフォルトの名無しさんNGNG
「フル結合」と「片側結合」って何ですか?
0126デフォルトの名無しさんNGNG
>>125
うん?なんだろう?
完全外部結合(full outer join)と左(右)外部結合(left, right outer join)のことかな・・・。
googleでも引っかからないなぁ・・・
どっかのベンダーの方言かな?
0127デフォルトの名無しさんNGNG
>>125
体位の事だろ
0128デフォルトの名無しさんNGNG
>>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しか触った事無いんで、間違ったらスマソ
0129 NGNG
>122
技術評論社「はじめてのSQL」
0130デフォルトの名無しさんNGNG
>>128の表って更新可能なの?
0131デフォルトの名無しさんNGNG
完全外結合って実現できているデータベースってあるの?
0132デフォルトの名無しさんNGNG
>>131
>完全外結合って実現できているデータベース
って何ですか?
全部の項目にFKでも張ってあるってこと?
0133111NGNG
>>128
すっかりあきらめて遅いままほっといてたよ!
ありがとう!勉強になったよ!
0134デフォルトの名無しさんNGNG
>>131
SQL ServerとPostgreSQLにはFULL OUTER JOINというキーワードがあるね。
SQL92準拠の振る舞いをするかどうかは知らない。

>>132
LEFT OUTER JOINとRIGHT OUTER JOINをUNIONしたようなもの。
0135132NGNG
>>134
>LEFT OUTER JOINとRIGHT OUTER JOINをUNIONしたようなもの。
ふんふん。勉強してみます。ありがとうございます!
(最後の「〜をUNIONしたようなもの。」のイメージがわかんないなー。)
0136素人NGNG
SQLで、列内の指定された年月情報を抽出したいんですが、
列内の年月表示が ex)1999-5-20 00:00 で記載されており
SELECT*FORM テーブル名 WHERE 年月表示=1999-5-20 00:00
又は
SELECT*FORM テーブル名 WHERE 年月表示='1999-5-20 00:00'
で抽出できません。誰かお力添えを頂きたく候。
0137デフォルトの名無しさんNGNG
>>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)
0138デフォルトの名無しさんNGNG
>>136
使用しているRDBMSの名称と、'年月表示'列の型を書いてくれ。
0139素人NGNG
お騒がせしました。
「.」
が式の中に紛れてました。
すいません。
0140343NGNG
;
0141デフォルトの名無しさんNGNG
っていうか、Oracle 9i Databaseって、何気にCore SQL99準拠なんですね。
0142デフォルトの名無しさんNGNG
ショーック! SQLってシークェルって読むのか!
0143デフォルトの名無しさんNGNG
>>142
>シークェル
と言っている人は見たことがないっす。
僕は「えすきゅーえる」といってます。
0144デフォルトの名無しさんNGNG
"SQL pronounce sequel"で検索中。よくわからん。
0145デフォルトの名無しさんNGNG
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>
0146デフォルトの名無しさんNGNG
リレーショナルデータベースは1970年にIBMサンノゼ研究所(現Almaden Research Center)に
所属していたE.F.コッド博士が発表した論文,"A Relational Model of Data for Large Shared Data Banks"
により原理が世に示された.同時期に概念設計されたデータベース操作言語がSEQUELである.

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

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

もう少し具体的に、というか知りたいことを限定して書いたら?
0160シロートNGNG
>>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
た な は

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

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

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

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

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

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

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

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

が、どう考えても遅いので、すなおにJavaで複数回SELECTしたほうが
速いと思う。
正規化しなかったDB設計者を呪え。
0178デフォルトの名無しさんNGNG
シロートよ、あんたは決して悪くないかもしれんが、
テーブル構造、全然分からん。
言うことがころころ変わって、むちゃくちゃだ。
>>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これは正規化以前の問題だな。
0179178NGNG
もしかして今回の話題の他にカラムがあって
実際には45ぐらいあるってこと?

時間nのカラムは31まであり
それぞれ
取得年月日が2000-10-20ならば
時間1・・・10月20日
時間2・・・10月21日
・・・
時間31・・・11月19日
のデータということか?
0180シロートNGNG
おはようございます。本日もよろしくお願いします。
>>179
有難うございます。そうなんです。不必要なカラムが多いので
実際に抽出するのは、45のカラムのうち33カラムです。
>>178
すいません。データ=セル内のDATAと理解してました。
カラム名
時間1……時間31 セル内の値は(100.00 float型 )
取得年月 セル内は、全て表示は 2000-10-20 00:00:00ですが文字列(chara型)です。
0181166=178=179NGNG
シロート
もういいから
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で値を取得すれば良い。

>本日もよろしくお願いします。
ふざけんな。
0182181NGNG
多分、あんたには分からんかもしれんから
もう一度詳しく質問を書く。

各月データというテーブルの
時間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日  ”
のデータということか?

これでちんぷんかんぷんの回答だったら
ネタとみなす。
0183シロートNGNG
>>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 %%%
このようになります。
0184デフォルトの名無しさんNGNG
SQLなんて
英単語わかれば簡単なわけよ
0185181NGNG
やっとスタートラインに立ったな。
時間とは勤務時間のことだろ。
やりたいことは、
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はできるんだろ?
0186181NGNG
スマソ
時間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だから)

だった。。。
0187177NGNG
>>186
お疲れ。
シロート君はわかってくれてるのかな。

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

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

>>189
自分ならAP側で素直に再帰処理かけるかな。
0196デフォルトの名無しさんNGNG
>>193
MySQLは使ったことないんで書けるかどうかわからないけど、

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

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

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

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

Oracleだと、

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

で、なんだかんだの部分が結果の10row目になるようにする、かな。
0204デフォルトの名無しさんNGNG
いやはや、名スレですなあ。

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

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

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

それにしてもページごとにSQL発行するのと
セッションオブジェクトに格納するのではどっちが重いのですかねえ。
あんまりセッションオブジェクトにデータを突っ込むと
IISのメモリ食ってしょうがないっす。
セッションオブジェクトってなかなか消滅しないもんで・・・
0207デフォルトの名無しさんNGNG
>>206
HTTPは基本的にステートレスなプロトコルだし、ダイレクトに
ページに飛んでくる場合も考えると、ページごとに検索した
ほうがいいと思う。
ページ遷移を強制して、セッションオブジェクトを使っても、
次のページにアクセスするとは限らないしね。
0208204、206NGNG
>207
せっかくセッションオブジェクトを用意しても
次のページ見てくれないとそれが無駄になるという・・・
だいたいちゃんとログアウトする奴なんぞおらんからのお
ゴミセッションオブジェクトがどんどん増えていくという・・・鬱。
助けてガベージコレクタ!
0209ななしNGNG
Oracle8.1.6使ってるんですがSQLでテーブルの列数(項目数)を
取ってくる命令はないですか?
0210デフォルトの名無しさんNGNG
SELECT count(*)
FROM ALL_TAB_COLUMNS A
WHERE A.TABLE_NAME='テーブル名' AND
A.OWNER='オーナー名'
で持ってこれる。
もしかしたら専用ファンクション
あるかもしれんけど、これで
ファンクションを作ってもいいと思う。
0211ななしNGNG
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)とかでは取ってこれないのでしょうか?
0212VBを知らずにカキコNGNG
>>211
列に別名を付ければ、通常の列と同じ方法で取得できる。
例えば"cnt"という名前にしたいのだったら、"as cnt"を追加する。

SQL = "select count(*) as cnt from ALL_TAB_COLUMNS A where A.TABLE_NAME = 'テーブル名'"
0213210(&その他もろもろ)NGNG
最初から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)
で支障がなければそれでかまわない。

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

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

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

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

>>217
なにがやりたい?(w
0219デフォルトの名無しさんNGNG
>>216
たぶんそれしかないです。
>>217
そのSQLは通らない。全然違うぞ。
0220213NGNG
>>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の環境なら通る。
0221217NGNG
select data1, data2
select sum(data2)
の間違い(自爆)

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

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



----------------------------------------------------------------
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だけで解決させるいい方法ってありますか?
(ループとか使わずにという意味)




文章が分かりづらかったらすいません・・・
0224デフォルトの名無しさんNGNG
とりあえず、RDBMSの種類とバージョンを書いとけ。
0225帰りたいよ〜NGNG
223です

オラクル8です。

書き忘れました。申し訳ない・・・
0226 NGNG
>>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」に展開してほしいけど
そこまでやってくれないみたい.
0227デフォルトの名無しさんNGNG
>>226
DISTINCTがあると駄目。多分。試してないけど。

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


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

select count(*)
from a_tbl
where
not exists (
select *
from b_tbl
where
b_tbl.bumon_cd = a_tbl.bumon_cd
)
;
0231帰りたいよ〜NGNG
223です。

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



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

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

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

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

ちなみにOracleでも俺はCONCAT関数って使ったことないな。
'ゴラァ' || 'ごらぁ'
が普通かと。
0236234NGNG
>>235

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

最初

select 列名1 & 列名2 from hoge;

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

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

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

 
0238デフォルトの名無しさんNGNG
select distinct 自作自演 from 2ちゃんねる
0239名無しさんに接続中…NGNG
すいません、ちょっと質問が・・・

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

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

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

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

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

具体的には
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です。
0243デフォルトの名無しさんNGNG
>>242
MySQL って UNION 演算子は使えるの?
0244デフォルトの名無しさんNGNG
>243
使えないようです
0245243NGNG
>>244
そうすると泥臭いが作業用テーブルに両テーブルの内容をINSERTするしかないか?>識者
0246デフォルトの名無しさんNGNG
>245
なるほど・・
ちなみに、UNION演算子が使用できる場合はどのようになるのでしょうか?
後学のため、教えていただけませんか?
0247デフォルトの名無しさんNGNG
>>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
となります。
0248デフォルトの名無しさんNGNG
>>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...;
こうした方が楽かも。
0249デフォルトの名無しさんNGNG
>247,248
どうもありがとうございました。勉強になりました。
0250デフォルトの名無しさんNGNG
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
0251250NGNG
SELECT distinct colA FROM tableABC

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

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

どっちかというとSQL Serverのと煮てるんだっけ?
0259256NGNG
>>258
はい。SQL Server系です。
といいますか、SQL Serverがsybase系です。。
0260257NGNG
自己解決しました。

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

(別板にてご教授いただきました…)
0261260NGNG
↑名前間違えました。。。

誤 - 257
正 - 259
0262デフォルトの名無しさんNGNG
>>260
大体あってるが、NULLの含まれるレコードに注意しな。

NULLを許していないならOK、気にしないでくれ。
0263デフォルトの名無しさんNGNG
>254
ネタ?
0264ikuNGNG
>>263
はい,質問です。
SQL文で更新する時に日付をUDATEというフィールドに
書き込みたいのですが・・・・・・
0265デフォルトの名無しさんNGNG
SYSDATEとか聞いたことない?
0266257NGNG
>>260
colA+colBでユニークなんですね。そうでなければまずいですよね?

>>264
使ってるRDBMSと開発環境を明示しましょう。
0267ikuNGNG
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までの月数
0268デフォルトの名無しさんNGNG
>267
oracleではそうだけどSQL Serverにはsysdateは無いんじゃないか?
SQL Serverだとgetdate()だったと思う。

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

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

indexは貼ってあるのか?
0273この場合?NGNG
もちろん貼ってます。
0274デフォルトの名無しさんNGNG
>269
select top 3 monar from
(select top 5 monar from Neko order by monar asc)
order by monar desc
0275デフォルトの名無しさんNGNG
ところで、みんな、インデックスって「貼る」って表現する?
俺は「張る」。
0276貼るNGNG
SQL-Server 7.0なんですけど、

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

だと、列名 'A' は無効です。と叱られます。
group by にはいちいちdatepart(hour, 日時)と指定する必要が
あるのでしょうか?
0277張るNGNG
SQL-Server は知らんが group by 1 とかはできんのか?
0278デフォルトの名無しさんNGNG
あるんじゃない?
0279貼るNGNG
>>277
実はGROUP BY 1は怒られます。ORDER BY 1は怒られないのです。
いけてねーDBだよ・・・
0280初心者NGNG
こんなテーブルがあります。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

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

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

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

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

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

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

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

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

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

bcpって言うコマンドの使い方教えてください。
0305デフォルトの名無しさんNGNG
そろそろ業務系の皆さんも仕事始めなんでageときますわ。
0306名無しさん@XEmacsNGNG
UIで編集可能な項目が主キーだと更新がめんどくさいんだよぉ。

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

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

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

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

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

http://users.goo.ne.jp/rdbms
0316デフォルトの名無しさんNGNG
>>315
そのSE、たぶんクソSEだ。
単一のベンダーを拠り所とするヤツって、思想的にダメ。
0317デフォルトの名無しさんNGNG
>>314
WebObjectsとRDBの連携って、どうなってんの?
SQLは書かないのか?
きょうびJDBC経由だったら、resultset作ってSQLぶん投げてるだろ。
つーかそれが普通。EJBだって結局はSQL書いてるよ。
0318314じゃないけどNGNG
>>317
知らないくせにえらそうだな。
WebObjects触ったら腰抜かすぞ!
SQLなんていらねーよ
0319デフォルトの名無しさんNGNG
>>311
Forte for java 3.0 CEとか入れるとPointBaseの機能限定版がついてくる。
SQLのドキュメント(英語)もついてきて、Javaとセットで勉強できるよ。
Javaいらん・・・?それはスマソ。
0320314NGNG
>>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年以上前から存在する技術だから、枯れてていい感じ。
0321デフォルトの名無しさんNGNG
誰かCool:Plexとか使ってねぇかなぁ?
0322デフォルトの名無しさんNGNG
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 はユニークです。
0323山神>322NGNG
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)
0324322NGNG
>>323
ありがとうございます。
でもこれはfooがソートされていないと駄目なんですね。
fooもbarも特にソートされていない場合によい方法はないでしょうか?
それとfoo列とbar列を1つではなく2つ以上ずらすことも可能なものをできればお願い致します。
0325デフォルトの名無しさんNGNG
>>314
適材適所でしょ。
扱うデータが少なければオブジェクトも良し。
0326デフォルトの名無しさんNGNG
>>324
やりたい意味がよくわからんが、どうしてそんなことしたいの?
普通に全部取り出して、ロジックで処理したらだめなの?
SQLでは、シーケンスが保証されていないRDBMSを前提にしているから
基本的に「順番」という概念はない。
RDBMSに依存してもいいなら、出きるかもしれない。(出来ないかもしれない)
0327326NGNG
っつか、よく読んだらIDってのがあるのね。あほなこと言いました。
0328デフォルトの名無しさんNGNG
>>324
SELECT A.FOO, B.BAR
FROM TABLE1 AS A, TABLE1 AS B
WHERE A.ID = B.ID - 1;
0329322NGNG
>>328
できたました。ありがとうございます。
0330&rleNGNG
英語を理解してればSQLほど簡単なもんはネェ。
0331デフォルトの名無しさんNGNG
SQLServerでoracleの「DESC」に相当するコマンドはあるのでしょうか(・・?
0332デフォルトの名無しさんNGNG
>>331
sp_columns<綴りあってるか?
0333デフォルトの名無しさんNGNG
SQLの仕様書ってどこで手に入るですか?
0334331NGNG
>>332 (・∀・)Thx!
0335デフォルトの名無しさんNGNG
>>330
それが英語圏の人間の奢りだというのに気づかないのか。
数式も読めないアフォ米国人のためになんで俺らがいらん苦労せにゃいかんのだ。
0336デフォルトの名無しさんNGNG
>330
なら何故にEnglishQueryなんてツールがあるのだろうか?
0337デフォルトの名無しさんNGNG
PHPとMySQLを使っています。以下のQuery文について質問です。
select m.Name t.View from message AS m, thread AS t order by t.moddate desc

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

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

いつも一度ワークテーブルに
シーケンスを付けてやってる
結構面倒だ
0351デフォルトの名無しさんNGNG
>>350
あんたすごいよ。
ためしにrownum使ったら連番が振られたよ。
ありがとね。
以前、順序.nextval を埋め込む方法を取ろうとしたけど、初期化が面倒でやめた。
0352351NGNG
あっ 私は通りすがりの ORACLE 使いです。
0353デフォルトの名無しさんNGNG
>345

http://www.interq.or.jp/www-user/kanki/dbfaq01.htm
0354デフォルトの名無しさんNGNG
連番って、まぁFAQだけど、なんで要るんだ?
なんかRDBの使い方間違ってないか?

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

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

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

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

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

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

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

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

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

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

b1 aaaaa1
b2 aaaaa2
b3 aaaaa3
を同じテーブル内にInsertしたいんですが。
0377デフォルトの名無しさんNGNG
>>376
insert into tbl ( ... ) select ... from tbl;
0378376NGNG
>>377
ありがとうございました。
基本的なコトでしたね
0379デフォルトの名無しさんNGNG
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のレコード数。
てのが条件です。
色々試したのですが出来なくて・・・。
教えて君でスミマセン。
0380デフォルトの名無しさんNGNG
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の場合っすけど
こんな感じでいかへん?
0381デフォルトの名無しさんNGNG
>where a.C1 (+)= c.C1
(+)ってなんですか?
0382デフォルトの名無しさんNGNG
>>381
外部結合演算子。Oracleのローカルルール。
Oracleは、外部結合の構文で標準SQLをサポートしてないのです。
OracleのSQLの仕様決めてる奴、死んで欲しいです。
0383デフォルトの名無しさんNGNG
?
普通の'='じゃだめなんですか?
0384デフォルトの名無しさんNGNG
「外部結合」っていうのはどれに掛かるんですか?
>>380のサブクエリーと関係ありますか?
0385380NGNG
>>382
とりあえずツッコミですが
ISOの書き方もサポートしてるはずです

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


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

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

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

外部結合はOUTER JOIN使うとなぜかエラーになっちゃいます。
書き方がいけないのかな?(+)使えるからいいんですが。
でも(+)って書き方の方が直感的だし、見た目もすっきりするから
いいですよねー。
0388デフォルトの名無しさんNGNG
テーブルの結合ってJOINだっていうけど(言わないの?)、
select * from a,b where a.no=b.no
って書くのはJOINじゃないの?
なんかわけわかんねぇこと書いてます?俺。
なんかもう泣きそうだよ。
0389デフォルトの名無しさんNGNG
以下のように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
0390379NGNG
>>383>>388

>>379の例で言うと、TableBにC3=40のレコードが無いため
ただのイコールだと結果は
C1|C2|C5
--------
30|AA|dd
50|CC|ff
となってしまいます。
レコード数=TableAのレコード数という条件なのでこれではだめです。
TableBに該当データが無くても、TableAのデータは得られるように
JOINとか(+)を使ってるわけです。
0391デフォルトの名無しさんNGNG
>388 それも一種のJOINだろ? ていうか何にこだわってんだ?
0392デフォルトの名無しさんNGNG
>>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はユニークとする。
0393389NGNG
>>392
レスありがとうございます。

オラクル限定ですか。
書くの忘れてましたが、使っているのはMYSQL-3.23.45です。
やはりサブクエリが使えるDBMでないとできないのでしょうか。
0394デフォルトの名無しさんNGNG
SQLserverで、
「SELECT SUM( aaa * bbb ) AS ccc FROM TEST_TABLE」
と実行すると「算術オーバーフロー」となってしまいます。
項目aaaとbbbが共にINTEGER型であるためにエラーが出ているのですが、
ここで定義しているcccに対して型指定は可能なのでしょうか?
0395デフォルトの名無しさんNGNG
>>394
できない。
DBでIntger型を使おうとすること自体ドキュソ
0396デフォルトの名無しさんNGNG
>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をかけてみよう!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

というようなものです。

参考になるHP等ありましたら教えてください。お願いします。
0424仕様書無しさんNGNG
フェッチ
0425デフォルトの名無しさんNGNG
>422
SQLでは出来ないと思う、ユーティリティかなんかだな
パッと考えただけだと、ACCESSでODBCで繋ぎ
insert into ・・・ select をする


>423
PostgreSQLなら、LIMITとOFFSETだな
0426sybase11.9.2 for linuxNGNG
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

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

他にやり方を知っている方がいましたら教えてください。
0431デフォルトの名無しさんNGNG
create viewしてそっからselect。
0432426NGNG
>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やテンポラリは使わないで実現したいと思っています。
そうも言ってられなくなってきましたけど。(汗)
0433426NGNG
>432
>できれば明示的にviewやテンポラリは使わないで実現したいと思っています。

これだけだと単なる1行野郎だと思われてしまうので、補足(言い訳)
させて頂きますと、テーブル設計しているのが私ではなく(顧客)、
アプリケーションで使用しているテーブルは例えテンポラリだろうと
仕様書に記述しておかなければならないので、この時期にその行程
に戻るというのは手続き上面倒なため、できれば既存のテーブルだけ
で実現させたいと考えています。
結局は今頃こんなところでハマっている私のミスなんですけど。(__;
0434428NGNG
>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

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

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

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

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

アドバイスをくれた皆様、ありがとうございました。
0440デフォルトの名無しさんNGNG
>437
普通DBMSを名乗るものには、ExplainPlan(実行計画)を
見るツールぐらいは有るだろ、そっちの方が明示的に見れるぞ
0441デフォルトの名無しさんNGNG
Outer Joinがわかりやすいとか
ツールで見るのがいいとか
もう、あほかばかかと(中略)
おめえらAccessでDrag&Dropで結合しとけ
0442442NGNG
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でやっていますが、一般的な範囲と言うことで。
あんまり面白くないかな?
0443ずーるNGNG
いまからSQLの勉強をしようかと思っているのですが,VBとSQLじゃやっぱ時代遅れ
ですか?
0444デフォルトの名無しさんNGNG
>>442
有効率のMAXのレコードと可能回数のMAXのレコードをUNION
させただけのような気がするけど・・・違うの?
0445デフォルトの名無しさんNGNG
>>422
有効率の順位と可能回数の順位との平均を出して、基準以下を削除
0446デフォルトの名無しさんNGNG
>>442だったスマソ鬱
0447デフォルトの名無しさんNGNG
>443
VBはともかく、SQLは今のところDBやる上で必須なのでやっておいて損は無いでしょう。
とりあえず、どっちもまだまだ現役なので時代遅れって事は無いと思うが。

ただ、いつまでもそれだけだと先が見えている事だけは事実。
0448442NGNG
>>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レコードを抽出したいです。
0449デフォルトの名無しさんNGNG
全然、仕様が見えない。
対象テーブルにおいて、可能回数のMAX値を
持つレコード(この場合ID=3)の有効率(この場合99.5)
以上の有効率数値を持つレコードを抽出しろ
ということか?
しかしMAX値を持つレコードが複数あり、有効率が
それぞれ異なったらどうするのだ?
その場合は有効率が低い方を優先させるのか?
 しかし、これだと最初の442説明のID4は抽出
されてしまうので違うと思うが。。。

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

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

しかも、>>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 両方大きいものはないので、抽出

です。ごめんなさい。すいません。申し訳ない。
0453デフォルトの名無しさんNGNG
>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回持ってくるやり方の方が良いと思うぞ
0454449NGNG
>>452の例も間違いだ
ID=4は抽出だろ?
有効率がID5のそれよりも大きい値だぞ。
まぁ、いいや。

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

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

>>454 「a」って?
0458デフォルトの名無しさんNGNG
>457
逆もあるだろ! 有効率が全部おなじ
もしくは全部同じちゅーのも考えられるわ
0459449NGNG
>>455
またまたすまそ。
ID=5の有効率
110.5を100.5とまちがえとった。
でもクエリーはこれでOKよ。
0460442NGNG
>>456 うっ。すごい(w 多分正解です。きれいだなぁ。感動。
ありがとうございます。
>>453 今自宅なんで、ACCESSしかないんですが、FROM句の構文エラーです
がでちゃいますぅ。
0461442NGNG
>>458 有効率が同じ場合、可能回数が大きいほうが欲しいです。
全く同じ場合、両方欲しいです。
0462デフォルトの名無しさんNGNG
>457と>461の条件の時は、きびしいでしょ
0463山神NGNG
>>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なんぞ問題にしてないですが。
0464デフォルトの名無しさんNGNG
SQLServer2000SP1にて質問させてください。
ひとつのコードから、マスタテーブル内の対応する名称を取得する
というプレーンな情報取得についてなのですが、

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

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

ご経験ある方、お知恵をお借りできますか?
0465デフォルトの名無しさんNGNG
>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 を想定しています
0466デフォルトの名無しさんNGNG
>>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は
>結果も違うのですけど。

何が言いたいのかよく分かりませんが、バカな私に説明していただけませんか?
というか、私はあなたのことかなりバカな人に見えるのですが。
0467デフォルトの名無しさんNGNG
>>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前後
から書いてあるから読ぬ。
0468デフォルトの名無しさんNGNG
しかし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ユーザにうまく浸透しないのだよな。

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

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

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

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

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

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

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

ありがとう。
0481デフォルトの名無しさんNGNG
>>480
ようは使い方だな。定義関数を使うと構造化できてクエリ全体を
見やすくできるから、使い方によっては非常に便利だ。
書き下したときに、どんなクエリになるか考えながら使えばいいと思うよ。
0482デフォルトの名無しさんNGNG
>464
特殊な例だったのかも知れませんが
トランザクションテーブルに名称を持たした事があるよ
0483デフォルトの名無しさんNGNG
教えてください
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;
0484デフォルトの名無しさんNGNG
>483
Delphiでいけ!
0485デフォルトの名無しさんNGNG
>>483
何をやりたいのかよくわからないんだけど、Query1の結果を表示したいだけなら
Table1 はいらないと思う。
DataSource1.DataSet := Query1;
DBGrid1.DataSource := DataSource1;
でいーんじゃない?
ま、Delphiスレで聞いたほうがいいでしょうsage
0486デフォルトの名無しさんNGNG
初心者です。教えてください
例えば
Query1.SQL.Add('ORDER BY ID DESC');  並び替え
Query1.SQL.Add('DELETE FROM テーブル');  削除
みたいにSQL文で一つのクエリーに2つの命令って出来ますか?
0487デフォルトの名無しさんNGNG
>486
何を聞きたいのかいまいち分からないが
ストアド使うのが一般的かな?
0488太郎NGNG
Postgresでランダムにレコードをとりだすことってできないんすか?
今、いったん、件数を数えてから、perlとかのrand関数つかってやってます。
Count()とrandom()あたりをつかうのかなぁ?
わかるかた、教えてくださいませ。
0489デフォルトの名無しさんNGNG
>488
ランダムで取り出すって意図が分からないですが
適当に取り出すって意味なら
ORDER BYをかげずに、取り出せば取得すれば良いんじゃないの?

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

limitの位置をずらせばランダムになるやんか
っと思うんだけど?
0492デフォルトの名無しさんNGNG
並び替えの時に
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テーブルを参照…)になってしまいます。
教えてください
0493デフォルトの名無しさんNGNG
>>492
そりゃそうだろ。AAA.ID なのか CCC.ID なのか明示しなきゃ。
0494デフォルトの名無しさんNGNG
>492
デルファイのコードで書くなちゅーの
ここで質問するならSQLだけで説明して欲しいわ
0495デフォルトの名無しさんNGNG
>>493
例えば
ORDER BY AAA.ID DESCですか?
0496デフォルトの名無しさんNGNG
オラクルのPL/SQLについて質問なのですが、
Postgreみたいにカーソルの明示的な移動って出来ないのでしょうか
1row前に戻るとか。
0497496NGNG
↑ちなみに8iですー
0498デフォルトの名無しさんNGNG
>496
FETCHしか無いから出来ないちゃうか?
ちゅーかカーソルの明示的な移動って、
どういう使い方をするときに必要なのだ?
0499496NGNG
>>498
カーソルを返すストアドファンクションで、
中で%NOTFOUNDまでループさせた場合、
その後にカーソルをreturnするとエラーになっちゃうんです。
%NOTFOUNDの手前でとめればOKなんですけど。
0500496NGNG
そんで手前で止める為に予め件数を取得してないとならないのが
面倒なので、なんとかカーソル動かせないかなぁと思ったのです。
0501デフォルトの名無しさんNGNG
このスレって元々は単発質問スレ?
糞スレリサイクル大成功?
0502デフォルトの名無しさんNGNG
>499
FETCHする前に変数に、変数に入れておけば良いんじゃない?
そしたら最後のレコードを取得できるんちゃう
0503デフォルトの名無しさんNGNG
>>499
例外処理で返すのは反則?
0504デフォルトの名無しさんNGNG
「日付が最も大きいもののデータを抽出する」
という処理はどうやりますか?
0505496=499NGNG
当方まだPL/SQLを始めて3日目なもので、
的はずれなこと言ってたらごめんなさい。

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

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

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

こんな感じでいいかね?
0507デフォルトの名無しさんNGNG
>504 日付降順に並べて1つフェッチしたら?
0508504NGNG
506のやり方は駄目でした。

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

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

説明を略しすぎてない?
0510504NGNG
>>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

・・・こんな感じになってます。
0511504NGNG
で、指定したIDの日付が最大のものを更新したいのです。
例えば、idが'yamamoto'でdate1が最大のもののdate1を更新したいのです。
説明不足で申し訳ない。
0512502NGNG
>505
そのとおり


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

思い付く方法といえば、ストアド作るか、シーケンス用のテーブル作って
SELECT 〜 FOR UPDATE, UPDATE 〜 しかないです。どちらもコードの修正が必要
になっちゃいます。
0514デフォルトの名無しさんNGNG
>513
トリガーでやる
0515 NGNG
>>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'
0516515NGNG
>>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'
0517504ではないがNGNG
>>516
すげえ。
半信半疑で実行して見たら本当にできたよ。
MySQLでこんなことできるとは知らなかった……。
0518515NGNG
>>517
本当はnot exists文が使えると
分かりやすいんだが。
あと
>>515-516
の両方のレスで
where句の
b.id1 is null and
は
b.id is null and
の間違い(コピペ修正ミス)
ゴミン
0519517NGNG
>>518
でも>>515はできなかったよ。
ANSI92 では UPDATE で FROM って使えるの?

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

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

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

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

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

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

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

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

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

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

宜しくお願いします。
0536デフォルトの名無しさんNGNG
↑訂正
戻り値 ×
戻り値の型 ○
0537デフォルトの名無しさんNGNG
質問です。

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

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

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

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

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

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

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

同名の関数があります。
書式指定文字列はちょっと違うはずなので、
その辺はドキュメントみてちょ。
0544デフォルトの名無しさんNGNG
PL/SQLで質問です。
date型をGMT通算秒で表示したいのですがどうすればいいんでしょう?
0545578NGNG
「通算秒」という概念が良く分からんが、NEW_TIMEっていう関数を
使えばGMTに変換は可能だぞ
0546デフォルトの名無しさんNGNG
C言語とかだとtime_tに入れるやつだよね。
たしかグリニッジ標準時間で1970年1月1日 0時0分0秒からの
経過時間を秒で表現するやつっしょ?
でもoracleで使えるのかな?
0547デフォルトの名無しさんNGNG
アホがおる
0548デフォルトの名無しさんNGNG
…しかし1はこんな展開になるなんて予想だにしなかっただろう…
0549デフォルトの名無しさんNGNG
月曜から初のプログラムというものに挑戦してます。
言語は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.型番(*)";
0550デフォルトの名無しさんNGNG
>>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日)
0551デフォルトの名無しさんNGNG
とりあえず、作ろうとしているSQLをsqlplusから
叩いてちゃんと動くかどうか確認してからだな。
0552デフォルトの名無しさんNGNG
とりあえずテーブルの構成から改善

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

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



0559デフォルトの名無しさんNGNG
ま、VBでも文字列の結合に+は使っちゃイカンというのは定説ですけどね。
0560デフォルトの名無しさんNGNG
>>556
惜しい。
「Structured Query Language」だよ。
0561デフォルトの名無しさんNGNG
マジで困ってます・・・

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に対応できません・・・(鬱

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

0565ハンチクNGNG
半角にしたけどいいね・・
こんなくらいの意味?もっとやっこしーの?

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 :と思ったが・・
0566ハンチクNGNG
失礼、>565 は >561 レス(わかるか・・)

しかし、ほんとの問題は条件1じゃない?
データ次第じゃあ、無限参照有り+重複参照有り、でしょ?
テーブルAのテーブル仕様(論理的に)が面倒そう・・
0567デフォルトの名無しさんNGNG
>>561
>>565のテーブルからSTART WITHで出してやればいい
もう解決かな
0568561NGNG
レスさんくす>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一発では無理な気がしてきてしまった今日この頃・・・

申し訳ない よろしくお願いします
0569ハンチクNGNG
>568 必ずしも数字ではないので・・・
仮にchar(4) とした場合 NVL(xx,'zzzzz')
全角とかあってややこしいなら NVL(xx,'') で 逆順ソート。
0570ハンチクNGNG
>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
0571デフォルトの名無しさんNGNG
すみません。START WITH って何ですか?
それを指定すると >>568 の順になるってのが、
どーやってもわかんない
0572デフォルトの名無しさんNGNG
>571

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

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

テーブルAの例の場合

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

でSQLを実行すると>578の様な結果になります
0573デフォルトの名無しさんNGNG

失礼 >568 の様な結果だね・・・鬱だ
0574561NGNG

>570

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

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

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

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

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

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

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

  Start With (゚∀゚)!イイ

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

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

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

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

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

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

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


0583デフォルトの名無しさんNGNG
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のレコードを抽出したい。
山田さんも佐藤さんも現会員なので予約、過去リストには出てきません。

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

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

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

というあたりで挫折しました。
0586デフォルトの名無しさんNGNG
UPDATE 表1
SET Count = ( SELECT COUNT(*)
FROM 表2
)

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

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

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

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


列挙しようと思ったがあまり思いつかなかった
0595デフォルトの名無しさんNGNG
>INSERT時にORDER BYが使えた
これは何の役に立つの?
0596デフォルトの名無しさんNGNG
そいあ、VIEW にも ORDER BY が使えるのね・・・変なの

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

不確定予測でスマン

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

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

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

ところで、君のところではテーブルの主キーが
何かもわからないでSQLを書いてるわけ?
0622デフォルトの名無しさんNGNG
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...

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

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

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

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

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

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

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

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

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

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

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

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

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

汎用言語(Java, VB, VC)からWebObjectsとやらを利用して
アプリケーション開発ってできるの?
WebObjectsってインターフェイス(ミドルウェア)じゃないんじゃない?
0634デフォルトの名無しさんNGNG
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マソ。
0635デフォルトの名無しさんNGNG
>>634

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

sage
0639デフォルトの名無しさんNGNG
SQLゴリゴリもいいし、WOでもいい。
目的に合わせてツールを選べ。

ただ正直、そろそろSQLゴリゴリからは解放されたいな・・・・・
0640デフォルトの名無しさんNGNG
SQLに代わる問い合わせ言語を開発しる・・・。

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


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

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

ただ、開発環境のIDE自体は、Mac版のほうが充実してるんだよな・・・
0651デフォルトの名無しさんNGNG
Oracle8でさ、更新日付が一番最近のレコードを一行だけ取り出す
うまい方法ってない?今やってるのがソートかけたものを一行Fetchする
やり方なんだけど、SQL一発でエレガントに取り出せないものかね?
8i以上ならサブクエリでORDER BYかけたものをrownum=1で
selectってできるんだけどさ。
0652デフォルトの名無しさんNGNG
>>651
ORDER BYをrownumのやり方きぼん。
0653岸NGNG
見てね〜!!

http://www.h4.dion.ne.jp/~k.seed/
0654デフォルトの名無しさんNGNG
おまいら!たまには政治にも目を向けてください。
0655651NGNG
>>652
Oracle8i以上
select *
from ( select *
     from TABLE1
    order by 更新日付 desc )
where rownum = 1

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

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



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

とか。あんましエレガントじゃないねぇ。
0659651NGNG
>>658
あ、それもここにカキコする前に試してみた(笑)

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

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

0660658NGNG
>>659
あ、同じく rownum=1 も追加ね。

で、PRO*C だったらふつーに fetch するのが一番エレガントじゃぁ・・・
0661デフォルトの名無しさんNGNG
SELECT * FROM TABLE1 WHERE 更新日付 IN
(SELECT MAX(更新日付) FROM TABLE1)
じゃダメなの?
0662651NGNG
>>660

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

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

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

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

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

初歩的な質問ですみません。
0672デフォルトの名無しさんNGNG
 お前ら当然glogin.sqlには

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

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

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

SQLServer2Kです。
0679デフォルトの名無しさんNGNG
そうなんですよね!
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

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

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

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

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

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

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

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

クエリのSQLびゅー
0698デフォルトの名無しさんNGNG
人|区分|名前|値|
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 |
0699デフォルトの名無しさんNGNG
sqlの勉強するのに良い参考書あるいはお薦めの参考書あったら
教えて下さい。
0700デフォルトの名無しさんNGNG
SQL文ってプログラム内から呼び出すときに、
あまりにも長いと駄目なんでしょうか?
たとえば、一行をいっぺんにUPDATEしようとすると
更新されず小分けにするとOKなんです

>>699
SQLで検索しろ!
0701デフォルトの名無しさんNGNG
>>698
select 区分, 名前, 値 from 表 where 区分 = 'B' and 値 = min(値)
group by 区分
0702デフォルトの名無しさんNGNG
>>698
select 区分, 名前, 値 from 表 where 区分 = 'B'
group by 区分 having min(値) = 値
0703デフォルトの名無しさんNGNG
>>698
select 区分, 名前, 値 from 表 where 人 = 'B'
group by 区分 having min(値) = 値
0704デフォルトの名無しさんNGNG
>>699 「改訂新版 はじめてのSQL」技術評論社 なんかどうだ?
0705698NGNG
>>701-703
ありがとう。でも出来なかったです。
ループ内なのでSQLでなんとかしたかったですが
とりあえずプログラム処理でやっちゃいます。
0706デフォルトの名無しさんNGNG
>>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.値
0707698NGNG
出来ました♪ >>706さんどうもです!
でも速度はプログラム処理の方(意外と速かった)とほとんど変わらなかった・・・
まあ勉強になったので良しですね。
ちなみに人 = 'B' の条件を副問い合わせ部分に入れたりしてみました。
0708706NGNG
>>707
人、区分でグループ化した時、一つのグループのレコード数がかなり多くなる
ような場合じゃないと大して効果は無いかも。

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

 テーブル名: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文はどのように書けば
良いのでしょうか?
0711デフォルトの名無しさんNGNG
>>710
普通は、このような用途がある場合、分類Aと分類Bを分けずに1つにするのではないでしょうか。

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

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

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

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


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

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

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

どなたか分かる方いませんか?
0722デフォルトの名無しさんNGNG
>>720
そもそも、number(4)って 4バイトって意味なのか?
0723デフォルトの名無しさんNGNG
>>720
それぞれのDB環境によって違うでしょう。
マニュアルで確認しよう。
0724デフォルトの名無しさんNGNG
あくまでも、予想なのだが
varcharと同じと考えるとそうかもね
ただ、number(4)だから
0から9999までの10進数しか扱えないと思われる
あくまでもいい加減な答えをしてみるテスト
0725デフォルトの名無しさんNGNG
>>720
oracleなら
charはchar(1)といっしょ
numberは小数点とかの位置、桁数がわからないとき
とかに使うんじゃなかったっけ。
ストアドの宣言ならテーブルの型使っとけ。
0726デフォルトの名無しさんNGNG
>>720
オラクルで、numberはnumber(38)のはず
バージョンによっては、違うのかもしれないが
0727デフォルトの名無しさんNGNG
>726
精度・位取りを省略すると浮動小数点数扱いになるよ。
最大精度は確かに38桁だけどnumber(38)とは全く意味が異なるので注意。
0728726NGNG
>>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はバイト数のような気がするので、
そこら辺の事を調べたらわかるのかもしれないが・・・・
領域計算の資料探せばわかるかな?
0729デフォルトの名無しさんNGNG
SQLの GROUP BY節 で筆問があります。
テーブルが1つに対してのGROUP BY節は出来るのですが、テーブルが2つになると
うまくできません。

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

俺もSQL勉強中だから一緒に悩んでやる(w
0731デフォルトの名無しさんNGNG
>>729
あとエラーメッセージを書け

どっちのテーブルの項目をGROUPしてるんだ
って単純な事だと思うが
0732729NGNG
テーブルを書きます。
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

どなたか分かる方いませんか?
0733730NGNG
>>732
すまんが、何が言いたいのかよくわからん。
いま書いているSQL文を見る限り

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

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

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

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

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

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

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

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

逆に言えば、どちらも更新されなければならないなら正規化されていないという事に。
0739729NGNG
結果を以下のようにしてみたかったの!
受注_支店番号 | 支店名 | 所在地
---------------+---------------+-------------------------------
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文が出ているのを試してみます。
0740デフォルトの名無しさんNGNG
>>739

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

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

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

とかのように使う。(あってる ? 試してないからちと不安)
0741デフォルトの名無しさんNGNG
>>739

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

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

申し訳ございませんが、同様な現象があったことがある方、対処方法をご存知の方
助言を頂けないでしょうか よろしくお願いします。
0746745NGNG
自己解決しました。
OSに依存していると勘違いをしていましたが、
単に名前解決を行っていなかったのが原因でした。
お騒がせして申し訳ございませんでした。
0747デフォルトの名無しさんNGNG
自己解決時のフォローを入れるようなまともな人を久々に見た...
感動をありがとう。
0748デフォルトの名無しさんNGNG
>>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
は成り立たない。おけ?
0749デフォルトの名無しさんNGNG
後の例は
select employCode, count(*)
from employee
where count(*) > 100
group by employCode
だ。
スマソ
0750@NGNG
m02製品品目を品目マスタ、t03出荷を出荷マスタとし出荷実績のない製品を表示
したいのですが,
select
m02製品品目.品番,
m02製品品目.品名
from
m02製品品目
where
not exists(
select
m02製品品目.品番
from
m02製品品目,t03出荷
where
m02製品品目.品番=t03出荷.品番); だとレコードがでないのです。existsを
つかって求めたいのですが,どこが間違っているのでしょうか?
0751デフォルトの名無しさんNGNG
>>750
だーかーら、何でExistsがそんなに好きなの?
select m02製品品目.品番, m02製品品目.品名
from m02製品品目
where m02製品品目.品番 not in(
select t03出荷.品番, count(*)
from t03出荷
group by t03出荷.品番
having count(*) > 0)<--これいらねぇな
0752751NGNG
>>751
うへ間違えた
select m02製品品目.品番, m02製品品目.品名
from m02製品品目
where m02製品品目.品番 in(
select t03出荷.品番
from t03出荷
group by t03出荷.品番
having count(*) > 0)
0753デフォルトの名無しさんNGNG
>>750
not existsの中の、
m02製品品目とt03出荷のテーブルの結合意味ある?

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


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

11111
222
3333

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

222
3333
11111

と並ぶようにするにはどうしたらいいんでしょうか?
0757デフォルトの名無しさんNGNG
>756

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

でいけるんちゃう?

SQL鯖は知らん。
0758名無しさん@お願いっぱい。NGNG
>>757
即レスありがとうございます
DBはローカルのParadoxテーブルです。

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

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

―     ○     ―         ^^

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






0766デフォルトの名無しさんNGNG
>764
主に業務システム構築っすね。
あとデータベース保守とか。
0767デフォルトの名無しさんNGNG
>>760, >>761

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

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

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

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

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

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

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

よろしくお願いします。
0772デフォルトの名無しさんNGNG
>>両者とも売上の無い日も空欄で良いので日付を連続して結果に返してほしいのです。

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

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

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

みたいな感じで
0773デフォルトの名無しさんNGNG
>>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

アバヨ
0774デフォルトの名無しさんNGNG
>>771
少なくとも使用DBくらい書けよ
0775デフォルトの名無しさんNGNG
みなさんありがとうございました。
使用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

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

0776デフォルトの名無しさんNGNG
結果は(NULL)ではなくゼロになって返ってくるとさらに嬉しいのですが・・・・

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

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

だとどういう結果が帰って来る?ほとんど素人だが採点頼む。
0778デフォルトの名無しさん     NGNG
>>777
スリーセブン、くそっ!
0779デフォルトの名無しさんNGNG
>>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

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

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

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

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文を出してワカランのなら
簡単には理解できないと思われます


あっ環境が無いので確認してないから、
間違えてるかも知れないけど
遠からずは無いと思う
頑張ってください
0789デフォルトの名無しさんNGNG
>>786
使えん。Oracle、SQLサーバマガジンの間違いじゃないのって言いたくなる。
これからDBはじめる初心者にはいいかも。
0790デフォルトの名無しさんNGNG
>>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
0791デフォルトの名無しさんNGNG
>>775
納期が迫っているのなら、SQL一発で抜き出すのは
ある程度のところで諦めて、何回かSQLを発行して
その結果をPG上でゴリゴリとくっつけるんだな。

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

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

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 = "山田"

でできたと思うんですが


最高得点回数についてどなたかアドバイスいただけませんか?
0794デフォルトの名無しさんNGNG
>>793
質問意味不明
出力結果求む

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


>>SELECT COUNT(DISTINCT NAME) FROM POINT WHERE NAME = "山田"
これだと必ず1になるんちゃう? DISTINCT いらないんちゃう?
0795デフォルトの名無しさんNGNG
SELECT NAME, COUNT(*)
FROM POINT
WHERE
( KAMOKU, POINT ) IN (
SELECT KAMOKU, MAX(POINT)
FROM POINT
GROUP BY KAMOKU
)
GROUP BY NAME;

こんなかんじ?
0796デフォルトの名無しさんNGNG
>>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って項目とテーブルに使われているのが気になるが
0797デフォルトの名無しさんNGNG
>>796
>>少なくともOracleは795-796両方OKだよ。
1) where exists (select ...)
2) where (col1, col2...) in (select ...)
は同じ結果を返すように作れるけど、2)の場合はサブクエリを先に評価
するようにオプティマイザを誘導できたりして、サブクエリで絞込みの大半を
行うようなケースで便利だったりする。
0798デフォルトの名無しさんNGNG
質問です。
数値型のデータにTO_CHARを使用したところ、空白が混ざってしまいます。
例: TO_CHAR(1,'00000000') → 「 00000001」
みたいな感じです。
どなたか、原因と回避方法をご存知ないでしょうか?
0799デフォルトの名無しさんNGNG
>>798
TO_CHAR(1,'FM00000000')
ヘルプないのけ?
0800デフォルトの名無しさんNGNG
--テーブル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文を作成すればよいのかわかりません。
キーがないので何をしたいのか意味不明かも
しれませんがどなたか教えてさい。

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

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

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

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


DDL/DML/DCLの区別は
オラクルマスターのシルバーで必須っす
0810デフォルトの名無しさんNGNG
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つとして、全員が入力していない可能性があります。
0811デフォルトの名無しさんNGNG
>>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
みたいなかんじ。
0812810NGNG
>>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
0813デフォルトの名無しさんNGNG
今オラクルマスターのゴールドの勉強しているんだけど、シルバーもっていたら
実務でもある程度は通用しますか?それともゴールドくらいきっちり持っていないと
駄目ですか?
0814デフォルトの名無しさんNGNG
シルバーは駄目っすね。ゴールドくらいはできて普通。
らしい。私はシルバーしか持ってないけど。
0815デフォルトの名無しさんNGNG
世の中、資格保有していなくともソツなく仕事をこなす人が存在する
そんなもんさ

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

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

>>815殿が述べている点については同意いたしまするよ
0819デフォルトの名無しさんNGNG
sqlplus で
select 'ABC&DEF' from dual;

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

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

ANIMAL

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

0825デフォルトの名無しさんNGNG
横に結合させる項目数の最大を決める必要がある!
グループ(TYPE)ごとの連番があればなお楽

770くらいからのレスを読んでわからないなら
プログラムで書いた方がええと思う
0826デフォルトの名無しさんNGNG
id | text
--------+--------------------------------------
1 | いのうえようすいイノウエタロー

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

ってやってもダメなんだけどポスグレに replace みたいな関数無いのかな?
文字列を置き換えるんじゃなく「文字列長」を置換するの!!
0827デフォルトの名無しさんNGNG
独習SQLってどうですか?
0828minamoNGNG
SQLの問題です。

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

というSQLを組みなさい。
0829デフォルトの名無しさんNGNG
age
0830デフォルトの名無しさんNGNG
>>828
本当に問題をだしているのですか?
知っている人に教えて欲しいのとは違うのですか?
0831デフォルトの名無しさんNGNG
Accessで不一致クエリでもかいてオナってろ(ワラ
0832デフォルトの名無しさんNGNG
>>828
一致するキーを条件に抽出するだけだろ。
0833デフォルトの名無しさんNGNG
ひょっとして

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

じゃないの?w
0834minamoNGNG
具体的な例を出そうか…

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

というテーブルがあり、

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

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

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

●データ定義

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です。
0837デフォルトの名無しさんNGNG
having count(*) = 1
0838836NGNG
SELECT * FROM MyTable t1 WHERE SINGULAR (
 SELECT * FROM MyTable t2 WHERE t2.keyVal >= t1.keyVal
   AND t2.keyVal < 7 AND t2.datVal < 3
);

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

 基 礎 じ ゃ ん

0842デフォルトの名無しさんNGNG
>>836

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

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

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

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

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

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

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

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

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

そういえば、Postgreのスレってどこかにあるのか?
0867デフォルトの名無しさんNGNG
PostgreSQL
http://pc.2ch.net/test/read.cgi/php/989375812/
PostgreSQL or MySQL
http://pc.2ch.net/test/read.cgi/unix/955533785/
MySQLってどうよ
http://pc.2ch.net/test/read.cgi/tech/1008316065/

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

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

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

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

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


0872デフォルトの名無しさんNGNG
すいません。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使ってます。よろしくお願いします。
0873デフォルトの名無しさんNGNG
>>872

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

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

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


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

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

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

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

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

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


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


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

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


実際さ、クラサバが流行始めた6〜7年前に流行ったマシン構成で、
(PenProでHD10GでNT3.51でORA7.3くらいかな?)
いまも現役稼働してるのって数多くはあるとおもう?
多少はあるとは思うが、移行作業の計画があるとかじゃない
ようは>>895だな
0901889NGNG
>>899
連番を取る方法かぁ・・・。
簡単な方法、思いつかないなぁ。
どなたか、簡単な方法があればご教授ください。m(_ _)m
0902デフォルトの名無しさんNGNG
>>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

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

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

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

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

未確認だからどうかワカランが!
0910デフォルトの名無しさんNGNG
>>909
構文的に間違ってた!
適当に解釈してください
0911889NGNG
>>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。
経験者の方、お力添えをお願いします。
0912889NGNG
出かける時間だぁ(T-T)
宜しくお願いします>ALL
0913デフォルトの名無しさんNGNG
うーむ。
後から連番を埋めることに、どういう意味があるんだろう。
0914909NGNG
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


こんな感じじゃない
0915デフォルトの名無しさんNGNG
連番の方が何かと都合がいいのは確か。
0916デフォルトの名無しさんNGNG
trigger 使っちゃ駄目なの?
0917デフォルトの名無しさんNGNG
age
0918デフォルトの名無しさんNGNG
trigger使うってどうすんの? なんかいい方法があるのかな。
0919デフォルトの名無しさんNGNG
>>911

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

別トランザクションが直前にINSERTしてたときは、そのトランザクションが
完了するまでロックされるし、COMMITした場合は一意制約に違反するから
INSERTに成功するまで繰り返さなきゃならない。
0920889NGNG
>>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;
0921デフォルトの名無しさんNGNG
>>920
それだとシーケンス使うのと一緒だべ
0922919NGNG
>>921
違う。シーケンスだと値が飛ぶ可能性が高いが、
最大値を使えば既に飛んでない限り飛ばない。
0923909NGNG
>>922
エライ中途半端な理由だな!
同じ事を>>905で例を上げているのに違う言われたから
考えたのに...それで納得するなら、別に構わないんだが
0924889NGNG
>>921
ロールバック・コミットを併用したときも
一緒ですか?

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

という風に使用したテーブルに順にABC…とふっていく
ヤシがいます…
なんと言ってやればいいのでしょうか?
0926デフォルトの名無しさんNGNG
>>925
几帳面でよろしい。
0927デフォルトの名無しさんNGNG
>>926
よろしくない。
SELECT文も、場合によっては100行を超えるときもある。
後から読むと、ASなんか使うなってよってよく思う。
0928タスケテNGNG
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 | ○ |
+------+------+-------+

しかし結果は上記の通り、外部結合できておりません。なぜでしょうか?
厨レベルでまことに恥ずかしい限りですが、どなたかお助けください。
0929タスケテNGNG
二重投稿すみません。半角スペース無効なの忘れてました。
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  | ○  |
+------+------+-------+

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

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

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

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

正解
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
0932デフォルトの名無しさんNGNG
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
0933デフォルトの名無しさんNGNG
>>932
テーブルの構造を変える。列数 100 なんて、常軌を逸している。
0934932NGNG
932です。
列数は、ちょっとおおげさに書きすぎました。
実際には、30〜40くらいなのです。

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


0936デフォルトの名無しさんNGNG
正規化するだけがテーブル設計で良いとは限らない
ってのも本当だな

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

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

0941デフォルトの名無しさんNGNG
agetageyou
0942デフォルトの名無しさんNGNG
果たしてこのスレにPart2はあるのだろうか?
0943KYONGNG
はじめまして。
SQLでつまってます。

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

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

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

>>945
受注番号がユニークでない(明細行があるのかな?)って言ってるから外れだよな。
0947通りすがりの人。NGNG
>>943

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

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

0948943NGNG
>>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と一緒でいけると思うが?
0949944NGNG
>>945 >>947
おまえらエロビデオのモザイクの中を想像する訓練が必要だな。

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

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

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

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

受注番号がユニークで無ければダメだな
きっと2件あったら4件でて来てしまうな
0954デフォルトの名無しさんNGNG
>>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)
しかないので悪いが、どちらも
確認済。
0955954NGNG
s/ユニークの時に/ユニークでなければ
0956超弩級初心者NGNG
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をご教示くださいませ。
0957デフォルトの名無しさんNGNG
SELECT コーン
FROM うんこ
WHERE 食DATE=( CurrentDate( ) - Day(1) )
0958デフォルトの名無しさんNGNG
ある抽出条件(条件1)ででてきたレコード群に対し、さらに抽出条件(条件2)を
課すにはどうすればいいですか?

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

等と言った感じにするのですか?
0959デフォルトの名無しさんNGNG
select * from TBL1
where 条件1 『and』 条件2
0960デフォルトの名無しさんNGNG
Postgresで試したのですけど、トリガーを使用するとき、
ユーザZでTable Aに更新かけられたとき、Table Bを更新するようなトリガーで
Table Bに更新権限がないってエラーになるんですけど、
Table Bに更新権限与えないとだめですか?
そういうもんですか?
Table Bに更新権限与えないでやる方法ないですかね?
0961960NGNG
だめかしら?
0962デフォルトの名無しさんNGNG
>>960
postgresは触ったことがないが、
この手の(隠蔽させる)方法として、
直接更新できないテーブルに対して
更新ストアドプロシージャを作成し、
そのストアドプロシージャに
更新させたいユーザに実行権限を
付与することで対応できると思う。
0963一緒に考えてくさいNGNG
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

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

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

SQL文実行↓

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

かなり悩んでます。2ヶ月くらい
0965デフォルトの名無しさんNGNG
>>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にならないのだけど?
0966デフォルトの名無しさんNGNG
Ωは?
0967デフォルトの名無しさんNGNG
965>>
当初、私もMIN関数を使っていたのですが
データの件数のせいかもしれませんが
すべてのユーザーについて、MIN関数を使うとべらぼうに遅いです。

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

これですべての行を調べなくてもすむんじゃないかと思うのですが、
実際にSQLを書こうとすると、どう書いていいのか分からないのです。
0968デフォルトの名無しさんNGNG
このスレまだあったんだ。
2getしようとしてやめた記憶がある。
懐かしい。
0969デフォルトの名無しさんNGNG
これ次スレ立てる必要ある?
こっちに統合しちゃっていいような気がする
http://pc3.2ch.net/test/read.cgi/tech/1020158297/l50
0970デフォルトの名無しさんNGNG
>>967
普通のRDBMSでは「数えない」なんて事が無理な以上、あなたの希望する事は無理。
0971デフォルトの名無しさんNGNG
すみません、教えてください!!!
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側の値で更新したいのです。

よろしくお願いします。
0972デフォルトの名無しさんNGNG
>>967
「ユーザが見つかった時点で処理終了 (次のユーザ処理へ)」 みたいなのは、SQLじゃ無理でないですか?
漏れはそういったSQL記述ができるRDBMS知らないです。 あるのかな?
RPGとかCOBOLなら書けますが、もしかしたら >>965さん のSQLの方が速いかも。
0973デフォルトの名無しさんNGNG
>>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

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

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


0978971NGNG
できました!!!
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 ));
でうまくいきました。
0979973NGNG
>>978
うまくいって、よかったね。
というか、おれはなんというSQL文を書いていたのだろうか。
INSERT文とUPDATE文が混ざってるよ。。。。。
マジ、寝ぼけるのもほどがある。
鬱・・・
0980デフォルトの名無しさんNGNG
質問なんですが、

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

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

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

なんてのもあります。
参考書やネットで調べてみたのですが、わかりません…
どなたか教えてください。お願いしますm(_ _)m
0981デフォルトの名無しさんNGNG
>>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リンク越しに結合すると強烈に遅いことが有るんで、全体に
占める更新対象の割合が小さい時は、絞込みに集合演算子使う
いいかも。
0982デフォルトの名無しさんNGNG
Oracle8です
数値項目で値がNullの場合、自動的にゼロを取得するようにするには
どうしたら良いのでしょうか。
よろしくお願いします。
0983デフォルトの名無しさんNGNG
>>969
扱ってる内容が結構差別化されてるから分かれてた方がいいと思う。
というわけで誰か次スレ立てて〜
0984デフォルトの名無しさんNGNG
こっちと統合するんじゃないの?どうせ住み分けできてないし。
データベース Part2
http://pc3.2ch.net/test/read.cgi/tech/1020158297/
0985デフォルトの名無しさんNGNG
>>982
NVL
0986982NGNG
>>985 ありがとうございます!
0987デフォルトの名無しさんNGNG
住み分けちゃんとできてるじゃん。たまにスレ違い質問が出るのはどこも一緒だし。
向こうの内容は自分的には必要無いから統合したら読みにくくなりそうだな。
0988デフォルトの名無しさんNGNG
>>987
むしろ製品固有スレにブランチを希望するのだが。
現存するスレ:PostgreSQL, MySQL, Interbase(Firebird), Access
建立してない:Oracle, MSSQLServer(MSDE), DB/2

結局、SQLゆうても標準SQL(ANSI SQL/92か?)に基づいているわけではないし。
製品固有のキツイ方言混じりのSQL文見せられてもなぁ、って想いがあるわけで。

# そもそも、ここは宿題の単発質問スレを成り行きで消化してただけじゃない?
0989デフォルトの名無しさんNGNG
まっ、放っておいてもスレ立てたい人が勝手に立てるでしょ
流れにまかせておけばいいんじゃない?
0990デフォルトの名無しさんNGNG
このスレまだ生きてる?
0991デフォルトの名無しさんNGNG
>>988 を訂正

現存するスレ
ORACLE & SQL Server
http://pc3.2ch.net/test/read.cgi/tech/1008908462/l50

ORACLE
http://pc3.2ch.net/test/read.cgi/tech/1010400855/l50

要するに、それなりに名前を聞くDBで個別スレが無いのはDB2だけだと。
もし次スレをたてるやつがいたら、ここら辺の関連スレの
リンクぐらいは張っておいて欲しいなぁ。
0992ペーパープラチナNGNG
1000間近ですな。
0993デフォルトの名無しさんNGNG
100000000000000000000 - 10000000000000000000
0994デフォルトの名無しさんNGNG
1000
0995デフォルトの名無しさんNGNG
1000
0996デフォルトの名無しさんNGNG
1000

0997デフォルトの名無しさんNGNG
1000
0998デフォルトの名無しさんNGNG
1000
 
0999デフォルトの名無しさんNGNG
1000


1000デフォルトの名無しさんNGNG
1000!!!!            
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。