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;