Имя: Пароль:
1C
1С v8
Помогите пожалуйста составить запрос
0 Иоган
 
15.04.16
12:09
в 1с есть таблица:
_____________
|1 | красный|
|2 | null   |
|3 | null   |
|4 | синий  |
|5 | null   |
|6 | белый  |
|7 | null   |
|8 | null   |
-------------

Как с помощью запроса вывести следующее?
_____________
|1 | красный|
|2 | красный|
|3 | красный|
|4 | синий  |
|5 | синий  |
|6 | белый  |
|7 | белый  |
|8 | белый  |
-------------

Важно: цвета могут быть любые, заранее значение не известно, количество NULLов также может быть любое, размер таблицы может быть любой

Спасибо большое
1 Necessitudo
 
15.04.16
12:41
Соединяй таблицу саму с собой через тета-соединение.
2 butterbean
 
15.04.16
12:43
(0) как ты получил такую таблицу? если запросом, то там и заполняй
3 ЛЮС
 
15.04.16
12:45
Где же такую бадагу спрашивают?

ВЫБРАТЬ
Т1.Н,
Максимум(Т2.Н) КАК Н2
Поместить ВТ
ИЗ Таб Как Т1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таб Как Т2
По Т2.Н >= Т1.Н И НЕ Т2.Ц ЕСТЬ NULL
;
Выбрать
ВТ.Н1,
Т3.Ц
ИЗ ВТ КАК ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таб как Т3
ПО ВТ.Н2 = Т3.Н
4 Иоган
 
15.04.16
13:57
(3) Это один знакомый из Екатеринбурга подкинул, ему при устройстве на работу задавали такую задачу. Я попытался разобрать, но знаний не хватило, не получилось. Вот и решил воспользоваться помощью формчан.

Спасибо за подсказку, однако, может быть я ошибаюсь, но мне кажется что условие

По Т2.Н >= Т1.Н И НЕ Т2.Ц ЕСТЬ NULL

Выдаст на выходе

_____________
|1 | белый  |
|2 | белый  |
|3 | белый  |
|4 | белый  |
|5 | белый  |
|6 | белый  |
|7 | белый  |
|8 | белый  |

разъясните пожалуйста, если я не прав
5 Иоган
 
15.04.16
14:00
(3) (4) Точнее так:

|1 | красный|
|2 | белый  |
|3 | белый  |
|4 | синий  |
|5 | белый  |
|6 | белый  |
|7 | белый  |
|8 | белый  |

Т.е. все нули заменит на белый
6 catena
 
15.04.16
14:57
Выбрать ТТ.НомСтр,ТТ.т, ЕстьNULL(ТТ2.т,ТТ.т) из (Выбрать Т1.НомСтр,Т1.т,Максимум(Т2.НомСтр) из Т1 как Т1
Левое соединение Т1 как Т2 по
    Т1.НомСтр>=Т2.НомСтр
    и не Т2.т есть NULL
    и Т1.т есть NULL
Сгруппировать по Т1.НомСтр,Т1.т
   ) как ТТ
   левое соединение Т1 как ТТ2
   по ТТ.НомСтр1 = ТТ2.НомСтр
7 Иоган
 
15.04.16
18:35
(6) что-то не выходит (
8 kittystark
 
16.04.16
08:31
выбрать 1 как номер , "красный" как цвет
поместить т1
объединить выбрать
2 , null  
объединить выбрать
3 , null  
объединить выбрать
4 , "синий"  
объединить выбрать
5 , null  
объединить выбрать
6 , "белый"  
объединить выбрать
7 , null  
объединить выбрать
8 , null   ;

выбрать *  поместить т2 из т1
где не цвет есть null;

выбрать * поместить т3
из т1 левое соединение т2
по т1.номер > т2.номер и т1.цвет есть null;

выбрать номер, максимум(номер1)
поместить т4
из т3
сгруппировать по номер;

выбрать т4.номер,цвет
из т4 левое соединение т2
по номер1 = т2.номер или т4.номер = т2.номер
9 Ildarovich
 
16.04.16
10:14
А вот еще через коррелированный запрос:
ВЫБРАТЬ
    Дано.Номер,
    ЕСТЬNULL(Выше.Цвет, Дано.Цвет)
ИЗ
    Дано КАК Дано
        ЛЕВОЕ СОЕДИНЕНИЕ Дано КАК Выше
        ПО (Дано.Цвет ЕСТЬ NULL )
            И (Выше.Номер В
                (ВЫБРАТЬ
                    МАКСИМУМ(Было.Номер) КАК Номер
                ИЗ
                    Дано КАК Было
                ГДЕ
                    Было.Номер < Дано.Номер
                    И НЕ Было.Цвет ЕСТЬ NULL ))
10 Ildarovich
 
16.04.16
10:33
А вот такой хитрый "регулярный" запрос может заполнить до семи пропусков в таблице:ВЫБРАТЬ
    Дано.Номер,
    ЕСТЬNULL(Дано.Цвет, Выше.Цвет) КАК Цвет
ПОМЕСТИТЬ Дано1
ИЗ
    Дано КАК Дано
        ЛЕВОЕ СОЕДИНЕНИЕ Дано КАК Выше
        ПО (Выше.Номер = Дано.Номер - 1)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Дано.Номер,
    ЕСТЬNULL(Дано.Цвет, Выше.Цвет) КАК Цвет
ПОМЕСТИТЬ Дано2
ИЗ
    Дано1 КАК Дано
        ЛЕВОЕ СОЕДИНЕНИЕ Дано1 КАК Выше
        ПО (Выше.Номер = Дано.Номер - 2)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Дано.Номер,
    ЕСТЬNULL(Дано.Цвет, Выше.Цвет) КАК Цвет
ИЗ
    Дано2 КАК Дано
        ЛЕВОЕ СОЕДИНЕНИЕ Дано2 КАК Выше
        ПО (Выше.Номер = Дано.Номер - 4)

Семь - потому, что 4 * 2 - 1 = 7. Дальше последняя секция может повторяться с числами 8, 16, 32, 64 и так далее для заполнения 15, 31, 63, 127 пропусков соответственно. С некоторыми оговорками на очень больших объемах данных (тысячи строк) этот подход будет быстрее, чем в (8), поскольку не использует тэта-соединений.
11 Zhuravlik
 
16.04.16
10:37
В закладки
12 Иоган
 
16.04.16
11:51
(10) (9) ООО! Вот это супер! Спасибо большое! я думаю вы на инфостарте под тем же логином пишите. Читал ваши публикации. Буду стремиться к вашему уровню!
13 wertyu
 
16.04.16
12:04
(9) ЕСТЬNULL(Выше.Цвет, Дано.Цвет)

местами поменять
14 Ildarovich
 
16.04.16
13:10
(13) нет разницы. Там получается одно из двух всегда NULL.
15 rsv
 
16.04.16
13:47
Ипользование после По гирлянд подзапросов .... Приведет к тому что ждать соединения таблиц на обьеме можно дооолго и не дождаться вообще
16 Ildarovich
 
16.04.16
14:17
(15) да, с использованием коррелированных запросов есть такой риск. Зависит от СУБД. Но иногда по скорости, наоборот, может быть очень большой выигрыш. Посмотрите, например, задачу 5 в http://catalog.mista.ru/public/427180/ . Там приведен подробный анализ с демонстрацией планов выполнения запросов.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.