我有三张桌子;人口数据表,县表和州表。当我运行下面的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
答案 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