Имя: Пароль:
1C
 
Язык запросов: Внутреннее и внешнее соединение
0 nop
 
23.10.08
12:17
ВНУТРЕНЕЕ - в результирующей таблице будут только записи для которых соединение таблиц удалось.

ВНЕШНЕЕ = ВНУТРЕНЕЕ + записи из одной, обеих таблиц (ЛЕВОЕ, ПРАВОЕ, ПОЛНОЕ) для которых соединение не удалось.

Верно?
1 IronDemon
 
23.10.08
12:19
Внутреннее соединение

При внутреннем соединении в результат запроса попадают только записи удовлетворяющие заданному условию. В связанных таблицах обычно есть одно поле, значения в котором совпадают в двух таблицах, например, ссылка на элемент справочника Номенклатура. Допустим, необходимо выбрать все проданные товары и вывести их в отчет с указанием артикула. Это делает представленный ниже запрос:

Левое внешнее соединение

Конструкция ЛЕВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Но, в отличие от внутреннего соединения, в результат запроса надо включить еще и записи из первого источника (указанного слева от слова СОЕДИНЕНИЕ), для которых не найдено соответствующих условию записей из второго источника.

Правило. В случае левого внешнего соединения в результат запроса будут включены все записи из первого источника; они будут соединены с записями из второго источника при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из второго источника, будут содержать значение NULL в полях, формируемых на основании записей из этого источника.


Правое внешнее соединение

Конструкция ПРАВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить еще и записи из второго источника (указанного справа от слова СОЕДИНЕНИЕ), для которых не найдено соответствующих условию записей из первого источника.

Правило. В случае правого внешнего соединения в результат запроса будут включены все записи из второго источника; они будут соединены с записями из первого источника при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из первого источника, будут содержать значение NULL в полях, формируемых на основании записей из этого источника.

Правое внешнее соединение полностью аналогично левому, за исключением того, что таблицы поменялись местами. Например, представленный ниже запрос эквивалентен предыдущему, но вместо левого, используется правое внешнее соединение:
2 Shurjk
 
23.10.08
12:20
(0) Что значит "соединение удалось"?
3 ЁБ
 
23.10.08
12:23
Спецификации "ВНУТРЕННЕЕ" и "ВНЕШНЕЕ" ни на что не влияют. Их ввели только для красоты.
А так есть четыре типа соединения :

СОЕДИНЕНИЕ (берем только записи удовлетворяющие условию)

ЛЕВОЕ СОЕДИНЕНИЕ (берем весь левый источник и пришпандориваем правый по условию)

ПРАВОЕ СОЕДИНЕНИЕ (берем весь правый источник и пришпандориваем правый по условию)

ПОЛНОЕ СОЕДИНЕНИЕ (берем оба источника и заполняем по условию)
4 nop
 
23.10.08
12:24
(3) о, понял! Спасибо :)
5 ЁБ
 
23.10.08
12:24
+
ПРАВОЕ СОЕДИНЕНИЕ (берем весь правый источник и пришпандориваем левый по условию)
6 nop
 
23.10.08
16:41
Можно делать СОЕДИНЕНИЕ со вложенным запросом (виртуальной таблицей) ?
ВЫБРАТЬ * из Документ.Х СОЕДИНЕНИЕ ( Выбрать р1, р2 ИЗ РегистрСведений.У ГДЕ ...) ПО .... ??
7 nop
 
23.10.08
16:55
апну
8 ДенисЧ
 
23.10.08
17:01
(6) "В качестве источника данных запроса может выступать также вложенный запрос; в тако м случае описание источника содержит <Описание запроса>" (с) ЖЖК
9 nop
 
23.10.08
17:02
(8) Спс
10 nop
 
28.10.08
12:55
СОЕДИНЕНИЕ в условии ПО допускаются синонимы полей или только имена? Например

   "ВЫБРАТЬ
   |    ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка,
   |    ЗарплатаКВыплатеОрганизацийЗарплата.СчетУчета КАК СчетУчетаХХХ
   |ИЗ
   |    Документ.ЗарплатаКВыплатеОрганизаций.Зарплата КАК ЗарплатаКВыплатеОрганизацийЗарплата
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям КАК РанееВыплаченныеСуммы
   |        ПО ЗарплатаКВыплатеОрганизацийЗарплата.СчетУчетаХХХ = РанееВыплаченныеСуммы.СчетУчета
11 Defender aka LINN
 
28.10.08
12:56
(10) В таблице "ЗарплатаКВыплатеОрганизацийЗарплата" нет поля "СчетУчетаХХХ". Сечешь? :)
12 nop
 
28.10.08
12:58
(11) то есть синонимы не катят для СОЕДИНЕНИЕ ?
13 MSensey
 
28.10.08
12:59
не катят
14 Defender aka LINN
 
28.10.08
12:59
(12) Катят имена полей. А уж как они в таблице появились - дело десятое.
15 nop
 
28.10.08
13:01
(14) не пойму... (10) будет работать??
16 MSensey
 
28.10.08
13:04
(15) не будет, см (11)
17 nop
 
28.10.08
13:05
(16) млин... а если СОЕДИНЯТЬ виртуальные таблицы?
18 MSensey
 
28.10.08
13:06
(17) даже в этом случаем мир не изменится
19 MSensey
 
28.10.08
13:06
(17) а чем тебя не устраивает (11) ?
20 Defender aka LINN
 
28.10.08
13:08
(17) Смотри:

ВЫБРАТЬ
   Таблица1.Товар КАК Псевдоним,
   Таблица2.Поле
ИЗ
   (ВЫБРАТЬ
       Номенклатура КАК Товар
   ИЗ
       РегистрНакопления.ТоварыНаСкладах.Остатки) КАК Таблица1
ЛЕВОЕ СОЕДИНЕНИЕ <что-то-там> КАК Таблица2

"Товар" - тоже псевдоним. Но только внутри запроса "Таблица1".
21 Defender aka LINN
 
28.10.08
13:09
+(20) Блин. Соединение-то и забыл :)

ВЫБРАТЬ
   Таблица1.Товар КАК Псевдоним,
   Таблица2.Поле
ИЗ
   (ВЫБРАТЬ
       Номенклатура КАК Товар
   ИЗ
       РегистрНакопления.ТоварыНаСкладах.Остатки) КАК Таблица1
ЛЕВОЕ СОЕДИНЕНИЕ <что-то-там> КАК Таблица2
ПО
   Таблица1.Товар = Таблица2.Товар
22 nop
 
28.10.08
13:13
(21) Понял! Спасибо
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой