sql - 如何根据它们的模式以透视方式显示所有数据库表
问题描述
这只是一个问题,我不知道如何解决这个问题,但在 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
解决方案
也许是带有 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)
推荐阅读
- hibernate - 我们可以在 Hibernate 中再次使持久对象瞬变吗?
- python - Django:表单无效
- php - 如何在不使用分页的情况下返回相同的 MySql 记录
- json - 在 json 反序列化之前根据属性名称和值更新字段值 [Newtonsoft / JSON.Net]
- sql - 为子查询选择计数,而不是使用“和”过滤器
- php - 在 Windows 10 操作系统的 XAMPP 安装设置中,我在哪里可以找到 PHPIniDir 指令及其值?
- javascript - scrollTo 速度/持续时间设置
- go - gotour 并发教程中为什么需要 goroutine 的解释
- html - 移除 DOM 元素时的 CSS 高度过渡
- python - BeautifulSoup:根据前面标签的内容打印 div