Sql 如何将两个表中的列合并到一个输出中?

Sql 如何将两个表中的列合并到一个输出中?,sql,postgresql,Sql,Postgresql,我有两张资料相似的桌子。让我们称它们为items\u a和items\u b。它们应该是一个,但它们来自不同的来源,所以它们不是。当我完全联接这两个表时,一些行以一个或两个表中的数据结束。两个表中的一列都是category\u id。我想使用category\u id将组合表与categories表交叉。但是,我现在有两个category\u id列(一个来自items\u a,一个来自items\u b)。有没有办法把这两列合并成一列 我希望这不是一个太令人困惑的问题。在查询中指定列应该可以做

我有两张资料相似的桌子。让我们称它们为
items\u a
items\u b
。它们应该是一个,但它们来自不同的来源,所以它们不是。当我完全联接这两个表时,一些行以一个或两个表中的数据结束。两个表中的一列都是
category\u id
。我想使用
category\u id
将组合表与categories表交叉。但是,我现在有两个
category\u id
列(一个来自
items\u a
,一个来自
items\u b
)。有没有办法把这两列合并成一列


我希望这不是一个太令人困惑的问题。

在查询中指定列应该可以做到:

select a.col1, b.col2, a.col3, b.col4, a.category_id 
from items_a a, items_b b 
where a.category_id = b.category_id
应该在选择所需的列时使用技巧

为了避免某些数据仅在项目_a中,而某些数据仅在项目_b中,您可以执行以下操作:

select 
  coalesce(a.col1, b.col1) as col1, 
  coalesce(a.col2, b.col2) as col2,
  coalesce(a.col3, b.col3) as col3,
  a.category_id
from items_a a, items_b b
where a.category_id = b.category_id

coalesce函数将返回第一个非null值,因此对于每一行,如果col1是非null的,它将使用该值,否则它将从col2获取值,等等。

我猜您要做的是一个of

如果两个表都有相同的列,那么您就可以这样做

SELECT category_id, col1, col2, col3
  FROM items_a
UNION 
SELECT category_id, col1, col2, col3 
  FROM items_b
否则,你可能需要做一些类似的事情

SELECT category_id, col1, col2, col3
  FROM items_a 
UNION 
SELECT category_id, col_1 as col1, col_2 as col2, col_3 as col3
  FROM items_b

我有一个类似的问题,但有一点不同:有些a.category\u id不在b中,有些b.category\u id不在a中。
要解决这个问题,只需将beny23的优秀答案改编为

select a.col1, b.col2, a.col3, b.col4, a.category_id from items_a a LEFT OUTER JOIN items_b b on a.category_id = b.category_id 选择a.col1、b.col2、a.col3、b.col4、a.category\u id 来自项目a 左外连接 项目b 在a.category\u id=b.category\u id上 希望这对某人有所帮助。

注意。

当您的表有三个或更多时,只需添加union和left outer join:

select a.col1, b.col2, a.col3, b.col4, a.category_id 
from 
(
    select category_id from a
    union
    select category_id from b
) as c
left outer join a on a.category_id = c.category_id
left outer join b on b.category_id = c.category_id

最上面的答案假设两个结果都不是空的。在我的需求中,有两个表需要设置为1,没有连接约束。我只是把它们结合起来

如果希望得到结果,而不管1是否为空

select a.col1, b.col2, a.col3, b.col4, a.category_id 
from items_a a
  full outer join items_b b 
  on 1=1
 
我们应该做到这一点。
实际上,当我这样做的时候,我不得不更进一步,对我想要连接在一起的两个“集合”使用表表达式,然后完全外部连接这两个集合。

您的第一个示例不是有效的
UNION
语句-它实际上应该是两个SELECT语句的组合。第二个示例不需要括号,而且在语法上是正确的。。。其中c.col1=coalesce(a.col1,b.col1)?@bigmac:不应该有问题吗?如果没有公共id怎么办?我只想让这些列彼此连接,而不使用公共id,只需要它们出现的顺序就可以了?@cmcdragokai:这听起来像是一个不同的问题。如果没有任何东西可以连接这两个表,那么依赖自然顺序不能保证得到一致的结果。如果我想检查列
a.col1
和列
b.col1
中的值,看看这些值是否不同,该怎么办?如果
a.col1
为0且
b.col1
为1,则删除此行。如果其中一个为null,则使用非null值。如果两者都为空,则保留空值。很难将此理解为对原始问题的回答。虽然这个概念可能确实是正确的,但它需要一些解释来说明它与问题的关系。这个答案确实帮助我将两个不同表中的两列组合起来,并在一个查询中将它们显示为两个不同的列。
select a.col1, b.col2, a.col3, b.col4, a.category_id 
from items_a a
  full outer join items_b b 
  on 1=1