Что-то эквивалентное "SELECT * FROM (SELECT table_name FROM ...)"? - PullRequest
3 голосов
/ 26 февраля 2012

Этот запрос выполняется, но он выдает имя таблицы в результате, а не фактически выбирает из этой таблицы.

SELECT T.* 
  FROM (SELECT tablename 
          FROM ListOfTables 
         WHERE id = 0) AS T

, где ListOfTables содержит id=0, tablename='some_table', я хочу вернуть тот же результатустановить, как если бы я написал это непосредственно:

SELECT * FROM some_table

Есть ли собственный способ сделать это в MySQL 5, или я должен сделать это в приложении?

Ответы [ 3 ]

5 голосов
/ 26 февраля 2012

Чтобы сделать это в MySQL , вам нужно создать подготовленный оператор , который вы можете создать только из пользовательской переменной :

SELECT @tn := tablename FROM ListOfTables WHERE id = 0;

SET @qs = CONCAT('SELECT * FROM ', @tn);
PREPARE ps FROM @qs;
EXECUTE ps;
3 голосов
/ 26 февраля 2012

Вам нужно использовать динамический SQL для получения этого результата (код ниже предполагает SQL Server, я не могу говорить о других СУБД).

declare @tableName varchar(100)
declare @query varchar(500)

select @tableName = tablename
from ListOfTables
where id = 0

select @query = 'select * from ' + @tableName

exec (@query)
0 голосов
/ 26 февраля 2012

Почти так же, как ответ @ Shark, за исключением того, что вы также цитируете имя таблицы, чтобы избежать синтаксических ошибок.

-- Using variables just for better readability.
DECLARE @Name NVARCHAR(4000)
DECLARE @Query NVARCHAR(4000)

-- Get the relevant data
SET @Name = QUOTENAME(SELECT tablename FROM ListOfTables WHERE id=0)
-- Build query 
SET @Query = 'SELECT * FROM ' + @Schema + '.' + @Name + ''
-- execute it.
EXEC(@Query)
...