为什么我无法获得预期的输出?

时间:2015-11-25 17:20:03

标签: sql sql-server tsql

我正在尝试从以下代码中检索学生数据。但实际产量与预期产量不同。我按照以下要求编写了连接条件。

要求:

  • 主要代码 - 在STU_ID,AWD_DEG_CD,DEG_AWD_TERM_CD和DEG_SEQ_NUM
  • 上将SR0DAT加入SR0PST
  • 研究生进度数据收集 - 加入研究生进度数据实用程序
  • 专业化代码 - 在STU_ID,AWD_DEG_CD,DEG_AWD_TERM_CD和DEG_SEQ_NUM上将SR0DAT加入SR0SZT,其中SR0SZT.COLL_CD<> ''并在STU_ID,COLL_CD,MAJOR_CD,DEG_CD和PROG_STRT_TERM上将SR0SZT连接到SR0PST

我的代码是

select *   
from dbo.SR0DAT dt  
left join dbo.SR0PST pt on dt.STU_ID = pt.STU_ID
                        and  dt.AWD_DEG_CD = pt.AWD_DEG_CD
                        and  dt.DEG_AWD_TERM_CD = pt.DEG_AWD_TERM_CD
                        and  dt.DEG_SEQ_NUM = pt.DEG_SEQ_NUM
left join dbo.SR0GPT gt on dt.STU_ID = gt.STU_ID
left join dbo.SR0SZT zt on dt.STU_ID = zt.STU_ID
                        and dt.AWD_DEG_CD = zt.AWD_DEG_CD
                        and dt.DEG_SEQ_NUM = zt.DEG_SEQ_NUM
                        and dt.DEG_AWD_TERM_CD = zt.DEG_AWD_TERM_CD
                        and pt.STU_ID = zt.STU_ID
                        and pt.COLL_CD = zt.COLL_CD
                        and pt.MAJOR_CD = zt.MAJOR_CD
                        and pt.DEG_CD = zt.DEG_CD
                        and pt.PROG_STRT_TERM = zt.PROG_STRT_TERM
where dt.STU_ID = '303001849'
  and zt.COLL_CD ! = ' '

我使用正确的连接语法吗?有人可以帮帮我吗?

谢谢大家的快速回复。请不要提及。实际和预期的o / ps如下所述。

expected:
    303001849   05S AB      1   0780    LS  AB      66F     NULL    NULL    NULL
    303001849   09S MA      1   0249    GD  MA      94F     NULL    NULL    NULL
    303001849   12W PHD     1   0249    GD  PHD     94F 11W 2011-01-10 00:00:00.000 NULL    NULL


Actual:
STU_ID  DEG_AWD_TERM_CD AWD_DEG_CD  DEG_SEQ_NUM MAJOR_CD    COLL_CD DEG_CD  PROG_STRT_TERM  ADV_CAND_TERM_CD    ADV_CAND_DT SPCL_CD SPCL_STRT_TERM
303001849   05S AB      1   0780    LS  AB      66F     NULL    NULL    NULL
303001849   05S AB      1   0780    LS  AB      66F 11W 2011-01-10 00:00:00.000 NULL    NULL
303001849   09S MA      1   0249    GD  MA      94F     NULL    NULL    NULL
303001849   09S MA      1   0249    GD  MA      94F 11W 2011-01-10 00:00:00.000 NULL    NULL
303001849   12W PHD     1   0249    GD  PHD     94F     NULL    NULL    NULL
303001849   12W PHD     1   0249    GD  PHD     94F 11W 2011-01-10 00:00:00.000 NULL    NULL

1 个答案:

答案 0 :(得分:0)

回答是因为我无法添加评论,但Sean Lange用左连接钉了它。您为每条记录获取重复条目的原因是因为一个时间戳的值为空,而另一个则没有。你可以使用

内部联接,它将排除null结果。风险在于,如果时间戳应该为空并且您想要显示记录,那么它们将被排除。

左连接,其中timestamp不为null。这只会加入时间戳不为空的条目,但是如果没有这样的条目,它将返回一个空行。

无论哪种方式,我都会检查您的数据结构。如果这是一次性查询你应该没问题,但是如果定期使用它,那么看起来你可能会得到一对多的关系,这可能会导致更多的重复行。