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

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

SQL教えて〜!!

1 :デフォルトの名無しさん:01/09/10 19:16
データーベースのテストが水曜日にあります。
全くのチンプンカンプンで問題の意味すらわかりません・・
門題は「単価が30000円以上で40000円以下の商品名と単価を
表示する命令」です!!これをSQL文にして欲しいのですが・・

891 :デフォルトの名無しさん:02/07/04 16:19
意見だと?
ワクワク

892 :デフォルトの名無しさん:02/07/04 19:16
Oracle のバインド変数みたいなのって
Postgres にないのかな?


893 :デフォルトの名無しさん:02/07/05 11:29
>>890
記憶域は有限なんだからどんな方法でID振ったところで
使い切る可能性は必ずある

894 :デフォルトの名無しさん:02/07/05 11:32
とかいう客が多いんで、いつ使い切るのか計算させてる。
だいたいは1000億年以上先だったりする。

895 :デフォルトの名無しさん:02/07/05 22:49
記憶域の心配して、あれこれ考える間に
ハード&ソフトが進化してしまうよ

896 :デフォルトの名無しさん:02/07/06 00:06
シーケンスを使い切るのはきっちり計算できるからデータ量考えたら
絶対使い切らないことは保証できるわな。

897 :889:02/07/06 01:19
とりあえず、シーケンス使っておけば
間違いないだろう。
時間軸でのソートも出来るし。
一年3200万秒もないんだから、事実上使い切るのは無理。

898 :デフォルトの名無しさん:02/07/06 01:23
SQL>CREATE SEQUENCE hoge;

順序が作成されました.


899 :デフォルトの名無しさん:02/07/06 01:31
でもさー、空き番号があったら嫌だっていう客多くない?
こっちの説明に耳かしてくれて、シーケンス使えるのって
大体1/3くらいかなぁ。


900 :デフォルトの名無しさん:02/07/06 08:18
シーーケンスも有限だからって使わなければ
日付型って有限なんじゃないの?<調べてないから予測
そんな事を言ったらDB設計自体できなくなるんじゃない


実際さ、クラサバが流行始めた6〜7年前に流行ったマシン構成で、
(PenProでHD10GでNT3.51でORA7.3くらいかな?)
いまも現役稼働してるのって数多くはあるとおもう?
多少はあるとは思うが、移行作業の計画があるとかじゃない
ようは>>895だな

901 :889:02/07/06 11:18
>>899
連番を取る方法かぁ・・・。
簡単な方法、思いつかないなぁ。
どなたか、簡単な方法があればご教授ください。m(_ _)m

902 :デフォルトの名無しさん:02/07/06 21:44
>>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

こんな感じなんじゃないかな?

903 :デフォルトの名無しさん:02/07/06 21:50
あっ書き間違えた
where a.r <> a.seq  →  where a.recnum <> a.seq


904 :889:02/07/06 21:57
>>902
すまんね。質問しなおす。
「連番を確実に取る方法を教えて下さい」。
です。以上。

905 :デフォルトの名無しさん:02/07/06 22:00
>>904
んじゃシーケンス以外なら
select max(seq)+1 form TableA
じゃないのか?

906 :889:02/07/06 22:09
>>905
え〜とゴメンなさい。説明が足りませんでした。
その連番を後々INSERT文でキーとして使う場合を想定してください。

シーケンス使っちゃ連番にならないしなぁ・・・。
どうやるんだろ?

907 :デフォルトの名無しさん:02/07/06 22:09
>>905
連番 (=番号が飛んでいない) じゃないと嫌だってさ。

908 :デフォルトの名無しさん:02/07/06 22:15
>>906
削除する時に本当にレコードを削除しないで、削除フラグだけ立てとく。
インサートする時まず削除フラグが立っていてシーケンスが最小のものが
あったらそのレコードを書き換える。
削除フラグが立っているレコードが無ければ、本当にインサートする。

って言うのはどう ?

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

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

未確認だからどうかワカランが!

910 :デフォルトの名無しさん:02/07/06 22:31
>>909
構文的に間違ってた!
適当に解釈してください

911 :889:02/07/06 23:08
>>910
適当に解釈したけど、こういうこと?

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

読み取り一貫性を考えると
ちょっと不安、このSQL。
経験者の方、お力添えをお願いします。


912 :889:02/07/06 23:20
出かける時間だぁ(T-T)
宜しくお願いします>ALL

913 :デフォルトの名無しさん:02/07/06 23:33
うーむ。
後から連番を埋めることに、どういう意味があるんだろう。


914 :909:02/07/07 00:35
insert into test (num,other)
select
nvl(min(a.recnum), select max(seq)+1 form test) num,
'適当' other
from
(select rownum recnum, num from test order by num) a
where a.recnum <> a.num


こんな感じじゃない

915 :デフォルトの名無しさん:02/07/07 00:46
連番の方が何かと都合がいいのは確か。

916 :デフォルトの名無しさん:02/07/07 01:08
trigger 使っちゃ駄目なの?

917 :デフォルトの名無しさん:02/07/09 23:23
age

918 :デフォルトの名無しさん:02/07/10 01:36
trigger使うってどうすんの? なんかいい方法があるのかな。

919 :デフォルトの名無しさん:02/07/10 23:06
>>911

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

別トランザクションが直前にINSERTしてたときは、そのトランザクションが
完了するまでロックされるし、COMMITした場合は一意制約に違反するから
INSERTに成功するまで繰り返さなきゃならない。

920 :889:02/07/11 11:00
>>914
nvl関数にSelect文って使えるんですか?

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

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

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


921 :デフォルトの名無しさん:02/07/11 21:33
>>920
それだとシーケンス使うのと一緒だべ

922 :919:02/07/11 22:41
>>921
違う。シーケンスだと値が飛ぶ可能性が高いが、
最大値を使えば既に飛んでない限り飛ばない。

923 :909:02/07/11 23:00
>>922
エライ中途半端な理由だな!
同じ事を>>905で例を上げているのに違う言われたから
考えたのに...それで納得するなら、別に構わないんだが

924 :889:02/07/11 23:39
>>921
ロールバック・コミットを併用したときも
一緒ですか?

>>923
すみません、>>901の時点でLOCK TABLEを知らなかったものですから。
>>905では、ロックの処理がないため
>>920と同じ内容を指してるとは思えなかったんですよ。
レスありがとうございます。(^^

925 :デフォルトの名無しさん:02/07/12 14:39
SELECT A.名称 , B.名称
FROM 業務 AS A , 商品 AS B

という風に使用したテーブルに順にABC…とふっていく
ヤシがいます…
なんと言ってやればいいのでしょうか?


926 :デフォルトの名無しさん:02/07/12 15:10
>>925
几帳面でよろしい。

927 :デフォルトの名無しさん:02/07/12 16:12
>>926
よろしくない。
SELECT文も、場合によっては100行を超えるときもある。
後から読むと、ASなんか使うなってよってよく思う。

928 :タスケテ:02/07/12 17:21
Oracle 8i から PostgreSQL 7.2.1 への移行ではまっています。

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

Oracle 8i でのSQL

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

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

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

PostgreSQL

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

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

しかし結果は上記の通り、外部結合できておりません。なぜでしょうか?
厨レベルでまことに恥ずかしい限りですが、どなたかお助けください。


929 :タスケテ:02/07/12 17:33
二重投稿すみません。半角スペース無効なの忘れてました。
Oracle 8i から PostgreSQL 7.2.1 への移行ではまっています。

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

Oracle 8i でのSQL

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

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

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

PostgreSQL

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

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

しかし結果は上記の通り、外部結合できておりません。なぜでしょうか?
厨レベルでまことに恥ずかしい限りですが、どなたかお助けください。

930 :デフォルトの名無しさん:02/07/12 18:09
Tableが2つ(バッチ用、マスタ用)あってマスタ用への変更を
バッチ用に書き込んでいます(マスタへの変更なし)

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

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

最新の情報一覧を見たいので
バッチ用にIDがあればそのレコードのID,名前,情報1,情報2、
なければマスタ用のID,名前,情報1,情報2を
表示するにはどのようなSQL文をかけばよいのでしょうか?


931 :928=929:02/07/12 20:43
自己レスです。簡単なことでした。逝ってきます…。

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

932 :デフォルトの名無しさん:02/07/14 21:17
ORACLEを使用していますが、テーブルの列が多い場合に、
SQL文が長くなりすぎてエラーとなってしまうのですが、
回避する方法はありますでしょうか?
(select * from AAAとすると、DATE型の書式を指定できない
ため以下のようにしてみました)

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

(テーブルのイメージ)
A001 CHAR
A002 CHAR
A003 DATE
A004 DATE
A005 CHAR
A006 CHAR
(省略)
A100 CHAR


933 :デフォルトの名無しさん:02/07/14 21:25
>>932
テーブルの構造を変える。列数 100 なんて、常軌を逸している。

934 :932:02/07/14 21:39
932です。
列数は、ちょっとおおげさに書きすぎました。
実際には、30〜40くらいなのです。

業務によって違うとは思いますが、列数は
どのくらいで設計すべきなのでしょうか?


935 :デフォルトの名無しさん:02/07/14 21:54
>>934
30〜40でも多くない?なんか古いシステムからそのままフォーマット
持ってきて使っているのでは?どっかにテーブル仕様書アップしてみな。
明日まで暇なんで見てやるよ(親が危篤で田舎に帰ってきたが持ち直した
もんでねぇ。忌引が有給になってしまったい)




936 :デフォルトの名無しさん:02/07/14 22:05
正規化するだけがテーブル設計で良いとは限らない
ってのも本当だな

だから注意して見るしかない!

937 :デフォルトの名無しさん:02/07/15 16:11
どっちかというとたかだか30〜40の列数でエラーになるほうが
おかしくないか?
いま手元にあるテーブルの仕様書見ると余裕で50列とか70列
とかあったりするけど別にエラー起きてないし。

938 :デフォルトの名無しさん:02/07/15 16:25
つぅかエラーメッセージは?

939 :デフォルトの名無しさん:02/07/16 00:15
>>932
出力後のカラム名が、例えば「DECODE ( name, NULL, 'ななし', ・・・・・・ )」と長い文字に
なった場合エラーになることがあります。
SELECT ながーーーいカラム名 AS a FROM table
とかにすれば解決。

ところで、MicrosoftAccess2002のSQLで
大文字小文字を区別するのってどうやるの?
SELECT name FROM table WHERE name = 'nanashi'
で、nanashiはヒットさせたいが、NANASHIはヒットさせたくない

940 :デフォルトの名無しさん:02/07/16 11:04
>>939
テーブルの列が多いのでは無くてSQL文が長いだけではない?
Viewを作るか集計用のテーブルを作っておくか考えたらどう?



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

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)