2014-11-05 5 views
-2
PROPERTY_FOR_RENT (Pno, Street, Area, City, Pcode, Type, Rooms, Rent, Ono, Sno, Bno) 
OWNER (Ono, Fname, Lname, Address, Tel_No) 

Найдите имя и адрес владельцев недвижимости, у которых есть только дома, зарегистрированные в агентстве проката.Как написать следующий SQL-запрос?

Есть 2 типа недвижимости (дома, квартира). «Только» у меня нет идеального об этом

SELECT Fname, Lname, Address 
FROM owner 
WHERE Ono 
IN (

    SELECT Ono 
    FROM property_for_rent 
    WHERE TYPE = "house" 
    AND Ono NOT 
    IN (

     SELECT Ono 
     FROM property_for_rent 
     WHERE TYPE <> "house" 
    ) 
) 

Так, я пробовал. Есть ли лучший способ?

+1

Пожалуйста, измените свой вопрос и показать любые попытки вы сделали, чтобы ответить на этот вопрос. –

+0

Должно быть, это простой INNER, LEFT присоединяется к группе, группе и счету. Взгляните на http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ для некоторой помощи с ними. Подумайте о данных в терминах SETS. вам нужно сначала получить набор списков данных, в которых люди, имеющие что-то иное, чем дома, зарегистрировались, а затем список владельцев, у которых есть зарегистрированные дома. возьмите из второго набора, в первом. – xQbert

ответ

1

Вы можете сделать это несколькими способами. Один из способов - использовать group by и having. Другой способ заключается в использовании not exists:

select o.* 
from owner o 
where not exists (select 1 from property_for_rent pfr where o.ono = pfr.ono and type <> 'house'); 
0

использовать следующий запрос

Select Fname, Lname, Address from Owner 
Where Ono IN (Select Ono from PROPERTY_FOR_RENT where Type = 'houses' AND Type != 'flat') 
+0

Это не сработает. Причина: пользователь может также иметь плоскость. ТОЛЬКО, как указал опр, проблема. Даже с 'AND Type! = 'Flat'' обновление не будет работать – xQbert

+0

У него есть только два типа домов и квартир, и он хочет только пользователей, которые зарегистрировались только в домах. пожалуйста, предложите другой запрос, если у моего запроса возникли проблемы, спасибо. –

+0

@ Gordon предоставил ответ, который, как я думаю, не может быть улучшен. Тем не менее, у меня будет одно использование внешних соединений и переход сюда через секунду с примером SQL Fiddle. Я бы порекомендовал, следуя ссылке SQL fiddle, которую я предоставляю, и попытаюсь использовать SQL, который у вас есть выше. Вы увидите, почему это не сработает. Я не спустил вниз, ответ, просто пытаясь воспитывать. – xQbert

-1

Шаг один: Присоединяйтесь таблицы вместе.
Подсказка: Какая колонка является общей для обеих таблиц?

+0

Это не ответ. –

0

Я считаю, что решение Гордона будет самым изящным: но поскольку я упомянул об этом в комментариях: вот способ сделать это в объединениях и наличии.

Select O.Ono, O.Fname, O.Lname, Count(Distinct P1.Type) cp1 , count(Distinct P2.Type) cp2 
FROM Owner O 
INNER JOIN Property_for_Rent P1 
on O.Ono = P1.Ono 
LEFT JOIN Property_for_Rent P2 
on O.Ono = P1.Ono 
and P1.PNo = P2.PNo 
and P2.Type = 'Houses' 
Group by Ono,FName,LName 
having cp1=Cp2 

SQL Fiddle Example:

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