sql-server - 从创建特定索引的表中获取列名
问题描述
SELECT name
FROM sys.COLUMNS
WHERE object_id = (
SELECT object_id
FROM sys.objects
WHERE name = 'Table_name'
)
AND column_id = (
SELECT COLUMN_ID
FROM sys.index_columns
WHERE object_id = (
SELECT object_id
FROM sys.objects
WHERE name = 'Table_name'
)
)
我已经编写了这个提供正确结果的查询,但我认为它可以以更准确的方式编写。
有人可以帮助我以更紧凑的方式编写此查询吗?
解决方案
“更好”的方法是使用JOIN
而不是相关的子查询(在我的情况下不起作用并抛出错误:“子查询返回多于一行”):
DECLARE @tableName SYSNAME = N'-your-table-name-here-';
SELECT
TableName = t.Name,
IndexName = ix.Name,
ColumnName = c.name
FROM
sys.indexes ix
INNER JOIN
sys.tables t ON t.object_id = ix.object_id
INNER JOIN
sys.index_columns ic ON ic.object_id = t.object_id AND ic.index_id = ix.index_id
INNER JOIN
sys.columns c ON c.object_id = t.object_id AND c.column_id = ic.column_id
WHERE
t.Name = @tableName
我也倾向于尝试使用更集中的目录视图,sys.tables
而不是依赖“包罗万象”的sys.objects
视图
推荐阅读
- sql - Postgres / SQL中是否有办法从字符串中的字符是列名的列中替换字符串中的字符?
- security - OWASP Zap 处理唯一字段和 API 序列的最佳方式是什么?
- android - Firebase 规则仅允许在 android studio 中进行一次更新
- directory - 有没有办法在网页上显示共享的谷歌驱动器文件夹和“孩子”?不仅仅是来自具有嵌入式文件夹视图的文件夹中的文件?
- angular - 从值成对出现的永无止境的流中获取第一个值
- mysql - 从 SQL 查询结果中求和不相等并删除重复项
- java - 使用 return vs While(condition) 方法来打破循环
- python - 如何在相同坐标上转动蛇段?
- spring - 在 Spring Boot 和 Hibernate 中使用 HikariCP 时可能出现 SQL Too many connections 问题的可能情况有哪些?
- php - Preg_split 创建一个数组,但使其为空