Oracle具体选择

时间:2012-05-17 15:14:42

标签: sql oracle

我有一张表如下

OWNERID 
PET_QUANTITY 
PET_TYPE

PET_TYPE是DOG,CAT或BIRD

每位所有者/宠物有一条记录,所以如果有一只狗和鸟,则会有两条记录,而pet_quantity在两条记录中都是2条。

我想要所有owner_IDs,这个人有两只宠物,宠物是一只狗和一只猫。

1 个答案:

答案 0 :(得分: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