![]() |
|
Логика СКД при применении полного соединения | ☑ | ||
---|---|---|---|---|
0
Crush
27.03.13
✎
11:35
|
Не могу сообразить. Есть два набора данных. Соединяю их. В результате получается полное соединение. А нужно левое. Наборы данных достаточно сложные, что бы методом тыка искать причину.
В инете нарыл, что скд делает полное соединение, когда в правой таблице есть условие на НЕ НУЛЛ. Взял два простых набора и ни как не получается заставить скд делать полное соединение. Цель темы: понять из-за чего возникает полное соединение и добиться на простом примере. Набор данных 1 ВЫБРАТЬ "Стол" КАК Товар, "Красный" КАК Цвет ПОМЕСТИТЬ вт ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Стул", "Синий" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Шкаф", "Белый" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ вт.Товар КАК Товар, вт.Цвет КАК Цвет {ВЫБРАТЬ Товар, Цвет} ИЗ вт КАК вт Набор данных 2 ВЫБРАТЬ "Стол" КАК Товар, "Кухня" КАК Склад, 1 КАК Количество ПОМЕСТИТЬ вт ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Стул", "Кухня", 4 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ вт.Товар КАК Товар, ЕСТЬNULL(вт.Склад, "") КАК Склад, ЕСТЬNULL(вт.Количество, 0) КАК Количество {ВЫБРАТЬ Товар, Склад, Количество} ИЗ вт КАК вт ГДЕ (НЕ вт.Товар ЕСТЬ NULL ) Вывод: Таблица {Строки=Товар; Колонки = Склад; Ресурсы = Количество} Срабатывает левое соединение. Как заставить СКД делать полное? |
|||
1
fisher
27.03.13
✎
11:37
|
(0) "Как заставить СКД делать полное?"
Спроси это у того мудреца, который про него заикнулся. |
|||
2
el-gamberro
27.03.13
✎
11:37
|
(0) Идешь в библиотеку. Берешь любую книгу по теории реляц. баз данных. Долго куришь. Потом долго смеешься на там какую ерунду ты написал в етой теме.
По сути убери условие ГДЕ (НЕ вт.Товар ЕСТЬ NULL ) |
|||
3
el-gamberro
27.03.13
✎
11:39
|
Кстати говоря в (0) в запросе нет НИ ОДНОГО соединения, и етот человек спршивает как получить ПОЛНОЕ вместо ЛЕВОГО
|
|||
4
fisher
27.03.13
✎
11:40
|
(3) Писатель? Речь о наборах данных СКД.
|
|||
5
Crush
27.03.13
✎
11:41
|
(2) Без этого условия срабатывает левое соединение. И с ним тоже.
(3) Соединение наборов данных по полю Товар (думал, что это и так понятно) |
|||
6
Crush
27.03.13
✎
11:44
|
Ссори! Речь не о полном, а о ВНУТРЕННЕМ соединении.
2 часа сна сказываются. Простите. Вместо левого у меня получается внутреннее. Помогите разобраться от чего это зависит |
|||
7
fisher
27.03.13
✎
11:46
|
(6) От кривых рук. Наборы данных всегда левым соединяются. Или докажи обратное на простом примере.
|
|||
8
Crush
27.03.13
✎
11:50
|
(7) Да вот за простым примером и обратился сюда. Если никто не сталкивался, то придется тогда упрощать свои наборы данных. Обязательно выложу.
|
|||
9
fisher
27.03.13
✎
11:56
|
(8) Проверь отборы СКД. Может, у тебя хитрый отбор накладывается на результат соединения, а тебе кажется что внутреннее отрабатывает.
|
|||
10
Crush
27.03.13
✎
12:02
|
Отбор ставится только на правый набор. Псевдоним поля отбора не совпадает с полями левого набора.
Если задать отбор приводящий к пустой правой таблице, то весь отчет получается пустой.. Эм... попробую ка я дать разные имена полям по которым соединяю.. |
|||
11
fisher
27.03.13
✎
12:08
|
(10) Это ТЫ ВООБРАЖАЕШЬ, что отбор ставится только на правый набор. Чтобы это стало реальностью, нужна магия фигурных скобок. А сейчас у тебя отбор применяется к РЕЗУЛЬТАТУ соединения наборов.
|
|||
12
Classic
27.03.13
✎
12:09
|
(10)
Отбор в СКД ставится уже на результирующую таблицу. Если у тебя левое соединение, а отбор вешается на элементы из правой таблицы, то фактические нулы правой таблицы не попадают в вывод. А значит получаешь внутреннее соединение. Что не понятно? |
|||
13
fisher
27.03.13
✎
12:12
|
(12) Не внутреннее соединение, а результат аналогичный внутреннему соединению.
|
|||
14
Classic
27.03.13
✎
12:13
|
(13)
Пофиг :) |
|||
15
fisher
27.03.13
✎
12:23
|
(14) Не пофиг. Вот благодаря такой формулировке, в мозгу ТС и поселилась ересь, что СКД умеет соединять наборы не только левым соединением.
|
|||
16
Crush
27.03.13
✎
12:26
|
Лёд тронулся.
Перенес отбор в параметы В правой таблице было условие {ГДЕ (ЕСТЬNULL(втДанные.Номенклатура, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка))).* КАК СравнениеНоменклатура} Убрал Теперь левая таблица полностью выводится. (Осталось вспомнить на кой я вчера это кривое условие добавил.) |
|||
17
Crush
27.03.13
✎
12:33
|
(12) Да, точно! Такая штука и в обычных запросах есть когда
Выбрать что то Из вт1 Левое соединение вт2 Где вт2.Поле1 = "бла бла" Вроде условие ставишь на правую таблицу, а ограничивается весь результат Спасибо за помощь! |
|||
18
fisher
27.03.13
✎
13:20
|
(16) Хм... Если это условие было только в правом наборе и автозаполнение настроек было отключено - тогда должно было правильно отработать. Может, галка автозаполнения настроек стоит?
|
|||
19
Crush
27.03.13
✎
14:52
|
(18) Автозаполнение отключено на обоих наборах.
И это условие тоже было ни причем. Второй набор данных выбирается из виртуальной таблицы оборотов регистра накопления. Если в параметрах таблицы написать .Обороты(, , , Измерение1=&ЗначениеИзмерения), то результат не ограничивается, а если .Обороты(, , , {(Измерение1)}) или .Обороты(, , , {(Измерение1).*}), то весь результат ограничивается данными правой таблицы. С параметром всё работает, но хочется пользоваться отбором скд. А сливать запросы обоих наборов - это уж очень тяжелая табличка получится. Хотя... Кто знает эту шибкоумную скд. Попробую. |
|||
20
Classic
27.03.13
✎
15:00
|
(19)
С колокольни твоей логики ограничение на Измерение1 - это не отбор. Это фактически условие соединения. |
|||
21
fisher
27.03.13
✎
15:21
|
(19) Хм... Очень странно. А попробуй Обороты(, , , {(Измерение1).* КАК ХитроеИмечко})
|
|||
22
fisher
27.03.13
✎
15:23
|
(21) + Подозреваю, что дефолтное имя отбора правой таблицы совпало с каким-то из левой.
|
|||
23
Crush
27.03.13
✎
15:32
|
(22) Отдельные имена уже давал. Всё равно строки с правыми нулами отбрасывает.
Чесал левой рукой правое ухо: 1) Ставил отбор не в параметры виртуальной таблицы а в секцию ГДЕ. Результат: Формируется долго и всё равно не выводит пустые значения. 2) Объединил наборы данных в один. Результат: Формируется долго. В группировку колонок попадает группировка по Null. т.е. лишняя пустая колонка выводится. Интуиция мне подсказывает, что должно быть решение, работающее как с параметрами. |
|||
24
fisher
27.03.13
✎
16:00
|
(23) Фигню подтверждаю. Смоделировал бяку на простом примере. Чешу репу...
|
|||
25
Crush
27.03.13
✎
16:00
|
Нашел у себя типовую демку бухгалтерии 2.0. Там простой пример сделал.
http://webfile.ru/6448135 Левый набор: ВЫБРАТЬ Ссылка из ПланСчетов.Хозрасчетный Правый набор: ВЫБРАТЬ СчетРасходов, Организация, СуммаОборот ИЗ РегистрНакопления.РеализацияУслуг.Обороты(, , , {(Организация)}) Соединение по Счет=СчетРасходов Вывод Таблица: Строки: Счета Колонки: Органицации Ресурс: СуммаОборот Если не задавать отбор по организации, то будет весь план счетов и суммы по всем организациям. Если задать отбор, то счета будут не все. |
|||
26
Crush
27.03.13
✎
16:05
|
Мне к зубному. Может кто догадается как решить задачу с использованием скд отбора без потери левого соединения. Результат должен быть такой же как если вместо СКД отбора задать параметр.
Платформы от 8.1.12.101 до 8.2.17.153 |
|||
27
fisher
27.03.13
✎
16:19
|
Ыыыыы!
Связь наборов компоновки данных таки может быть внутренней! В конструкторе СКД этого нет, но у объекта "СвязьНаборовДанныхМакетаКомпоновкиДанных" есть свойство "ТипСвязи" типа "ТипСвязиНаборовДанныхКомпоновкиДанных" принимающее значения "Внешняя" и "Внутренняя". Изначально она внешняя. Но как только в СКД устанавливается отбор в правом наборе, она какого-то муя автоматом меняется на внутреннюю! |
|||
28
Crush
28.03.13
✎
09:42
|
Попробовал сначала временную таблицу получить, а потом её вставил в условие таблицы оборотов. Воз и ныне там.
ВЫБРАТЬ Организации.Ссылка ПОМЕСТИТЬ втОрганизации ИЗ Справочник.Организации КАК Организации {ГДЕ Организации.Ссылка.* КАК ОрганизацияДляОтбора} ; ... РегистрНакопления.РеализацияУслуг.Обороты(,,,Организация В (ВЫБРАТЬ вт.Ссылка ИЗ втОрганизации КАК вт)) ... Копаю в сторону изменения типа связи налету или может найдется способ ограничить интеллектуальные способности скд. |
|||
29
Crush
28.03.13
✎
10:05
|
УРА!!!!!ПОБЕДА!!!
Ларчик просто открывался!:))) Нужно в настройках ставить отбор не на весь отчет (глобальный отбор), а только на интересующую группировку. Тогда сохраняется левое соединение. Рабочий пример для БП20 тут http://webfile.ru/6449381 Помогла тема v8: 3 набора в СКД - реально? |
|||
30
fisher
28.03.13
✎
11:18
|
(29) Рад, что проблемка решилась, но глобально - всё равно неведомая фигня :(
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |