0

我有如下三个表:

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 字段相关联的所有 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;

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

谢谢。

4

1 回答 1

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

于 2013-08-11T02:43:46.560 回答