我有一个与1到n查询相关的问题,我希望有人可以解释一下。
这是我想要完成的事情。
我有几个家,每个家可能有多个住户。我想选择5个家庭和所有相关的住户。我知道有两种做法。其中最常见的是使用IN条件获取5个家庭的select语句,然后使用IN条件获取相关的占用者。另一种方法是使用带有子查询的一个查询来改变两个查询。如果不使用子查询,还有其他方法可以完成吗?
更新
似乎共识是使用子查询无法做到这一点。
答案 0 :(得分:5)
您通常使用JOIN从两个表中获取相关数据
SELECT
*
FROM
(SELECT TOP 5 * FROM Homes ORDER BY something) H
JOIN
Occupants O ON H.HomeID = O.HomeID
但是,TOP 5只需要应用于Homes。它是MySQL的LIMIT,而不是TOP。
编辑:
窗口/排名功能仍然需要子查询或某些间接(如CTE)以允许过滤生成的数字。
SELECT
*
FROM
(SELECT *, ROW_NUMBER() OVER (ORDER BY something) AS RowNum
FROM Homes) H
JOIN
Occupants O ON H.HomeID = O.HomeID
WHERE
RowNum <= 5
;WITH CTE AS
(
SELECT
*, ROW_NUMBER() OVER (ORDER BY something) AS RowNum
FROM
Homes
)
SELECT
*
FROM
CTE H
JOIN
Occupants O ON H.HomeID = O.HomeID
WHERE
RowNum <= 5
答案 1 :(得分:1)
您可以执行类似的操作,具体取决于数据库引擎支持:
select *
from
(
select top 5
home_id,
... -- other columns
from
home
order by
awesomeness desc
) h
inner join occupant o on o.home_id = h.home_id
答案 2 :(得分:0)
使用内部联接。每个家庭将被列出多次,一次为该家庭中的每个居住者。
select Home.HomeName, Occupant.OccupantName from Home
inner join Occupant on Home.Id=Occupant.HomeId
然后你会得到:
Home1 OccupantA
Home1 OccupantB
Home2 OccupantC
Home2 OccupantD
答案 3 :(得分:0)
如果您使用的是SQL Server(2005及更高版本),则可以使用CTE
WITH MyTopFive (MyId, MyOtherField, SomeField) AS
(
SELECT TOP 5 MyId, MyOtherField, SomeField FROM Homes ORDER BY SomeField
)
SELECT *
FROM Mytopfive t5
JOIN Occupants o ON o.myid = t5.myid
gbn拥有最好的通用数据库解决方案。
答案 4 :(得分:-1)
sql server specific
是的,您可以使用联接来执行此操作。你没有显示你的数据库模式,但如果我猜测你可能想要这样的东西:
select *, RANK() OVER (PARTITION BY home.homeid ORDER BY home.homeid DESC) as houserank
from home
join occupant on home.homeid = occupant.homeid
where houserank < 6