#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;