【问题标题】:How do I handle long comparisons in SQL如何处理 SQL 中的长比较
【发布时间】:2009-02-18 10:53:32
【问题描述】:

我在使用 SQL 时遇到了病态问题,因此我通常通过构建快速软件应用程序来处理我的 SQL 问题,从而对所有数据库问题进行分类。

(在这种情况下我也是这样做的)

感谢 StackOverflow,我想我可能会因为正确而感到羞耻,所以我想学习如何在实际 SQL 或 T-SQL 本身(如果可能的话)中进行这种 SQL 故障排除:

我有:

数据库 DB1 表 A (unitNo, BuildingNo)

数据库 DB2 表 B (unitNo, BuildingNo)

  1. 我想从数据库 DB1 中找出表 A 中存在的单元(单元编号),而数据库 DB2 中的表 B 中不存在,反之亦然。

  2. 可以有多个单元具有相同的单元编号,这是因为可以将相同的单元编号分配给不同建筑物的单元。

  3. 我没有任何数据库的写入权限。

我希望这不会被视为“gimme teh codz”帖子,我想知道比我更流畅的 SQL 的人如何排序这种算法,教程或提示的帖子非常受欢迎,没有完整的需要代码,但如果它有助于有意义,那么请这样做。

起初我以为我可以从一个表中获取所有单元号,然后从另一个表中排除它们,如下所示:

select concated.unit from 
( SELECT (  unitNo + ',' + CONVERT(varchar(12), BuildingNo) ) as unit
FROM A) concated 
having concated.unit not in

(
'201,1',
'202,1',
'203,1',
'204,1',
'205,1',
'206,1',
[...]

这通常可行,但任何一张表中的单元数都是巨大的,尝试这样做会使 SQL 服务器崩溃:

“堆栈空间不足”

谢谢,

瑞克

【问题讨论】:

    标签: sql sql-server database algorithm query-optimization


    【解决方案1】:

    我认为您正在寻找完全外部联接。这为您提供了您在第 1 部分中要求的单位编号。

    Select 
       A.UnitNumber, B.UnitNumber
    from
       DB1.dbo.TableA A FULL OUTER JOIN DB2.dbo.TableB B 
           on A.UnitNumber = B.UnitNumber
           and A.BuildingNumber = B.BuildingNumber
    Where
       A.UnitNumber is null or B.UnitNumber is null
    

    我在下面概述的其他可能感兴趣的查询。

    这会为您提供 A 中的记录,而不是 B 中的记录。

    Select
        A.UnitNumber
    From
        DB1.dbo.TableA A Left Join DB2.dbo.TableB B 
            on A.UnitNumber = B.UnitNumber 
            and A.BuildingNumber = B.BuildingNumber
    Where
        B.UnitNumber is null
    

    您只需将其反转以查找 B 中不在 A 中的记录。

    Select
        B.UnitNumber
    From
        DB2.dbo.TableB B left join DB1.dbo.TableA A 
            on B.UnitNumber = A.UnitNumber
            and B.BuildingNumber = A.BuildingNumber
    Where
        A.UnitNumber is null
    

    【讨论】:

    • 谢谢,无知并不像他们说的那么幸福。谢谢。
    【解决方案2】:

    正如 JPunyon 所说,但如果您希望将它们全部放在一个列表中,则类似于:

    Select 
        [UnitNumber] = COALESCE(A.UnitNumber, B.UnitNumber),
        [Source] = CASE WHEN A.UnitNumber IS NOT NULL THEN 'A' ELSE 'B' END
    from
        DB1.dbo.TableA A
        FULL OUTER JOIN DB2.dbo.TableB B 
            on A.UnitNumber = B.UnitNumber
    Where
        A.UnitNumber is null or B.UnitNumber is null
    ORDER BY COALESCE(A.UnitNumber, B.UnitNumber)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      相关资源
      最近更新 更多