• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

#1です。 前回答えを書いたつもりだったので、補足になりますが。。 >なるほど、FROMでAを指しているところでエラーというわけでしょうか エラーはおきません。SELECT文の結果がゼロ件で何も登録されないというだけです。 >この点も合わせて、SELECTにDISTINCTをつけて以下のようにすれば解決するでしょうか? なぜBLOODテーブルだけにしたのにDISTINCTが必要と思いましたか? BLOODテーブルはマスタですから、データは4件だけで重複はありませんよね。 このあたりが机上学習の弱さですかね。。 無料で使えるものを入れてみては?

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

先ず、DBシステムによりJOINの記述方法が異なります。 また、バージョンにより違いがあることも珍しくありません。 よって、「Oracle10gでは」とか「Accessでは」という記述が必要です。 次に、掲題のSQLですが、これは正しくありません。 INSERTする情報の中にHUMAN由来のものがありませんよね。不必要な 結合は間違いの元であり、例え期待通り動作しても効率が悪いのです。 尚、#1の方の回答は方言が無いので、大抵のDBで、このまま使えます。

SAKENOSAKA
質問者

補足

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

  • jamshid6
  • ベストアンサー率88% (591/669)
回答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'

SAKENOSAKA
質問者

お礼

回答、ありがとうございます。 すみません、間違っていました。 このように書きたかったのです。 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

  • OracleのSQLについて 助けてください。

    OracleのSQLについて 助けてください。 (例) テーブルA 「human」 | ID | 名前 | テーブルB 「kotoba」 | ID | 名前 | テーブルC 「kakutougi」 | ID | 名前 | テーブルD 「kotoba_have」 | human.ID | kotoba.ID | テーブルE 「kakutougi_have」 | human.ID | kakutougi.ID | テーブルAには一人一人のIDと名前が入っています。 テーブルBには言語の種類IDと種類名(英語、日本語など)が入っています テーブルCには格闘技の種類IDと種類名が入っています。 テーブルDとテーブルEはその人がどの言語がしゃべれ、どの格闘技ができるかを示しています。 テーブルD、Eはその人が複数の言語が話せ、複数の格闘技ができる場合複数のhuman.IDが入ります。 ここで日本語と英語が話せ、柔道と空手ができる人を呼び出したい場合はどのようなSQLにすればよいのでしょうか。 プログラムでwhileで回してはできるのですが、データ量が膨大のためSQLでどうにかしたいのですがわかる方いらっしゃいますでしょうか? 助けてください。よろしくお願いします。

  • SQLの書き方

    テーブルA ○id data テーブルB ○subId id userId ○は、プライマリ 上記のようなテーブルがあります。 テーブルBのuserIdと テーブルAのid(=テーブルBのId)を指定して テーブルA,Bのデータを取得したいです。 ただし、テーブルBに該当データ(指定したuserId)に該当する データがない場合、テーブルAのデータのみ取得したいと考えています。 一発のSQLで取得できますでしょうか? ご教示お願いいたします。

  • SQLで二つのテーブルを統合したい

    お世話になります。 Access2000のSQLで質問させて下さい。 下記のAとBのテーブルがある状態で、二つを統合した Cを生成したいのですが、どのようにSQLを作成したらよいでしょうか? お手数でもうしわけございませんが、SQL文で回答頂ければ助かります。 --テーブルA--- ID 名前 11 やまだ 12 さかもと --テーブルB--- ID 名前 25 きのした 26 つちや --C-- ID 名前 11 やまだ 12 さかもと 25 きのした 26 つちや

  • 場合によって条件を変えるSQL

    ORACLE環境下、SQLにて以下のような条件でデータを取得したいです。 AテーブルとBテーブルを結合して、Bテーブルから名称を取得する。 <Aテーブル> id (key) 番号1 番号2 A01  001  n0001 A02  null  n0002 <Bテーブル> code(key) 名前  番号1 番号2 c0001   太郎  001  n0001 c0002   次郎  002  n0002 (1)A.番号が入力されていれば A.番号1=B.番号1 AND A.番号2=B.番号2を条件にする (2)A.番号が入力されていなければ A.番号=B.番号を条件からはずす。 A.番号2=B.番号2 のみで検索する。 <欲しい結果> A01→太郎を取得 A02→次郎を取得 入力されていたら条件に加え、入力されていなかったら 条件から外す、というSQLを教えていただけないでしょうか。 よろしくお願いいたします。

  • SQLの書き方

    わからないので質問をさせて頂きます。 テーブルAに、money、rank、name、IDと言うカラムがあります。 テーブルBに、IDとpointと言うカラム名があります。 テーブルAのIDを指定し、テーブルBに同じIDが存在する場合 テーブルAとBの値を取得するSQLを書いています。 Select テーブルA.money,テーブルA.rank テーブルA.name,テーブルA.ID,テーブルB.point FROM テーブルA,テーブルB Where テーブルA.ID = '5'; このように書くとmoney,rank,name、IDは重複して表示がされ pointに関してはすべてのpointが表示されてしまいます…。 重複するのでdistinctを使ったのですが うまくいかず…。 SQL初心者ですが、よろしければ教えてください。

    • ベストアンサー
    • MySQL
  • SQLの書き方を教えてください。

    初めまして。sql初心者です。OracleのSQLについて質問があります。 「update Aテーブル set Aテーブル.構成順 = (select Bテーブル.順番 from Bテーブル where Aテーブル.ID = Bテーブル.ID and Aテーブル.種類 = Bテーブル.種類CD)」 こういった内容のSQLって発行できるんでしょうか。 Bテーブル.種類CDの"種類CD"で「コンポーネント"種類CD"を宣言してください」というエラーになります。 書き方が分かりません。。 すいませんが教えていただきたく思います。 よろしくお願いいたします。

  • SQLについて教えてください

    お世話になっております。 以下、取得したい内容です。 この内容に対して、どのようにSQLを書けばよいか良いか教えて頂きたいです。 (1)DBの全テーブルに対して特定のカラムを取得したい。(カラム名はA,Bとする) (2)取得したカラム.Aに格納されている各値に対して、カラム.Bの各レコードの項目には何の値が格納されているか知りたい。 DBはオラクルですが、オラクルでしか使えないSQL構文はつかないようにしたいです。 自分で考えたSQLは、 SELECT A,B FROM * GROUP BY A,B ですが、そもそも全テーブルを指定する際に使用するのが、「*」では正しくないような気もします。 説明がつたなくて申し訳ございません。 宜しくお願い致します。 ・テーブルイメージ テーブル.test1 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 1 | | 02 |AA| 1 | | 03 |AB| 2 | | 04 |AB| 2 | | 05 |AC| 3 | | 06 |AC| 3 | | 07 |AC| 3 | +--------+------+ テーブル.test2 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 1 | | 02 |AA| 1 | | 03 |AB| 2 | | 04 |AB| 2 | | 05 |AC| 1 | | 06 |AC| 3 | | 07 |AC| 3 | +--------+------+ テーブル.test3 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 3 | | 02 |AA| 1 | | 03 |AC| 2 | | 04 |AC| 3 | +--------+------+

  • SQLがわからないので教えて下さい。

    SQLがわからないので教えて下さい。 素人な質問なのかもしれませんが、お願いします。 次のような2つのテーブルがあるとします。 テーブルA ID,name -------- 1,name1 2,name2 3,name3 4,name4 5,name5 テーブルB ID,hoge1,hoge2,hoge3 --------------------- 2, hoge, hoge, hoge 3, hoge, hoge, hoge テーブルAのとテーブルBのIDを見て、テーブルBのID に無いテーブルAのIDを取り出す方法が知りたいです。 質問がわかりにくいかもしれないので上の例でいえば、テーブルAのIDが1~5でテーブルBの方にがありますので、取り出したいIDは、1、4、5です。 どうかご教授ください。 よろしくお願いします。

  • SQLのsum関数

    こんにちは。 PostgresのSQLが思うように動いてくれません!! そのIDを持っている人がどのくらいの数を持っているのかを抽出したいのです。 テーブルは下記です。 ********************************************* ★Aテーブル ID  名前  数  場所  日付 0001 みかん 1  冷蔵庫 0901 0001 みかん 4  倉庫  0901 0001 みかん 1  冷蔵庫 0901 0002 いちご 1  部屋  0901 0002 いちご 2  部屋  0801 0003 きのこ 6  倉庫  0901 ★Bテーブル ID  名前 0001 みかん 0002 いちご 0003 きのこ 0004 あいす ********************************************* となっている場合、下記SQLを実行すると select a.ID ,b.名前 ,sum(a.数) as 数 from Aテーブル a,Bテーブル b where a.日付 >= '0901' and a.日付 <= '0901' and a.ID = b.ID group by a.ID ,b.名前, a.数 結果が 0001 みかん 2 0001 みかん 4 0002 いちご 1 0002 いちご 2 となり0001は合計6で出て欲しいのに別々に出てしまいます。 理想では 0001 みかん 6 0002 いちご 3 で出て欲しいです。 たとえばこの場合、場所によってなど出てしまうものでしょうか? これはなぜなのでしょうか? よろしくお願いします。

  • mysql でのsqlの書き方について教えてくださ

    mysql でのSQLの書き方についての質問です。 テーブルA(2項目 他既存データ) 氏名(姓) 氏名(名) 山田    太郎 山田    次郎 テーブルB(4項目) ふりがな氏名(姓) ふりがな氏名(名) 氏名(姓) 氏名(名) やまだ        たろう          山田    太郎 やまだ        じろう          山田    次郎 といった2つのテーブルがあります。 テーブルAに ふりがな氏名(姓) ふりがな氏名(名)  の2項目を追加してテーブルBのふりがなを 対応するテーブルAのふりがなに update したいのです。 内容がわかりにくくてすみません。

    • ベストアンサー
    • MySQL