SQL:在一个表中查找同一个字段,以获取另一个表中的多个值?

时间:2009-11-22 15:46:14

标签: sql postgresql

(不确定这个问题的名称是否真的有意义,但我想做的事情非常简单)

给出看起来像这样的表:

Table Foo
---------------------------------
| bar1_id | bar2_id | other_val |
---------------------------------

Table Bar
--------------------
| bar_id | bar_desc|
--------------------

如何创建一个返回表格的选择,如下所示:

---------------------------------------------------------
| bar1_id | bar1_desc | bar2_id | bar2_desc | other_val |
---------------------------------------------------------

即。我想从Foo中获取每一行并添加一个包含Bar中bar_id描述的列。因此Bar中可能会有一些行不会在结果集中结束,但Foo的每一行都应该在其中。

此外,这是postgres,如果这有所不同。

5 个答案:

答案 0 :(得分:2)

SELECT F.bar_id1, 
    (SELECT bar_desc FROM Bar B WHERE (F.bar_id1 = B.bar_id)),
    F.bar_id2, 
    (SELECT bar_desc FROM Bar B WHERE (F.bar_id2 = B.bar_id)),
    F.other_val
FROM FOO F;

答案 1 :(得分:2)

这并没有直接回答你的问题(但没关系,上面的人已经有了),但......

这被认为是非常糟糕的设计。将foo与3个小节相关联后会发生什么?或者更多? (不要说它永远不会发生。我已经失去了多年来我实施过的“永远不会发生的事情”的数量。)

执行此操作的一般正确方法是执行一对多关系(每个条指向一个foo,或者一个中间的foo-to-bar表,请参阅many-to-many relationships)。现在你正确地格式化了前端的输出,只需获取每个foo的一个条形列表就可以传递给它(在SQL中很容易)。报告是一种特殊情况,但通过旋转或CrossTab queries仍然可以相对轻松地完成。

答案 2 :(得分:1)

SELECT
  foo.bar1_id, bar1.bar_desc AS bar1_desc,
  foo.bar2_id, bar2.bar_desc AS bar2_desc,
  foo.other_val
FROM
  foo
  INNER JOIN bar bar1 ON bar1.id = foo.bar1_id
  INNER JOIN bar bar2 ON bar2.id = foo.bar2_id

这假设您在bar1_id中始终同时拥有bar2_idfoo。如果这些可以null,则将INNER JOIN更改为LEFT OUTER JOIN

答案 3 :(得分:0)

select f.bar1, b1.desc, f.bar2, b2.desc, f.value 
from foo as f, bar as b1, bar as b2 
where f.bar1 = b1.id 
  and f.bar2 = b2.id

答案 4 :(得分:0)

我会尝试使用information_schema.colums表。

    SELECT concat(table_name,'_',column_name) 
FROM information_schema.columns WHERE table_name = bar1 OR table_name = bar2
into new_table

然后你可以填充它。

将foo作为select * from bar1

或选择进入