sql - 自定义表连接

标签 sql postgresql join

假设我在 Postgresql 数据库中有 4 个表:

users {
 id: int
}

cars {
 id: int
}

usage_items {
 id: int,
 user_id: int,
 car_id: int,
 start: date,
 end: date
}

prices {
 id: int,
 car_id: int,
 price: int
}

当用户租车时,我创建了一个 usage_item 记录来跟踪租车时间。月底时,我会寄给他一张包含计算成本的发票。这里的 SQL 非常简单:

SELECT usage_items.start, usage_items.end, prices.price
FROM usage_items
JOIN prices ON prices.car_id = usage_items.car_id

(我在这里省略了带有日期比较的 WHERE 子句,我在 Ruby 代码中进行的其余计算)

我现在遇到的问题是,我的一些用户与我签订了定制契约(Contract),以确保为他们提供更低的价格。我正在寻找一种在我的数据库中表达这种逻辑的方法。 我想到了将 user_id 列添加到价格表中的想法,但这样我就需要为每个用户创建价格。所以我决定实现以下逻辑:如果价格行中的 car_id 为 null,则表示它是所有用户的默认价格。否则,它特定于用户。但是我不知道如何为这种情况编写 SQL,因为:

SELECT usage_items.start, usage_items.end, prices.price
FROM usage_items
JOIN prices ON prices.car_id = usage_items.car_id
WHERE prices.user_id IS NULL OR prices.user_id = usage_items.user_id

返回两个价格的行。我只需要具有关联组的那个,或者如果它不存在则具有 null group_id 的那个。

你能帮我修复这个 SQL 吗?或者也许我的设计不好,我应该以某种方式更改它?

最佳答案

鉴于您现有的模式,这是完成您想要的事情的一种方法:

设置:

CREATE TABLE usage_items (user_id INTEGER, car_id INTEGER);
CREATE TABLE prices (user_id INTEGER, car_id INTEGER, price INTEGER);

INSERT INTO usage_items VALUES (1, 10), (2, 11), (3, 12);
INSERT INTO prices VALUES
    (1, 10, 101),
    (2, 11, 102),
    (4, 12, 104),
    (NULL, 10, 201),
    (NULL, 11, 202),
    (NULL, 12, 304);

查询(我没有使用开始/结束,但它是同一件事):

SELECT DISTINCT ON (u.user_id, u.car_id) u.user_id, u.car_id, p.price
FROM usage_items u
LEFT JOIN prices p
    ON u.car_id = p.car_id
    AND (u.user_id = p.user_id OR p.user_id IS NULL)
ORDER BY u.user_id, u.car_id, CASE WHEN p.user_id IS NOT NULL THEN 1 ELSE 2 END

结果:

| user_id | car_id | price |
| ------- | ------ | ----- |
| 1       | 10     | 101   |
| 2       | 11     | 102   |
| 3       | 12     | 304   |

如您所见,usage_items 中的记录及其汽车的相应记录和 prices 中的 user_id 获得了自定义价格,而不是 NULL 版本;没有自定义价格的用户 3 获得 NULL 版本(而不是其他客户的自定义价格)。


在这里测试https://www.db-fiddle.com/f/wPVWEY3r22n22iKpDMrcMC/0

关于sql - 自定义表连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52609505/

相关文章:

mysql - 通过表连接优化慢速 Lon/Lat 查询

php - 组连接结果不准确

sql - 如何快速 self 加入(与不同的相同)?

sql - 在 postgres 的 jsonb_each 中选择空对象

mysql - 从 3 个不同的表中确定每个用户的总成本

mysql - 查找两列中的不同值

sql - 如何在不使用 CASE WHEN 的情况下将 GROUP BY 作为参数?

mysql - 需要有关 4 个表的 SQL 查询的帮助

SQL - 在外部查询和子查询中使用相同的表

mysql - 检查主键 SQL 是否不存在行