簡體   English   中英

SQL - LEFT OUTER JOIN和WHERE子句

[英]SQL - LEFT OUTER JOIN and WHERE clause

我在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與美國匹配時,此查詢不會返回任何結果。

在異常情況下如何獲得正確的計數? 非常感謝您的幫助。

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

你不想列出文字,輸入錯誤會導致很難看到錯誤。 您還希望最終成功,以便用戶可以擁有一個頁面來自行維護。 所以:

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

你能嘗試一下嗎?

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

也許? 沒有測試過。

- 編輯

無視這一點; 正如上面的海報所示,它需要一個“分組”來工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM