Sql 使用新查询作为别名

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:

我有两张桌子:

带有计数器名称的表(t1):

和带有计数器值的表(t2):

使用SQL,我尝试将t2中的结果列命名为t1中的名称,如下所示:

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;)我做了大量的查询重设,将类似标量的子查询移动到联接中,我的规则一直是我提到的。当然,对于示例数据,它可以正常工作,但现实生活有点复杂:)从我这里开始@安德烈·伊古里诺夫:我在现实世界中还没有遇到过空值:告诉我,它们真的有天蓝色的粉红色吗?;)