プロが教えるわが家の防犯対策術!

閲覧ありがとうございます。
2個以上のテーブルで外部接続する方法が判らず
投稿しました。

DATA1
-----------------------
店名     カテゴリ1  カテゴリ2
大将     ラーメン   餃子
トレビアン  パスタ    ケーキ


ジャンル
-----------------
カテゴリ  大分類
ラーメン  中華
餃子    中華
パスタ   イタリアン
ケーキ   スイーツ


お店の 「名前」・「カテゴリ」 が入っているテーブルに、
「ジャンル」をくっつけたいと思っています。
期待している結果は以下のようなものです。


DATA1
-----------------------
店名     カテゴリ1  カテゴリ2  大分類1   大分類2
大将     ラーメン   餃子     中華     中華
トレビアン  パスタ    ケーキ    イタリアン  スイーツ


以下のように書いてみましたが、上手くいきませんでした。
どのようにSQL文を書けばいいのか、いまいち判りません。

初歩的な事かもしれませんが、よろしくお願いします。

select *
FROM DATA
LEFT JOIN ジャンル ON (カテゴリ1=カテゴリ)
LEFT JOIN ジャンル ON (カテゴリ2=カテゴリ)

A 回答 (2件)

>実は、ジャンルのテーブルを「ジャンル1」「ジャンル2」と二つ用意する


>方法は一度ためして、それ以外の方法がないかと悩んでいました。

>今、DATA1の中に「カテゴリ1」から「カテゴリ5」まであり、
>これでは同じ内容のテーブルが5個になってしまうので、

ちょっと勘違いされているようです。

私の回答は、「別名を付けているだけ」であり、ジャンルのテーブル自体は「1つのまま」です。
ジャンルテーブルを2つ(5つ)作る必要はありません。

大事な事なので2回書きますw

私の書き方で必要なテーブルは

「DATA1とジャンルの2テーブル」だけです。

「DATA1とジャンル1とジャンル2の3テーブル」ではありません。

つまり「同じテーブルを別のテーブルとして扱っている」だけです。

そうではなく、単純に
「LEFT JOINを何度も書くのは煩雑なので単純にできないか」
と言う事でしたら、「できません」。

そもそも、ジャンル1~ジャンル<n>、と言う風に、横に繰り返し列を持つのは正規化上、好ましくないんです。
(まあ、5つくらいが限度でしょう)

これが何10とあるなら、DATA1とカテゴリのリレーションを持つ中間テーブルを作るべきでしょうね。

データの正規化については、ご自分で調べてくださいね。

この回答への補足

同じテーブルを複数回参照する事もうまくできました。
いろいろとありがとうございました。

補足日時:2011/01/24 11:49
    • good
    • 0
この回答へのお礼

データーの正規化、中間テーブルのキーワードで色々調べてみました。
おっしゃるとおり、設計を見直すほうがいいですね。

多対多の問題点に、現在思いっきり該当しています。
正規化にしたがってDBを作りかえる事にしました。

すでに、このQAのタイトルと内容がズレていますが
他の方がQ&A参照したときに、参考になるように
リンクを張っておきます。

多対多のデータの問題点
http://oshiete.goo.ne.jp/qa/3738694.html
データの正規化
http://gihyo.jp/dev/feature/01/database/0003?pag …

自分の場合、設計の都合で、カテゴリー5個まで
と現実側に制限がかかっていました。

今回は、勘違い気味な質問にまで付き合ってくださって
ありがとうございました。

お礼日時:2011/01/24 11:10

ジャンルから取得したい情報は、DATA1上にある、カテゴリ1とカテゴリ2で、2種類(キーは別)なのだから、「この2つのジャンルは別物である」と言う事をDBエンジンにわからせる必要があります。



つまり、「カテゴリ1用のジャンル」と「カテゴリ2用のジャンル」と言う風に書くんです。

そのためには以下のように、別名(エイリアス)を付けてください。

SELECT
d.店名,
d.カテゴリ1,
d.カテゴリ2,
g1.大分類 大分類1,
g2.大分類 大分類2
FROM DATA1 d
LEFT JOIN ジャンル g1
ON d.カテゴリ1 = g1.カテゴリ
LEFT JOIN ジャンル g2
ON d.カテゴリ2 = g2.カテゴリ

SQlite3なのでおそらくLinuxか、iOSか、Androidの話かと思われますが、今手元に環境がないので、FireFoxプラグインのSQLite Manager(Windows)で確認しました。

この回答への補足

回答ありがとうございます。
質問が悪かったみたいで、質問の補足です。

実は、ジャンルのテーブルを「ジャンル1」「ジャンル2」と二つ用意する
方法は一度ためして、それ以外の方法がないかと悩んでいました。

今、DATA1の中に「カテゴリ1」から「カテゴリ5」まであり、
これでは同じ内容のテーブルが5個になってしまうので、
「ジャンル」のテーブルをなんとか1つ済ます回避策等があれば
と思って質問させていただきました。

もしかしたら機能的に無理な事を聞いているかもしれません。
無理な場合は無理と言っていただける形でも助かります。

たびたび済みませんがよろしくお願いします。

補足日時:2011/01/23 19:28
    • good
    • 0

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

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