2009-08-15 100 views
5

我在SQL中很糟糕。我不知道我想做什么是可能的。但是,由于我们的数据结构,我需要通过这种方式解决这个问题,或者进行大规模的架构变更。SQL - 左外连接和WHERE子句

我想要统计一个国家的“省份”(又名a国家)的数量。但是,只有少数几个省份需要被忽略。因此,我试图检索一个国家名单,并列出每个国家的省份数。

作为一个例子,我需要查询美国,而忽略“华盛顿特区”从计数。原因是因为根据我们的要求,华盛顿不是一个州。下面是我的时刻(它不工作)尝试:

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][email protected] and 
    p.[Name] <> 'Washington D.C.' 

正如你可以想像,这查询不返回任何结果当idParameter符合美国的。

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

回答

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 
+0

是的。你是对的。哎呀。 – 2009-08-15 14:19:56

-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') 

也许吧?未经测试。

- 编辑

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

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 
    [email protected] 
GROUP BY c.Name 
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