Почему этот SQL возвращает неправильный набор результатов? - PullRequest
0 голосов
/ 13 августа 2011

у меня три таблицы; таблица данных о населении, таблица округов и таблица состояний. Когда я запускаю SQL ниже, я получаю неправильный набор результатов. SQL возвращает 55 округов в Висконсине. Я знаю, что в штате 72 человека. Когда я иду к таблице округов и запускаю приведенный ниже однострочный оператор 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 ]

2 голосов
/ 13 августа 2011

Последний запрос объединяет еще две таблицы, и похоже, что некоторые страны (17) не имеют связей в таблицах Population или Data State

Попробуйте

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 голос
/ 13 августа 2011

Возвращает правильные округа с нулевыми значениями в полях из таблиц, которые нельзя объединить.

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
1 голос
/ 13 августа 2011

При таком типе проблемы вам нужно разбить проблему на более мелкие части, чтобы выяснить, где проблема.

Ваш запрос выглядит корректным, поэтому он как-то связан с данными.

Попробуйте использовать левые объединения, как предлагалось по умолчанию, затем превратите их во внутренние объединения одно за другим, и вы увидите, какое ограничение вы добавляете, вызывает проблему.

Я предполагаю, что в PopulationData нет данныхдля всех округов.Если вы хотите, чтобы эти округа по-прежнему отображались в списке, даже если в PopulationData нет данных, поместите сначала «Состояния», выполните внутреннее объединение с округами, затем оставьте объединение с PopulationData.

1 голос
/ 13 августа 2011

Вы уверены, что данные в вашей таблице PopulationData верны? Если у вас неправильное население в отображениях округа, то вы получите плохой результат.

И если первый работает правильно с использованием StateId, почему бы вам не попробовать использовать этот StateId вместо имени в том, который не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...