Solusi paling sederhana adalah dengan menggunakan dua kueri terpisah.
Kami menggunakan hasil dari kueri pertama untuk menghasilkan teks SQL secara dinamis untuk kueri kedua.
mysql> SET @colname := '' ;
mysql> SELECT t.rslt FROM table1 t WHERE t.id = 1 ORDER BY t.rslt LIMIT 1 INTO @colname ;
mysql> SET @sql := CONCAT('SELECT `',@colname,'` FROM table2 ORDER BY 1') ;
mysql> PREPARE stmt FROM @sql ;
mysql> EXECUTE stmt ;
mysql> DEALLOCATE PREPARE stmt ;
N.B. termasuk @colname
sebagai bagian dari teks SQL, SQL yang disiapkan secara dinamis, berpotensi menjadi kerentanan SQL Injection.
Jika persyaratannya adalah menyelesaikan sesuatu yang serupa dalam konteks tunggal Pernyataan SQL, maka pernyataan tersebut perlu mengantisipasi kemungkinan nilai yang akan dikembalikan untuk kueri dari tabel1, dan menyertakan referensi eksplisit ke kolom yang mungkin dari tabel2. Misalnya, seperti ini:
SELECT CASE ( SELECT t.rslt FROM table1 t WHERE t.id = 1 LIMIT 1 )
WHEN 'r1' THEN r.r1
WHEN 'r2' THEN r.r2
WHEN 'r3' THEN r.r3
ELSE NULL
END AS c2
FROM table2 r
ORDER BY ...
Ini belum tentu cara yang paling efisien untuk menulis kueri, tetapi ini menunjukkan polanya.
Dalam pernyataan SQL, pengidentifikasi (nama tabel, nama kolom, nama fungsi) harus ditentukan secara eksplisit; ini tidak dapat diturunkan secara dinamis pada saat run time. Ini karena bagaimana pernyataan SQL diproses... menguraikan teks SQL untuk sintaks, lalu menguraikan semantik (referensi dan hak istimewa yang valid), mengevaluasi biaya relatif untuk jalur akses yang tersedia, memilih rencana eksekusi, dan kemudian mengeksekusi rencana itu.
Artinya, perilaku yang diamati dengan SQL ini adalah apa yang kita harapkan:
SELECT (SELECT rslt FROM table1 WHERE id = 1) FROM table2
Teks SQL disiapkan, dan pada waktu eksekusi, untuk setiap baris dalam tabel2, subquery di SELECT
daftar dijalankan. Jika subquery mengembalikan nilai skalar, nilai skalar dikembalikan sebagai kolom kueri luar. Nilai yang dikembalikan oleh subkueri adalah nilai , itu tidak (dan tidak dapat) dievaluasi sebagai nama kolom.