我购买了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
如果我的海运为空,我会得到以下结果:
你可以做
SELECT COALESCE(st.purchase_id, at.purchase_id) as purchase_id
COALESCE 函数接受两个或多个参数并返回 第一个非空参数。下面说明了语法 合并功能:
SELECT COALESCE(10,20); -- return 10
SELECT COALESCE(NULL,20,10); -- returns 20
合并(X,Y,...)
coalesce() 函数返回其第一个非 NULL 参数的副本,或者如果所有参数均为 NULL,则返回 > NULL。 Coalesce() 必须至少有 2 个参数。
我认为您正在寻找
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