我刚刚开始学习SQL,并且正在阅读Ken Henderson的一本名为“Transact SQL的大师指南”的书。在书中,它给了我这个表:
CREATE TABLE timeclock
(
Employee varchar(30),
TimeIn smalldatetime,
TimeOut smalldatetime
)
INSERT timeclock VALUES('Pythia','07:31:34','12:04:01')
INSERT timeclock VALUES('Pythia','12:45:10','17:32:49')
INSERT timeclock VALUES('Dionysus','9:31:29','10:46:55')
INSERT timeclock VALUES('Dionysus','10:59:32','11:39:12')
INSERT timeclock VALUES('Dionysus','13:05:16','14:07:41')
INSERT timeclock VALUES('Dionysus','14:11:49','14:57:02')
INSERT timeclock VALUES('Dionysus','15:04:12','15:08:38')
INSERT timeclock VALUES('Dionysus','15:10:31','16:13:58')
INSERT timeclock VALUES('Dionysus','16:18:24','16:58:01')
然后它给出一段代码,用来查询员工离开办公室的时间:
SELECT
t1.Employee, t1.TimeOut AS StartOfLoafing,
t2.TimeIn AS EndOfLoafing,
DATEDIFF(mi,t1.TimeOut,t2.TimeIn) AS LengthOfLoafing
FROM
timeclock t1
JOIN
timeclock t2 ON (t1.Employee = t2.Employee)
WHERE
(t1.TimeOut = (SELECT MAX(t3.TimeOut)
FROM timeclock t3
WHERE (t3.Employee=t1.Employee) AND (t3.TimeOut <= t2.TimeIn)))
我试着阅读了这个查询的解释,但是我仍然不理解第5-7行(嵌套部分真的让我抓狂)。看起来像是在迭代表?有人能给初学者详细解释一下吗?
提前谢谢你。
发布于 2017-01-14 02:50:17
上面的查询使用连接生成员工及其timein/timeout的笛卡尔乘积。它使用where t1.timeout=
子查询来获取小于t2.TimeIn
的最新timeout
(在本例中使用max
)。
该查询也可以这样编写:
select
t1.Employee
, StartOfLoafing = t1.TimeOut
, EndOfLoafing = t2.TimeIn
, LengthOfLoafing = datediff(mi,t1.TimeOut,t2.TimeIn)
from timeclock as t1
cross apply (
select top 1 i.timein
from timeclock i
where i.employee=t1.employee
and i.timein >=t1.timeout
order by i.timein asc) as t2
rextester:http://rextester.com/SES2195
https://stackoverflow.com/questions/41640585
复制相似问题