2012-03-21 63 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