全外连接缺失值为null

时间:2017-10-15 21:37:03

标签: sql postgresql outer-join

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

以下是示例:

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'    |
+---------------------------------+

3 个答案:

答案 0 :(得分:1)

我建议有两张表代表营养类型和食物类型。然后有一个额外的表格,指明营养价值。

您可以在食物和营养方面进行交叉连接,然后左右加入营养价值以获得结果。

我为你在这里http://sqlfiddle.com/#!17/d974b/3

做了一个小提琴

您无法进行完全外部联接的原因是,如果您在行上有数量,那么您也有ID。它们位于同一数据集中。

答案 1 :(得分:1)

这看起来不像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
;

答案 2 :(得分:0)

如果您有2个表(t1和t2),其列为cols:dimension_1,dimension_2,measure_1,measure_2

你可以写

select dimension_1, dimension_2, sum(measure_1) as measure_1, sum(measure_2) as measure_2
from t1
full join t2 using(dimension_1, dimension_2)
group by dimension_1, dimension_2