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

时间:2012-04-26 12:41:39

标签: sql oracle join

之前我问了几乎相同的问题,但由于音序器的缘故,我无法使用MERGE语法。问题是我们有数据库中人员的价格规则。我想为那些应该有相同规则的人同步这些价格规则。

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

好的,现在人们B和C最终需要和用户A有相同的价格规则。所以我有一个像这样的pricerule表(简化):

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

1 个答案:

答案 0 :(得分:2)

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