为什么这个SQL返回不正确的结果集?

时间:2011-08-12 20:27:56

标签: sql sql-server tsql

我有三张桌子;人口数据表,县表和州表。当我运行下面的SQL时,我得到一个不正确的结果集。 SQL返回威斯康星州的55个县。我知道该州有72个。当我进入Counties表并运行下面的单行SELECT语句时,我得到了72个县。

我也得到了同一个县的倍数,但人口细节不同,这对我来说表明了连接语句的问题。我想我尝试了所有连接语句的组合,但一直无法解决问题。使用一个连接组合,我能够返回86个县的结果集。这也是错误的。

谢谢!

- 返回正确的县。 SELECT * FROM counties WHERE stateId = 'D14B7CD0-145F-4B84-9533-0BB3B2F5A5B5'

-- returns incorrect counties.
SELECT this.POPULATION, this.LATITUDE, this.LONGITUDE, this.CountyId, st.NAME AS StateName, cty.Name AS CountyName
FROM PopulationData AS this
INNER JOIN Counties AS cty ON this.CountyId = cty.Id
INNER JOIN States AS st ON cty.StateId = st.Id
WHERE (st.Name = 'wisconsin')
ORDER BY CountyName

4 个答案:

答案 0 :(得分:2)

后一个查询加入另外两个表,所以看起来有些国家(17)在populationData或states表中没有关系

试试

SELECT 
      this.POPULATION, 
      this.LATITUDE, 
      this.LONGITUDE, 
      this.CountyId, 
      st.NAME AS StateName, 
      cty.Name AS CountyName
FROM Counties AS cty
LEFT JOIN  PopulationData AS this ON this.CountyId = cty.Id
LEFT JOIN States AS st ON cty.StateId = st.Id
WHERE (st.Name IS NULL OR st.Name = 'wisconsin')
ORDER BY CountyName

答案 1 :(得分:1)

您确定PopulationData表中的数据是否正确?如果你对县映射的人口不正确,那么你将得到不好的结果。

如果第一个使用stateId正常工作,为什么不尝试在不工作的那个中使用stateId而不是name。

答案 2 :(得分:1)

对于这类问题,您必须将问题分解成更小的部分,以找出问题所在。

您的查询看起来有效,因此它与数据有关。

尝试使用左边连接作为silev建议,然后逐个将它们转换为内部连接,你会看到你添加的限制导致了这个问题。

我的猜测是所有县的PopulationData都没有数据。如果你想仍然看到列出的那些县,即使PopulationData中没有数据首先放入状态,也要使用Counties进行内连接,然后使用PopulationData连接。

答案 3 :(得分:1)

在无法连接的表的字段中返回具有空值的正确县。

SELECT this.POPULATION, this.LATITUDE, this.LONGITUDE, this.CountyId, st.NAME AS StateName, cty.Name AS CountyName
FROM Counties AS cty
LEFT JOIN States AS st ON this.CountyId = cty.Id
LEFT JOIN PopulationData AS this ON cty.StateId = st.Id
WHERE cty.stateId = 'D14B7CD0-145F-4B84-9533-0BB3B2F5A5B5'
ORDER BY CountyName