Mysql Копировать данные ячейки в другую ячейку - PullRequest
0 голосов
/ 07 августа 2020

У меня есть таблица, как показано ниже. Если данные ячейки имеют значение NULL, я хочу скопировать данные другой строки с тем же идентификатором группы. Как мне выполнить запрос?

id|groupid|category

1 | 1     | red 
2 | 1     | red
3 | 1     | NULL
4 | 2     | NULL
5 | 2     | blue
6 | 3     | green
7 | 3     | NULL
8 | 3     | NULL

Конечное состояние

id|groupid|category

1 | 1     | red 
2 | 1     | red
3 | 1     | red
4 | 2     | blue
5 | 2     | blue
6 | 3     | green
7 | 3     | green
8 | 3     | green

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Использовать

UPDATE source_table t1
  JOIN source_table t2 USING (groupid)
SET t1.category = t2.category
WHERE t1.category IS NULL
  AND t2.category IS NOT NULL

Если в группе существует более одного значения NOT NULL, то будет использоваться неопределенное значение из всех возможных (если вам нужно какое-то определенное значение в этом случае - укажите критерии) .

Если группа содержит только значения NULL, ни одна строка не будет обновлена.

1 голос
/ 07 августа 2020

Попробуйте использовать MAX в качестве функции c здесь:

SELECT
    id,
    groupid,
    MAX(category) OVER (PARTITION BY groupid) category
FROM yourTable
ORDER BY
    id;

Здесь будет работать функция MAX, потому что она игнорирует значения NULL внутри группы, возвращая non NULL значение категории.

Предполагается, что вы намерены назначить один и тот же цвет для всех записей в данном groupid. Кроме того, если это так, то это может означать, что ваша модель данных не полностью нормализована, и цвета для каждой группы должны существовать во второй таблице сопоставления, например,

groupid | category
1       | red
2       | blue
3       | green

В версиях MySQL ранее, чем 8+, вы можете использовать соединение для достижения того же результата:

SELECT
    t1.id,
    t1.groupid,
    t2.category
FROM yourTable t1
INNER JOIN
(
    SELECT groupid, MAX(category) AS category
    FROM yourTable
    GROUP BY groupid
) t2
    ON t1.groupid = t2.groupid
ORDER BY
    id;

Изменить:

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

UPDATE yourTable t1
INNER JOIN
(
    SELECT groupid, MAX(category) AS category
    FROM yourTable
    GROUP BY groupid
) t2
    ON t1.groupid = t2.groupid
SET
    t1.category = t2.category
WHERE
    t1.category IS NULL;
...