我正在尝试从以下代码中检索学生数据。但实际产量与预期产量不同。我按照以下要求编写了连接条件。
要求:
我的代码是
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
答案 0 :(得分:0)
回答是因为我无法添加评论,但Sean Lange用左连接钉了它。您为每条记录获取重复条目的原因是因为一个时间戳的值为空,而另一个则没有。你可以使用
内部联接,它将排除null结果。风险在于,如果时间戳应该为空并且您想要显示记录,那么它们将被排除。
左连接,其中timestamp不为null。这只会加入时间戳不为空的条目,但是如果没有这样的条目,它将返回一个空行。
无论哪种方式,我都会检查您的数据结构。如果这是一次性查询你应该没问题,但是如果定期使用它,那么看起来你可能会得到一对多的关系,这可能会导致更多的重复行。