Najprostszym rozwiązaniem jest użycie dwóch oddzielnych zapytań.
Używamy wyniku z pierwszego zapytania, aby dynamicznie wygenerować tekst SQL dla drugiego zapytania.
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 ;
Uwaga w tym @colname
jako część tekstu SQL, dynamicznie przygotowany SQL, jest potencjalną podatnością na wstrzyknięcie SQL.
Jeśli wymaganiem jest zrobienie czegoś podobnego w kontekście singla Instrukcja SQL, wówczas instrukcja musi przewidywać możliwe wartości do zwrócenia dla zapytania z tabeli 1 i zawierać wyraźne odwołania do możliwych kolumn z tabeli2. Na przykład coś takiego:
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 ...
Niekoniecznie jest to najskuteczniejszy sposób napisania zapytania, ale demonstruje wzorzec.
W instrukcji SQL identyfikatory (nazwy tabel, nazwy kolumn, nazwy funkcji) muszą być określone jawnie; nie można ich wyprowadzić dynamicznie w czasie wykonywania. Dzieje się tak ze względu na sposób przetwarzania instrukcji SQL... analizowanie tekstu SQL pod kątem składni, następnie analizowanie semantyki (prawidłowe referencje i uprawnienia), ocenianie względnego kosztu dostępnych ścieżek dostępu, wybieranie planu wykonania, a następnie wykonywanie tego planu.
Oznacza to, że zachowanie obserwowane w przypadku tego kodu SQL jest takie, jakiego oczekujemy:
SELECT (SELECT rslt FROM table1 WHERE id = 1) FROM table2
Tekst SQL jest przygotowywany i w czasie wykonywania dla każdego wiersza w tabeli2 podzapytanie w SELECT
lista jest wykonywana. Jeśli podzapytanie zwraca wartość skalarną, wartość skalarna jest zwracana jako kolumna zapytania zewnętrznego. Wartość zwracana przez podzapytanie to wartość , nie jest (i nie może być) oceniany jako nazwa kolumny.