我必须比较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
正如您所看到的,view2
与view1
相比缺少两行,但有其他行,而其他视图中则不存在。此外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
如果不清楚,请告诉我。
答案 0 :(得分:1)
看看这是否符合您的要求。
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 |
+------------+--------------+----+----+----+
答案 1 :(得分:0)
这是完全外部联接的功能,它为每个联接组合了“左”和“右”表中的数据。 如果您想检查某些内容是否包含关键字“存在”/“不存在”与联合(从查询中排除国家)应该更有效。 TJ