2016-03-23 26 views
2

SQL Server 2014 numaralı Microsoft'ta ortak Microsoft AdventureWorks2014 örnek veritabanını kullanarak öğreniyorum.DB'm dışındaki tüm benzersiz olmayan sütunlar nasıl seçilir?

Bugün sadece HAVING ve Information Schema hakkında öğrendim ve ikisini birleştirmeye çalışıyorum.

Sebep şu ki, tüm tablolardaki hangi sütunların paylaşıldığını hızlıca söylemek isterim. Bu,

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

Ancak çıktı bana sadece beni yavaşlatır benzersiz sütun adları verir. (! 5-7 arasında diğer SOF sayfalarda)

ben gibi "How to select non 'unique' rows" başvuran cevaplar denedim:

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

... ama bu hatayı alıyorum:

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.

cevap

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 

Çıkış:

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

sorunuzu paylaşılır tüm sütunları alınamadı ve ardından tüm bilgiler (şema, ad) için orijinal tabloya katılmak flmayaca¤: Senaryonuzun sonunda

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

"column_name ORDER BY" ekleme yaptılar hile, teşekkürler! – SPR

İlgili konular