如何连接两个结果

问题描述 投票:0回答:2

我购买了3张桌子,空运和海运。 我已经在db fiddle中制作了示例代码。我的问题是在第 6 段,我没有任何海运,我的 id 为 null,那是因为我使用的是海运中的 id。我应该怎么做才能解决这个问题?

采购表:

CREATE TABLE purchase
(
id SERIAL PRIMARY KEY,
date DATE NOT NULL
)

空气转运台:

CREATE TABLE air_transfers
(
id SERIAL PRIMARY KEY,
purchase_id INTEGER NOT NULL REFERENCES purchase(id),
units INTEGER NOT NULL
)

海运接送表:

CREATE TABLE sea_transfers
(
id SERIAL PRIMARY KEY,
purchase_id INTEGER NOT NULL REFERENCES purchase(id),
units INTEGER NOT NULL
)

我的外连接:

WITH sea_transfers AS (
SELECT purchase_id, SUM(units) AS units
FROM sea_transfers
GROUP BY purchase_id
),
air_transfers AS (
SELECT purchase_id, SUM(units) AS units
FROM air_transfers
GROUP BY purchase_id
)
SELECT st.purchase_id, (COALESCE(st.units,0) + COALESCE(at.units,0)) AS units
FROM sea_transfers AS st
FULL OUTER JOIN air_transfers AS at
ON st.purchase_id = at.purchase_id

如果我的海运为空,我会得到以下结果:

sql postgresql pg
2个回答
2
投票

你可以做

SELECT COALESCE(st.purchase_id, at.purchase_id) as purchase_id

小提琴

第3方编辑

来自sqlitetutorial.net

COALESCE 函数接受两个或多个参数并返回 第一个非空参数。下面说明了语法 合并功能:

SELECT COALESCE(10,20); -- return 10
SELECT COALESCE(NULL,20,10); -- returns 20

来自官方sqlite文档

合并(X,Y,...)

coalesce() 函数返回其第一个非 NULL 参数的副本,或者如果所有参数均为 NULL,则返回 > NULL。 Coalesce() 必须至少有 2 个参数。


1
投票

我认为您正在寻找

UNION ALL
而不是
FULL OUTER JOIN
,因为
UNION ALL
将合并两个结果
air_transfers
sea_transfers
表,您将从两个表中获得所有
purchase_id
units
值。

SELECT  purchase_id, SUM(units) AS units
FROM (
   SELECT purchase_id,units FROM air_transfers
   UNION ALL
   SELECT purchase_id,units FROM sea_transfers
) t1
GROUP BY purchase_id
© www.soinside.com 2019 - 2024. All rights reserved.