gpt4 book ai didi

sql - 全外连接缺失值与 null

转载 作者:行者123 更新时间:2023-11-29 12:09:02 25 4
gpt4 key购买 nike

我正在尝试在 postgresql 数据库上使用 full outer join 来获取对缺失行具有空值的表的并集。但是,它对我不起作用。

例子如下:

create temp table nutrient_names (
name text
);

insert into nutrient_names values
('fat'),
('sugar'),
('sodium'),
('total fat');

create temp table nutrients (
food_id int,
name text,
quantity float8
);

insert into nutrients values
(1, 'fat', 0.3),
(1, 'sugar', 15),
(1, 'sodium', 10),
(1, 'total fat', 25),
(2, 'sugar', 10),
(2, 'sodium', 4);

这是输出:

select n.name, n.food_id, n.quantity from nutrient_names nn
full outer join nutrients n
on nn.name = n.name
order by n.food_id, n.name;

+---------------------------------+
|name |food_id |quantity|
+---------------------------------+
| 'fat' |1 |'0.3' |
| 'sodium' |1 |'10' |
| 'sugar' |1 |'15' |
| 'total fat'|1 |'25' |
| 'sodium' |2 |'4' |
| 'sugar' |2 |'10' |
+---------------------------------+

我想要的:

+---------------------------------+
|name |food_id |quantity|
+---------------------------------+
| 'fat' |1 |'0.3' |
| 'sodium' |1 |'10' |
| 'sugar' |1 |'15' |
| 'total fat'|1 |'25' |
| 'fat' |2 |null | <----
| 'sodium' |2 |'4' |
| 'sugar' |2 |'10' |
| 'total fat'|2 |null | <----
+---------------------------------+

最佳答案

FULL JOIN 看起来不适合这里。根据您的示例,您希望列出 nutrient_names 中的所有行,次数与食物 ID 的次数一样多。这通常使用 CROSS JOIN 完成。

如果您没有包含食物 ID 列表的单独表格,您可以动态构建它然后加入它:

WITH
CTE_IDs
AS
(
SELECT DISTINCT
food_id
FROM nutrients
)
SELECT
nutrient_names.name
,CTE_IDs.food_id
,nutrients.quantity
FROM
CTE_IDs
CROSS JOIN nutrient_names
LEFT JOIN nutrients
ON nutrients.name = nutrient_names.name
AND nutrients.food_id = CTE_IDs.food_id
;

关于sql - 全外连接缺失值与 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46760247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com