【问题标题】:SQL Joins giving wrong countSQL 连接给出错误的计数
【发布时间】:2014-05-04 12:29:30
【问题描述】:

我在下面有一个用非 ansi 编写的查询,我正在转换为 ansi 以便从 SQL 2008 迁移到 2012。问题是以下查询的计数不匹配。

 Select  count(*) 
 FROM t1 ,t2 ,t3,t4,t5
 WHERE t3.RequestId = t1.GenRequestId
 AND t1.RequestType = 'xxx'
 AND t4.RequestId =* t3.RequestId
 AND t4.ItemTypeId =* t2.ItemTypeId 
 AND t1.managerid *= t5.managerid 

 Select  count(*)
 FROM t1
 LEFT JOIN t5 ON t1.managerid = t5.managerid,
 t4
 RIGHT JOIN t3 ON t4.RequestId = t3.RequestId
 RIGHT JOIN t2 ON t4.ItemTypeId = t2.ItemTypeId
 WHERE t3.RequestId = t1.GenRequestId
 AND t1.RequestType = 'xxx' 

在使用连接时我想要相同的计数。感谢您的帮助..!!

【问题讨论】:

  • LEFT/RIGHT JOIN 和 INNER JOIN (t1,t2..) 不一样。
  • 如果涉及外连接,则连接操作的顺序是相关的。您无法更改它们并期望得到相同的结果:首先是 t1 和 t3 的内连接,然后是 t4 和 t3 的右连接,接下来是 t4 和 t2 的右连接,最后是 t1 和 t5 的左连接。
  • 添加到 Ejay 的评论 - 我也没有在您的第二个查询中看到加入 t4

标签: sql sql-server sql-server-2008 join


【解决方案1】:

要解决这个问题,请重写原始内容,使所有内容都是左外连接:

Select  count(*) 
 FROM t1 ,t2 ,t3,t4,t5
 WHERE t3.RequestId = t1.GenRequestId
 AND t1.RequestType = 'xxx'
 AND t3.RequestId *= t4.RequestId
 AND t2.ItemTypeId *= t4.ItemTypeId 
 AND t1.managerid *= t5.managerid ;

然后使用此建议的顺序进行最终查询(左侧的表格需要出现在右侧的表格之前):

 SELECT  count(*)
 FROM t1 INNER JOIN
      t3
      ON t3.RequestId = t1.GenRequestId LEFT OUTER JOIN
      t4
      ON t3.RequestId = t4.RequestId LEFT OUTER JOIN
      t2
      ON t2.ItemTypeId = t4.ItemTypeId LEFT OUTER JOIN
      t5
      ON t1.managerid = t5.managerId;
 WHERE t1.RequestType = 'xxx';

不过,老实说,我发现旧式连接语法很难使用。而且,我发现混合使用left outer joinright outer join 真的很困难。我倾向于回到数据并从头开始重写查询。

【讨论】:

  • +1 - 一般来说,我发现OUTER JOINs 到OUTER JOINs 是不必要的/误导性的;通常这些行确实确​​实 存在,或者是必需的,或者可以连接到原始表,或类似的。例如,给定名称ItemTypeId,任何被引用为t2 的内容都可能是事实/类型表。我也会回到数据并重新编写。
  • @user2625377 。 . .在这种情况下,我的建议是从select count(*) from t1 开始,一次添加一个条件,使用两种格式,看看问题出在哪里以及如何解决它。
  • 亲爱的 Gordon Linoff...第一种格式给了我正确的计数,但第二种格式给了我更少的计数..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 2018-08-03
  • 1970-01-01
相关资源
最近更新 更多