使用SELECT *时字段名称前面的表名

时间:2016-06-16 08:50:04

标签: sql-server tsql select sql-server-2014

我想知道在将SELECT *JOIN结合使用时是否有可能显示完整的列名。

作为一个例子,我有这个查询(选择从另一个应用程序导入的数据):

SELECT *
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.SomeKey = t2.SomeKey
LEFT JOIN Table3 t3 ON t2.SomeOtherKey = t3.SomeOtherKey

这给了我这样的结果:

+---------+------+-------+------------+---------+--------------+-----------+------------+--------------+-------+---------------+------------+
| SomeKey | Name | Value | WhateverId | SomeKey | SomeOtherKey | ValueType | CategoryId | SomeOtherKey | Value | ActualValueId | SomeTypeId |
+---------+------+-------+------------+---------+--------------+-----------+------------+--------------+-------+---------------+------------+
| bla     | bla  | bla   | bla        | bla     | bla          | bla       | bla        | bla          | bla   | bla           | bla        |
+---------+------+-------+------------+---------+--------------+-----------+------------+--------------+-------+---------------+------------+

我想要的是每个字段前面的表名。结果将是这样的:

+----------------+-------------+-------+------------------+
| Table1.SomeKey | Table1.Name | ..... | Table2.ValueType | .....
+----------------+-------------+-------+------------------+
| bla            | bla         | ..... | bla              | .....
+----------------+-------------+-------+------------------+

我想这样做,因为已经给出了查询(没有SELECT *),我现在必须在其中一个表中找到一个列,其值与另一个表中的给定标识相匹配。我知道我可以分析每个表格。但是,我想知道我是否可以添加任何简单的语句来获取字段名称前面的表名。

2 个答案:

答案 0 :(得分:3)

那个问题的答案是 NO 。您无法使用*对列进行别名。

如果您想要处理这些列,请根据需要将它们指定为自己并为其设置别名,一般情况下,我会尽量避免使用*来避免使用含糊不清的列。

以这种方式思考 - 再花2分钟的时间来避免可能出现100X的错误。

答案 1 :(得分:3)

您可以使用SELECT为每个列轻松构建AS子句。我们假设您有以下表格:

IF  OBJECT_ID('dbo.Table01') IS NOT NULL
BEGIN
    DROP TABLE Table01;
END;

IF  OBJECT_ID('dbo.Table02') IS NOT NULL
BEGIN
    DROP TABLE Table02;
END;

CREATE TABLE Table01
(
    [ID] INT IDENTITY(1,1)
   ,[Name] VARCHAR(12)
   ,[Age] TINYINT
);

CREATE TABLE Table02
(
    [ID] INT IDENTITY(1,1)
   ,[Name] VARCHAR(12)
   ,[Age] TINYINT
);

你的查询是:

SELECT *
FROM Table01
INNER JOIN Table02
    ON Table01.[ID] = Table02.[ID];

只需执行以下声明:

SELECT ',' + [source_table] + '.' + [source_column] + ' AS [' + [source_table] + '.' + [source_column] + ']'
FROM sys.dm_exec_describe_first_result_set  
(N'SELECT *
FROM Table01
INNER JOIN Table02
    ON Table01.[ID] = Table02.[ID]', null,1) ;

你会得到这个:

enter image description here

只需将结果复制并粘贴到您的查询中(并删除第一个逗号):

SELECT Table01.ID AS [Table01.ID]
,Table01.Name AS [Table01.Name]
,Table01.Age AS [Table01.Age]
,Table02.ID AS [Table02.ID]
,Table02.Name AS [Table02.Name]
,Table02.Age AS [Table02.Age]
FROM Table01
INNER JOIN Table02
    ON Table01.[ID] = Table02.[ID];

你会得到这个:

enter image description here

当然,您可以使用function的输出并以您喜欢的方式构建SELECT列(排除列,格式化等)。