cross join和cross apply

select * from dbo.test_dept

select * from dbo.test_user 

--正常 LEFT OUTER JOIN 检索.
SELECT
test_dept.dept_name,
test_user.user_name
FROM
test_dept
LEFT JOIN test_user
    ON (test_dept.dept_id = test_user.dept_id)
    
--使用 cross join 无关联条件的 排列组合
SELECT
test_dept.dept_name,
test_user.user_name
FROM
test_dept
    cross join test_user;


-- 用于测试的表值函数,参数为 部门编号
-- 返回部门下的 人员信息.
-- 这里检索条件中,不包含 dept_id 字段
-- 也就说, 传入一个部门ID,就拿到所属的 员工.
CREATE FUNCTION dbo.getUserInfo(@dept_id INT)
RETURNS TABLE
AS
RETURN
SELECT
    user_id,
    user_name
FROM
    test_user
WHERE
    dept_id = @dept_id;    
    drop function getUserInfo
     SELECT * from dbo.getUserInfo(1)


--cross join是笛卡尔乘积
SELECT
test_dept.dept_name,
test_user.user_name
FROM
test_dept
    cross join getUserInfo(1) test_user;

--cross apply 是每一个部门,与这个部门下的所有员工,做排列组合(笛卡尔乘积).
--类似于inner join…… on ……
SELECT
test_dept.dept_name,
test_user.user_name
FROM
test_dept
    cross apply  getUserInfo( test_dept.dept_id ) test_user;
    
SELECT
test_dept.dept_name,
test_user.user_name
FROM
test_dept inner join test_user on test_dept.dept_id =test_user .dept_id;

--outer apply 是每一个部门,与这个部门下的所有员工,做排列组合(笛卡尔乘积).
--类似于left join…… on ……
SELECT
test_dept.dept_name,
test_user.user_name
FROM
test_dept
    outer apply  getUserInfo( test_dept.dept_id ) test_user;
    
SELECT
test_dept.dept_name,
test_user.user_name
FROM
test_dept left join test_user on test_dept.dept_id =test_user .dept_id;




      
    
 



 

posted @ 2014-01-03 10:00  ps十一郎  阅读(753)  评论(0编辑  收藏  举报