2013-01-24 112 views
0

我有兩個表:產品表和地域表。產品表中持有哪些國家,他們可以在出售的產品和地域代碼表示的ID:Oracle WITH子句和按結果分組

PRODUCT: 

PRODUCT_ID | TERRITORY_CODE 
---------------------------- 
    PROD1 |  2 
    PROD2 |  0 
    PROD3 |  1 
    PROD4 |  0 
    PROD5 |  2 
    PROD6 |  0 
    PROD7 |  2 

第二個表表保存一個地域代碼和它允許出售國家相應的ISO代碼對於例如:

TERRITORY: 

TERRITORY_CODE | COUNTRY_CODE 
--------------------------- 
     0  |  US 
     1  |  CA 
     2  |  US 
     2  |  CA 

我想編寫計數使用COUNTRY_CODE爲關鍵字的PRODUCT_IDs數量的查詢。

例如,我想知道在美國有多少種不同的產品可供銷售。我不想知道02是包含美國的地區代碼,我只想通過COUNTRY_CODE查找。我怎樣才能做到這一點?

在一些初步的研究,我發現一個WITH條款可能是有用的,並與下面的查詢上來:

WITH country AS (
    SELECT (DISTINCT COUNTRY_CODE) 
    FROM TERRITORY 
) 
SELECT COUNT(DISTINCT PRODUCT_ID) 
FROM country c, 
PRODUCT p 
WHERE p.TERRITORY_CODE=c.TERRITORY_ID; 

然而,這並沒有產生預期的結果。我也無法通過COUNTRY_CODE獲得它。我究竟做錯了什麼?

+0

它看起來像你的例子中的SQL可能不完整。 「TERRITORY_ID」似乎不在「國家/地區」。 – woemler

+0

您是否只有'product_id'的唯一實例,還是隻有每個''territory_code''唯一?答案會有所不同。 –

+0

產品ID是唯一的。對於許多產品ID,「territory_code」可以相同。在領土方面,一個territory_code有許多country_codes,而country_code可能屬於許多territory_codes。 – michaelmichael

回答

4

看起來你需要使用GROUP BY。試試這樣的:

SELECT T.Country_Code, COUNT(DISTINCT PRODUCT_ID) 
FROM Product P 
JOIN Territory T ON P.Territory_Code = T.Territory_Code 
GROUP BY T.Country_Code 

SQL Fiddle

祝你好運。