如何解决使用聚簇索引的内部联接约束需要为空
我已经创建了一个聚集索引视图,它将查询时间减少了4倍。主要问题是这样做时我无法使用完全外部联接,最终导致丢失多达20%的数据集记录(空值对于后变换非常重要)。
使用内部联接时是否可以保留空值?
我尝试了几件事,但没有一个起作用:
-
SELECT * FROM dbo.gbmp mp INNER JOIN dbo.gbnatr ntr ON ISNULL(mp.GBMPNATR,-1) = ntr.NTNATR
-
SELECT * FROM dbo.gbmp mp INNER JOIN dbo.gbnatr ntr ON mp.GBMPNATR = ntr.NTNATR OR ntr.NTNATR IS NULL
这是我的索引定义:
CREATE UNIQUE CLUSTERED INDEX UIX_STG_Movements_Prec_DO_norn
on STG_Movements_Prec_DO (GBMPnopR,GBMPnorN,GBMPNSEQN,GBMPNDOC,GBMPVLR)
有解决方法吗?
Inputs:
Table gbmp
OPR | Natr
1 | DO
2 | DO
3 | CC
4 | CRF
Table gbnatr
OPR | Natr
1 | DO
2 | DO
3 | CC
4 | EFT
Desired output:
OPR | Natr
1 | DO
2 | DO
3 | CC
4 | NULL
Output obtained:
OPR | Natr
1 | DO
2 | DO
3 | CC
解决方法
如果数据中有NULL
个值并想要一个内部联接,则可以尝试:
SELECT *
FROM dbo.gbmp mp JOIN
dbo.gbnatr ntr
ON mp.GBMPNATR = ntr.NTNATR
UNION ALL
SELECT *
FROM dbo.gbmp mp JOIN
dbo.gbnatr ntr
ON mp.GBMPNATR IS NULL AND nt.NTNATR IS NULL;
这应该在列上使用适当的索引。
编辑:
您似乎想要:
SELECT mp.OPR,(CASE WHEN mp.Natr = ntr.Natr THEN mp.Natr END) as Natr
FROM dbo.gbmp mp JOIN
dbo.gbnatr ntr
ON mp.OPR = ntr.OPR
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。