Sql 使用新查询作为别名
我有两张桌子: 带有计数器名称的表(t1): 和带有计数器值的表(t2): 使用SQL,我尝试将t2中的结果列命名为t1中的名称,如下所示:Sql 使用新查询作为别名,sql,sap-ase,Sql,Sap Ase,我有两张桌子: 带有计数器名称的表(t1): 和带有计数器值的表(t2): 使用SQL,我尝试将t2中的结果列命名为t1中的名称,如下所示: Time Apples Nuts 12:00 24 43 13:00 64 73 ... 这是我的问题(不起作用): 有什么想法吗 UPD: 我知道,DB设计不是很好,但它不是我的DB,我只是一个RO用户:) UPD2:
Time Apples Nuts
12:00 24 43
13:00 64 73
...
这是我的问题(不起作用):
有什么想法吗
UPD:
我知道,DB设计不是很好,但它不是我的DB,我只是一个RO用户:)
UPD2:
谢谢大家!!我明白,在我的情况下,不自动查询更容易,但如果名称(t1)的表将被更改,则可以根据需要执行一次查询并手动编辑别名。看起来您的设计可能有缺陷。不能将静态数据(如列/列名)与动态数据混合使用
但是如果你真的想这样做,我想你可能需要从应用程序中进行两次查询。一个是获取列名,然后使用它动态构建实际查询。看起来您的设计可能有缺陷。不能将静态数据(如列/列名)与动态数据混合使用
但是如果你真的想这样做,我想你可能需要从应用程序中进行两次查询。一个是获取列名,然后使用它动态构建实际查询。在结果集中返回名称和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;
返回resultset中的名称和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;
假设您使用的是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)
EXEC sp_ExecuteSQL @SQLStatement
使用t1
作为输入,将所有可能的别名连接到可执行语句中。此步骤的结果将以的形式出现,计数器ID\u 1为苹果,计数器ID\u 2为螺母
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'
执行该语句
DECLARE @SQLStatement NVARCHAR(MAX)
EXEC sp_ExecuteSQL @SQLStatement
假设您使用的是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)
EXEC sp_ExecuteSQL @SQLStatement
使用t1
作为输入,将所有可能的别名连接到可执行语句中。此步骤的结果将以的形式出现,计数器ID\u 1为苹果,计数器ID\u 2为螺母
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'
执行该语句
DECLARE @SQLStatement NVARCHAR(MAX)
EXEC sp_ExecuteSQL @SQLStatement
您需要动态别名。SQL Server不会这样做。 除了重新设计表之外,您还可以做什么
select
Time as 'Time',
Counter_Name as 'Apples'
Counter_ID_2 'Nuts'
from t2
但是,当然,只有在预先定义了要选择的列的情况下,这才有效。您需要动态别名。SQL Server不会这样做。 除了重新设计表之外,您还可以做什么
select
Time as 'Time',
Counter_Name as 'Apples'
Counter_ID_2 'Nuts'
from t2
当然,只有在预先定义了要选择哪些列的情况下,这才有效。虽然使用动态SQL可以做到这一点,但我强烈建议您重新考虑表的设计。您的
名称
表和值
表之间没有真正的链接,只是将名称
中的ID串联起来。问题是它不是我的表,它是一个大的法人系统,我没有机会影响此数据库的任何设计问题:)如果t1中有另一行,比如说3 Orange
,那么从t2哪里获得数据,在结果集中有一列为Orange
?虽然使用动态SQL可以做到这一点,但我强烈建议您重新考虑表的设计。您的名称
表和值
表之间没有真正的链接,只是将名称
中的ID串联起来。问题是它不是我的表,它是一个大的法人系统,我没有机会影响此DB的任何设计问题:)如果在t1中有另一行,比如说3 Orange
,那么从t2哪里获取数据以在结果集中有列作为Orange
?这是正确的,但必须使用左外连接。在原始查询中,如果只得到NULL,则可能会错过整行。@AndreyGurinov:“必须使用左外部联接”-我不同意:示例数据中没有NULL,我个人不做NULL;)我做了大量的查询重设,将类似标量的子查询移动到联接中,我的规则一直是我提到的。当然,对于示例数据,它可以正常工作,但现实生活有点复杂:)从我这里开始@安德烈·伊古里诺夫:我在现实世界中还没有遇到过空值:告诉我,它们真的有天蓝色的粉红色吗?;)这是正确的,但必须使用左外连接。在原始查询中,如果只得到NULL,则可能会错过整行。@AndreyGurinov:“必须使用左外部联接”-我不同意:示例数据中没有NULL,我个人不做NULL;)我做了大量的查询重设,将类似标量的子查询移动到联接中,我的规则一直是我提到的。当然,对于示例数据,它可以正常工作,但现实生活有点复杂:)从我这里开始@安德烈·伊古里诺夫:我在现实世界中还没有遇到过空值:告诉我,它们真的有天蓝色的粉红色吗?;)