Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:在一个表中的同一字段中查找另一个表中的多个值?_Sql_Postgresql - Fatal编程技术网

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

SQL:在一个表中的同一字段中查找另一个表中的多个值?,sql,postgresql,Sql,Postgresql,(不确定这个问题的名称是否真的有意义,但我想做的很简单) 给定如下所示的表: Table Foo --------------------------------- | bar1_id | bar2_id | other_val | --------------------------------- Table Bar -------------------- | bar_id | bar_desc| -------------------- 如何创建一个select以返回如下所示的表: -

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

给定如下所示的表:

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

Table Bar
--------------------
| bar_id | bar_desc|
--------------------
如何创建一个select以返回如下所示的表:

---------------------------------------------------------
| bar1_id | bar1_desc | bar2_id | bar2_desc | other_val |
---------------------------------------------------------
i、 我想从Foo中获取每一行,并添加一列,其中包含来自bar的bar\u id的描述。所以,可能有来自Bar的一些行不在结果集中,但Foo的每一行都应该在结果集中

此外,这是博士后,如果这有区别的话

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

这假设您在
foo
中始终同时拥有
bar1\u id
bar2\u id
。如果这些可以是
null
,那么将
内部连接更改为
左侧外部连接

,这不会直接回答您的问题(但没关系,上面的人已经有了),但是

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
这被认为是非常糟糕的设计。当你的foo可以与3个条相关联时,将来会发生什么?还是更多?(不要说这永远不会发生。我已经记不清这些年来我实施了多少“这永远不会发生”的事情)


通常正确的方法是建立一对多关系(每个条都指向一个foo,或者中间的foo-to-bar表,请参见)。现在,您可以在前端正确设置输出格式,只需为每个foo获取一个条列表,并将其传递给它(在SQL中很容易做到)。报告是一种特殊情况,但使用数据透视或其他方法仍然相对容易完成。

我会尝试使用information\u schema.colums表

    SELECT concat(table_name,'_',column_name) 
FROM information_schema.columns WHERE table_name = bar1 OR table_name = bar2
into new_table
然后您可以填充它

将foo作为从bar1中选择*


或者选择进入

我的身份发生了什么变化(在代码前面加四个空格(有一个按钮可以快速完成:选择代码,然后按CTRL-K键)我很清楚设计的含义。我没有创建这些表,我只是处理其他人创建的数据库。而且,在这种情况下,Foo真的不可能变大,因为它描述的结构本质上是双面的。
    SELECT concat(table_name,'_',column_name) 
FROM information_schema.columns WHERE table_name = bar1 OR table_name = bar2
into new_table