如何编写以下SQL查询?

如何编写以下SQL查询?

问题描述:

PROPERTY_FOR_RENT (Pno, Street, Area, City, Pcode, Type, Rooms, Rent, Ono, Sno, Bno) 
OWNER (Ono, Fname, Lname, Address, Tel_No) 

查找只有在出租代理处注册的房屋的业主的名称和地址。如何编写以下SQL查询?

有两种类型的属性(房屋,单位)。 “唯一”我对此没有任何理想

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

请编辑您的问题,并显示您所作的任何试图回答这个问题。 – 2014-11-05 13:07:20

+0

应该可能是一个简单的INNER,左加入一个拥有,一组和一个计数。看看http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/寻求帮助。根据SETS考虑数据。您需要首先获得一组数据列表,其中列出了除了注册房屋以外的其他房屋,然后列出了已注册房屋的业主名单。从第二组拿下,第一组拿下。 – xQbert 2014-11-05 13:09:07

您可以通过几种方式做到这一点。一种方法是使用group byhaving。另一种方法是使用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'); 

使用以下查询

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 2014-11-05 13:13:02

+0

他只有两种类型的房屋和单位,他只希望仅注册房屋的用户。如果我的查询有问题,请提出一些其他查询,谢谢。 – 2014-11-05 13:22:08

+0

@戈登提供了我认为无法改进的答案。然而,我将有一个使用外部连接,并在这里有一个SQL小提琴示例。我会建议遵循我提供的SQL小提琴链接并尝试使用上面的SQL。你会明白为什么它不起作用。我没有降低你的答案,只是试图教育。 – xQbert 2014-11-05 16:12:16

步骤一:加入表一起。
提示:这两个表共用什么列?

+0

这不属于答案。 – 2014-11-05 13:52:02

我相信戈登的解决方案是最优雅的:但自从我在评论中提到它时:这里有一种方法可以在连接中进行并且具有。

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: