我有以下查詢作爲存儲過程的一部分。它返回關於一個國家的一些指標以及我們在每個國家/地區有多少個位置。這個查詢工作正常。根據子查詢結果篩選器查詢
但是,這會返回所有國家/地區的數據,包括那些沒有位置的國家/地區。我想修改它,以便它只返回CenterCount> 0的記錄,但CenterCount只是子查詢結果的別名,所以我不能只放WHERE CenterCount > 0
。
我知道我可以通過複製WHERE
或HAVING
子句中的該子查詢來完成此操作,但我不希望在那裏有兩次子查詢。有沒有更好的方法來做到這一點?
SELECT
cn.Code as CountryCode,
cn.CountryName,
(
SELECT COUNT(DISTINCT(CenterID))
FROM Center.Center center
JOIN Organization.OrganizationAddress orgAddr
ON center.OrganizationID = orgAddr.OrganizationID
JOIN Common.Address ca
ON orgAddr.AddressID = ca.AddressID
AND ca.AddressTypeID = 1 --Physical
WHERE ca.CountryID = cn.CountryID
AND center.ActiveInd = 1
AND ((center.CenterStatusTypeID = 1) OR (center.CenterStatusTypeID = 2 AND center.OpenUTCDate <= DATEADD(DAY, 14, GETUTCDATE())))
AND ca.ActiveInd = 1
) as CenterCount,
(
SELECT COUNT(DISTINCT(SatelliteID))
FROM Center.Satellite sat
JOIN Common.Address ca
ON sat.AddressID = ca.AddressID
WHERE ca.CountryID = cn.CountryID
AND sat.ActiveInd = 1
AND sat.StatusTypeID = 2 --Approved
AND sat.PayerTypeID = 2 --Retail
AND sat.WebsitePresenceFlag = 1
AND sat.OpenUTCDate <= DATEADD(DAY, 14, GETUTCDATE())
) as SatelliteCount
FROM Core.Country cn
WHERE (@Country IS NULL OR cn.CountryID = @CountryID)
ORDER BY 1
創建一個'變量'並存儲'CenterCount'的結果並使用該變量! –
將子查詢移動到主查詢的一部分。這樣你就可以使用SQL的全部功能,而不會重複整個事情。 – Odi