8

これはSQL設計の質問です。まず、セットアップ。私は3つのテーブルを持っています:

  1. リンクされたサーバーに対するクエリに基づいて自動的に入力されるA。このテーブルのデータは変更できません。
  2. Bは、Asのコレクションの名前を含む、わずか12行程度です。
  3. AtoBは、Asが名前付きコレクションに編成され、両方の列に外部キーがあるマッピングテーブルです。

SQLマッピングテーブル

たとえば、Aには次のものが含まれます。

  1. キリン
  2. フクロウ

そしてBには以下が含まれます:

  1. シアトル動物園
  2. サンノゼ動物園

また、AtoBには次のものが含まれています。

1,1(シアトルのキリン)
2,1(シアトルのフクロウ)
3,1(シアトルのタイガー)
2,2(サンノゼのフクロウ)

さて、問題:

これらのコレクションの一部に、Aにないアイテムを含めるように依頼されました。そこで、Aと同じID列とName列を持つテーブルCを作成し、データを入力します。前の例に従って、Cに次のものが含まれているとします。

  1. ドラゴン

問題は、CのアイテムをAtoBに含めるにはどうすればよいですか?シアトル動物園にドラゴンを含める必要がある場合はどうなりますか?

私の最初の本能は、素朴で、AとCの和集合を含むビューVを作成し、AtoBをVtoBに変更することでした。それが私の素朴さが報われたところです。ビューへの外部キーを作成することはできません。

1つまたは複数のAまたはCをBに関連付けるための標準的で正しい手段があると思います。

4

4 に答える 4

13

アーサー・トーマスのソリューションを拡張するためunionに、サブセレクトにWHEREを含めないで、ユニバーサルビューを作成できるようにします。

SELECT A.Name as Animal, B.Name as Zoo FROM A, AtoB, B
    WHERE AtoB.A_ID = A.ID && B.ID = AtoB.B_ID 
UNION
SELECT C.Name as Animal, B.Name as Zoo FROM C, CtoB, B
    WHERE CtoB.C_ID = C.ID && B.ID = CtoB.B_ID

次に、次のようなクエリを実行できます。

SELECT Animal FROM zoo_animals WHERE Zoo="Seattle Zoo"
于 2010-01-11T21:18:25.633 に答える
5

ドラゴンをAに入れることができない場合は、別のテーブルと別のリンクテーブルを作成する必要があります。問題は、保存する必要のある一意のデータセット(別のテーブル)を作成することです。これは、Aと同じセットにすることはできません。同じセットではないため、外部キーを持つリンクテーブル(AtoB)を使用できなくなります。リンクがセットAからの参照であることを確認するキー。したがって、次のようなテーブルを作成できます。

imaginary_creatures

  • id
  • 名前

imaginary_creatures_to_b

  • imaginary_creatures_id(imaginary_creaturesテーブルへのリンク)
  • b_id(動物園テーブルへのリンク)

後で動物園にすべての生き物を入れたいときは、UNIONを行うことができます

SELECT A.Name FROM A where A.ID IN 
   (SELECT AB.A_ID FROM AtoB AB WHERE B_ID = 
      (SELECT B.ID FROM B WHERE B.Name = 'Zoo Name'))
UNION
SELECT i.name FROM imaginary_creatures i i.id IN 
   (SELECT ic.imaginary_creatures_id FROM imaginary_creatures_to_c ic 
    WHERE ic.b_id = (SELECT B.ID FROM B WHERE B.Name = 'Zoo Name'))

それを書くためのより良い方法があるかもしれませんが、それはあなたの目的のために働くはずです。

于 2010-01-11T21:02:36.260 に答える
1

Arthur Thomasには優れた解決策があります。他の可能な解決策は、リンクテーブルに、関連するテーブル(AまたはC)を示す列を追加することです。次に、外部キーではなくトリガーを介して関係を適用します。しかし、実際にはアーサーのソリューションは、この種のことを行うための好ましい方法です。

于 2010-01-11T21:08:20.503 に答える
0

ドラゴンをAに入れ、AtoBに一致するレコードがあるかどうかに関係なく、Aからすべてのレコードを選択する場合は、LEFTOUTERJOINを実行します。このようなもの:

SELECT * FROM A
LEFT OUTER JOIN AtoB
ON A.id = AtoB.A_ID

編集:これは、新しいレコードをAに追加できる場合にのみ機能します。追加できないという事実を見逃しました。アーサー・トーマスの解決策はあなたが望むものだと思います。

于 2010-01-11T20:43:46.857 に答える