开发者

SQL statement not returning all fields

I have the following SQL statement:

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

What I Would like to statement to do is return all the different results (weither they have a count in the Field DB or not). Currently the Query only returns the values that have a count.

ie in the reuslts DB I have

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

only x and z have field that require this result in the field DB so I only get back

Result x, z
count 1, 2

what I want is

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


That's because your where clause is filtering out results with no fields.
The where clause is applied after the join is made; criteria in the ON clause is applied before the JOIN is made.

The [conceptual] process for executing a SQL select query is:

  • Compute the cartesian product of all tables in the from clause.
  • Apply the join criteria
  • Apply the where criteria, if such exists.
  • Partition the results set into groups, based on the criteria in the group by clause, if it exists.
  • Compute the values of any summary (aggregate) functions specified, collapsing each group to a single row, whose columns consist solely of aggregate functions, constant values or grouping columns.
  • Apply the criteria specified by the having clause, if such exists.
  • Order the results according to the order by clause, if such exists.
  • Compute the values of the aggregate functions specified in the compute/compute by clauses, if such exists.

So...you need to do this to get what you want:

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

The above will give you one row for every result, with a count of matching fields in the specified region (what I believe is what you're asking for). The count will be zero for any result with no matching fields in the specified region.


How do we filter results based on the @RegionID parameter, if there are no fields? - it's the WHERE clause that's affecting your result set, since it's asserting a condition about the Fields table. I'm guessing:

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜