Оператор SQL не возвращает все поля - PullRequest
1 голос
/ 14 июля 2011

У меня есть следующий оператор SQL:

    SELECT r.Result AS Resuly, 
           COUNT(f.fieldID) AS [Count] 
      FROM dbo.Fields f
RIGHT JOIN dbo.Results r ON f.Results = r.ID
     WHERE f.RegionID = @RegionID
  GROUP BY r.Result

То, что я хотел бы сделать в заявлении, - это вернуть все разные результаты (независимо от того, есть ли у них счет в БД поля или нет). В настоящее время запрос возвращает только те значения, у которых есть число.

т.е. в БД reuslts у меня есть

ID 1, 2 and 3
Result x, y, z

только поля x и z имеют поля, которые требуют этого результата в поле DB, поэтому я получаю только обратно

Result x, z
count 1, 2

что я хочу это

Result x,y,z
Count 1,(null or 0), 2

Ответы [ 2 ]

6 голосов
/ 14 июля 2011

Это потому, что ваше предложение where отфильтровывает результаты без полей.
Предложение where применяется после соединение выполнено;критерии в предложении ON применяются до соединения.

[Концептуальный] процесс выполнения запроса SQL select:

  • Вычисляет декартово произведение всех таблиц в предложении from.
  • Примените критерии объединения
  • Примените критерии where, если таковые существуют.
  • Разделите набор результатов на группы на основе критериев в предложении group by, если оно существует.
  • Вычисляет значения любых указанных сводных (агрегатных) функций, сворачивая каждую группу в одну строку, столбцы которой состоят исключительно из агрегатных функций, константных значений или столбцов группировки.
  • Примените критерии, заданные *Предложение 1027 *, если таковое существует.
  • Упорядочить результаты в соответствии с предложением order by, если таковое существует.
  • Вычислить значения агрегатных функций, указанных в compute / compute by предложений, если таковые существуют.

Итак ... вам нужно сделать это, чтобы получить то, что вы хотите:

select Result      = result.Result ,
       ResultCount = count(field.fieldID)
from      dbo.Results result
left join dbo.Fields field   on field.Results  = result.ID
                            and field.RegionID = @RegionID
group by result.Results

Выше приведено по одной строке для каждогорезультат, с количеством совпадающих фиполя в указанном регионе (я полагаю, что вы просите).Счет будет нулевым для любого результата без соответствующих полей в указанном регионе.

0 голосов
/ 14 июля 2011

Как отфильтровать результаты по параметру @RegionID, если полей нет?- это предложение WHERE влияет на ваш набор результатов, так как оно утверждает условие для таблицы Fields.Я догадываюсь:

SELECT r.Result AS Result, COUNT(f.fieldID) AS [Count] FROM dbo.Fields f
RIGHT OUTER JOIN dbo.Results r ON f.Results = r.ID
WHERE f.RegionID = @RegionID OR f.RegionID is null
GROUP BY r.Result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...