sql - 我如何处理 SQL 中的长比较

标签 sql sql-server database algorithm query-optimization

我对 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 服务器崩溃:

"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/

相关文章:

c# - 嵌套 TransactionScope() 不会回滚

c# - 为 iPhone 应用程序抓取 MS SQL Server 数据?

mysql - 试图获取单行数据 - Mysql

python - 在 Python 中处理大型 csv 文件

database - 我怎样才能用关系代数找到MAX?

PHP如何选择特定的SQL单元格并存储在变量中

mysql - 如何改进索引以便在毫秒内执行查询?

sql - SQL WHERE 子句是否短路计算?

sql - 如何在连接两个表时找到列的最大值而不使用 rownumber 函数?

sql-server - 是否可以同时使用 Entity Framework 和数据库项目?