loading..
Русский    English
13:12
листать

CROSS APPLY / OUTER APPLY стр. 1

Оператор CROSS APPLY появился в  Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server 2005. Он позволяет выполнить соединение двух табличных выражений. При этом каждая строка из левой таблицы сочетается с каждой строкой из правой.

Давайте попробуем разобраться в том, какие преимущества дает нам использование этого нестандартного оператора.

Первый пример.

Консоль
Выполнить
  1. SELECT * FROM
  2. Product
  3. CROSS APPLY
  4. Laptop;

Мы получили просто декартово произведение таблиц Product и Laptop. Аналогичный результат мы можем получить с помощью следующих стандартных запросов:

Консоль
Выполнить
  1. SELECT * FROM
  2. Product
  3. CROSS JOIN
  4. Laptop;
или

Консоль
Выполнить
  1. SELECT * FROM
  2. Product, Laptop;

Поставим теперь более осмысленную задачу.

Для каждого ноутбука дополнительно вывести имя производителя.

Эту задачу мы можем решить с помощью обычного соединения:

Консоль
Выполнить
  1. SELECT P.maker, L.*  FROM
  2. Product P JOIN Laptop L ON P.model= L.model;

С помощью CROSS APPLY решение этой же задачи можно написать так:

Консоль
Выполнить
  1. SELECT P.maker, L.*  FROM
  2. Product P
  3. CROSS APPLY
  4. (SELECT * FROM Laptop L WHERE P.model= L.model) L;

 "И что тут нового"? - спросите вы. Запрос стал даже более громоздким. Пока да, можно согласиться. Но уже здесь можно заметить весьма важную вещь, которая отличает CROSS APPLY от других видов соединений. А именно, мы используем коррелирующий подзапрос в предложении FROM, передавая в него значения из левого табличного выражения. В данном примере это значения из столбца P.model. Т.е. для каждой строки из левой таблицы правая таблица будет своя.

Поняв это, мы можем воспользоваться данными преимуществами. Рассмотрим следующую задачу.

Для каждого ноутбука дополнительно вывести максимальную цену среди ноутбуков того же производителя.

Эту задачу мы можем решить с помощью коррелирующего подзапроса в предложении SELECT:

Консоль
Выполнить
  1. SELECT *, (SELECT MAX(price) FROM Laptop L2
  2. JOIN  Product P1 ON L2.model=P1.model
  3. WHERE maker = (SELECT maker FROM Product P2 WHERE P2.model= L1.model)) max_price
  4.  FROM laptop L1;

Пока решение, использующее CROSS APPLY, будет мало чем отличаться от вышеприведенного:

Консоль
Выполнить
  1. SELECT *
  2.  FROM laptop L1
  3.  CROSS APPLY
  4.  (SELECT MAX(price) max_price FROM Laptop L2
  5. JOIN  Product P1 ON L2.model=P1.model
  6. WHERE maker = (SELECT maker FROM Product P2 WHERE P2.model= L1.model)) X;


Bookmark and Share
Страницы: 1 2 3
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN Больше тэгов
Учебник обновлялся
сегодня
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100