2012-05-17 172 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也適用於「*數據模型相當不幸*」 –