比方说,我有一个3个表:
汽车
CarColorHistory
颜色 :
我想选择所有小轿车和他们的颜色,但重要的是,这种颜色的车是从最后一次修改的颜色CarColorHistory
表。
我需要用加入做到这一点。
例:
汽车:
1
2
CarColorhistory:
1 1 1 26/03/2012 -> (actual color, can be take by date or id)
2 1 2 25/03/2012
3 2 2 25/03/2012
颜色:
1 Blue
2 Red
我需要的结果:(汽车ID,colorName)
1 Blue
2 Red
我试图通过加入汽车表和CarColorHistory表做,但我得到汽车的所有颜色。 我只需要实际的颜色(最后加入)。
请帮忙
有几种方法,你可以得到结果。 您可以使用子查询,以获得max(modificationdate)
select c.id, r.colorname
from cars c
inner join CarColorhistory h1
on c.id = h1.carid
inner join
(
select max(modificationdate) MaxDate,
carid
from CarColorhistory
group by carid
) h2
on h1.carid = h2.carid
and h1.modificationdate = h2.maxdate
inner join color r
on h1.colorid = r.id
请参阅SQL拨弄演示
或者,因为你使用的是SQL Server,您可以使用排序功能 :
select id, colorname
from
(
select c.id, r.colorname,
row_number() over(partition by c.id order by modificationdate desc) rn
from cars c
inner join CarColorhistory h1
on c.id = h1.carid
inner join color r
on h1.colorid = r.id
) src
where rn = 1;
请参阅SQL拨弄演示
试试这个:
select c.id, colorname
from cars c
inner join CarColorHistory h on c.id = h.CarID
inner join Color c2 on h.colorid = c2.id
where h.ModificationDate = (select max(ModificationDate)
from CarColorHistory x where c.id = x.CarId)
这应该为你做的伎俩:
SELECT c.id, (
SELECT co.ColorName FROM Color co
WHERE co.id = (
SELECT TOP 1 ColorID FROM CarColorHistory
WHERE CarID = c.id
ORDER BY ModificationDate DESC
)
) AS ColorName
要做到这一点可能是只使用子查询,因为你正在使用T-SQL,你也应该能够与应用做到这一点,像之前发布的一种方式:
SELECT
Cars.Id, LatestColors.ColorID, LatestColors.ModificationDate
FROM Cars
CROSS APPLY (
SELECT TOP 1
ColorID, ModificationDate
FROM CarColorHistory
WHERE CarID = Cars.ID
ORDER BY ModificationDate DESC
) AS LatestColors
你可以试试这个,如果你有Sql Server 2005
或更高版本:
您可以尝试在这里,如何Common table expression
工作: 的Sql小提琴演示
;WITH CTE_Cars(CarID, MaxDate)
AS
(
SELECT CarID, MAX(ModificataionDate) AS MaxDate
FROM CarColorHistory
GROUP BY CarID
)
SELECT CTE_Cars.CarID, Color.ColorName
FROM
CTE_Cars
INNER JOIN CarColorHistory ON CarColorHistory.CarID = CTE_Cars.CarID AND
CarColorHistory.ModificataionDate = CTE_Cars.MaxDate
INNER JOIN Color ON Color.id = CarColorHistory.ColorId
我不知道这是否是最好的方式,但是这是我做的方式。 首先得到你想要的值超出使用MAX中的表,然后使用该结果作为表JOIN
,以消除不需要的值。
SELECT c.ID, Color.Color
From Cars c JOIN CarColorHistory h on c.id = h.CarID
JOIN Color on h.ColorID = Color.ID
JOIN
--Create a table with only the latest value and the car ID
(
SELECT c.ID, Max(h.TimeStamp) as time
FROM Cars c JOIN CarColorHistory h on c.id = h.CarID
JOIN Color on h.ColorID = Color.ID
Group by c.ID --Join the table on latest time to get rid of old timestamps
) Max on Max.ID = c.ID and h.TimeStamp=max.time