- ベストアンサー
SQLの正しい書き方
データベース初心者です。 (机上で学習中のレベル。) 質問用に例えば以下のテーブルがあるとします。 血液型占い。 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
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 前回答えを書いたつもりだったので、補足になりますが。。 >なるほど、FROMでAを指しているところでエラーというわけでしょうか エラーはおきません。SELECT文の結果がゼロ件で何も登録されないというだけです。 >この点も合わせて、SELECTにDISTINCTをつけて以下のようにすれば解決するでしょうか? なぜBLOODテーブルだけにしたのにDISTINCTが必要と思いましたか? BLOODテーブルはマスタですから、データは4件だけで重複はありませんよね。 このあたりが机上学習の弱さですかね。。 無料で使えるものを入れてみては?
その他の回答 (2)
- nda23
- ベストアンサー率54% (777/1415)
先ず、DBシステムによりJOINの記述方法が異なります。 また、バージョンにより違いがあることも珍しくありません。 よって、「Oracle10gでは」とか「Accessでは」という記述が必要です。 次に、掲題のSQLですが、これは正しくありません。 INSERTする情報の中にHUMAN由来のものがありませんよね。不必要な 結合は間違いの元であり、例え期待通り動作しても効率が悪いのです。 尚、#1の方の回答は方言が無いので、大抵のDBで、このまま使えます。
- jamshid6
- ベストアンサー率88% (591/669)
たぶん、以下のように書きたかったのだろうと思います。 (投稿する直前に見直しをお勧めします) 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'
お礼
回答、ありがとうございます。 すみません、間違っていました。 このように書きたかったのです。 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 血液型=(選択された血液型)
補足
ご回答ありがとう御座います。 >INSERTする情報の中にHUMAN由来のものがありませんよね なるほど。考えが甘かったです。 これが #1さんが指摘されたバグに繋がったという事ですね。 >・HUMANに1件もデータがない場合、何も登録されません