如何编写以下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"
)
)
这是我试过的方式。有没有更好的方法?
您可以通过几种方式做到这一点。一种方法是使用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');
使用以下查询
Select Fname, Lname, Address from Owner
Where Ono IN (Select Ono from PROPERTY_FOR_RENT where Type = 'houses' AND Type != 'flat')
这不起作用。原因:用户也可能有一个单一的,因为操作指出是问题。即使使用'AND Type!='flat',更新也不起作用 – xQbert 2014-11-05 13:13:02
他只有两种类型的房屋和单位,他只希望仅注册房屋的用户。如果我的查询有问题,请提出一些其他查询,谢谢。 – 2014-11-05 13:22:08
@戈登提供了我认为无法改进的答案。然而,我将有一个使用外部连接,并在这里有一个SQL小提琴示例。我会建议遵循我提供的SQL小提琴链接并尝试使用上面的SQL。你会明白为什么它不起作用。我没有降低你的答案,只是试图教育。 – xQbert 2014-11-05 16:12:16
步骤一:加入表一起。
提示:这两个表共用什么列?
这不属于答案。 – 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
请编辑您的问题,并显示您所作的任何试图回答这个问题。 – 2014-11-05 13:07:20
应该可能是一个简单的INNER,左加入一个拥有,一组和一个计数。看看http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/寻求帮助。根据SETS考虑数据。您需要首先获得一组数据列表,其中列出了除了注册房屋以外的其他房屋,然后列出了已注册房屋的业主名单。从第二组拿下,第一组拿下。 – xQbert 2014-11-05 13:09:07