簡體   English   中英

合並具有相同值的sql行

[英]Merging sql rows with same values

我已經向數據庫中添加了一些數據,但我發現我有很多重復項,當然還有不同的鍵,我想將它們合並為一條記錄。

我想在sql數據庫本身中執行此操作,我不想截斷表並再次插入值(沒有重復項),因為腳本非常慢。

這是我的情況的一個示例:

表軌道:

key |   artist  | title
----|-----------|--------
k1  |  artist1  | title1
----|-----------|--------
k2  |  artist1  | title1
----|-----------|--------
k3  |  artist1  | title1

表格圖表:

trackKey | otherKey |  anotherKey  |  value
---------|----------|--------------|---------
k1       |   ok1    |      ak4     |    v1
---------|----------|--------------|---------
k3       |   ok2    |      ak2     |    v2
---------|----------|--------------|---------
k1       |   ok3    |      ak9     |    v2
---------|----------|--------------|---------
k2       |   ok4    |      ak1     |    v6

其中chart.trackKey引用track.key

我想要實現的結果是:

表軌道:

key |   artist  | title
----|-----------|--------
k1  |  artist1  | title1

表格圖表:

trackKey | otherKey |  anotherKey  |  value
---------|----------|--------------|---------
k1       |   ok1    |      ak4     |    v1
---------|----------|--------------|---------
k1       |   ok2    |      ak2     |    v2
---------|----------|--------------|---------
k1       |   ok3    |      ak9     |    v2
---------|----------|--------------|---------
k1       |   ok4    |      ak1     |    v6

這樣, track相同條目的每個重復項將合並為一行,並且chart中的舊鍵將更新為track表中唯一的舊鍵。

有什么辦法可以在SQL中做到這一點?

編輯:

基於@popovitsj的答案的解決方案#1

UPDATE chart c SET trackUri =
(WITH track_unique AS
(
    SELECT MIN(uri) AS key, artist, title, album. artwork FROM track
    GROUP BY artist, title
)
SELECT tu.key FROM chart c1
INNER JOIN track t ON c1.trackUri = t.key
INNER JOIN track_unique tu ON t.artist = tu.artist AND t.title = tu.title
WHERE c1.trackUri = c.trackUri and c1.countryId = c.countryId and c1.date = c.date);

回報

#1064 - Syntax error near 
'track_unique AS (
SELECT MIN(uri) AS key, artist, title, album. artwork FR' line 2 

基於@juergen d答案的解決方案#2

update chart
join track t1 on t1.uri = chart.trackUri
left join 
(
   select min(uri) as key
   from track 
   group by artist, title
) tmp_track on tmp_track.key = chart.trackUri
set trackkey = tmp_tbl.key
where chart.trackUri not in 
(
  select min(uri)
  from track
  group by artist, title
  having count(*) > 1
);

回報

#1064 - Syntax error near
   'key
   from track
   group by artist, title
) tmp_track on tmp_track.key = c' line 5 

我不知道自己在做什么錯,所以我要添加架構定義(取自phpMyAdmin

在此處輸入圖片說明

第一個with子句獲取您要保留的ID,然后在下一個選擇查詢中,將這些ID與圖表ID進行匹配。

我根據您對原始答案的修改對這個答案進行了編輯。 該答案假定chart(countryid,date)唯一地標識一個圖表,並且僅當track(key,artist,title,album)相等時才可以合並track(key,artist,title,album)

UPDATE chart c SET trackUri =
(WITH track_unique AS
(
    SELECT MIN(uri) AS key, artist, title, album, artwork FROM track
    GROUP BY artist, title, album, artwork
)
SELECT tu.key FROM chart c1
INNER JOIN track t ON c1.trackUri = t.key
INNER JOIN track_unique tu
ON t.artist = tu.artist
AND t.title = tu.title
AND t.album = tu.album
AND t.artwork = tu.artwork
WHERE c1.trackUri = c.trackUri
AND c1.countryId = c.countryId
AND c1.date = c.date);

要在執行此更新后刪除剩余的重復項,請執行以下操作:

DELETE FROM track
WHERE uri NOT IN
    (SELECT MIN(uri) AS key, artist, title, album, artwork
     FROM track
     GROUP BY artist, title, album, artwork);

如果重復的值是完全重復的,則可以使用

SELECT MIN(key),artist,title FROM track GROUP BY artist,title;

以獲得track表中數據的無重復版本。 您可以將其放在一個臨時表中並交換它們,或者使用SQL客戶端下載數據並重新導入它,等等。為了安全起見,我不會在單個語句中嘗試全部操作。 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM