2016-10-20 3 views
0

У меня есть две таблицы: SQLВыбор свойства из списка Property_Features

PROPERTY 
PID Address 
1 123 Center Road 
2 23 North Road 
3 3a/34 Crest Avenue 
5 49 Large Road 
6 2 Kingston Way 
7 4/232 Center Road 
8 2/19 Ash Grove 
9 54 Vintage Street 
10 15 Charming Street 

PROPERTY_FEATURE 
P.PID Feature  
1  Wine Cellar 
1  Helipad 
2  Tennis Court 
2  Showroom 
7  Swimming Pool - Above Ground 
9  Swimming Pool - Below Ground 
9  Wine Cellar 

Я хочу, чтобы выбрать свойства, которые содержит специфические особенности. Например, я хотел бы выбрать идентификатор свойства, который имеет функции Wine Cellar и Helipad, он вернет Имущество с идентификатором 1.

Любые идеи?

+0

Вы приложили все усилия, чтобы сделать это самостоятельно? Мы не работаем над выполнением домашних заданий или написанием кода. –

ответ

2

Вы можете сделать это с помощью Group By и Having пункт

select PID 
From PROPERTY_FEATURE 
Group by PID 
Having COUNT(case when Feature = 'Wine Cellar' then 1 end) > 0 --1 
    and COUNT(case when Feature = 'Helipad' then 1 end) > 0 -- 2 

1) Counts только тогда, когда Feature = 'Wine Cellar' & > 0 удостоверится по крайней мере один 'Wine Cellar' существует для каждого PID

2) Counts только тогда, когда Feature = 'Helipad' & > 0 убедитесь, что по крайней мере один 'Helipad' существует для каждого PID

AND удостоверится как 1 & 2 выполнено, то вернуть PID

0

Вы можете сделать это путем фильтрации на необходимые функции, а затем группировка и подсчет в HAVING предложении. Вы также можете группировать напрямую (без фильтрации сначала), но если таблица очень большая, с большим количеством pid, это приведет к большому количеству ненужной группировки строк, которые не будут использоваться в конце.

Что-то вроде этого:

select pid 
from property_feature 
where feature in ('Wine Cellar', 'Helipad') 
group by pid 
having count(feature) = 2; 

Это предполагает, нет дубликатов в таблице (так что вы не можете иметь 1 'Helipad' дважды, портя счетчик). Если там может быть дублирующим, измените последнюю строку на count (distinct feature) = 2.

+0

Но недостатком является то, что решение становится менее гибким, когда вы перемещаете фильтр в предложение 'Where'. Хотя для текущего вопроса ваш ответ прекрасен –

+0

@prdp - Я не вижу его. Если есть больше возможностей, они переходят в список IN, а не в предложение HAVING. Правильно? – mathguy

+0

Считайте, что вы хотите найти 'PID', который имеет только' 'Wine Cellar'''' 'Helipad'', тогда вам нужно удалить это предложение where и обработать его в After .. –

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