问题描述
我已经创建了一个聚集索引视图,它将查询时间减少了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