我必须比较 6 个视图。每个视图由 3 列组成,Table_Name
、Column_Name
、Country
。样本:
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
如您所见,与view1
相比,view2
缺少两行,但具有其他视图中不存在的附加行。此外,view2
缺少一行。
在每个视图中,都有来自每个数据库的表和列的数据。这就是我想要的:我想比较视图,以便我可以查看所有视图中的所有表及其列。然后它应该使用一些标记列,该列是视图中是否存在列的指示器。
基于示例数据的示例:
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
到目前为止,这是我的查询,但它根本没有按我的预期工作,因为它执行类似交叉连接的操作。
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
如果有什么不清楚的地方,请告诉我。
看看这是否符合您的要求。
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;
输出如下:
+------------+--------------+----+----+----+
| 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 |
+------------+--------------+----+----+----+
这是完整外部联接的功能,它为每个联接组合来自"左"和"右"表的数据。如果您想检查是否包含某些内容,则带有联合的关键字"存在"/"不存在"(从查询中排除然后国家/地区)应该更有效。TJ