2013-01-24 76 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

祝你好运。