首页 > 解决方案 > 如何根据它们的模式以透视方式显示所有数据库表

问题描述

这只是一个问题,我不知道如何解决这个问题,但在 MSSql 查询中是否有一个简单的解决方案,可以根据它们的模式以旋转的方式列出所有表。

例如,如果存在 7 个具有 3 个模式的表

Master.Categories
Master.Customer
Transaction.Order
Transaction.OrderItems
Catalogue.Product
Catalogue.ProductPricing
Logs.OrderLogs

...

输出应该看起来像

Master | Transaction | Catalogue | Logs
Categories | Order | OrderLogs | OrderLogs
Customer | OrderItems | ProductPricing | NULL

标签: sqlsql-server

解决方案


也许是带有 row_number() 的 PIVOT

这假设您已经从适当的数据库中收集了所需的信息。

例子

Declare @YourTable Table ([SomeCol] varchar(50))
Insert Into @YourTable Values 
 ('Master.Categories')
,('Master.Customer')
,('Transaction.Order')
,('Transaction.OrderItems')
,('Catalogue.Product')
,('Catalogue.ProductPricing')
,('Logs.OrderLogs')


Select *
 From  (
        Select B.*
              ,RN=row_number() over (partition by Item Order by Value) 
         From @YourTable
         Cross Apply ( values (left(SomeCol,charindex('.',SomeCol)-1),substring(SomeCol,charindex('.',SomeCol)+1,255))
                     ) B(Item,Value)
       ) src 
 Pivot (max(Value) for Item in ([Master],[Transaction],[Catalogue],[Logs]) ) pvt

退货

RN  Master      Transaction Catalogue       Logs
1   Categories  Order       Product         OrderLogs
2   Customer    OrderItems  ProductPricing  NULL

编辑-动态方法-注意这不使用表变量

Declare @SQL varchar(max) = '
Select *
 From  (
        Select B.*
              ,RN=row_number() over (partition by Item Order by Value) 
         From YourTable
         Cross Apply ( values (left(SomeCol,charindex(''.'',SomeCol)-1),substring(SomeCol,charindex(''.'',SomeCol)+1,255))
                     ) B(Item,Value)
       ) src 
 Pivot (max(Value) for Item in ('+Stuff((Select Distinct ','+QuoteName(left(SomeCol,charindex('.',SomeCol)-1)) 
                                           From YourTable A  
                                           For XML Path('')),1,1,'') +') ) pvt
'
Exec(@SQL)

推荐阅读