【问题标题】:SQL Server count() returns different results when using joinsSQL Server count() 在使用连接时返回不同的结果
【发布时间】:2015-03-25 04:39:48
【问题描述】:

我是 SQL Server 的新手,我不是在寻找解决方案(但它可能对其他人有所帮助),相反,我想了解行为/为什么我从下面的两个伪查询中得到两个不同的结果。

我加入另外两个表的原因是因为我需要根据“车库”中的“日期记录”来计算车辆中的所有项目。所有记录自 2010 年以来。所以在我这样做之前,我想确保我从表“汽车”中获得相同的总数,并且在加入“车库”条件之前的连接结果也相同,那是我注意到结果的差异的时候。

我原以为连接会被忽略?

希望有人可以提供建议?提前致谢!

SELECT count(Car.CAR_ID) AS Car_ID
FROM Vehicle Car
INNER JOIN Road Rd
ON Car.CAR_ID = Rd.CAR_ID
JOIN Garage g
ON Rd.GARAGE_ID = g.GARAGE_ID
----------------------------------------------
Car_ID
----------------------------------------------
226923


SELECT count(Car.CAR_ID) AS Car_ID
FROM Vehicle Car
----------------------------------------------
Car_ID
----------------------------------------------
203417

【问题讨论】:

  • 仅供参考 - 我认为这与您的问题无关,但在您的查询中,INNER JOIN 和 JOIN 在 SQL Server 中做同样的事情。
  • 查看Rd.CAR_IDg.GARAGE_ID 列是否是其表中的主键。如果没有,每辆车可能有几条道路或每辆车有几个车库
  • @rholt - 感谢您的信息 ;)
  • @Aツ 谢谢 - 是的,它们都是主键!
  • 嗯? Road.C​​ar_ID 是主键吗?

标签: sql sql-server


【解决方案1】:

INNER JOIN:当两个表中至少有一个匹配时,返回所有行。

LEFT JOIN:从左表返回所有行,从右表返回匹配的行。

RIGHT JOIN:从右表返回所有行,从左表返回匹配的行。

FULL JOIN:当其中一个表匹配时返回所有行。

您正在使用内部联接,这就是您从实际 count() 结果中得到错误结果的原因。 如果您想从左表中获取所有记录,则必须在此查询中使用left join,然后您将获得与主表[left table] 相同的count() 的结果。

【讨论】:

  • 谢谢! - 如果我删除 INNER 并离开 JOIN 也会发生这种情况
  • 谢谢大家,我会回去看看我的加入!
【解决方案2】:

你要么有

  • Road 表中有多个具有相同 Car_ID 或的记录
  • Road 表中有多个具有相同 Garage_ID 或的记录
  • 以上两者

您也许可以运行以下命令来获得您想要的东西(假设道路和车库表中始终存在匹配项):

 SELECT count(Distinct Car.CAR_ID) AS Car_ID
 FROM Vehicle Car
 INNER JOIN Road Rd
 ON Car.CAR_ID = Rd.CAR_ID
 JOIN Garage g
 ON Rd.GARAGE_ID = g.GARAGE_ID

【讨论】:

  • 你有 203417?
猜你喜欢
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多