0

我有一个关于 SQL 的病态问题,所以我通常通过构建快速软件应用程序来处理我的 SQL 问题来对我的所有数据库问题进行分类。

(就像我在这种情况下所做的那样)

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

我有:

数据库 DB1 表 A (unitNo, BuildingNo)

数据库 DB2 表 B (unitNo, BuildingNo)

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

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

  3. 我没有对任何数据库的写访问权。

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

“堆栈空间不足”

谢谢,

里克

4

2 回答 2

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
于 2009-02-18T10:58:57.647 回答
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)
于 2009-02-18T11:16:13.813 回答