запрос не работает должным образом

У нас есть такие таблицы:

player(id,salary,bonus)

productivity_per_year(id,goals,year)

Таблица продуктивности (ID, цели, год)

+----+-------+------+
| ID | Goals | Year |
+----+-------+------+
| 01 |    20 | 2001 |
| 01 |    30 | 2002 |
| 02 |    30 | 2001 |
| 02 |    40 | 2002 |
+----+-------+------+

Вопрос в том, как можно поднять бонус игрока, если игрок за последние два года (2001 и 2002) забил 30 и более голов. Например, здесь я хочу, чтобы бонус получил игрок с id=02, так как он набрал >=30 как в 2001, так и в 2002 году.

Я использую следующую процедуру, но она терпит неудачу, так как добавляет бонус обоим игрокам!!!

create or replace 
procedure football
AS
BEGIN
   update player p
      set p.bonus = p.bonus + 500
   where p.id in 
         (select s.id from productivity s where
            s.goals >30 
        and  s.year>=2001
        and s.id = p.id
         );
END;

person Flinkos Tsonos    schedule 25.11.2012    source источник


Ответы (1)


Оба игрока получают больший бонус, так как оба игрока забили более 30 голов с 2001 года. Это то, что вы делаете со своим запросом. Однако, чтобы дать бонус только игроку, забившему более 30 голов в 2001 и 2002 годах, вы можете попробовать следующий запрос.

update player p 
set bonus = bonus + 500 
where p.id in 
((select s.id from productivity s where s.goals > 30 and s.year = 2001 and s.id = p.id)
intersect
(select s.id from productivity s where s.goals > 30 and s.year = 2002 and s.id = p.id));

С postgresql работает.

person joel    schedule 25.11.2012