Как реплицировать уникальный ключ (уникальное значение в столбце против значения в другом столбце) в записи при ее множественном появлении?

#sql #database #validation #database-design

Вопрос:

введите описание изображения здесь

Итак, у меня есть таблица с именем дракон с 2 столбцами Покемон и Сила. Моя таблица результатов должна выглядеть так, как показано на изображении. Как мне это сделать с помощью SQL? У меня такое чувство, что это возможно с помощью Join. Но я изо всех сил пытаюсь придумать правильный мыслительный процесс.

Комментарии:

1. Отметьте свой вопрос в базе данных, которую вы используете.

2. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Ответ №1:

если все, что вам нужно, — это результат в виде представления

 SELECT  
  D.Pokemon, 
  CASE WHEN D.Power IS NOT NULL THEN D.Power ELSE D1.power END
FROM  Dragon D
LEFT JOIN 
 ( 
    SELECT 
      Pokemon, 
      MAX(Power) Power 
    FROM Dragon 
    WHERE Power IS NOT NULL 
    GROUP BY Pokemon) D1
ON D.Pokemon = D1.Pokemon
 

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

 UPDATE D
SET D.power= D1.power
FROM  Dragon D
    LEFT JOIN 
     ( 
        SELECT 
          Pokemon, 
          MAX(Power) Power 
        FROM Dragon 
        WHERE Power IS NOT NULL 
        GROUP BY Pokemon) D1
    ON D.Pokemon = D1.Pokemon
    WHERE D.Power IS NULL
 

Ответ №2:

Вы можете использовать оконную функцию:

 select d.*, max(power) over (partition by pokemon) as imputed_power
from dragon d;
 

Если вы действительно хотите изменить данные, то в стандартном SQL вы можете использовать коррелированный подзапрос:

 update dragon
    set power = (select max(d2.power) from dragon d2 where d2.pokemon = d.pokemon)
    where power is null;