Как вставить значения в таблицу на основе значений другой таблицы в SQL? - PullRequest
2 голосов
/ 28 апреля 2020

Итак, в SQL у меня есть таблица альбомов, в которой есть (album_id, album_name, year) У меня также есть таблица песен, в которой есть (song_id, song_name, album_name).

Я использовал таблицу изменений заявление о добавлении столбца к песням с именем album_id

Для каждой песни, которая принадлежит альбому, я хочу добавить соответствующий альбом_id в эту строку

Я не уверен, как это сделать. Я сделал

UPDATE songs
SET songs.album_id = (select albums.album_id FROM albums WHERE songs.album_name = albums.album_name);

Однако этот подзапрос возвращает более одной строки и выдает ошибку. Я также попытался добавить distinct в подзапрос и добавить group by album.album_id в подзапрос.

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

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

У вас есть проблема. Альбомы имеют повторяющиеся имена. Вы можете найти их в данных:

select a.album_name, count(*)
from albums a
group by a.album_name
having count(*) > 1;

Теперь у вас могут быть случайные дубликаты в данных - один и тот же альбом появляется несколько раз. Если это так, исправьте albums, удалив дубликаты.

Или, возможно, у вас есть добросовестных разных альбомов с одинаковыми именами (и предположительно разных исполнителей). В этом случае вам необходимо выяснить, кто принадлежит данному пользователю.

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

UPDATE songs s JOIN
       (SELECT album_name, COUNT(*) as cnt, MIN(album_id) as album_id
        FROM albums a
        GROUP BY album_name
        HAVING COUNT(*) = 1   -- safe, there is only one
       ) a
       ON s.album_name = a.album_name
    SET s.album_id = a.album_id;

По-видимому, это обсуждалось на musi c сайтов, таких как этот один и этот один .

0 голосов
/ 28 апреля 2020

Ограничить одним, если он всегда одинаковый

...