Penso di aver capito che vuoi selezionare una colonna per nome e i nomi sono stringhe nel tuo TABLE_MASTER.
Non è possibile eseguire questa operazione in una singola query SQL, poiché SQL non può selezionare una colonna utilizzando un'espressione stringa. C'è una differenza tra una stringa e un identificatore. Ad esempio, questo seleziona i dati da una colonna in base all'identificatore:
SELECT header01 ...
Ma la seguente è un'espressione stringa (semplice, che è solo un valore costante). Restituisce solo una stringa fissa 'header01', NON i dati da una colonna con quel nome:
SELECT 'header01' ...
Allo stesso modo, l'utilizzo di qualsiasi altra espressione in un elenco di selezione seleziona solo il valore di tale espressione, NON i dati archiviati in una colonna denominata dal valore stringa dell'espressione.
Pertanto, se vuoi che una query restituisca una colonna dinamica denominata da qualche altra variabile o espressione, non puoi farlo nella stessa query in cui hai letto quell'espressione. Devi formattare una nuova query SQL dai valori che hai letto. Questa è chiamata istruzione SQL dinamica (già menzionato da spencer7593, che ha pubblicato una risposta mentre stavo scrivendo la mia risposta).
Puoi usare il tuo TABLE_MASTER per formattare un'istruzione SQL dinamica per recuperare le colonne e ridefinire il loro alias:
SELECT CONCAT(
'SELECT ',
GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ',
QUOTE(MAX(NAME)), ' AS NAME ',
'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;
Il risultato di ciò è una stringa che forma un'altra istruzione SELECT, questa rinomina le colonne come desideri:
SELECT header01 AS header_master01,header02 AS header_master02, 'Paul' AS NAME FROM TABLE_EXAMPLE
Quindi puoi utilizzare la stringa memorizzata in @sql
come una query SQL dinamica.
Ecco la procedura che fa questo:
DELIMITER ;;
CREATE PROCEDURE MyProc()
BEGIN
SELECT CONCAT(
'SELECT ',
GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ',
QUOTE(MAX(NAME)), ' AS NAME ',
'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
DELIMITER ;
Chiama la procedura e ottieni il risultato:
CALL MyProc();
+-----------------+-----------------+------+
| header_master01 | header_master02 | NAME |
+-----------------+-----------------+------+
| data01 | data02 | Paul |
| data11 | data12 | Paul |
+-----------------+-----------------+------+
Devo commentare che questo è un sacco di problemi da affrontare. Preferirei recuperare i dati così come sono nel database e riformattarli nel codice dell'applicazione. Quindi non dovrei utilizzare alcun SQL dinamico per formattare le colonne.