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

SQL教えて〜!!

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさんNGNG
データーベースのテストが水曜日にあります。
全くのチンプンカンプンで問題の意味すらわかりません・・
門題は「単価が30000円以上で40000円以下の商品名と単価を
表示する命令」です!!これをSQL文にして欲しいのですが・・
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
削除する時に本当にレコードを削除しないで、削除フラグだけ立てとく。
インサートする時まず削除フラグが立っていてシーケンスが最小のものが
あったらそのレコードを書き換える。
削除フラグが立っているレコードが無ければ、本当にインサートする。

って言うのはどう ?
レス数が900を超えています。1000を超えると表示できなくなるよ。