sql join -vs- where子句不会产生相同的结果?

时间:2010-12-09 15:50:59

标签: sql-server-2005

对于为什么这两个SQL结构不会产生相同的结果,我感到有些困惑。

当缺陷表中只存在一个时,SQL#1返回2个相同的记录(dup)...参见下一个sql

SELECT  * 
FROM Defects d
    JOIN StatusCode C ON C.CodeName = d.Status AND c.scid = 10
WHERE d.AssignedTo='me' 

SQL#2重新运行1条记录 - 这是正确的,因为查看原始数据有一个缺陷未关闭“我”

SELECT  * 
FROM Defects d
WHERE d.AssignedTo='me' AND Status <> 'closed'

所有我正在做的不是使用否定状态而不是某种东西,使用积极的连接方式来记录除了已关闭的每个值缺陷状态

为什么会发生这种情况,如何通过联接来改变我的选择以核心其结果。我尝试使用DISTINCT,但它失败了:

  

无法选择ntext数据类型   作为DISTINCT,因为它不是   可比性。

没有“关闭”的状态代码,而不是单一的状态代码:

select * from StatusCode where scid = 10

产生以下值: 固定 新 准备重新测试 重新测试失败 质量跟进 重开 被拒绝 消费者 在编码中 打开 固定 新 准备重新测试 重新测试失败 质量跟进 重开 被拒绝 消费者 在编码中 打开

3 个答案:

答案 0 :(得分:1)

这返回了多少行?

SELECT * FROM StatusCode C WHERE c.scid = 10

您可能希望这样做:

SELECT  * 
FROM Defects d
WHERE d.AssignedTo='me' AND d.Status IN (
    SELECT C.CodeName FROM StatusCode C WHERE C.scid = 10
)

编辑以解决您的编辑问题:,因为您有多个状态scid=10,每个状态都将加入您的行,这就是您获得重复项的原因。我的代码建议仍然有效。

答案 1 :(得分:1)

内连接将返回所有匹配的行组合,因此StatusCode表中必须有两个行与您的缺陷的“Status”值匹配(和有scid = 10)。

已修复
新的准备重新测试
重新测试失败
质量跟进重新打开已拒绝的消费者
在编码中打开
固定
新的准备重新测试
重新测试失败
质量跟进重新打开已拒绝的消费者
在编码中/>打开

不确定我是否完全正确地解析了您的列表,但似乎确实存在重复。那么,答案是消除StatusCode表中的重复项,或者如果重复项有效,则应用额外的过滤器来区分它们。

答案 2 :(得分:-2)

我认为问题出在这里:

JOIN StatusCode C ON C.CodeName = d.Status AND c.scid = 10

c.scid = 10应该在where子句中。