如何在连接表的列名中返回表名

时间:2011-10-17 08:02:04

标签: sql sql-server tsql

我的查询......

select * from Contact c
left join Employee e on c.ContactID=e.ContactID
left join [Role] r on e.EmployeeID=r.EmployeeID
where FirstName like '%pete%'

它返回信息,发现它很好。但是,我希望能够看到每个列来自的表,而不必明确地挑选每一列,并对列名称执行'as'语句。这可能吗?

3 个答案:

答案 0 :(得分:3)

不,我不认为这是可能的。一般来说,在查询中使用“select *”是一个坏主意,所以你最好输入列名,这可以使用管理工作室等工具来加速。

如果你使用select *这很糟糕,因为

1)如果有人更改了表格,那么查询仍然可以正常运行,但要查找为什么不再阅读数据会更难。

2)您可能会带来比实际需要更多的数据,浪费读取时间和网络带宽。通常很好的做法是只包含必要的列,然后在您发现需要时添加更多列。

答案 1 :(得分:1)

这可能会对你有所帮助。 e的所有列都在分隔符的前面,r的所有列都在后面。

select e.*, '' as [_______], r.* from Contact c
left join Employee e on c.ContactID=e.ContactID
left join [Role] r on e.EmployeeID=r.EmployeeID
where FirstName like '%pete%'

答案 2 :(得分:1)

您可以尝试使用下一种方法,但我警告您:它不准确

要显示列列表(列名,表名,表别名,数据库名),至少执行一次后,此解决方案将使用缓存计划。下一个示例可以在AdventureWorks2008中运行。

--First step is to run query
SET ANSI_WARNINGS ON;
GO
--QID:579F1EB7-3E68-4ED6-AED0-22E1890AF6CF
SELECT  TOP(10)
        h.SalesOrderID
        ,h.OrderDate
        ,e.JobTitle
        ,p.*
        ,p.FirstName + p.LastName --calculated field
FROM    Sales.SalesOrderHeader h
INNER JOIN HumanResources.Employee e ON e.BusinessEntityID = h.SalesPersonID
INNER JOIN Person.Person p ON e.BusinessEntityID = p.BusinessEntityID 
GO

--Second step
DECLARE  @plan_handle VARBINARY(64)
        ,@x XML;

SELECT  TOP(1)
        @plan_handle = qs.plan_handle
FROM    sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) txt
WHERE   txt.text LIKE '--QID:579F1EB7-3E68-4ED6-AED0-22E1890AF6CF%'
AND     txt.text NOT LIKE '%dm_exec_query_stats%'
--The last used plan (be careful with concurrent executions)
--Also, for the same query you may have many more plans (with parallelism or without)
ORDER BY qs.last_execution_time DESC;   

SELECT  @x = f.query_plan
FROM    sys.dm_exec_query_plan(@plan_handle) f;

WITH XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT   a.b.value('@Database','NVARCHAR(128)') [Database]
        ,a.b.value('@Schema','NVARCHAR(128)')   [Schema]
        ,a.b.value('@Table','NVARCHAR(128)')    [Table]
        ,a.b.value('@Alias','NVARCHAR(128)')    [Alias]
        ,a.b.value('@Column','NVARCHAR(128)')   [Column]
FROM    @x.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/QueryPlan/RelOp/OutputList/ColumnReference') a(b);

在目标查询开始时,我使用此评论--QID:guid(查询ID)进行更精确的识别。 如果您有存储过程,则可以使用sys.dm_exec_query_stats(我没有测试过)视图而不是sys.dm_exec_procedure_stats视图来过滤database_id和object_id(存储过程ID)。

结果:

Database               Schema             Table              Alias Column               
---------------------- ------------------ ------------------ ----- ---------------------
[AdventureWorks2008]   [Sales]            [SalesOrderHeader] [h]   SalesOrderID
[AdventureWorks2008]   [Sales]            [SalesOrderHeader] [h]   OrderDate
[AdventureWorks2008]   [HumanResources]   [Employee]         [e]   JobTitle
[AdventureWorks2008]   [Person]           [Person]           [p]   BusinessEntityID
[AdventureWorks2008]   [Person]           [Person]           [p]   PersonType
[AdventureWorks2008]   [Person]           [Person]           [p]   NameStyle
[AdventureWorks2008]   [Person]           [Person]           [p]   Title
[AdventureWorks2008]   [Person]           [Person]           [p]   FirstName
[AdventureWorks2008]   [Person]           [Person]           [p]   MiddleName
[AdventureWorks2008]   [Person]           [Person]           [p]   LastName
[AdventureWorks2008]   [Person]           [Person]           [p]   Suffix
[AdventureWorks2008]   [Person]           [Person]           [p]   EmailPromotion
[AdventureWorks2008]   [Person]           [Person]           [p]   AdditionalContactInfo
[AdventureWorks2008]   [Person]           [Person]           [p]   Demographics
[AdventureWorks2008]   [Person]           [Person]           [p]   rowguid
[AdventureWorks2008]   [Person]           [Person]           [p]   ModifiedDate
NULL                   NULL               NULL               NULL  Expr1006