Обновление запроса с объединениями и группировкой по пунктам - PullRequest
2 голосов
/ 04 февраля 2011

У меня следующий запрос, и я пытаюсь обновить table1 с общей суммой. Есть ли способ сделать это за 1 шаг?

select e.id
     , p.id
     , case  
         when count(distinct e.item) = 1 then 100
         when count(distinct e.item) = 2 then 150
         when count(distinct e.item) = 3 then 200
         when count(distinct e.item) = 4 then 225
         when count(distinct e.item) = 5 then 275
         when count(distinct e.item) = 6 then 325
         when count(distinct e.item) = 7 then 375
         when count(distinct e.item) = 8 then 450
         when count(distinct e.item) = 8 then 470
       end as TotalPay
  from table1 p 
  join table2 e on e.id = '111111'
               and p.id=e.itemid
group by e.id, p.id

Ответы [ 2 ]

3 голосов
/ 04 февраля 2011

Использование:

UPDATE TABLE1
   SET total = (SELECT CASE
                         WHEN COUNT(DISTINCT t2.item) = 1 THEN 100
                         WHEN COUNT(DISTINCT t2.item) = 2 THEN 150
                         WHEN COUNT(DISTINCT t2.item) = 3 THEN 200
                         WHEN COUNT(DISTINCT t2.item) = 4 THEN 225
                         WHEN COUNT(DISTINCT t2.item) = 5 THEN 275
                         WHEN COUNT(DISTINCT t2.item) = 6 THEN 325
                         WHEN COUNT(DISTINCT t2.item) = 7 THEN 375
                         WHEN COUNT(DISTINCT t2.item) = 8 THEN 450
                         WHEN COUNT(DISTINCT t2.item) = 9 THEN 470
                       END
                  FROM TABLE2 t2
                 WHERE t2.itemid = id
                   AND t2.id = '111111'
              GROUP BY t2.id, t2.itemid)
 WHERE EXISTS(SELECT NULL
                FROM TABLE2 t
               WHERE t.itemid = id
                 AND t.id = '111111')
  • Предложение WHERE необходимо, в противном случае все строки TABLE1 будут обработаны.Те, у кого нет связанных строк TABLE2, были бы обновлены до NULL
  • Oracle (IME, до 10 г) не поддерживает JOIN в выражении UPDATE, таком как MySQL и SQL Server -должен использовать подзапрос (соотнесенный в этом примере).Это также не позволяет вам определять псевдоним таблицы для обновляемой таблицы, поэтому, когда псевдоним таблицы пропущен, как вы видите в примере - столбец приходит из таблицы без псевдонима (тот, который обновляется)
1 голос
/ 04 февраля 2011

Try:

update table1 p 
set TotalPay = 
(
select case  
         when count(distinct e.item) = 1 then 100
         when count(distinct e.item) = 2 then 150
         when count(distinct e.item) = 3 then 200
         when count(distinct e.item) = 4 then 225
         when count(distinct e.item) = 5 then 275
         when count(distinct e.item) = 6 then 325
         when count(distinct e.item) = 7 then 375
         when count(distinct e.item) = 8 then 450
         when count(distinct e.item) = 8 then 470
       end as TotalPay
  from table2 e where p.id=e.itemid
                and e.id = '111111'  
)  

Как было указано в комментариях, приведенное выше обновит все строки в table1, даже если в table2 нет совпадений, в которых для столбца будет установлено значение NULL.Чтобы избежать этого, добавьте предложение WHERE - см. Ответ OMGPonies.

...