我正在继承一份我们希望自动化的大型报告。我相信大部分数据都在我可以通过SQL Server访问的数据仓库中。我遇到的问题是我没有很多文档(数据字典,模式等),我想确定哪些字段在几个表中是通用的。通常,当我想返回表和列的列表时,我会查询信息模式。但是,在这种情况下,我基本上是在寻找类似的查询:
select table_name, column_name
from (information_schema, others?)
where table_name like 'T_Blah %'
and column_names are equal
我意识到我可以通过对象浏览器实现这一点,但是一旦我开始涉及更多的表,我想要一种基于查询的快速方法来识别我的字段以便加入。
我感谢任何帮助。我用Google搜索了一段时间,但我没有找到解决方案(或者我没有注意到我找到了一个解决方案)。
答案 0 :(得分:1)
除信息模式外,您还拥有系统表syscolumns。假设你使用前者,这样的东西应该有效:
select column_name, count(distinct table_name)
from information_schema.columns
group by column_name
having count(distinct table_name) > 1
显然,如果你想查看一个子集
,你可以通过表名/模式进行限制答案 1 :(得分:0)
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
答案 2 :(得分:0)
如果我理解你的正确,你可以试试这个:
SELECT TABLE_NAME, COLUMN_NAME
FROM ( SELECT *, COUNT(*) OVER(PARTITION BY COLUMN_NAME) Quant
FROM INFORMATION_SCHEMA.COLUMNS) A
WHERE TABLE_NAME LIKE 'T_Blah%' AND Quant > 1
ORDER BY COLUMN_NAME, TABLE_NAME
答案 3 :(得分:0)
这适用于sql-server。这只是我随身携带的一个查询,因此它比您要求的要多一点。但是,我保留它以防你想要额外的信息:)。如果没有,请将其删除。
select distinct columns.name, schemas.name + '.' + tables.name
from sys.columns
join sys.tables
on tables.object_id = columns.object_id
join sys.schemas
on schemas.schema_id = tables.schema_id
where tables.name like '%blah%'
order by columns.name, schemas.name + '.' + tables.name
答案 4 :(得分:0)
这将产生指定表中的列名和数据类型,这些列也出现在其他表中,后面跟着一个以逗号分隔的表列表:
SELECT COLUMN_NAME, DATA_TYPE, REPLACE(REPLACE(REPLACE(
(SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (COLUMN_NAME = CommonColumns.COLUMN_NAME) AND (DATA_TYPE = CommonColumns.DATA_TYPE)
FOR XML PATH(''))
, '</TABLE_NAME><TABLE_NAME>', ', '), '<TABLE_NAME>', ''), '</TABLE_NAME>', '')
AS Tables
FROM (SELECT DISTINCT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE 'T_Blah%') AS CommonColumns
WHERE (SELECT COUNT(TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (COLUMN_NAME = CommonColumns.COLUMN_NAME) AND (DATA_TYPE = CommonColumns.DATA_TYPE)) > 1
要让它对所有表执行此操作,只需删除WHERE TABLE_NAME LIKE 'T_Blah%'
。
或者如Aaron建议的那样,请避免使用INFORMATION_SCHEMA:
SELECT ColumnName, sys.types.name AS DataType, REPLACE(REPLACE(REPLACE(
(SELECT sys.tables.name AS TableName
FROM sys.columns INNER JOIN
sys.tables ON sys.columns.object_id = sys.tables.object_id
WHERE (sys.tables.type = 'U') AND (sys.columns.name = CommonColumns.ColumnName) AND
(sys.columns.system_type_id = CommonColumns.system_type_id)
FOR XML PATH(''))
, '</TableName><TableName>', ', '), '<TableName>', ''), '</TableName>', '')
AS Tables
FROM (SELECT DISTINCT sys.columns.name AS ColumnName, sys.columns.system_type_id
FROM sys.columns INNER JOIN
sys.tables ON sys.columns.object_id = sys.tables.object_id
WHERE (sys.tables.type = 'U') AND (sys.tables.name LIKE 'T_Blah%')) AS CommonColumns INNER JOIN
sys.types ON sys.types.system_type_id = CommonColumns.system_type_id
WHERE ((SELECT COUNT(sys.tables.object_id) AS TableCount
FROM sys.columns INNER JOIN
sys.tables ON sys.columns.object_id = sys.tables.object_id
WHERE (sys.tables.type = 'U') AND (sys.columns.name = CommonColumns.ColumnName) AND
(sys.columns.system_type_id = CommonColumns.system_type_id)) > 1)
ORDER BY CommonColumns.ColumnName, sys.types.name
要通过外键获取关系,请使用:
SELECT sys.foreign_keys.name AS ForeignKeyName, OBJECT_NAME(sys.foreign_key_columns.parent_object_id) AS ForeignKeyTableName,
ForeignKeyColumns.name AS ForeignKeyColumnName, OBJECT_NAME(sys.foreign_key_columns.referenced_object_id) AS ReferencedTableName,
ReferencedColumns.name AS ReferencedColumnName
FROM sys.foreign_keys INNER JOIN
sys.foreign_key_columns ON sys.foreign_keys.object_id = sys.foreign_key_columns.constraint_object_id INNER JOIN
sys.columns AS ForeignKeyColumns ON sys.foreign_key_columns.parent_object_id = ForeignKeyColumns.object_id AND
sys.foreign_key_columns.parent_column_id = ForeignKeyColumns.column_id INNER JOIN
sys.columns AS ReferencedColumns ON sys.foreign_key_columns.referenced_object_id = ReferencedColumns.object_id AND
sys.foreign_key_columns.referenced_column_id = ReferencedColumns.column_id
WHERE (OBJECT_NAME(sys.foreign_key_columns.parent_object_id) LIKE 'T_Blah%') OR (OBJECT_NAME(sys.foreign_key_columns.referenced_object_id)
LIKE 'T_Blah%')