Sql 使用聚集索引的内部联接约束(需要空值)

Sql 使用聚集索引的内部联接约束(需要空值),sql,sql-server,clustered-index,Sql,Sql Server,Clustered Index,我创建了一个集群索引视图,它将查询时间减少了4倍。主要的问题是,在这样做时,我无法使用完整的外部联接,结果丢失了数据集20%的记录(空值对于后验变换很重要) 有没有办法在使用内部联接时保持空值 我尝试了几件事,但都没有成功: 这是我的索引定义: 创建唯一的聚集索引UIX\u STG\u Movements\u Prec\u DO\n 关于STG_运动(GBMPNOPR、GBMPNORN、GBMPNSEQN、GBMPNDOC、GBMPVLR) 有解决办法吗 Inputs: Table

我创建了一个集群索引视图,它将查询时间减少了4倍。主要的问题是,在这样做时,我无法使用完整的外部联接,结果丢失了数据集20%的记录(空值对于后验变换很重要)

有没有办法在使用内部联接时保持空值

我尝试了几件事,但都没有成功:

  • 这是我的索引定义:

    创建唯一的聚集索引UIX\u STG\u Movements\u Prec\u DO\n
    关于STG_运动(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
    

    我迷路了。数据中的
    NULL
    s是由
    完全联接产生的还是由
    产生的?样本数据和期望的结果会有所帮助。使用
    左连接到
    dbo.gbnatr
    ,不要在
    上的
    中使用
    ISNULL
    ISNULL
    ?示例数据和预期结果将帮助我们帮助您。@GordonLinoff我在原始查询中使用的左连接产生的NULL。我在这里发布的查询用于视图创建only@Larnu这是一个群集视图。我是个新手,但就我所知,我不能在Schemabinding集群视图中使用左连接,对吗?这就是为什么我要求提供示例数据和预期结果,@mburns。不知道你到底是什么之后,我们不得不猜测。谢谢你的回答,但我没有得到想要的答案output@mburns . . 这看起来像是一个简单的
    case
    逻辑,带有一个
    join
    。这也不行。我想我解释错了,但谢谢你的见解
    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