【问题标题】:Joining tables without a common column in sql server在sql server中连接没有公共列的表
【发布时间】:2019-09-25 20:46:06
【问题描述】:

表 1

ID  
----                        
1                           
2                           
3                           
4                           
5      

表2

Name
----
Z
Y
X
W
V                           

预期输出:

ID              Name
-------------------------
1               NULL
2               NULL
3               NULL
4               NULL
5               NULL
NULL             Z
NULL             Y
NULL             X
NULL             W
NULL             V

我需要通过在 SQL Server 中使用 JOINS 来解决上述情况。

【问题讨论】:

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


    【解决方案1】:

    使用FULL OUTER JOIN,可以得到预期的结果。

    由于没有公共字段,因此 Table1 中的任何记录都不应与 Table2 匹配,反之亦然。所以也许ON 0 = 1 作为连接条件也将按预期工作。 Thanks Bart Hofland

    所以下面的查询也可以工作:

    SELECT T1.Id, T2.[Name]
    FROM Table1 T1
    FULL OUTER JOIN Table2 T2 ON 0 = 1;
    

    SELECT T1.Id, T2.[Name]
    FROM Table1 T1
    FULL OUTER JOIN Table2 T2 ON T2.[Name] = CAST(T1.Id AS VARCHAR(2));
    

    示例数据演示:

    DECLARE @Table1 TABLE (Id INT);
    
    INSERT INTO @Table1 (Id) VALUES
    (1),                           
    (2),                           
    (3),                           
    (4),                           
    (5);  
    
    DECLARE @Table2 TABLE ([Name] VARCHAR(1));
    
    INSERT INTO @Table2 ([Name]) VALUES
    ('Z'),
    ('Y'),
    ('X'),
    ('W'),
    ('V');
    
    SELECT T1.Id, T2.[Name]
    FROM @Table1 T1
    FULL OUTER JOIN @Table2 T2 ON 0 = 1;
    

    输出:

    Id      Name
    -----------------
    1       NULL
    2       NULL
    3       NULL
    4       NULL
    5       NULL
    NULL    Z
    NULL    Y
    NULL    X
    NULL    W
    NULL    V
    

    【讨论】:

    • 使用 FULL OUTER JOIN 可以解决问题,但应该更改匹配记录的逻辑。由于没有公共字段,我认为表 1 中的任何记录都不应与表 2 匹配,反之亦然。所以也许ON 0 = 1 作为连接条件会按预期工作。
    • @BartHofland 是的,有效点。让我用您的评论参考更新答案。
    【解决方案2】:

    我不明白您为什么要这样做,但要获得预期的结果,您可以这样做。不过,这不是一个联接。

    SELECT ID, NULL as NAME from Table1
    UNION ALL
    SELECT NULL, NAME from Table2
    

    编辑添加

    由于该问题专门要求使用连接的解决方案,因此 Arulkumar 对 FULL OUTER JOIN 的回答更合适,您不必担心列数据类型是什么。

    【讨论】:

    • 在这种特定情况下,您的查询可能会正常工作。但是,可以肯定的是,我通常会在第一个 SELECT 查询中将 NAME 的 NULL 值显式转换为 Table2NAME 列的类型。 (否则,第二个查询可能会因转换错误而失败。)但是,OP 没有提供有关数据类型的信息,因此这里不可能。 ;-) 也许较新的 SQL Server 版本可以更好地处理隐式转换,但我不确定。
    猜你喜欢
    • 2018-10-20
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2015-11-11
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多