Что-то эквивалентное SELECT * FROM (SELECT table_name FROM)?

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

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

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

SELECT * FROM some_table

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


person spraff    schedule 26.02.2012    source источник
comment
Имена таблиц в SQL не могут быть динамическими — вам нужно использовать динамический SQL, который никто не может предоставить в разумных пределах, пока вы не укажете, какую базу данных вы используете.   -  person OMG Ponies    schedule 26.02.2012
comment
Родной способ сделать что? Непонятно, чего вы пытаетесь достичь.   -  person Andrew Logvinov    schedule 26.02.2012
comment
Какого результата вы ожидаете? Пожалуйста, покажите структуру и некоторое содержимое таблицы 'ListOfTables'   -  person Vitaliy Lebedev    schedule 26.02.2012


Ответы (3)


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

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

SET @qs = CONCAT('SELECT * FROM ', @tn);
PREPARE ps FROM @qs;
EXECUTE ps;
person AndreKR    schedule 26.02.2012
comment
Как насчет того, где id является параметром? - person spraff; 26.02.2012
comment
Я не понимаю. Конечно, вы можете ввести значение id из своего приложения, как обычно. Вы даже можете сделать первый запрос подготовленным оператором. - person AndreKR; 26.02.2012
comment
Мне нужно сделать все это одним оператором для mysql_query PHP - я играю с ним, но не могу найти способ сложить все вместе без ошибки синтаксического анализа. - person spraff; 26.02.2012
comment
Это связано с тем, что, цитируя php.net/manual/en/function.mysql- query.php, множественные запросы не поддерживаются. Вам нужно использовать другой клиентский API, создать хранимую процедуру или найти другое решение, возможно, в stackoverflow.com/questions/345637/ - person AndreKR; 26.02.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)
person Community    schedule 26.02.2012
comment
Вам понадобится курсор/и т. д., чтобы циклически просматривать список имен таблиц. - person OMG Ponies; 26.02.2012
comment
@OMGPonies Я не думал, что ОП хотел просмотреть все столы ..? - person ; 26.02.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)
person Oybek    schedule 26.02.2012