使用加入

时间:2016-02-01 13:04:45

标签: sql-server sql-server-2008 tsql

我必须比较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

正如您所看到的,view2view1相比缺少两行,但有其他行,而其他视图中则不存在。此外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

如果不清楚,请告诉我。

2 个答案:

答案 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