Published on

September 14, 2004

Использование скалярных подзапросов в SQL Server

Скалярные подзапросы – это мощная функция в SQL Server, которая позволяет извлекать одно значение столбца из одной строки. Они могут использоваться в различных ситуациях, таких как выражения CASE, условия WHERE, порядок сортировки ORDER BY и выражения SELECT. В этой статье мы рассмотрим различные примеры использования скалярных подзапросов в SQL Server.

Скалярный подзапрос в выражении CASE

Давайте начнем с создания таблицы с примерами данных:

USE tempdb;
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[systems]') AND objectproperty(id, N'isusertable') = 1)
    DROP TABLE [systems];
CREATE TABLE systems (id INT, dbtype VARCHAR(100));
INSERT INTO systems VALUES (1, 'sql server');
INSERT INTO systems VALUES (2, 'oracle');
INSERT INTO systems VALUES (3, 'sybase');
INSERT INTO systems VALUES (4, 'db2');
INSERT INTO systems VALUES (5, 'ingress');
INSERT INTO systems VALUES (6, 'gupta sql');

Используя скалярный подзапрос в выражении CASE, мы можем найти значения, которые являются “MS SQL Server”. Вот пример запроса:

SELECT id, dbtype, 
    (CASE WHEN dbtype IN (SELECT dbtype FROM systems WHERE dbtype = 'SQL Server') 
    THEN 'MS SQL Server' 
    ELSE 'Non MS SQL Server' END) AS 'SQL Server?' 
FROM systems;

Вышеприведенный запрос вернет следующие результаты:

iddbtypeSQL Server?
1sql serverMS SQL Server
2oracleNon MS SQL Server
3sybaseNon MS SQL Server
4db2Non MS SQL Server
5ingressNon MS SQL Server
6gupta sqlNon MS SQL Server

Скалярный подзапрос в операторе SELECT

Затем создадим таблицу с примерами данных:

USE tempdb;
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[employee]') AND objectproperty(id, N'isusertable') = 1)
    DROP TABLE [employee];
CREATE TABLE employee (empid INT, name VARCHAR(100), salary MONEY, deptid INT);
INSERT INTO employee VALUES (1, 'claire shi', 95000.00, 1);
INSERT INTO employee VALUES (2, 'carol mok', 65000.00, 2);
INSERT INTO employee VALUES (3, 'lucy ge', 95780.00, 2);
INSERT INTO employee VALUES (4, 'william hung', 95010.00, 2);
INSERT INTO employee VALUES (5, 'chang jin', 55000.00, 1);
INSERT INTO employee VALUES (6, 'honglet hsu', 65000.00, 3);
INSERT INTO employee VALUES (7, 'karen mok', 75000.00, 1);
INSERT INTO employee VALUES (8, 'vivian shi', 98909.00, 4);
INSERT INTO employee VALUES (9, 'hsu chi', 51000.00, 3);
INSERT INTO employee VALUES (10, 'chow fat', 53000.00, 4);

В этом примере подзапрос возвращает максимальную зарплату в виде одного значения столбца. Вот запрос:

SELECT name, deptid, salary, 
    (SELECT MAX(salary) FROM employee me WHERE me.deptid = e.deptid) AS Department_MAX_Salary 
FROM employee e 
ORDER BY deptid, salary;

Вышеприведенный запрос вернет следующие результаты:

namedeptidsalaryDepartment_MAX_Salary
Chang Jin15500095000
Karen Mok17500095000
Claire Shi19500095000
Carol Mok26500095780
William Hung29501095780
Lucy Ge29578095780
Hsu Chi35100065000
Honglet Hsu36500065000
Chow Fat45300098909
Vivian Shi49890998909

Скалярный подзапрос в условии WHERE

Давайте создадим таблицу с примерами данных:

USE tempdb;
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[employee]') AND objectproperty(id, N'isusertable') = 1)
    DROP TABLE [employee];
CREATE TABLE employee (empid INT, name VARCHAR(100), salary MONEY, deptid INT);
INSERT INTO employee VALUES (1, 'claire shi', 95000.00, 1);
INSERT INTO employee VALUES (2, 'carol mok', 65000.00, 2);
INSERT INTO employee VALUES (3, 'lucy ge', 95780.00, 2);
INSERT INTO employee VALUES (4, 'william hung', 95010.00, 2);
INSERT INTO employee VALUES (5, 'chang jin', 55000.00, 1);
INSERT INTO employee VALUES (6, 'honglet hsu', 65000.00, 3);
INSERT INTO employee VALUES (7, 'karen mok', 75000.00, 1);
INSERT INTO employee VALUES (8, 'vivian shi', 98909.00, 4);
INSERT INTO employee VALUES (9, 'hsu chi', 51000.00, 3);
INSERT INTO employee VALUES (10, 'chow fat', 53000.00, 4);

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[department]') AND objectproperty(id, N'isusertable') = 1)
    DROP TABLE [department];
CREATE TABLE department (deptid INT, name VARCHAR(100));
INSERT INTO department VALUES (1, 'information technology');
INSERT INTO department VALUES (2, 'finance');
INSERT INTO department VALUES (3, 'treasury');
INSERT INTO department VALUES (4, 'marketing');

В этом примере подзапрос используется для оценки значений зарплаты основного запроса. Вот запрос:

SELECT a.name, b.name AS Department, a.salary 
FROM employee a, department b 
WHERE a.deptid = b.deptid 
AND a.salary < (SELECT MAX(salary) FROM employee);

Вышеприведенный запрос вернет след

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.