2

私はSQL Server 2014に共通マイクロソフトAdventureWorks2014サンプルデータベースを利用したSQLを学んでいます。DBから一意でない列をすべて選択するにはどうすればよいですか?

は、私はちょうど約HAVINGInformation Schema今日学んだと2を組み合わせしようとしています。

理由ビーイングは、私は本当にすぐにすべてのテーブルの列が共有されてお伝えしたいと思います。これはうまくいきます:

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

あなたのクエリが共有されているすべての列をretriveし、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

スクリプトの末尾に「COLUMN_NAME BY ORDER」を追加しましたトリック、ありがとう! – SPR

関連する問題