如何在多个表之间选择匹配的列名?

时间:2019-09-05 19:44:35

标签: sql sql-server

我有近100张桌子,很多名字都非常相似,以“ STANDARD”和“ MARKIT”之类的名字开头,依此类推。我想找到所有与这些表相同的列名。因此,我想搜索以'STANDARD'开头的所有具有相同字段名称的表,例如'Field1''Field2''Field3''Field4'。我猜想这将是sys.columns.namesys.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 ...

2 个答案:

答案 0 :(得分:1)

您走在正确的轨道上,需要joinsys.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