0

次のような3つのテーブルがあります。

m(id INT, name TEXT)
tn(id INT, name TEXT, valueid  INT)
tv(valueid INT, name TEXT)

m テーブルには一意のエントリのみがあります。「tn」テーブルには、m.id フィールドに一致する値が少なくとも 1 つ含まれます。通常は多数あります。最後に、「tv」テーブルには、valueid フィールドを使用して tn テーブルに関連付けられた多くの値があります。

その結果、m テーブルから値を選択できるようになり、m.id = tn.id のように「tn」テーブルで対応する値を見つけることができます。最後に、tn.valueid フィールドに関連付けられているすべての tv 値を取得する必要があります。

出力は次のようになります

foo host bar
foo host foobar
bar host1 foo

ここで、列 1 は m.name から、列 2 は tn.name から、列 3 は tv.names からです。tv.names のエントリごとに、クエリの新しい出力行が生成されます。

アップデート:

これまでのところ、m の一意の名前とそれに関連付けられている tn.name の値を選択できる最初のクエリを作成できました。

select m.name, tn.name from m, tn where m.id = tn.id and m.id = 128;

これを拡張して 3 番目のテーブルを含め、他の 2 つのテーブルの valueid フィールドによる選択を制限する必要があります。

ありがとう。

4

1 に答える 1

1

現在の表記法を維持して、同じアプローチを使用して 3 番目のテーブルを追加できます。

select m.name, tn.name, tv.name
  from m, tn, tv
 where m.id = tn.id
   and tn.valueid = tv.valueid
   and m.id = 128
;

ただし、最近のほとんどの人は、より明示的な ANSI 結合表記を使用する方がよいと考えていると思います。

SELECT m.name, tn.name, tv.name
  FROM m
  JOIN tn ON tn.id = m.id
  JOIN tv ON tv.valueid = tn.valueid
 WHERE m.id = 128
;

ON(すべてを大きな節に入れるのではなく、いくつかの条件が特定の節に入って結合の性質を明確にするという点で、より明確WHEREです。)

于 2013-08-11T02:43:46.560 に答える