sql - 根据同一表中的主记录插入缺失记录

标签 sql oracle join

我之前问过几乎相同的问题,但由于定序器的原因我无法使用 MERGE 语法。问题是我们对数据库中的人员有价格规则。我想为其他应该有相同规则的人同步这些价格规则。

+---------------------------+
| id | name | belongs_to_id |
|----+------+---------------+
| 1  | A    |               |
| 2  | B    | 1             |
| 3  | C    | 1             |
| 4  | D    |               |
+----+------+---------------+

好吧,现在用户 B 和 C 最终需要拥有与用户 A 相同的价格规则。所以我有一个如下的价格规则表(简化的):

+-----------------------------------+
| id | user_id | product_id | price |
+----+---------+------------+-------+
| 1  | 1       | 1          | 0.12  |
| 2  | 1       | 2          | 0.10  |
| 3  | 1       | 3          | 0.03  |
| 4  | 2       | 2          | 0.10  |
| 5  | 2       | 3          | 0.10  |
| 6  | 3       | 1          | 0.12  |
| 7  | 3       | 2          | 0.10  |
| 8  | 3       | 3          | 0.03  |
| 9  | 3       | 4          | 0.25  |
+----+---------+------------+-------+

所以在这个例子中,应该发生的是:

  • 为用户 2 提供产品 1 的价格,价格为 0.10
  • 将用户 2 产品 3 的价格更新为 0.03
  • 删除用户 3、产品 4 的价格规则

我想我必须采取三个步骤:删除、更新、添加。我得到了前两个。但我正在思考插入语句。基本上,我需要为用户 1 选择所有价格规则,然后为每个用户按product_id 进行左连接。我如何为每个用户执行此操作?

我使用的是 Oracle 10.1

最佳答案

INSERT INTO
  priceRule
SELECT
  user.id,
  parentPriceRule.product_id,
  parentPriceRule.price
FROM
  user
LEFT JOIN
  priceRule    AS parentPriceRule
    ON  parentPriceRule.user_id = user.belongs_to_id
LEFT JOIN
  priceRule    AS myPriceRule
    ON  myPriceRule.user_id     = user.id
    AND myPriceRule.product_id  = parentPriceRule.product_id
WHERE
  myPriceRule.id IS NULL

关于sql - 根据同一表中的主记录插入缺失记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10333645/

相关文章:

php - 使用第一个 MySQL 查询的结果从第二个表中提取数据

mysql - 选择已售出和未售出的产品

mysql - SQL选择当前周/上周

arrays - 加入 Elasticsearch 索引,同时匹配嵌套/内部对象中的字段

SQL 使用 OBJECT 作为 ORDER 方法的参数

sql - 如何对一年中的每个月进行分组

java - 在 Flink 数据集上应用多个 JOIN 的分区策略

sql - PostgreSQL,使用 pg_restore 更新现有行

mysql - 当我选择 MAX(updated_date) 时,其他列的值错误

sql - 甲骨文 : 2 column names for a single column