2012-05-17 123 views
0

我有一个表如下甲骨文具体选择

OWNERID 
PET_QUANTITY 
PET_TYPE 

PET_TYPE或者是狗,猫或鸟

有每个业主一个记录/宠物,所以如果有一只狗和鸟类会有两个记录和pet_quantity在两个记录中都是2。

我想要所有的owner_IDs,其中人有两只宠物,宠物是一只狗和一只猫。

+1

我希望这是一个愚蠢的学校问题(或类似的),否则数据模型真的很糟糕。 – APC

回答

5

首先,数据模型非常不幸,因为特定行的PET_QUANTITY的值取决于其他行中的数据。这违反了基本的规范化规则。反过来,这又会造成一种情况,那就是你不可避免地会失去同步,所以你必须确定PET_QUANTITY规则或表中规则的行数。通过适当规范化的数据模型可以更好地服务您。

假设PET_QUANTITY规则时存在差异,其中一个方案是使用一个INTERSECT

SELECT owner_id 
    FROM your_table 
WHERE pet_quantity = 2 
    AND pet_type = 'CAT' 
INTERSECT 
SELECT owner_id 
    FROM your_table 
WHERE pet_quantity = 2 
    AND pet_type = 'DOG' 

另一个办法是做类似

SELECT owner_id, COUNT(DISTINCT pet_type) 
    FROM your_table 
WHERE pet_quantity = 2 
    AND pet_type IN ('DOG', 'CAT') 
GROUP BY owner_id 
HAVING COUNT(DISTINCT pet_type) = 2 
+0

+1也适用于“*数据模型相当不幸*” –