我对 SQL 有一个病理性问题,所以我通常通过构建快速软件应用程序来处理我的 SQL 问题来解决我所有的数据库问题。
(我在这种情况下也是这样做的)
感谢 StackOverflow,我认为我可以羞于正确,所以我想学习如何在实际 SQL 或 T-SQL 本身(如果可能的话)中进行此类 SQL 故障排除:
我有:
数据库DB1表A(unitNo, BuildingNo)
数据库 DB2 表 B (unitNo, BuildingNo)
我想找出数据库 DB1 的表 A 中存在的单位(单位编号),这些单位不存在于数据库 DB2 的表 B 中,反之亦然。
可以有多个单元具有相同的单元号,这是因为相同的单元号可以分配给不同建筑物的单元。
我没有对任何数据库的写入权限。
我希望这不会被视为“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 服务器崩溃:
"ran out of stack space"
谢谢,
瑞克
最佳答案
我认为您正在寻找完全外部联接。这会为您提供您在第 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
关于sql - 我如何处理 SQL 中的长比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/560586/