2017-11-02 19 views
0

データベースに複数のテーブルがあります(何千もある)。次のようにこの目的のために、私は3つのサンプル表を作成:2つのテーブルから同様のカラム名とカウントを取得する

table1(song_cast, song_name, song_size) 
    table2(song_size, singer, movie_name, song_cast) 
    table3(movie_name, singer, song_name, song_cast) 

を私は期待して出力され

|table1 & table2 | song_cast, song_size | 2 #count of common columns 
    |table2 & table3 | singer, song_cast, movie_name | 3 
    |table1 & table3 | song_name, song_cast | 2 
私はJavaでこのコード(NetBeans IDEの8.2)を実行されますので、私はなります

この出力をNetBeansで取得します。

+1

私はあなたが質問をよく分かりません。 – notyou

+0

@notyouこの場合、期待される結果が彼の質問でした。 – Sami

答えて

1

common table expressionsstuff() with select ... for xml path ('') method of string concatenationを使用してください。

;with cte as (
select c.* 
from information_schema.tables t 
    inner join information_schema.columns c 
    on t.table_schema = c.table_schema 
    and t.table_name = c.table_name 
where t.table_type='base table' 
) 
, match as (
select 
    tables = l.table_name + ' & ' + r.table_name 
    , l.column_name 
from cte l 
    inner join cte r 
    on l.column_name = r.column_name 
    and l.table_name < r.table_name 
) 
select 
    tables 
    , columns = stuff((
    select ', '+ column_name 
    from match i 
    where m.tables = i.tables 
    for xml path (''), type).value('(./text())[1]','nvarchar(max)') 
    ,1,2,'') 
    , matches = count(*) 
from match m 
group by tables 

rextesterデモ:http://rextester.com/TLQ28814

リターン:

+-----------------+-------------------------------+---------+ 
|  tables  |   columns   | matches | 
+-----------------+-------------------------------+---------+ 
| table1 & table2 | song_cast, song_size   |  2 | 
| table1 & table3 | song_cast, song_name   |  2 | 
| table2 & table3 | singer, movie_name, song_cast |  3 | 
+-----------------+-------------------------------+---------+ 
+0

@Samiあなたが何か他のものを紛失していない限り、行は異なる順序で期待された結果と異なるでしょうか? – SqlZim

+0

恐ろしい!それはまさに私が探していたものです。あなたの努力に感謝します。 –

+0

@ShadowFiendお手伝いを! – SqlZim

関連する問題