2016-03-23 24 views
2

我正在学习使用SQL Server 2014中的常见Microsoft AdventureWorks2014示例数据库的SQL。如何从我的数据库中选择所有非唯一列?

我刚刚得知HAVINGInformation Schema今天,我试图将两者结合起来。

原因是,我真的很想告诉迅速从所有表列共享。这个作品:

SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
ORDER BY COLUMN_NAME, TABLE_SCHEMA 

但是...输出给我的唯一列名只会减慢我。

我试着将答案从"How to select non 'unique' rows"如(中5-7其他SOF页面!):

SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COUNT(*) 
FROM INFORMATION_SCHEMA.COLUMNS 
GROUP BY COLUMN_NAME 
HAVING COUNT(COLUMN_NAME) > 1 

...但我得到这个错误:

Msg 8120, Level 16, State 1, Line 1 Column 'information_schema.columns.TABLE_SCHEMA' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

回答

0
SELECT * 
FROM (
    SELECT 
     col = c.name, 
     obj_name = o.name, 
     sch_name = SCHEMA_NAME(o.[schema_id]), 
     col_type = TYPE_NAME(c.system_type_id), 
     RowNum = COUNT(1) OVER (PARTITION BY c.name, o.[type] ORDER BY 1/0) 
    FROM sys.columns c 
    JOIN sys.objects o ON c.[object_id] = o.[object_id] 
    WHERE o.[type] = 'U' 
) t 
WHERE t.RowNum > 1 
ORDER BY t.col 

输出:

col      obj_name   sch_name col_type  
----------------------- ------------------- --------- ------------ 
dbid     spt_fallback_usg dbo  smallint  
dbid     spt_fallback_db  dbo  smallint  
xserver_name   spt_fallback_usg dbo  varchar  
xserver_name   spt_fallback_db  dbo  varchar  
xserver_name   spt_fallback_dev dbo  varchar  
1

你可以ü SE查询,以检索所有共享的列,然后再加入到原始表的所有信息(架构,名):

SELECT t.TABLE_SCHEMA, 
     t.table_name, 
     t.column_name 
FROM INFORMATION_SCHEMA.COLUMNS t 
INNER JOIN (
    SELECT s.column_name 
    FROM INFORMATION_SCHEMA.COLUMNS s 
    GROUP BY s.column_name 
    HAVING COUNT(s.column_name) > 1 
) tt ON (t.column_name = tt.column_name) 
+0

添加“ORDER BY列名”在脚本的最后做了绝招,谢谢! – SPR

相关问题