Конструкция join |
Для большей совместимости со стандартом from с помощью ключевого слова join.
в включена возможность описывать соединения таблиц в секцииПример:
select x$files.xf$name, x$fields.xe$name from x$files join x$fields on (x$files.xf$code = x$fields.xe$filecode) ;
Данный запрос эквивалентен запросу:
select x$files.xf$name, x$fields.xe$name from x$files, x$fields where (( root /== x$fields.xe$filecode and (x$files.xf$code = x$fields.xe$filecode) )) ;
<join-соединение-таблиц> = <соединение-по-условию> | <соединение-по-именам-столбцов> | <естественное-соединение>
<соединение-по-условию> - соединение таблиц определяется подцепками и фильтрами в секции <условие-соединения>. Данный вариант во многом похож на соединение таблиц посредством конструкции where оператора select.
<соединение-по-условию> = <таблица-1> [left] join <таблица-2> on <условие-соединения>
<соединение-по-именам-столбцов> - таблицы связываются по условию равенства перечисленных столбцов. Полученные связи воспринимаются как фильтры. Столбцы, по которым связываются таблицы, должны иметь одинаковые имена в обеих таблицах.
<соединение-по-именам-столбцов> = <таблица-1> [left] join <таблица-2> using (<список-столбцов>)
<естественное-соединение> - две таблицы объединяются по всем одноименным столбцам. Одноименные столбцы связываются по условию равенства. Полученные связи воспринимаются как фильтры.
<естественное-соединение> = <таблица-1> [left] natural join <таблица-2>
<таблица-1> и <таблица-2> - соединяемые таблицы.
left - указывает на необходимость включить в результат запроса несвязные записи (мягкая подцепка).
Так, запрос:
select x$files.xf$name, x$fields.xe$name from x$files left join x$fields on (x$files.xf$code = x$fields.xe$filecode) ;
Аналогичен запросу
select x$files.xf$name, x$fields.xe$name from x$files, x$fields where (( root == x$fields.xe$filecode and (x$files.xf$code = x$fields.xe$filecode) ));
В результат запроса попадают несвязные записи из левой таблицы.
join - ключевое слово, указывающее на операцию соединения таблиц (оператор соединения таблиц).
on - ключевое слово, указывающее на связь таблиц по заданным подцепкам и фильтрам.
<условие-соединения> - определяет условия соединения таблиц. Если в условиях соединения присутствуют подцепки, они идут непосредственно после ключевого слова on. Синтаксис описания подцепок похож на синтаксис конструкции where оператора select, но фильтры внутри двойных скобок не допускаются.
<условие-соединения> = (( <подцепки> )) [ and <фильтры> ] | <фильтры>
<подцепки> - полный для данной логической таблицы набор соединений таблиц (подцепок), разделенных ключевым словом and. Порядок перечисления сегментов не имеет значения:
<подцепки> = <подцепка> | <подцепки> and <подцепка>
<подцепка> - устанавливает соответствие между отдельным полем подчиненной таблицы и соответствующим ему полем родительской таблицы:
<подцепка> = <левое-выражение> <условие-связи> <поле-подчиненной-таблицы>
<левое-выражение> - выражение (в т.ч. поле родительской таблицы), задающее условие связи.
<условие-связи> - аналогично условиям связи конструкции where оператора select. Условие "/==" не поддерживатся. Жеская-мягкая подцепка устанавливается на основании ключевого слова left: при его наличии подцепка мягкая, при отсутствии - жесткая.
<условие-связи> = == | >>= | <<= | >> | <<
<поле-подчиненной-таблицы> - связываемое поле подчиненной таблицы.
<фильтры> - набор условий отбора записей.
<фильтры> = (<предикат>) | <фильтры> and (<предикат>)
<предикат> - выражение, сравнивающее поля родительской и подчиненной таблиц.
<предикат> = <левое-выражение> <операция-сравнения> <правое-выражение>
<левое-выражение> и <правое-выражение> - выражения, задающие условие фильтрации. Одно из выражений должно быть полем подчиненной (фильтруемой) таблицы.
<операция-сравнения> - одна из операций сравнения:
<операция-сравнения> = = | >= | <= | > | < | <>
using - ключевое слово, указывающее на связь таблиц по условию равенства перечисленных столбцов.
<список-столбцов> - перечень имен столбцов, по которым связываются таблицы. Они должны иметь одинаковые имена в обеих таблицах.
<список-столбцов> = <столбец> | <столбец>, <список-столбцов>
natural - ключевое слово, указывающее на естественное соединение таблиц. Соединение аналогично join using. В качестве списка столбцов используются все одноименные столбцы связываемых таблиц.
При совместном использовании конструкций join и where связи, образованные конструкцией join, добавляются к связям, образованным конструкцией where (см. Пример 4).
Пример 1. Использование разных вариантов оператора join.
Пусть имеются таблицы следующей структуры:
create table Table1 ( ... Code : word "Код ресурса", MasterCode : word "Код владельца ресурса", ... ) create table Table2 ( ... Code : word "Код ресурса", MasterCode : word "Код владельца ресурса", ... )
Тогда соединение таблиц по совпадению двух указанных полей можно записать:
select * from Table1 join Table2 using (Code, MasterCode);
Если Code и MasterCode являются единственными полями с одинаковым названием в обеих таблицах, то можно упростить:
select * from Table1 natural join Table2;
В общем случае соединение двух таблиц оформляется через фильтры:
select * from Table1 join Table2 on (Table1.Code = Table2.Code) and (Table1.MasterCode = Table2.MasterCode) ;
При наличии необходимых индексов соединение двух таблиц лучше оформить через подцепки:
select * from Table1 join Table2 on (( Table1.Code == Table2.Code and Table1.MasterCode == Table2.MasterCode )) ;
Можно также воспользоваться комбинацией подцепки и фильтра:
select * from Table1 join Table2 on (( Table1.Code == Table2.Code )) and (Table1.MasterCode = Table2.MasterCode) ;
Пример 2. Связывание таблиц по фильтрам.
interface JoinDemo2 'Связывание таблиц по фильтрам' EscClose, Cyan; show at (0,0,79,25); create view as select x$fields.xe$name, x$indexes.xi$name from x$indexes left join x$fields on (x$indexes.xi$filecode = x$fields.xe$filecode) and (x$indexes.xi$fieldcode = x$fields.xe$code) ; browse brw1; show at (1,1,78,10); fields x$indexes.xi$name 'Индекс' : [15], protect; x$fields.xe$name 'Поле' : [15], protect; end; end.
Пример 3. Связывание таблиц по подцепке и фильтрам.
interface JoinDemo3 'Связывание таблиц по подцепке и фильтрам' EscClose, Cyan; show at (0,0,79,25); create view as select x$fields.xe$name, x$indexes.xi$name from x$indexes join x$fields on ((x$indexes.xi$filecode == x$fields.xe$filecode)) and (x$indexes.xi$fieldcode = x$fields.xe$code) and ('PRJEXECUTORS01' = x$indexes.xi$name) ; browse brw1; show at (1,1,78,10); fields x$indexes.xi$name 'Индекс' : [15], protect; x$fields.xe$name 'Поле' : [15], protect; end; end.
Пример 4. Связывание таблиц с совместным использованием конструкций join и where.
interface JoinDemo3 'Join совместно с Where' EscClose, Cyan; show at (0,0,79,25); create view as select x$files.xf$name, x$fields.xe$name, x$indexes.xi$name from x$fields, x$files left join x$indexes on ((x$files.xf$code == x$indexes.xi$filecode)) where (( x$indexes.xi$filecode == x$fields.xe$filecode and x$indexes.xi$fieldcode == x$fields.xe$code )) ; browse brw1; show at (1,1,78,9); table x$files; fields x$files.xf$name 'Файл' : [15], protect; end; browse brw2; show at (1,10,78,17); table x$indexes; fields x$indexes.xi$name 'Индекс' : [15], protect; end; browse brw3; show at (1,18,78); table x$fields; fields x$fields.xe$name 'Поле' : [15], protect; end; end.
Атлантис 5.1.34.