2012-03-21 87 views
1

我有2個表:使用新的查詢作爲別名

表設有專櫃名稱(T1):

Counter_ID Counter_Name 
     1   Apples 
     2   Nuts 
     ... 

並表計數器值(T2):

Time Counter_ID_1 Counter_ID_2 
12:00   24   43 
13:00   64   73 
    ... 

使用SQL我試圖從t2中命名我的結果列,因爲它們在t1中被命名爲如下所示:

Time   Apples   Nuts 
12:00   24   43 
13:00   64   73 
    ... 

這裏是我的查詢(不工作):

select 
t2.Time as 'Time', 
t2.Counter_ID_1 as (select Counter_Name from t1 where Counter_ID=1), 
t2.Counter_ID_2 as (select Counter_Name from t1 where Counter_ID=2) 
from t2 

任何想法?

UPD: 我知道,DB設計不是很好,但它不是我的數據庫,我只是一個RO-用戶:)

UPD2: 謝謝大家!我明白了,在我的情況下,不會自動執行它,而是在需要時執行查詢一次,並且如果名稱(t1)的表將被更改,則手動編輯別名。

+1

雖然這可以使用動態SQL,但我強烈建議您重新考慮您的表格設計。除了連接來自'names'的ID之外,'name'表和'values'表之間沒有**真實的鏈接。 – 2012-03-21 08:06:41

+0

問題是它不是我的表,它是大型的法人系統,我沒有機會影響這個數據庫的任何設計問題:) – anjolio 2012-03-21 08:16:12

+1

什麼是您的DBMS? – 2012-03-21 08:27:26

回答

0

你想要動態別名聲明。 SQL Server不這樣做。 你可以做什麼,其他的是重新設計你的表格是

select 
Time as 'Time', 
Counter_Name as 'Apples' 
Counter_ID_2 'Nuts' 
from t2 

但當然,如果你已經預先定義的,你會選擇哪一列只會工作。

0

看起來像你的設計可能有缺陷。您不能將列/列名稱等靜態數據與動態數據混合使用。

但是,如果你真的想這樣做,我想你可能不得不從應用程序做出2個查詢。一個獲取列名稱,然後使用它來動態構建您的實際查詢。

1

返回結果集中的名稱和ID並推遲到調用應用程序,例如

SELECT 
t2.Time AS 'Time', 
t2.Counter_ID_1, s1.Counter_Name AS Counter_Name_1, 
t2.Counter_ID_2, s2.Counter_Name AS Counter_Name_2 
FROM t2 
    JOIN t1 AS s1 ON s1.Counter_ID = t2.Counter_ID_1 
    JOIN t1 AS s2 ON s2.Counter_ID = t2.Counter_ID_2; 
+0

這是正確的,但您必須使用LEFT OUTER JOIN。當您在原始查詢中獲得NULL時,您可能會錯過整行。 – 2012-03-21 08:26:23

+0

@AndreyGurinov:「必須使用LEFT OUTER JOIN」 - 我不同意:樣本數據中沒有空值,我個人也沒有空值;) – onedaywhen 2012-03-21 09:59:13

+0

我做了大量的查詢重新調整,其中我將標量狀的子查詢移動到了加入和我的規則總是介意我已經提到。當然,對於示例數據,它的工作正常,但現實生活有點複雜:)從我這裏! – 2012-03-21 10:05:03

0

假設你正在使用SQL Server,以下將創建使用t1作爲COLUMNNAMES輸入t2

DECLARE @SQLStatement NVARCHAR(MAX) 

SELECT @SQLStatement = 
      ISNULL(@SQLStatement, '') 
      + ', Counter_ID_' 
      + CAST(Counter_ID AS VARCHAR(32)) 
      + ' AS ' + Counter_Name        
FROM t1 

SELECT @SQLStatement = 'SELECT TIME ' + @SQLStatement + ' FROM t2' 
EXEC sp_ExecuteSQL @SQLStatement 

斷下的可執行文件的動態聲明

聲明一個變量持有可執行聲明

DECLARE @SQLStatement NVARCHAR(MAX) 

使用t1作爲輸入,將所有可能的別名連接到可執行語句中。這個步驟的結果將在, Counter_ID_1 AS Apples, Counter_ID_2 AS Nuts

SELECT @SQLStatement = 
      ISNULL(@SQLStatement, '') 
      + ', Counter_ID_' 
      + CAST(Counter_ID AS VARCHAR(32)) 
      + ' AS ' + Counter_Name        
FROM t1 

形式添加SELECTFROM條款

SELECT @SQLStatement = 'SELECT TIME ' + @SQLStatement + ' FROM t2' 

執行

EXEC sp_ExecuteSQL @SQLStatement