如何处理 SQL 中的长比较
Posted
技术标签:
【中文标题】如何处理 SQL 中的长比较【英文标题】:How do I handle long comparisons in SQL 【发布时间】:2009-02-18 10:53:32 【问题描述】:我在使用 SQL 时遇到了病态问题,因此我通常通过构建快速软件应用程序来处理我的 SQL 问题,从而对所有数据库问题进行分类。
(在这种情况下我也是这样做的)
感谢 ***,我想我可能会因为正确而感到羞耻,所以我想学习如何在实际 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 服务器崩溃:
“堆栈空间不足”
谢谢,
瑞克
【问题讨论】:
【参考方案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)
【讨论】:
以上是关于如何处理 SQL 中的长比较的主要内容,如果未能解决你的问题,请参考以下文章