Вставить записи в таблицу на основе «основной» записи в той же таблице - PullRequest
0 голосов
/ 20 марта 2012

У меня есть одна таблица, например ценники, которые хранят специальные цены на статьи для клиентов. Теперь я хочу синхронизировать цены на основе другого пользователя. Предположим, у меня есть это как набор данных:

+---------------------------+
| user_id | prod_id | price |
+---------+---------+-------+
| 10      | 1       | 1     |
| 10      | 2       | 5     |
| 10      | 3       | 7     |
| 20      | 2       | 5     |
| 30      | 2       | 5     |
| 30      | 3       | 7     |
+---------+---------+-------+

Теперь я хотел бы обновить / вставить цены для нескольких других пользователей, основываясь на ценах пользователя 10. Я уже написал запрос на удаление и обновление, но я застрял с запросом на вставку, чтобы вставить новые правила, которые других пользователей еще нет.

Так эффективно это будет делать следующие вставки:

INSERT INTO pricerules 
(user_id, prod_id, price) 
VALUES 
(20, 1, 1), 
(20, 3, 7), 
(30, 1, 1);

Есть ли способ сделать это в одном запросе? Я искал MINUS, чтобы выбрать записи, которых нет для пользователя 20, но мне нужно было бы выполнить запрос для каждого пользователя.

Я думал, может быть, я мог бы использовать MERGE.

Я использую Oracle 10.1 ..

Ответы [ 3 ]

1 голос
/ 20 марта 2012

Вы были правы. Слияние - это путь. Пожалуйста, попробуйте следующее.

merge into pricerules p
using ( select t1.user_id, t2.prod_id, t2.price
   from 
   (select distinct user_id
   from pricerules
   where user_id <> 10) t1,
   (select distinct prod_id, price
   from pricerules
   where user_id = 10) t2
   ) t
on (p.user_id = t.user_id
   and p.prod_id = t.prod_id
   and p.price = t.price)
when not matched then 
   insert (user_id, prod_id, price) values (t.user_id, t.prod_id, t.price) ;
0 голосов
/ 20 марта 2012

Быстро набрал это вместе, так что я не уверен, правильно ли это. Но я пытаюсь выбрать все идентификаторы продукта у пользователя 10, которых у нового пользователя еще нет.

Чего не хватает в вашем вопросе, так это где источник user_id. Возможно, вы захотите объединить это с пользовательской таблицей, чтобы вы могли запустить ее для всех пользователей.

insert into pricerules
   (user_id, prod_id, price)
   select &new_user_id
         ,prod_id
         ,price
     from pricerules p
    where user_id = 10
      and not exists (select 1
             from pricerules p2
            where p2.userid = &new_userid
              and p2.prod_id = p.prod_id)
0 голосов
/ 20 марта 2012

Я долгое время не пользовался Oracle, поэтому мой синтаксис может быть немного отключен, но общая идея такова:

INSERT INTO pricerules 
(user_id, prod_id, price) 
select 20 as user_id, 1 as prod_id, 1 as price from dual
union all
select 20, 3, 7 from dual
union all
select 30, 1, 1 from dual
...