Comparer des vues en utilisant la jointure

Je dois comparer 6 vues. Chaque vue se compose de 3 colonnes, Table_Name , Column_Name , Country . Échantillon:

 view1: Table_Name Column_Name Country TML_Daily LineID CH TML_Daily LineOrder CH TML_Daily LineName CH TML_Daily LineName_GER CH TML_Daily LineName_ITA CH TML_Daily LineName_FRA CH TML_Daily LineLevel CH view2: Table_Name Column_Name Country TML_Daily LineID FR TML_Daily LineOrder FR TML_Daily LineName FR TML_Daily LineName_GER FR TML_Daily LineName_RUS FR TML_Daily LineLevel FR view3: Table_Name Column_Name Country TML_Daily LineID AU TML_Daily LineOrder AU TML_Daily LineName AU TML_Daily LineName_GER AU TML_Daily LineName_FRA AU TML_Daily LineLevel AU 

Comme vous pouvez le voir, view2 manque deux lignes par rapport à view1 , mais a une ligne supplémentaire, qui n'est pas présente dans les autres vues. Il manque également une ligne à view2 .

Dans chaque vue, il y a des données de tables et de colonnes de chaque database. Voici ce que je veux: Je veux comparer les vues, afin que je puisse voir toutes les tables avec ses colonnes à travers toutes les vues. Ensuite, il devrait utiliser une colonne de marqueur, qui est indicateur si la colonne est ou n'est pas présent dans la vue.

Exemple basé sur des données d'exemple:

 Table: Column: CH FR AU TML_Daily LineID 1 1 1 TML_Daily LineOrder 1 1 1 TML_Daily LineName 1 1 1 TML_Daily LineName_GER 1 1 1 TML_Daily LineName_ITA 1 0 0 TML_Daily LineName_FRA 1 0 1 TML_Daily LineName_RUS 0 1 0 TML_Daily LineLevel 1 1 1 

C'est ma requête jusqu'à présent, mais ça ne marche pas du tout comme je l'espérais, parce que ça ressemble à une jointure croisée.

 SELECT distinct COALESCE(c.Table_Name, a.Table_Name, l.Table_Name) AS TableName, COALESCE(c.Column_Name, a.Column_Name, l.Column_Name) AS ColumnName, ISNULL(c.Column_Name, 0) AS CH, ISNULL(a.Column_Name, 0) AS AU, ISNULL(l.Column_Name, 0) AS FR FROM DB1.dbo.v_TECH_ColumnList c FULL OUTER JOIN DB2.dbo.v_TECH_ColumnList a ON a.Table_Name=c.Table_Name FULL OUTER JOIN DB3.dbo.v_TECH_ColumnList l ON l.Table_Name=c.Table_Name ORDER BY TableName, ColumnName 

S'il vous plaît laissez-moi savoir si quelque chose n'est pas clair.

Voyez si cela fait ce que vous voulez.

 DECLARE @v1 TABLE(table_name VARCHAR(32),column_name VARCHAR(32),country VARCHAR(3)); INSERT INTO @v1(table_name,column_name,country)VALUES ('TML_Daily','LineID','CH'), ('TML_Daily','LineOrder','CH'), ('TML_Daily','LineName','CH'), ('TML_Daily','LineName_GER','CH'), ('TML_Daily','LineName_ITA','CH'), ('TML_Daily','LineName_FRA','CH'), ('TML_Daily','LineLevel','CH'); DECLARE @v2 TABLE(table_name VARCHAR(32),column_name VARCHAR(32),country VARCHAR(3)); INSERT INTO @v2(table_name,column_name,country)VALUES ('TML_Daily','LineID','FR'), ('TML_Daily','LineOrder','FR'), ('TML_Daily','LineName','FR'), ('TML_Daily','LineName_GER','FR'), ('TML_Daily','LineName_RUS','FR'), ('TML_Daily','LineLevel','FR'); DECLARE @v3 TABLE(table_name VARCHAR(32),column_name VARCHAR(32),country VARCHAR(3)); INSERT INTO @v3(table_name,column_name,country)VALUES ('TML_Daily','LineID','AU'), ('TML_Daily','LineOrder','AU'), ('TML_Daily','LineName','AU'), ('TML_Daily','LineName_GER','AU'), ('TML_Daily','LineName_FRA','AU'), ('TML_Daily','LineLevel','AU'); SELECT tc.table_name, tc.column_name INTO #table_columns FROM ( SELECT table_name,column_name FROM @v1 UNION SELECT table_name,column_name FROM @v2 UNION SELECT table_name,column_name FROM @v3 ) AS tc; SELECT tc.table_name, tc.column_name, CASE WHEN v1.country IS NULL THEN 0 ELSE 1 END AS CH, CASE WHEN v2.country IS NULL THEN 0 ELSE 1 END AS FR, CASE WHEN v3.country IS NULL THEN 0 ELSE 1 END AS AU FROM #table_columns AS tc LEFT JOIN @v1 AS v1 ON v1.table_name=tc.table_name AND v1.column_name=tc.column_name LEFT JOIN @v2 AS v2 ON v2.table_name=tc.table_name AND v2.column_name=tc.column_name LEFT JOIN @v3 AS v3 ON v3.table_name=tc.table_name AND v3.column_name=tc.column_name ORDER BY tc.table_name, tc.column_name; DROP TABLE #table_columns; 

La sortie est la suivante:

 +------------+--------------+----+----+----+ | table_name | column_name | CH | FR | AU | +------------+--------------+----+----+----+ | TML_Daily | LineID | 1 | 1 | 1 | | TML_Daily | LineLevel | 1 | 1 | 1 | | TML_Daily | LineName | 1 | 1 | 1 | | TML_Daily | LineName_FRA | 1 | 0 | 1 | | TML_Daily | LineName_GER | 1 | 1 | 1 | | TML_Daily | LineName_ITA | 1 | 0 | 0 | | TML_Daily | LineName_RUS | 0 | 1 | 0 | | TML_Daily | LineOrder | 1 | 1 | 1 | +------------+--------------+----+----+----+ 

C'est une caractéristique de la jointure externe complète qui combine vos données des tables "left" et "right" pour chaque jointure. Si vous voulez vérifier si quelque chose est ou non inclus, le mot key "existe" / "n'existe pas" avec les syndicats (exclure, puis pays de la requête) devrait être plus efficace. tj