我有两张桌子:
具有计数器名称(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)的表将被更改。
答案 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
添加SELECT
和FROM
子句
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
但当然,只有在您预先定义了要选择的列时才会有效。