# Pastebin i8uevHcl WITH extract_albums AS ( SELECT data->>'id' AS spotify_id , data->>'name' AS name , data->>'album_type' AS type , data->>'release_date' AS release_date , data->'tracks' AS tracks , data->'artists' AS artists , data - '{tracks,artists}'::text[] AS album_data , last_refresh , expires_at FROM mapping.tmp_sp_cache ), insert_albums AS ( INSERT INTO spotify_cache_album (spotify_id, name, type, release_date, last_refresh, expires_at, data) SELECT spotify_id , name , type , release_date , last_refresh , expires_at , album_data FROM extract_albums RETURNING id AS album_id , spotify_id AS spotify_album_id ), extract_album_artists AS ( SELECT spotify_id AS spotify_album_id , a->>'id' AS spotify_artist_id , a->>'name' AS name , a AS artist_data FROM extract_albums, jsonb_array_elements(artists) a ), insert_album_artists AS ( INSERT INTO spotify_cache_artist (spotify_id, name, data) SELECT DISTINCT spotify_artist_id , name , artist_data FROM extract_album_artists ON CONFLICT (spotify_id, name) DO NOTHING ), insert_rel_album_artist AS ( INSERT INTO rel_album_artist (album_id, artist_id) SELECT spotify_album_id , spotify_artist_id FROM extract_album_artists ), extract_album_tracks AS ( SELECT spotify_id AS spotify_album_id , t->>'id' AS spotify_track_id , t->>'name' AS name , (t->'track_number')::int AS track_number , t->'artists' AS track_artists , t - 'artists' AS track_data FROM extract_albums, jsonb_array_elements(tracks) t ), insert_album_tracks AS ( INSERT INTO spotify_cache_track (spotify_id, name, track_number, album_id, data) SELECT spotify_track_id , name , track_number , spotify_album_id , track_data FROM extract_album_tracks RETURNING id AS track_id , spotify_id AS spotify_track_id ), extract_track_artists AS ( SELECT spotify_track_id , a->>'id' AS spotify_artist_id , a->>'name' AS name , a AS artist_data FROM extract_album_tracks, jsonb_array_elements(track_artists) a ), insert_track_artists AS ( INSERT INTO spotify_cache_artist (spotify_id, name, data) SELECT DISTINCT spotify_artist_id , name , artist_data FROM extract_track_artists ON CONFLICT (spotify_id, name) DO NOTHING ) INSERT INTO rel_track_artist (track_id, artist_id) SELECT spotify_track_id , spotify_artist_id FROM extract_track_artists;