我有一個有 3 列的表
pID | key_name | value
-----------------------
10 | 'series' |'Songs'
10 | 'wood' |'Beech'
10 | 'language' |'German'
11 | 'series' |'Songs'
11 | 'wood' |'Oak'
11 | 'language' |'French'
12 | 'series' |'Exams'
12 | 'language' |'English'
我需要更新一個表,其中 key_names 現在是列名,因此
pID | series | wood | language
-----------------------------
10 ! 'Songs'|'Beech'|'German'
11 | 'Songs'|'Oak' |'French'
12 | 'Exams'| |'English'
現在我可以寫一些像 SQL
UPDATE dest-tbl INNER JOIN start-tbl
ON dest-tbl.pID = start-tbl.pID
SET dest-tbl.series = start-tbl.value
WHERE dest-tbl.key_name = 'series'
但由于有 65 個不同的 key_name 值,這意味著該 SQL 必須有 65 個變體。
我覺得最好的方法可能是創建一個 key_name 值的陣列并回圈遍歷它,但我不知道如何做到這一點。
誰能幫我這個?
使用 MariaDB v10.3
MTIA
uj5u.com熱心網友回復:
SELECT
t1.pID,
t1.value,
t2.value,
t3.value
FROM Table1 t1
LEFT JOIN Table1 t2 on t2.pID=t1.pID and t2.key_name='wood'
LEFT JOIN Table1 t3 on t3.pID=t1.pID and t3.key_name='language'
WHERE t1.key_name='series';
輸出:
-------- ---------- ---------- ----------
| 10 | Songs | Beech | German |
| 11 | Songs | Oak | French |
| 12 | Exams | | English |
-------- ---------- ---------- ----------
DBFIDDLE
uj5u.com熱心網友回復:
正如我在評論中所說,要獲得靈活的解決方案,您需要動態 sql
CREATE TABLE tab1 ( `pID` INTEGER, `key_name` VARCHAR(10), `value` VARCHAR(9) ); INSERT INTO tab1 (`pID`, `key_name`, `value`) VALUES ('10', 'series', 'Songs'), ('10', 'wood', 'Beech'), ('10', 'language', 'German'), ('11', 'series', 'Songs'), ('11', 'wood', 'Oak'), ('11', 'language', 'French'), ('12', 'series', 'Exams'), ('12', 'language', 'English');
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(CASE WHEN `key_name` = ''', `key_name`, ''' THEN `value` ELSe "" END) AS `', `key_name`, '`' ) ) INTO @sql FROM `tab1` ;
SET @sql = CONCAT('SELECT `pID`, ',@sql,' from tab1 GROUP BY `pID`'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;? ? PID | 語言 | 系列 | 木頭 --: | :------- | :----- | :---- 10 | 德語 | 歌曲 | 櫸木 11 | 法語 | 歌曲 | 橡木 12 | 英文 | 考試 | ?
db<>在這里小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/335755.html
