(不确定这个问题的名称是否真的有意义,但我想做的事情非常简单)
给出看起来像这样的表:
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,如果这有所不同。
答案 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_id
和foo
。如果这些可以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
或选择进入