使用联接比较视图



我必须比较 6 个视图。每个视图由 3 列组成,Table_NameColumn_NameCountry 。样本:

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

最新更新