2012-02-26 62 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,在你指定你正在使用的數據庫之前,沒有人能提供一個合理的例子。 – 2012-02-26 16:13:50

+0

本土方式做什麼?目前還不清楚你想要達到的目標。 – 2012-02-26 16:14:00

+0

你期待什麼結果?請顯示錶'ListOfTables'的結構和一些內容 – 2012-02-26 16:15:18

回答

3

你需要使用動態SQL來獲得這個結果(下面的代碼假設SQL Server,我不能說其他的RDBMS')。

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來循環訪問表名列表 – 2012-02-26 16:25:09

+0

@OMGPonies我不認爲OP想循環遍歷所有表。 – 2012-02-26 16:28:29

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創建:在SQL

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

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

那裏'id'是一個參數呢? – spraff 2012-02-26 16:35:05

+0

我不明白。當然,您可以像往常一樣從應用程序中提供id值。你甚至可以使第一個查詢成爲準備好的語句。 – AndreKR 2012-02-26 16:36:51

+0

我需要爲PHP的所有'mysql_query'聲明所有的聲明 - 我正在玩弄它,但無法找到一種方法將所有內容合併到一起,而不會出現解析錯誤。 – spraff 2012-02-26 16:41:10

相關問題