(3) Принципов несколько, если не выполняется одно условие проверяется другое. Мне удалось при помощи упорядочивания сделать строки первыми. Но видимо кроме нумерации других вариантов нет
(4) Зависимо от условии сортировки можно добавить еще одну колонку типа булево, а потом фильтровать по этому колонку. Вроде так:
Поле1 Поле2 Поле3 Поле4
Знач1 Вася Сауна Истина
Знач2 Петя Дом Истина
Знач2 Сережа Дом Ложь
Знач2 Андрей Дом Ложь
Знач3 Иван Бильярд Истина
Знач3 Веня Бильярд Ложь
после фильтра где Поле4 = Истина, будет необходимый результат.
(26) Полей несколько и условий тоже. Если числа в двух строках совпадут то проверяется следующее. А если в конце остается несколько строк, то и берем любое
К примеру, можно пронумеровать записи запроса, а после группировки обернуть все еще одним запросом, где выберутся только записи, в которых Номер = 1.
Поищите примеры нумерации в запросе. Так, на вскидку, из интернета:
ВЫБРАТЬ
Контрагенты.Наименование,
1 КАК НомерСтроки
ПОМЕСТИТЬ ВТ
ИЗ
Справочник.Контрагенты КАК Контрагенты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Контрагенты.Наименование КАК Наименование,
СУММА(ВТ.НомерСтроки) КАК НомерСтроки
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ
ПО Контрагенты.Наименование <= ВТ.Наименование
СГРУППИРОВАТЬ ПО
Контрагенты.Наименование
УПОРЯДОЧИТЬ ПО
НомерСтроки
Показать
Результат на примере таблиц
Таблица1:
Петров | 1
Иванов | 1
Сидовров | 1
Таблица2 (с соединением)
Петров | 1
Иванов | 1
Иванов | 1
Сидоров | 1
Сидоров | 1
Сидоров | 1
После группировки по 1-му полю:
Петров |1
Иванов|2
Сидоров|3
(18) "ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1 ... )" - такое не взлетит. Это ж коррелирующий подзапрос предполагается, а в нем не получится наложить условия по данным первой таблицы. Или я не до конца понял, как вы предлагаете.
Этим же приемом я пользовался, когда пробовал себя в программировании под SQL, для исключения задвоений строк с данными из-за ошибочных задвоений в связанных через соединение справочниках. Скорость запроса падает, но достоверность результата 100%. В 1С это, похоже, запрещенный прием )
(22) Ключевая фраза "ПОЧТИ такой же". Да не такой. В "ГДЕ" основного запроса - там да, работает. Там доступны поля внешнего запроса. А в соединении поля из другой внешней таблицы доступны не будут.
Но сабжевую задачу как раз можно решить полностью аналогично примеру Гилева. Я забыл совсем, что "В" можно по нескольким полям накладывать сразу. Подобную конструкцию использовал, но только на одно поле.
Нужно сначала сделать вложений запрос по Знач1,Знач2,Знач3, где выбрать различние.
а потом результат вложенго запроса связать внутренним соединением с основным набором даных.
(16) Нет. Да и вообще, какой смысл нумеровать порядок записей, если в запросе они могут появиться в произвольном порядке. Т.е. выбранная сейчас первая запись, во втором запросе может быть уже не первой
Слово "первые" напрягает, одному ежу понятно, какая именно запись должна считаться первой. Ну да ладно, допустим первость здесь равносильна случайности.
Я где-то видел такой способ. Ключевое поле берем как есть, а второе берем агрегированно (например, макс). и группируем по ключевому. Но это было с двумя полями, ради третьего придется джойнить. Но попробовать можешь, суть думаю ясна.
Например, селект базтаб.поле1, макс(поле2) как поле2макс, поле3 фром базоваятаблица иннер джойн базоваятаблица как базтаб по поле3 = базтаб.поле3 и поле2макс = базтаб.поле2
вроде как-то так. И оно работало, но при условии того, что запись для каждого поле2---поле3 всегда одна и не более. Что касается оптимальности, то такой запрос летает.
p.s. на самом деле я забыл в "примере" про группировку. Конечно же, запрос с агрегацией должен быть без джоина и с группировкой по полю3, а уже следующий запрос должен взять этот запрос и джойнить с базовой таблицей. Но я же суть рассказываю все же, а не пытаюсь сделать все за автора.
(25) А у меня как положено отрабатывает. На 8.3.6 клиент-сервер.
У Гилева там в конце приписка есть - "Кроме того, в некоторых версиях файлового варианта условие ГДЕ из-за ошибки платформы 8.2 не срабатывает."
Может, актуально до сих пор :)
ВЫБРАТЬ "Петя" КАК Ф, 1 КАК К1, 1 КАК К2, 1 КАК К3, 1 КАК К4
ПОМЕСТИТЬ Дано
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ "Петя", 2, 0, 0, 0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ "Петя", 3, 0, 0, 0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ "Вася", 5, 5, 5, 5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ "Вася", 7, 8, 9, 12
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ "Женя", 4, 4, 4, 4
;
ВЫБРАТЬ РАЗЛИЧНЫЕ Ф, К1, К2, К3, К4
ИЗ Дано
ГДЕ (Ф, К1, К2, К3, К4)
В (ВЫБРАТЬ ПЕРВЫЕ 1 * ИЗ Дано КАК ВСЁ ГДЕ ВСЁ.Ф = Дано.Ф)
ВЫБРАТЬ "Петя" КАК Ф, 1 КАК К1, 1 КАК К2, 1 КАК К3, 1 КАК К4
ПОМЕСТИТЬ Дано
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ "Петя", 2, 0, 0, 0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ "Петя", 3, 0, 0, 0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ "Вася", 5, 5, 5, 5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ "Вася", 7, 8, 9, 12
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ "Женя", 4, 4, 4, 4
;
ВЫБРАТЬ РАЗЛИЧНЫЕ Ф, К1, К2, К3, К4
ИЗ Дано
ГДЕ (Ф, К1, К2, К3, К4)
В (ВЫБРАТЬ ПЕРВЫЕ 1 * ИЗ Дано КАК ВСЁ ГДЕ ВСЁ.Ф = Дано.Ф)
Показать
да и у меня на 8.2.19.102 Клиент-Сервер - выводит все записи...
(27) Спасибо, очень помогло. Я и не знал, что когда соединяешь в области ГДЕ с вложенной таблицей, то во вложенную таблицу передается ТЕКУЩАЯ ЗАПИСЬ основного запроса. Например
ВЫБРАТЬ
Т1.Группировка1,
Т1.Поле1
ИЗ
ВТ КАК Т1
ГДЕ
Т1.Поле1 В (
ВЫБРАТЬ ПЕРВЫЕ 1
Т2.Поле1
ИЗ
ВТ КАК Т2
ГДЕ
Т2.Группировка1 = Т1.Группировка1)
Показать
Здесь видно во вложенной таблице фигурирует прямым образом (!) строка из основной таблицы Т1.*
То есть получается во вложенную таблицу передается текущая строка таблицы Т1, и можно сузить выборку таблицы 2 по ней, используя ГДЕ Т2.Группировка1 = Т1.Группировка1.