|
помогите с запросом | ☑ | ||
---|---|---|---|---|
0
Эльнур
15.02.12
✎
12:39
|
Есть две таблицы с полями Номенклатура и характеристика. Как сделать полное соединение этих таблиц. Вот сам запрос
<code> ВЫБРАТЬ ПринятыеМатериалы.Номенклатура КАК Номенклатура1, ПринятыеМатериалы.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры1, ПереданныеМатериалы.Номенклатура, ПереданныеМатериалы.ХарактеристикаНоменклатуры ИЗ (ВЫБРАТЬ РеализацияУслугПоПереработкеИспользованныеМатериалы.Номенклатура КАК Номенклатура, РеализацияУслугПоПереработкеИспользованныеМатериалы.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, РеализацияУслугПоПереработкеИспользованныеМатериалы.Номенклатура.Наименование + ЕСТЬNULL(РеализацияУслугПоПереработкеИспользованныеМатериалы.ХарактеристикаНоменклатуры.Наименование, "") КАК Поле1, РеализацияУслугПоПереработкеИспользованныеМатериалы.Ссылка.Сделка КАК ЗаказПокупателя ИЗ Документ.РеализацияУслугПоПереработке.ИспользованныеМатериалы КАК РеализацияУслугПоПереработкеИспользованныеМатериалы) КАК ПринятыеМатериалы ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПолучениеУслугПоПереработкеИспользованныеМатериалы.Номенклатура КАК Номенклатура, ПолучениеУслугПоПереработкеИспользованныеМатериалы.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, ПолучениеУслугПоПереработкеИспользованныеМатериалы.Номенклатура.Наименование + ЕСТЬNULL(ПолучениеУслугПоПереработкеИспользованныеМатериалы.ХарактеристикаНоменклатуры.Наименование, "") КАК Поле1, ПолучениеУслугПоПереработкеИспользованныеМатериалы.Ссылка.Заказ КАК ЗаказПоставщику ИЗ Документ.ПолучениеУслугПоПереработке.ИспользованныеМатериалы КАК ПолучениеУслугПоПереработкеИспользованныеМатериалы) КАК ПереданныеМатериалы ПО ПринятыеМатериалы.Номенклатура = ПереданныеМатериалы.Номенклатура И ПринятыеМатериалы.ХарактеристикаНоменклатуры = ПереданныеМатериалы.ХарактеристикаНоменклатуры ГДЕ ПринятыеМатериалы.ЗаказПокупателя = &ЗаказПокупателя И ПереданныеМатериалы.ЗаказПоставщику = &ЗаказПоставщику </code> но он не соединяет эти таблицы как надо. |
|||
1
Fish
15.02.12
✎
12:41
|
А как надо?
|
|||
2
Эльнур
15.02.12
✎
12:42
|
Надо именно полное, но выдается неполное соединение.
|
|||
3
RomanYS
15.02.12
✎
12:43
|
условия засунь в соединение
|
|||
4
depthzer0
15.02.12
✎
12:43
|
(2) как узнал?
|
|||
5
depthzer0
15.02.12
✎
12:43
|
(4) +1
|
|||
6
ssh2006
15.02.12
✎
12:43
|
(2)
ГДЕ ПринятыеМатериалы.ЗаказПокупателя = &ЗаказПокупателя И ПереданныеМатериалы.ЗаказПоставщику = &ЗаказПоставщику |
|||
7
Beduin
15.02.12
✎
12:44
|
(3) Не в соединения, а во вложенные запросы.
|
|||
8
RomanYS
15.02.12
✎
12:44
|
+(3) а лучше во вложенные запросы
|
|||
9
Эльнур
15.02.12
✎
12:45
|
(4) распечатал и проверил на бумаге
|
|||
10
SoulPower
15.02.12
✎
12:46
|
Засунь во временные таблицы и объедини их.
|
|||
11
Эльнур
15.02.12
✎
12:46
|
(10) сейчас посмотрю
|
|||
12
Beduin
15.02.12
✎
12:47
|
(10) Не временные, а беременные.
|
|||
13
SoulPower
15.02.12
✎
12:48
|
Если нужно условие на результат, то его тоже нужно помещать во временную таблицу.
|
|||
14
SoulPower
15.02.12
✎
12:49
|
такой вот глюк 1с )
|
|||
15
SoulPower
15.02.12
✎
12:51
|
(10) *соедини
|
|||
16
Beduin
15.02.12
✎
12:52
|
(14) Глюка нет. Вложенные запросы формируется вначале, а потом идет соединение.
При полном соединении поля заказпокупателя и заказ поставщику может быть пустым. |
|||
17
Эльнур
15.02.12
✎
12:59
|
Спасибо ребята, кажется временные таблицы помогли.
|
|||
18
SoulPower
15.02.12
✎
13:00
|
Глюк в том что нельзя сделать полное соединение таблиц без вложенных запросов или временных таблиц. Точнее можно, но оно работает не правильно, не так как должно, записи с null туда не попадают. Но решать эту задачу(да и вообще практически любую задачу) с помощью вложенных запросов это убого, т.к работаю они медленнее и возможны непредсказуемые последствия.
|
|||
19
RomanYS
15.02.12
✎
13:09
|
(18) никакого глюка нет, null действительно (и ожидаемо) не проходит под эти условия.
|
|||
20
Fish
15.02.12
✎
13:22
|
(18) Тут глюк не в 1С, а в понимании работы запросов :)))
|
|||
21
SoulPower
15.02.12
✎
13:23
|
(19) что значит под "эти условия"?
есть условия полного соединения, в которое должны попадать все строки двух таблиц и не важно что в полях. Поведение 1с противоречит этим условиям. |
|||
22
pessok
15.02.12
✎
13:26
|
Может таки имеется в виду ОБЪЕДИНИТЬ?
З.Ы. камменты не читал |
|||
23
SoulPower
15.02.12
✎
13:27
|
(20) то есть по вашему неправильная работа полного соединения это то что нужно понимать.
ну тогда конечно всё ок. |
|||
24
RomanYS
15.02.12
✎
13:27
|
(21) условие, например:
"ГДЕ ПринятыеМатериалы.ЗаказПокупателя = &ЗаказПокупателя И ПереданныеМатериалы.ЗаказПоставщику = &ЗаказПоставщику" Условие применяется после соединения, следовательно, либо применяй условие раньше (ВТ или вложенные запросы), либо ставь условие в соединение, либо учитывай NULL в конечном условии (для извращенцов) |
|||
25
Fish
15.02.12
✎
13:29
|
(23) Вам уже пояснили, что всё работает правильно, как и должно. Только вы почему-то думаете, что полное соединения работает неправильно :)))
|
|||
26
RomanYS
15.02.12
✎
13:30
|
(23) работа полного соединения полностью соответствует документации и здравому смыслу.
Тебе нужно понять, что предложение ГДЕ применяется уже к результату соединения |
|||
27
Жан Пердежон
15.02.12
✎
13:35
|
в (0) внутреннее соединение написанное через Ж
|
|||
28
SoulPower
15.02.12
✎
13:39
|
(26) ну я столкнулся с тем что работа полного соединения не совпала со здравым смыслом.
например если взять пустую таблицу с одной колонкой и такую же, но со значениями. И сделать полное соединение со связью по колонке. То будет таблица 2х2, в строках пустые значения и значения из заполненной таблицы. Это как показывает здравый смысл и определение полного соединения. В 1с же ничего не будет. |
|||
29
Fish
15.02.12
✎
13:47
|
(28) В 1С всё будет, если правильно писать запросы.
|
|||
30
SoulPower
15.02.12
✎
13:56
|
(29) Я привёл вам пример, который у меня не заработал.
ВЫБРАТЬ Таб1.Поле КАК Поле1, Таб2.Поле КАК Поле2 ИЗ Таб1 ПОЛНОЕ СОЕДИНЕНИЕ Таб2 ПО Таб1.Поле = Таб2.Поле |
|||
31
Fish
15.02.12
✎
13:59
|
(30) Так и не заработает. Если Вы не умеете использовать полное соединение, это еще не значит, что оно работает неправильно. Почитайте для начала книжки хотя бы. Например "Простые примеры разработки" :)))
|
|||
32
SoulPower
15.02.12
✎
14:12
|
(26) Применять условие на результат объединения, Вы не находите это странным?
Значит сервер должен объединить две таблицы (могут быть большими), а потом на результат применить условие ГДЕ. Думаю это не оптимально с точки зрения производительности. (31) Вы можете привести пример, как с Вашей точки зрения должно быть корректно? |
|||
33
Fish
15.02.12
✎
14:18
|
(32) В языке запросов, как и в любом другом нет чьих-то точек зрения. Есть определённые правила построения запросов, и их надо знать, а не рассуждать "правильно - не правильно".
Как раз описанный вами пример есть в книжке "Простые примеры разработки" А.П. Габец, Д.И. Гончаров. Откройте книжку и почитайте, а потом рассуждайте о правильности работы полного соединения. |
|||
34
Fish
15.02.12
✎
14:22
|
+(33) Я бы еще посоветовал Вам изучить книжку "Понимание SQL" Мартина Грубера. Тогда, я надеюсь, разговоры о "глюках 1С" отпали бы.
|
|||
35
SoulPower
15.02.12
✎
14:24
|
(33) Значит примера с вашей стороны не будет. И разговор пустой.
|
|||
36
ssh2006
15.02.12
✎
14:25
|
(35) ответ был еще в (3)
|
|||
37
Fish
15.02.12
✎
14:27
|
(35) Я не собираюсь здесь переписывать примеры из учебников, чтобы Вам что-то доказать. Не вижу смысла.
|
|||
38
Жан Пердежон
15.02.12
✎
14:40
|
(35) всего 1 документ, в товарах 2 строки: все выдает как надо
Выбрать Товары.НомерСтроки, Серии.НомерСтроки ИЗ Документ.ВозвратТоваровОтКлиента.Товары КАК Товары Полное Соединение Документ.ВозвратТоваровОтКлиента.Серии КАК Серии ПО Товары.НомерСтроки = Серии.НомерСтроки |
|||
39
SoulPower
15.02.12
✎
15:08
|
(38) Я сталкивался с тем, что не работало. Скорее всего к этому моменту уже решили проблему.
Проверил - работает, но если наложить условия на таблицы, то не будет. Может Fish объяснит почему не работает и почему не должно работать? |
|||
40
Fish
15.02.12
✎
15:18
|
(39) Нету у меня желания объяснять почему. Всё это есть в учебниках и книгах. Надо взять и почитать.
Могу дать наводку: если у тебя первая таблица со значениями, а вторая пустая, то твой запрос отработает так, как ты хочешь. А вот если у тебя первая таблица пустая, а вторая со значениями - то твой запрос не годится. |
|||
41
Жан Пердежон
15.02.12
✎
15:23
|
(39) если ты условия наложишь как в (0)
то у тебя и будет работать как в (0) причем не только в 1С |
|||
42
Fish
15.02.12
✎
15:26
|
(39) Блин вот тебе пример из книги. А почему это так думай сам.
Как объединить данные из двух таблиц по определенному условию? ВЫБРАТЬ ВЫБОР КОГДА (ЗаказыПокупателейОстатки.Номенклатура) ЕСТЬ NULL ТОГДА ЗаказыПоставщикамОстатки.Номенклатура ИНАЧЕ ЗаказыПокупателейОстатки.Номенклатура КОНЕЦ КАК Номенклатура, ЗаказыПокупателейОстатки.КоличествоОстаток КАК ЗаказаноПокупателями, ЗаказыПоставщикамОстатки.КоличествоОстаток КАК ЗаказаноПоставщикам ИЗ РегистрНакопления.ЗаказыПокупателей.Остатки(&ДатаОтч) КАК ЗаказыПокупателейОстатки ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПоставщикам.Остатки(&ДатаОтч) КАК ЗаказыПоставщикамОстатки ПО ЗаказыПокупателейОстатки.Номенклатура = ЗаказыПоставщикамОстатки.Номенклатура |
|||
43
Жан Пердежон
15.02.12
✎
15:28
|
(42) пример ниочем)
и про первая таблица пустая - бред |
|||
44
Fish
15.02.12
✎
15:31
|
(43) конечно, Габец и Гончаров - лохи. И в книгах они пишут полный бред :)))
|
|||
45
Fish
15.02.12
✎
15:34
|
+(44) Может я не совсем правильно сформулировал мысль из книги, т.к. дословно там много текста, но суть примерно та же.
|
|||
46
SoulPower
15.02.12
✎
15:41
|
(42) Чтото я не вижу ветку ГДЕ в примере. А вроде суть этого топика в соединениях с отбором.
|
|||
47
Fish
15.02.12
✎
15:44
|
(46) В данном примере отбор идет по дате. Причем здесь ГДЕ? Вроде про ГДЕ уже выше всё написали.
|
|||
48
Fish
15.02.12
✎
15:47
|
+(47) В твоем примере (30) условия ГДЕ тоже не было.
|
|||
49
Жан Пердежон
15.02.12
✎
15:49
|
(44) причем тут Габец и Гончаров? Свою голову надо иметь. Запрос из (42) ничем не отличается от запроса из (30) и ровным счетом никак не соотносится с якобы кривой работой полного соединения. В (31) и (40) вообще бред сивой кобылы.
|
|||
50
Fish
15.02.12
✎
15:58
|
(49) Ладно, может и бред, не такой уж я мега-гуру в запросах, да и не очень хорошо умею излагать мысли в письменном виде. :)) Но если мне что-то неясно, я открываю книгу, читаю примеры, и в результате у меня все соединения работают правильно. И не кричу при этом, что "1С глючит", т.к. считаю, что если у меня результат запроса не тот, который я ожидал - то это проблема в моём запросе, а не в 1с. Вот только это я и хотел сказать :)))
|
|||
51
SoulPower
15.02.12
✎
16:20
|
(38) Попробуйте с условиями и желательно с двух сторон, что-нибудь типа того:
Выбрать Товары.НомерСтроки, Серии.НомерСтроки ИЗ Документ.ВозвратТоваровОтКлиента.Товары КАК Товары Полное Соединение Документ.ВозвратТоваровОтКлиента.Серии КАК Серии ПО Товары.НомерСтроки = Серии.НомерСтроки Где Товары.Ссылка = &Ссылка Серии.Ссылка = &Ссылка1 |
|||
52
ssh2006
15.02.12
✎
16:22
|
(51) в чем вопрос?
|
|||
53
hhhh
15.02.12
✎
16:23
|
(51) надо писать
Где (Товары.Ссылка = &Ссылка ИЛИ Товары.Ссылка ЕСТЬ NULL) И (Серии.Ссылка = &Ссылка1 ИЛИ Серии.Ссылка ЕСТЬ NULL) привыкайте уже. |
|||
54
Fish
15.02.12
✎
16:30
|
(51) Тут дело не в работе полного соединения, а в неправильном условии. Ты накладываешь условие:
Где Товары.Ссылка = &Ссылка При этом у тебя одна таблица пустая, т.е. Товары.Ссылка = NULL, а это никак не будет равно &Ссылка. Вот поэтому в примере (42) поле "номенклатура" берётся из разных таблиц. |
|||
55
ssh2006
15.02.12
✎
16:32
|
(51) сработает как внутреннее соединение
|
|||
56
SoulPower
15.02.12
✎
16:43
|
(53) это не решает проблему.
(54) Не важно пустая таблица или нет. Товары.Ссылка = NULL, Вы уверены? Это табличная часть существующего документа, с чего ссылке быть пустой. (55) Именно. Но почему? |
|||
57
Жан Пердежон
15.02.12
✎
16:48
|
(56) тоже самое что и в (0)
потому что условие накладываются после выполнения соединения тоже самое будет в любой субд поддерживающей sql |
|||
58
depthzer0
15.02.12
✎
16:52
|
(56) ГДЕ надо заменить на И
|
|||
59
SoulPower
16.02.12
✎
16:17
|
Разобрался)
Создал таблицы в скуле и сверил. Работает правильно. Смутили некоторые моменты, которые не сразу очевидны. Бывает так) Спасибо за дискуссию, особенно Жану. Я учусь и был рад приобретённым знаниям. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |