【问题标题】:How to get table name back in column name of joined tables如何在连接表的列名中取回表名
【发布时间】:2011-10-17 08:02:03
【问题描述】:

我有查询...

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”语句。这可能吗?

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

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

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

1) 如果有人更改了表,那么查询仍然可以工作,但更难追踪您不再读取数据的原因。

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

【讨论】:

    【解决方案2】:

    这可能会对您有所帮助。 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%'
    

    【讨论】:

      【解决方案3】:

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

      为了显示列列表(列名、表名、表别名、数据库名),至少执行一次后,此解决方案使用缓存计划。下一个示例可以在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_procedure_stats(我没有测试过)视图来过滤database_id和object_id(存储过程id),而不是sys.dm_exec_query_stats视图。

      结果:

      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
      

      【讨论】:

        猜你喜欢
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-29
        • 1970-01-01
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多