2016-03-23 17 views
2

Ich lerne SQL unter Verwendung der gängigen Microsoft AdventureWorks2014 Beispieldatenbank in SQL Server 2014.Wie wählt man alle nicht eindeutigen Spalten aus meiner DB aus?

Ich habe gerade über HAVING und Information Schema heute gelernt und versuche, die beiden zu kombinieren.

Grund sein, würde ich wirklich gerne schnell sagen, welche Spalten aus allen Tabellen geteilt werden. Das funktioniert:

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

Aber ... die Ausgabe gibt mir eindeutige Spaltennamen, die mich nur verlangsamt.

Ich habe die Anwendung Antworten versucht, aus "How to select non 'unique' rows" wie (unter 5-7 anderen SOF Seiten!):

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

... aber ich bekomme diese Fehlermeldung:

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.

Antwort

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 

Ausgabe:

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

Sie können u se Ihre Abfrage alle Spalten retrive, die gemeinsam genutzt werden, und dann in die Originaltabelle für alle Informationen (Schema, Name) beitreten:

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 column_name“ am Ende des Skripts Hinzufügen tat das Trick, danke! – SPR