среда, 2 февраля 2011 г.

Синтаксис объединения стандарта ANSI в Oracle

Oracle9i вводит новый синтаксис объединения, соответствующий стандарту ANSI SQL, определенному для SQL/92.


Внутреннее объединение

При использовании традиционного синтаксиса объединения вы указываете в инструкции FROM несколько таблиц, разделяя их запятыми, например:
select e.last_name, d.department_name
  from employees e, departments d
 where e.department_id = d.department_id;

В новом синтаксисе Oracle9i вы указываете в инструкции FROM тип объединения вместе с ключевым словом JOIN. Например, чтобы выполнить внутреннее объединение таблиц, вы пишете:
from employees e
inner join departments d

В традиционном синтаксисе объединения условие объединения задается в инструкции WHERE. В новом синтаксисе инструкция WHERE предназначена только для фильтрации. Условия объединения отделено от инструкции WHERE и помещено в новую инструкцию ON, входяющую в состав инструкции FROM. Используя новый синтаксис, перепишем условие объединения из предыдущего примера:
on e.department_id = d.department_id;

Весь запрос в новом формате будет выглядеть так:
select e.last_name, d.department_name
from employees e
inner join departments d
on e.department_id = d.department_id;

Если используется условие объединения по равенству и названия друх столбцов совпадают, то условия данного объединения можно записать следующим образом:
select e.last_name, d.department_name
from employees e
join departments d
using (department_id);

Слово inner является необязательным и его можно не использовать.

Декартово произведение (перекрестное объединение)

В традиционном синтаксисе декартово произведение будет выглядеть следующим образом:
select e.last_name, d.department_name
from employees e, departments d;

Приемущество нового синтаксиса в том, что вы не можете непредумышленно сгенерировать декартово произведение, опустив условие объединения.
select e.last_name, d.department_name
from employees e
cross join departments d;

Внешние объединения

Синтакис внешнего объединения ANSI не использует в условии объединения оператор (+). Вместо этого в инструкции указывается тип обхединения. Синтаксис внешнего объединения ANSI таков:

FROM table1 { LEFT | RIGHT | FULL } [OUTER] JOIN table2

Вид соединения выбирается обязательно один из трех LEFT, RIGHT или FULL. Ключевое слово OUTER можно не писать.
Покажем на примерах традиционный синтаксис внешнего объединения и синтаксис стандарта ANSI.

Присоединение слева.
К основной таблице LOCATION присоединяем слева дополнительную таблицу DEPARTMENTS, допуская в дополнительной таблице пустные значения, чтобы вывести основную таблицу полностью.

Решение традиционным синтаксисом:
select *
  from locations l, departments d
 where l.location_id = d.location_id(+);

Два варианта для синтаксиса стандарта ANSI:
select * from locations l left join departments d using (location_id);

select *
  from locations l
  left join departments d
    on d.location_id = l.location_id;

Правое соединение
select *
  from locations l, departments d
 where l.location_id(+) = d.location_id;
 
select * from locations l right join departments d using (location_id);

select *
  from locations l
 right join departments d
    on d.location_id = l.location_id;

Полное соединение
select *
  from locations l, departments d
 where l.location_id = d.location_id(+)
union all
select *
  from locations l, departments d
 where l.location_id(+) = d.location_id;

select * from locations l full join departments d using (location_id);

select *
  from locations l
  full join departments d
    on d.location_id = l.location_id;

2 комментария:

  1. где планы запросов? а где работа с model? иерархические запросы? почему необходимо использовать именно ansi-синтаксис, вместо нормального ораклового? Где вывод?

    ОтветитьУдалить
  2. Я так счастлив сегодня, потому что Бог сделал это для меня после того, как я пережил трудные времена с другими кредиторами, и ничего не вышло, я хотел потерять свою веру и надежду, но я все еще должен стоять твердо и добиваться того, чего я ищу. Я счастлив сегодня, потому что Бог направил меня в лучшую кредитную компанию, и я ни о чем не пожалел после того, как связался с ними, и мое сердечное желание было исполнено, и мне дали указанную сумму, которую я просил (300000,00 долларов США), деньги были внесены в моя учетная запись после двух недель разговора с компанией, и они не беспокоили меня и не вызывали у меня головной боли при получении этого кредита от них, другие члены моей семьи и друзья, которых я им направил, все тоже получили свой кредит, я буду любить вас чтобы связаться с 247officedept@gmail.com / whatsapp 1-989-394-3740. . и получите ссуду быстро, и это безопасно и быстро, вы, потерявшая надежду, веру и все, что у вас есть, всего лишь во имя получения ссуды, и ничего не получится, держите пари, если вы попробуете этого человека по имени Бенджамин, вы никогда не будете пожалеете о чем-либо, и ваш запрос на кредит будет одобрен, и он будет выплачен прямо на ваш банковский счет, поэтому поторопитесь и свяжитесь с быстрым ответом по WhatsApp + 1-989-394-3740. попросите ссуду любого типа, и она вам будет предоставлена. Желаю тебе всего наилучшего

    ОтветитьУдалить