![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
データベース初心者です。
(机上で学習中のレベル。)
質問用に例えば以下のテーブルがあるとします。
血液型占い。
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
No.3ベストアンサー
- 回答日時:
#1です。
前回答えを書いたつもりだったので、補足になりますが。。
>なるほど、FROMでAを指しているところでエラーというわけでしょうか
エラーはおきません。SELECT文の結果がゼロ件で何も登録されないというだけです。
>この点も合わせて、SELECTにDISTINCTをつけて以下のようにすれば解決するでしょうか?
なぜBLOODテーブルだけにしたのにDISTINCTが必要と思いましたか?
BLOODテーブルはマスタですから、データは4件だけで重複はありませんよね。
このあたりが机上学習の弱さですかね。。
無料で使えるものを入れてみては?
No.2
- 回答日時:
先ず、DBシステムによりJOINの記述方法が異なります。
また、バージョンにより違いがあることも珍しくありません。
よって、「Oracle10gでは」とか「Accessでは」という記述が必要です。
次に、掲題のSQLですが、これは正しくありません。
INSERTする情報の中にHUMAN由来のものがありませんよね。不必要な
結合は間違いの元であり、例え期待通り動作しても効率が悪いのです。
尚、#1の方の回答は方言が無いので、大抵のDBで、このまま使えます。
この回答への補足
ご回答ありがとう御座います。
>INSERTする情報の中にHUMAN由来のものがありませんよね
なるほど。考えが甘かったです。
これが
#1さんが指摘されたバグに繋がったという事ですね。
>・HUMANに1件もデータがない場合、何も登録されません
No.1
- 回答日時:
たぶん、以下のように書きたかったのだろうと思います。
(投稿する直前に見直しをお勧めします)
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 血液型=(選択された血液型)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessのテーブルデータを一気...
-
Accessでデータシートに同じデ...
-
MS Accessの列と行の入れ替えを...
-
Accessでの稼働日数計算の方法
-
このISAMでは、リンクテーブル・・
-
処理の途中で停止させ、再開さ...
-
テーブルで一番古いレコードだ...
-
Access VBAからエクセルに出力...
-
Access(MDB)の複製(レプリケー...
-
ビューのソートについて
-
Oracleで上書きImportはできま...
-
ユニオンクエリで複数ファイル...
-
accessでレコード更新直後の反...
-
クエリとパススルークエリを作...
-
マテリアライズドビューとスナ...
-
SQL文のEXISTSについて
-
ACCESS2003でメニューバーを作...
-
MS Accessを共有した際にファイ...
-
【mysql : HTML】チェックボッ...
-
アクセス レコードセットを更...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
Accessのテーブルデータを一気...
-
アクセス レコードセットを更...
-
Oracleで上書きImportはできま...
-
テーブルで一番古いレコードだ...
-
このISAMでは、リンクテーブル・・
-
ビューのソートについて
-
SQLです教えてくださいお願いし...
-
accessでレコード更新直後の反...
-
構文エラー : 演算子がありませ...
-
マテリアライズドビューとスナ...
-
結合テーブルでINSERTする方法...
-
Accessでの稼働日数計算の方法
-
ERROR1062:Duplicate entry.......
-
同一テーブルのデータを参照し...
-
処理の途中で停止させ、再開さ...
-
重複クエリを使ったデータ削除
-
Accessでレコード削除ができな...
-
MS Accessを共有した際にファイ...
-
IF NOT EXISTを使用するINSERT文
おすすめ情報