SQL select - 一对多对多

时间:2013-08-11 02:11:52

标签: sql join

我有三个表如下:

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

在m表中只有唯一的条目。 'tn'表将包含至少一个与m.id字段匹配的值,通常有很多。最后,'tv'表有许多值,它们使用valueid字段关联回tn表。

结果是能够从m表中选择一个值,在'tn'表中找到它的相应值,就像m.id = tn.id一样。最后,我需要输出与tn.valueid字段关联的所有电视值。

输出就是这样

foo host bar
foo host foobar
bar host1 foo

其中第1列来自m.name,第2列来自tn.name,第3列来自tv.names。对于tv.names中的每个entrit,都会为我的查询生成一个新的输出行。

更新

到目前为止,我已经能够构建第一个查询,它允许我选择m中的唯一名称,并在tn.name中显示相关值:

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

我需要扩展它以包含第三个表,并通过其他两个表中的valueid字段限制选择。

感谢。

1 个答案:

答案 0 :(得分:1)

保持当前符号,您可以使用相同的方法添加第三个表:

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子句中。)