SQL Server 使用APPLY运算符

从SQL Server 2005开始,提供了APPLY运算符

内部联接的方式实现

SELECT D.deptname, E.empid, E.empname, E.salary
FROM dbo.Departments AS D
         INNER JOIN dbo.Employees AS E ON D.deptid = E.deptid;

右表表达式为子查询

SELECT D.deptname, E.empid, E.empname, E.salary
FROM dbo.Departments AS D
         CROSS APPLY (SELECT empid, empname, salary FROM dbo.Employees WHERE deptid = D.deptid) AS E;

右表表达式为表值函数

CREATE FUNCTION dbo.fn_get(@deptid AS int)
    RETURNS TABLE
        AS
        RETURN
        SELECT empid, empname, salary
        FROM Employees
        WHERE deptid = @deptid;

SELECT D.deptname, E.empid, E.empname, E.salary
FROM dbo.Departments AS D
         CROSS APPLY fn_get(D.deptid) AS E;

OUTER APPLY

SELECT D.deptname, E.empid, E.empname, E.salary
FROM dbo.Departments AS D
         OUTER APPLY fn_get(D.deptid) AS E;

附: 建表语句

IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULL
    DROP TABLE dbo.Employees;
IF OBJECT_ID('dbo.Departments', 'U') IS NOT NULL
    DROP TABLE dbo.Departments;

CREATE TABLE dbo.Employees
(
    empid   int         NOT NULL,
    deptid  int         NULL,
    empname varchar(25) NOT NULL,
    salary  money       NOT NULL
        CONSTRAINT PK_Employees PRIMARY KEY (empid)
);
CREATE TABLE dbo.Departments
(
    deptid   int         NOT NULL PRIMARY KEY,
    deptname varchar(25) NOT NULL,
);
GO

INSERT INTO dbo.Employees
VALUES (1, NULL, 'Nancy', $10000.00),
       (2, 1, 'Andrew', $5000.00),
       (3, 1, 'Janet', $5000.00),
       (4, 1, 'Margaret', $5000.00),
       (5, 2, 'Steven', $2500.00),
       (6, 2, 'Michael', $2500.00),
       (7, 3, 'Robert', $2500.00),
       (8, 3, 'Laura', $2500.00),
       (9, 3, 'Ann', $2500.00),
       (10, 4, 'Ina', $2500.00),
       (11, 7, 'David', $2000.00),
       (12, 7, 'Ron', $2000.00),
       (13, 7, 'Dan', $2000.00),
       (14, 11, 'James', $1500.00);
INSERT INTO dbo.Departments
VALUES (1, 'HR'),
       (2, 'Marketing'),
       (3, 'Finance'),
       (4, 'R&D'),
       (5, 'Training'),
       (6, 'Gardening');

文章来源: 锋利的SQL(第2版)7.8使用APPLY运算符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值