2012-02-26 3 views
3

Этот запрос выполняется, но в результате он выдает имя таблицы вместо фактического выбора из этой таблицы.Что-то эквивалентное «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, или я нужно делать в приложении?

+2

имен таблиц в SQL не может быть динамическим - вы должны использовать динамический SQL, который никто не может дать разумный пример, пока вы не укажете, какую базу данных вы используете. –

+0

Родной способ сделать что? Непонятно, чего вы пытаетесь достичь. –

+0

Какой результат вы ожидаете? Пожалуйста, покажите структуру и некоторое содержимое таблицы «ListOfTables» –

ответ

3

Для получения этого результата необходимо использовать динамический 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

Вам понадобится курсор/etc для этого, чтобы циклически перебирать список имен таблиц. –

+0

@OMGPonies Я не думал, что OP хочет перебирать все таблицы ..? –

0

Почти так же, как ответ @ 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) 
5

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

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

SET @qs = CONCAT('SELECT * FROM ', @tn); 
PREPARE ps FROM @qs; 
EXECUTE ps; 
+0

Как насчет того, где 'id' является параметром? – spraff

+0

Не понимаю. Конечно, вы можете использовать значение id из своего приложения, как обычно. Вы даже можете сделать первый запрос подготовленным заявлением. – AndreKR

+0

Мне нужно сделать все это единым оператором для 'mysql_query' PHP. Я играю с ним, но не могу найти способ сложить все вместе без ошибки синтаксического анализа. – spraff