Sql 为什么我无法获得预期的输出?
我正在尝试从下面的代码中检索学生数据。但实际产出与预期产出不同。我按照以下要求编写了连接条件 要求:Sql 为什么我无法获得预期的输出?,sql,sql-server,tsql,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
- 主要代码-在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_STU 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/p如下所述
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
回答是因为我无法添加评论,但肖恩·兰格用左连接将其锁定。您为每个记录获取重复条目的原因是,其中一条记录的时间戳值为空,而另一条记录的时间戳值为空。你可以用任何一种 将排除空结果的内部联接。风险在于,如果时间戳应该为空,并且您希望以任何方式显示记录,那么它们将被排除在外 左连接,其中时间戳不为null。这将只连接时间戳不为null的条目,但是如果没有这样的条目,它将返回一个null行
不管怎样,我都会检查您的数据结构。如果这是一个一次性查询,您应该可以,但如果定期使用,那么您可能会得到一对多的关系,这可能会导致更多重复行。回答,因为我无法添加注释,但Sean Lange用左连接将其固定。您为每个记录获取重复条目的原因是,其中一条记录的时间戳值为空,而另一条记录的时间戳值为空。你可以用任何一种 将排除空结果的内部联接。风险在于,如果时间戳应该为空,并且您希望以任何方式显示记录,那么它们将被排除在外 左连接,其中时间戳不为null。这将只连接时间戳不为null的条目,但是如果没有这样的条目,它将返回一个null行
不管怎样,我都会检查您的数据结构。如果这是一个一次性查询,您应该可以,但如果定期使用,那么您可能会得到一对多的关系,这可能会导致更多重复行。我没有看到任何语法或逻辑上不正确的地方。然而,对于表定义或至少是对错误的解释,任何人在这里都无能为力。您需要解释诸如“实际输出与预期输出不同”之类的事情。是不是多排了?少一点,但要考虑的一件事。您有一个left join zt,但是您的where谓词改变了它,这样它就不会返回不匹配的行,因为NULL在join中的工作方式。它既不是=也不是!=如果Sean的评论没有给出您的答案,请尝试发布几行示例数据、该数据的预期输出和该数据的实际输出。(您可以清除或忽略任何敏感信息。)在看不到实际结果与预期结果之间的差异的情况下,我们通常只能找到语法错误。请尝试内部连接而不是左连接谢谢jamie,我试过了,但没有给出准确的答案。我没有发现任何语法或逻辑上的错误。然而,对于表定义或至少是对错误的解释,任何人在这里都无能为力。您需要解释诸如“实际输出与预期输出不同”之类的事情。是不是多排了?少一点,但要考虑的一件事。您有一个left join zt,但是您的where谓词改变了它,这样它就不会返回不匹配的行,因为NULL在join中的工作方式。它既不是=也不是!=如果Sean的评论没有给出您的答案,请尝试发布几行示例数据、该数据的预期输出和该数据的实际输出。(您可以清除或忽略任何敏感信息。)在看不到实际结果与预期结果之间的差异的情况下,我们通常只能找到语法错误。请尝试内部连接而不是左连接谢谢jamie,我尝试过,但没有给出准确的结果