SQL - LEFT OUTER JOIN和WHERE子句

时间:2009-08-15 14:01:19

标签: sql join

我在SQL上很糟糕。我不知道我想做什么是可能的。但是,由于我们的数据结构,我需要以这种方式解决这个问题,或者进行大规模的架构改变。

我正在计算一个国家的'省'(a.k.a州)的数量。但是,只有少数省份需要被忽视。因此,我试图检索一个国家列表,其中包括每个国家的省份数量。

作为一个例子,我需要查询美国,而忽略'华盛顿D.C.'从伯爵。原因是因为根据我们的要求,华盛顿特区不是一个州。这是我现在正在尝试的东西(它不起作用):

SELECT
  c.Name AS 'CountryName',
  ISNULL(COUNT(p.[ID]), 0) as 'ProvinceCount'
FROM 
  Country c LEFT OUTER JOIN [Province] p ON p.[CountryID]=c.[ID]
WHERE
  c.[ID]=@idParameter and
  p.[Name] <> 'Washington D.C.'

可以想象,当idParameter与美国匹配时,此查询不会返回任何结果。

如何在异常情况下获得正确的计数?非常感谢你的帮助。

4 个答案:

答案 0 :(得分:9)

您需要GROUP BY子句才能获得正确的计数,并且您需要外部联接才能为没有有效省份的国家/地区显示“0”值。

select
  c.Name as 'CountryName',
  isnull(count(c.Name), 0) as 'ProvinceCount'
from
  Country c
left outer join
  Province p on
  p.CountryID = c.[ID]
where
  c.[ID] = @idParameter
  and p.[Name] not in ('Washington D.C', 'Another State')
group by 
  c.Name

答案 1 :(得分:3)

你不想列出文字,输入错误会导致很难看到错误。您还希望最终成功,以便用户可以拥有一个页面来自行维护。所以:

ALTER TABLE Province
ADD IsState bit
GO

UPDATE Province
set IsState = 1
where Name not in ('Washington D.C', 'Another State')
GO

UPDATE Province
SET IsState = 0
WHERE IsState IS NULL
GO

-- double check the data at this point by browsing it...

SELECT  c.name AS 'country name',
isnull(count(1), 0) AS 'provice count'
FROM  Country c
INNER JOIN Province p 
ON  p.CountryID = c.[ID]
WHERE c.[ID] = @idParameter
AND p.IsState = 1
GROUP BY c.name
ORDER BY 1  
GO

答案 2 :(得分:0)

你可以尝试一下吗?

SELECT
  c.Name AS 'CountryName',
  ISNULL(COUNT(*), 0) as 'ProvinceCount'
FROM 
  Country c LEFT OUTER JOIN Province p ON p.CountryID=c.ID and p.Name <> 'Washington D.C.'
WHERE
  c.ID=@idParameter 
GROUP BY c.Name

答案 3 :(得分:-2)

select
  c.name as 'country name'
  isnull(count(p.[ID]), 0) as 'provice count'
from
  Country c
inner join
  Province p on
  p.CountryID = c.[ID]
where
  c.[ID] = @idParameter
  and
  p.[Name] not in ('Washington D.C', 'Another State')

也许?未经测试。

- 编辑

忽视这一点;正如上面的海报所示,它需要一个“分组”来工作。