【发布时间】:2013-12-16 14:12:13
【问题描述】:
http://sqlfiddle.com/#!3/78273/1
create table emptb1
(
id int,
name varchar(20),
dept int
)
insert into emptb1 values (1,'vish',10);
insert into emptb1 values (2,'vish',10);
insert into emptb1 values (3,'vish',30);
insert into emptb1 values (4,'vish',20);
create table depttb1
(
id int,
name varchar(20)
)
insert into depttb1 values(10,'IT')
insert into depttb1 values(20,'AC')
insert into depttb1 values(30,'LIC')
select * from emptb1
select e.id, e.name, a.id
from emptb1 e
cross apply
(
select top 1 * from depttb1 d
where d.id = e.dept
order by d.id desc
) a
我正在尝试学习交叉应用,因为它类似于内部连接,但适用于函数。
在上面的查询中,我假设它应该只需要 dept=30,因为 order d.id desc 只会给出前 1st id,即 30,然后它应该返回 dept id = 30 的员工,但它给了我所有的行和所有部门。
查询出了什么问题,或者我对交叉应用概念的解释有误。
【问题讨论】:
-
您查询的实际上是“对于每个员工,找到他们工作的所有部门,然后选择该员工工作的部门 ID 最高的部门” - 现在,显然,使用您的架构,每个员工只为一个部门工作,但仍然会为每个员工返回一行。
-
@Damien_The_Unbeliever 好的,如果员工为 40 和 50 等两个不同的部门工作,它只会给我 50。但我尝试插入一个具有 40 和 50 的部门的员工,但它仍然给了我两个部门.
-
那是因为在当前架构中对在两个部门中拥有员工进行建模的唯一方法是在
emptbl中有两行(可能)具有相同的id和name?如果是这样,请再次查看您的查询 - 它在cross apply期间没有说明这些列 - 所以首先它对deptid为 40 的行执行此操作,depttbl中唯一匹配的行是带有 @ 的行987654329@ 40。所以这是emptbl中第一行的前 1 个匹配行。然后,我们对deptid为50的那一行做同样的处理。这一次,我们匹配id为50的那一行,又是前1...
标签: sql sql-server sql-server-2008 cross-apply