SQL 连接多个表,计数,包括0个计数

SQL Join multiple tables, count, include 0 counts

我正在使用 Oracle 数据库 11g。 假设我有 3 个数据库 tables。一份包含披萨店的信息,一份包含人的信息,一份包含订单的信息:

PIZZA_SHOP
编号|姓名 |
1 | 多米诺骨牌
2 | 必胜客
3 | 棒约翰

个人
姓名| PIZZA_SHOP_FK
吉姆 | 多米诺骨牌
Tod | 必胜客
凯莉 | 多米诺骨牌
弗兰克 | 棒约翰

订单
PERSON_FK |订单
吉姆 | 意大利辣香肠
Tod | 奶酪
凯莉 | 意大利辣香肠
吉姆 | 香肠
Tod | 专业

我们想省略特色披萨。从这个table可以看出,2个pepperoni和1个sausage pizza是从Dominos订的,1个cheese pizza是从Pizza Hut订的,没有从Papa Johns订过。我想要做的是获得以下输出:

多米诺骨牌 --- 意大利辣香肠 --- 2
多米诺骨牌 --- 香肠 --- 1
多米诺骨牌 --- 奶酪 --- 0
必胜客 --- 意大利辣香肠 --- 0
必胜客 --- 香肠 --- 0
必胜客 --- 奶酪 --- 1
棒约翰 --- 意大利辣香肠 --- 0
棒约翰 --- 香肠 --- 0
棒约翰 --- 奶酪 --- 0

我试过的是这样的:
SELECT PS.NAME, O.ORDER, 计数(O.ORDER)
来自 PIZZA_SHOP PS
FULL OUTER JOIN PERSON P
ON P.PIZZA_SHOP_FK = PS.NAME
完整的外部连接订单 O
ON O.PERSON_FK = P.NAME
其中 O.ORDER 在 ('Pepperoni', 'Cheese', 'Sausage')
GROUP_BY PS.NAME, PS.TYPE

但不幸的是,它没有检索到任何“0”计数。我尝试了其他几种方法,但开始 运行 没主意了。谁能帮我解决一下?

此类查询背后的想法是使用 cross join 创建所有行,然后使用 left joingroup by 将所需数据组合在一起。这有点复杂,因为你在人和订单之间有这些奇怪的关系,但它仍然可行:

select ps.name, toppings.order, count(o.order)
from pizza_shop ps cross join
     (select 'Pepperoni' as order from dual union all
      select 'Cheese' from dual union all
      select 'Sausage' from dual
     ) toppings left join
     order o
     on o.order = toppings.order left join
     persons p
     on p.pizza_shop_fk = ps.name and
        p.name = o.person_fk
group by ps.name, toppings.order;