2012-05-17 2 views
0

У меня есть таблица следующимOracle конкретный выбор

OWNERID 
PET_QUANTITY 
PET_TYPE 

PET_TYPE либо DOG, CAT, или BIRD

Существует одна запись на владельца/домашнее животное, так что если есть собака и птица там будет две записи и pet_quantity будут равны 2 в обеих записях.

Я хочу, чтобы все owner_ID, где у человека есть два домашних животных, а домашние животные - собака и кошка.

+1

Я надеюсь, что этот тупой школьный вопрос (или аналогичный), потому что в противном случае модель данных действительно отстой. – APC

ответ

5

Во-первых, модель данных является довольно неудачной, поскольку значение для 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 также для "* модель данных довольно неудачная *" –

Смежные вопросы