2017-10-15 68 views
1

我試圖在postgresql數據庫上使用full outer join來獲取缺失行具有空值的表的聯合。但是,它不適合我。完全外部聯接缺少值爲null

這裏是例子:

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

回答

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 
; 
+0

偉大的,更新我的答案,以刪除不可能:) – jontro

+0

這就是它。非常感謝。什麼是查詢! – James

1

我建議具有表示營養種類和類型的兩個表餐飲。然後有一張額外的表格來說明營養價值。

您可以對食物和營養做一個交叉連接,然後做一個營養價值的左連接,以獲得您的結果。

我做了一個小提琴爲你在這裏看http://sqlfiddle.com/#!17/d974b/3

,你不能做一個完整的外部原因聯接是,如果你有一個排的數量,你有ID以及。他們在相同的數據集中。

+1

有將最有可能是具有食物的其他好處一張單獨的桌子。如果你想添加更多的屬性,如food_type,weight等,你不會希望將其存儲在每一個重複行 – jontro