我正在查詢。我有以下表格:複雜的SQL查詢。任何方法來簡化?
CREATE TABLE #House
(
HouseName Varchar(1),
Address Varchar(255)
)
CREATE TABLE #Events
(
Id Integer,
HouseName Varchar(1),
EventName Varchar(255),
Date Date,
Family Varchar(255)
)
INSERT #House VALUES('A', '1 Market St')
INSERT #House VALUES('B', '2 Market St')
INSERT #House VALUES('X', '3 Market St')
INSERT #House VALUES('D', '4 Market St')
INSERT #Events VALUES(1,'A','MoveIn','2005-01-31','Smith')
INSERT #Events VALUES(2,'A','Remodel','2005-03-31','Smith')
INSERT #Events VALUES(3,'A','Remodel','2008-03-31','Smith')
INSERT #Events VALUES(4,'A','CleanUp','2008-05-31','Smith')
INSERT #Events VALUES(5,'B','MoveIn','2005-01-31','Newton')
INSERT #Events VALUES(6,'B','MoveOut','2008-05-01','Newton')
INSERT #Events VALUES(7,'B','MoveIn','2008-12-01','Einstein')
INSERT #Events VALUES(8,'D','MoveIn','2007-08-31','Soo')
INSERT #Events VALUES(9,'D','MoveOut','2010-08-13','Soo')
我希望得到以下結果:
HouseName Address MostRecentResident MoveInDate
A 1 Market StSmith 2005-01-31
B 2 Market St Einstein 2008-12-01
D 4 Market St Soo 2007-08-31
注:樓B有兩個MoveIn事件。
這是查詢。你認爲有更簡單的方法來獲得相同的結果嗎?
Select
a.HouseName, a.Address, b.Family as [MostRecentResident],
mid.MoveInDate
from
#House a, #Events b,
--MoveInDate of the last family:
(Select HouseName, Max(MoveInDate) MoveInDate
from
(Select HouseName, Family, MIN(Date) MoveInDate
From #Events
Group by HouseName, Family) ff
group by HouseName) mid,
--Distinct house and the last move in date:
(Select HouseName, MAX(Date) LastMoveInDate
From #Events
Group by HouseName) lmid
where
a.HouseName = b.HouseName
and b.HouseName = lmid.HouseName
and b.Date = lmid.LastMoveInDate
and b.HouseName = mid.HouseName
提示:使用別名,幫助,例如'從#House作爲H,#Events作爲E'。而更現代的'JOIN'語法將是一個好主意,例如'從#House作爲H內部連接#Events作爲E在...'。 – HABO
[踢壞的習慣:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) - 在ANSI - ** 92 ** SQL標準(**超過20年前的**)中,舊式*逗號分隔的表*樣式列表被替換爲* proper * ANSI'JOIN'語法並且不鼓勵使用它 –