【问题标题】:SQL - LEFT OUTER JOIN and WHERE clauseSQL - LEFT OUTER JOIN 和 WHERE 子句
【发布时间】:2009-08-15 14:01:19
【问题描述】:

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

我正在尝试计算一个国家/地区的“省”(又名州)的数量。但是,只有少数几个省需要从计数中忽略。因此,我正在尝试检索一个国家列表,其中包含每个国家/地区的省份。

例如,我需要查询美国,并忽略“华盛顿特区”从计数。原因是因为按照我们的要求,华盛顿特区不是一个州。这是我目前正在尝试的(它不起作用):

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 与美国匹配时,此查询不会返回任何结果。

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

【问题讨论】:

    标签: sql join


    【解决方案1】:

    您需要一个 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
    

    【讨论】:

      【解决方案2】:

      您不想列出文本,错字可能会导致难以看到的错误。您还希望最终实现它,以便用户可以拥有一个页面来自己维护它。所以:

      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
      

      【讨论】:

        【解决方案3】:

        你可以试试这个吗?

        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
        

        【讨论】:

          【解决方案4】:
          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')
          

          也许?未测试。

          -- 编辑

          忽略这个;正如上面的海报所建议的那样,它需要一个“分组依据”才能工作。

          【讨论】:

            猜你喜欢
            • 2011-01-30
            • 2010-11-26
            • 1970-01-01
            • 2014-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-26
            相关资源
            最近更新 更多