如何在SQL中处理长比较

时间:2009-02-18 10:53:32

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

我有SQL的病态问题,因此我通常通过构建quickie软件应用程序来处理我的SQL问题来排序所有数据库问题。

(正如我在这种情况下所做的那样)

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

我有:

数据库DB1表A(unitNo,BuildingNo)

数据库DB2表B(unitNo,BuildingNo)

  1. 我想从数据库DB1中提供表A中存在的单位(单元号),这些单元号在数据库DB2中不存在于表B中,反之亦然。

  2. 可能有多个单位具有相同的单位编号,这是因为相同的单位编号可以给予不同建筑物的单位。

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

  4. 我希望这不被视为“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服务器崩溃:

      

    “耗尽了堆栈空间”

    谢谢,

    里克

2 个答案:

答案 0 :(得分:3)

我认为你正在寻找全外联盟。它为您提供了第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

答案 1 :(得分: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)