我有SQL的病态问题,因此我通常通过构建quickie软件应用程序来处理我的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服务器崩溃:
“耗尽了堆栈空间”
谢谢,
里克
答案 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)