使用新查询作为别名

时间:2012-03-21 07:59:00

标签: sql sybase-ase

我有两张桌子:

具有计数器名称(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: 我知道,数据库设计不是很好,但它不是我的数据库,我只是一个RO用户:)

UPD2: 谢谢你们!我理解,在我的情况下,更容易不自动,但在我需要时进行一次查询并手动编辑别名,如果名称(t1)的表将被更改。

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

看起来您的设计可能存在缺陷。您不能将列/列名称等静态数据与动态数据混合使用。

但如果你真的想这样,我想你可能不得不从应用程序中提出2个查询。一个获取列名,然后使用它来动态构建您的实际查询..

答案 2 :(得分:0)

假设您正在使用SQL Server,以下将创建一个可执行动态语句,该语句使用t1作为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

答案 3 :(得分:0)

你想要动态别名。 SQL Server不会这样做。 您可以做什么,其他重新设计表格

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

但当然,只有在您预先定义了要选择的列时才会有效。