我有近100张桌子,很多名字都非常相似,以“ STANDARD”和“ MARKIT”之类的名字开头,依此类推。我想找到所有与这些表相同的列名。因此,我想搜索以'STANDARD'开头的所有具有相同字段名称的表,例如'Field1'
,'Field2'
,'Field3'
和'Field4'
。我猜想这将是sys.columns.name
和sys.tables
的某种组合,但我不确定。我认为下面的SQL是一个好的开始,但是在运行脚本之前,我不知道常见的列是什么。
SELECT
sys.columns.name AS ColumnName,
tables.name AS TableName
FROM
sys.columns
JOIN sys.tables ON
sys.columns.object_id = tables.object_id
WHERE
tables.name like '%STANDARD%' AND ... something else ...
答案 0 :(得分:1)
您走在正确的轨道上,需要join
和sys.tables
sys.columns
,在这里,我正在使用一个技巧来尝试查找表名和列并按表名分组,仅找到所有字段的组(未经测试)
SELECT t.name AS 'TableName'
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE t.name LIKE '%STANDARD%' and c.name in ('Field1', 'Field2', 'Field3', 'Field4')
GROUP BY t.name
HAVING count(*) = 5
ORDER BY t.name
编辑
以下查询查找跨多个表共享的列名
select c.ColumnName, count(*)
from sys.columns c
join sys.tables t
on c.object_id = t.object_id
group by c.ColumnName
having count(*) > 2;
如果需要,您可以将上述想法用作子查询。
答案 1 :(得分:0)
如果我理解正确,则需要具有 all 指定列的“标准”表。
您可以使用INFORMATION_SCHEMA.COLUMNS
。
select table_schema, table_name
from information_schema.columns c
where table_name like 'STANDARD%' and
table_schema = @schema and
column_name in ('field1', 'field2', 'field3', 'field4')
group by table_schema, table_name
having count(*) = 4; -- has all four columns