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;