dポイントプレゼントキャンペーン実施中!

データベース初心者です。
(机上で学習中のレベル。)

質問用に例えば以下のテーブルがあるとします。
血液型占い。
HUMAN[ID,名前,血液型ID]
BLOOD[血液型ID,血液型,性格]

例えばBLOODには各血液型のデータが既に用意されている。
[1,'A','几帳面']
[2,'B','美人']
[3,'O','めんどくさがり']
[4,'AB','よくわからない']

UIから名前と血液型を入力するとHUMANに
ユーザーデータが登録されます。
HUMANテーブルでは血液型ではなくて血液型のIDを入れます。
この時に登録するためのSQLの書き方ですが
例えば、'山田','AB'と入力された場合(ここではIDは1と入れる)
以下のSQLの記述が正しいでしょうか。添削をお願いします。
これでも問題ない事は分かっているのですが
これが正しいやり方なのかが分からないので宜しくお願いします。

INSERT INTO HUMAN
SELECT 1,'山田',B.血液型ID
FROM HUMAN A,HUMAN B
WHERE A.血液型ID = B.血液型ID

A 回答 (3件)

#1です。


前回答えを書いたつもりだったので、補足になりますが。。

>なるほど、FROMでAを指しているところでエラーというわけでしょうか
エラーはおきません。SELECT文の結果がゼロ件で何も登録されないというだけです。

>この点も合わせて、SELECTにDISTINCTをつけて以下のようにすれば解決するでしょうか?

なぜBLOODテーブルだけにしたのにDISTINCTが必要と思いましたか?
BLOODテーブルはマスタですから、データは4件だけで重複はありませんよね。

このあたりが机上学習の弱さですかね。。
無料で使えるものを入れてみては?
    • good
    • 0

先ず、DBシステムによりJOINの記述方法が異なります。


また、バージョンにより違いがあることも珍しくありません。
よって、「Oracle10gでは」とか「Accessでは」という記述が必要です。
次に、掲題のSQLですが、これは正しくありません。
INSERTする情報の中にHUMAN由来のものがありませんよね。不必要な
結合は間違いの元であり、例え期待通り動作しても効率が悪いのです。

尚、#1の方の回答は方言が無いので、大抵のDBで、このまま使えます。

この回答への補足

ご回答ありがとう御座います。
>INSERTする情報の中にHUMAN由来のものがありませんよね
なるほど。考えが甘かったです。
これが
#1さんが指摘されたバグに繋がったという事ですね。
>・HUMANに1件もデータがない場合、何も登録されません

補足日時:2009/11/19 23:43
    • good
    • 0

たぶん、以下のように書きたかったのだろうと思います。


(投稿する直前に見直しをお勧めします)

INSERT INTO HUMAN
SELECT 1,'山田',B.血液型ID
FROM HUMAN A,BLOOD B
WHERE A.血液型ID = B.血液型ID AND B.血液型='AB'

記述としては間違ってはいません。
でも正しいやり方ではありません
・HUMANに1件もデータがない場合、何も登録されません
・HUMANに2件以上AB型の人がいたら、山田さんのデータを2件以上登録しようとします。
 (で、主キー制約でエラーになるでしょう)

以下のものでよいでしょう。
INSERT INTO HUMAN
SELECT 1,'山田',血液型ID
FROM BLOOD
WHERE 血液型='AB'
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。
すみません、間違っていました。
このように書きたかったのです。
INSERT INTO HUMAN
SELECT 1,'山田',B.血液型ID
FROM HUMAN A,BLOOD B
WHERE A.血液型ID = B.血液型ID

これでも以下の問題があったのですね。
気づきませんでした。勉強になります。
>・HUMANに1件もデータがない場合、何も登録されません
なるほど、FROMでAを指しているところで
エラーというわけでしょうか。

>・HUMANに2件以上AB型の人がいたら、山田さんのデータ
ごもっともです。
この点も合わせて、SELECTにDISTINCTをつけて
以下のようにすれば解決するでしょうか?

INSERT INTO HUMAN
SELECT DISTINCT 1,(記入された名前),血液型ID
FROM BLOOD
WHERE 血液型=(選択された血液型)

お礼日時:2009/11/19 23:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す