查找多个表之间的公共列

时间:2015-11-17 18:07:23

标签: sql sql-server multiple-columns

我有数百个表,每个表包含400多列。 我想在这些表之间找到公共列的名称。 我该怎么做。我发现一个在线代码,但只能用于少量的表。  当我在我的情况下运行查询时,我收到以下错误 - > '查询处理器耗尽了内部资源,无法生成查询计划。这是一种罕见的事件,仅适用于引用大量表或分区的极其复杂的查询或查询。请简化查询。如果您认为自己错误地收到了此消息,请与客户支持服务部​​门联系以获取更多信息。'

这是查询:

insert into temp_table 
  select column_name from information_schema.columns where table_name = 'test_datajuly17' 
  intersect select column_name from information_schema.columns where table_name = 'test_datajuly20' 
  intersect select column_name from information_schema.columns where table_name = 'test_datajuly21'

任何帮助将不胜感激。 感谢

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作。

如果您知道要比较的表,请将表名放入临时表(@TEMPTABLE),然后执行以下操作

DECLARE @TEMPTABLE AS TABLE
(
    TableName VARCHAR(32)
)

INSERT INTo @TEMPTABLE
VALUES
('spt_fallback_dev'), --test names
('spt_values')



SELECT fulllist.*
FROM INFORMATION_SCHEMA.COLUMNS fulllist
INNER JOIN @TEMPTABLE baseCmp on baseCmp.TableName = fulllist.TABLE_NAME
INNER JOIN
    ( SELECT COLUMN_NAME
      FROM INFORMATION_SCHEMA.COLUMNS isc
      INNER JOIN @TEMPTABLE tt on tt.TableName = isc.TABLE_NAME
      GROUP BY COLUMN_NAME
      HAVING COUNT(*) > 1) temp on temp.COLUMN_NAME = fulllist.COLUMN_NAME
ORDER BY COLUMN_NAME

然后你可以用结果做各种事情(例如转动它等)

答案 1 :(得分:-1)

下面的查询完全相同。所以你不需要内部和外部查询。

SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS isc
  INNER JOIN @TEMPTABLE tt on tt.TableName = isc.TABLE_NAME
  GROUP BY COLUMN_NAME
  HAVING COUNT(*) > 1
  ORDER BY COLUMN_NAME