编写查询以将来自多个表的结果与所有可能的组合相结合

时间:2016-05-23 01:31:24

标签: sql postgresql

我有这个数据库架构:

CREATE TABLE users (
    id    SERIAL PRIMARY KEY,
    name  char(50) NOT NULL UNIQUE
);

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name char(50) NOT NULL,
);

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    uid INTEGER REFERENCES users (id) NOT NULL,
    pid INTEGER REFERENCES products (id) NOT NULL,
    quantity INTEGER NOT NULL,
    price FLOAT NOT NULL CHECK (price >= 0)
);

我正在尝试编写一个查询,它将为我提供用户和产品的所有组合,以及用户在该产品上花费的总金额。具体来说,如果我有5个产品和5个用户,表中应该有25行。现在我有一个几乎可以完成工作的查询,但是,如果用户从未购买过该产品,那么根本就没有打印行。

这是我到目前为止所写的内容:

SELECT u.name as username, p.name as productname, SUM(o.quantity * o.price) as totalPrice
FROM users u, orders o, products p
WHERE u.id = o.uid
AND p.id = o.pid
GROUP BY u.name, p.name
ORDER BY u.name, p.name

我认为这需要某种联接,但我的SQL知识有限,我不确定这样做的最佳方法是什么。我想如果有人可以帮我解决这个问题,那么我会有更好的理解。

1 个答案:

答案 0 :(得分:1)

您可以使用cross joinleft join

执行此操作
select u.name as username, p.name as productname,
       sum(o.quantity * o.price) as totalPrice
from users u cross join
     products p left join
     orders o
     on o.uid = u.id and o.pid = p.id
group by u.name, p.name;

cross join生成所有行。 left join引入匹配的行。使用SQL时的一个简单规则是:从不FROM子句中使用逗号。 始终使用明确的JOIN语法。