Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Update через цикл While / 13 сообщений из 13, страница 1 из 1
13.02.2020, 19:51
    #39926424
Sadmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update через цикл While
Доброго вечера!
Подскажите пожалуйста где я тут не прав, заранее спасибо!

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
 set nocount on
   if isnull(object_id('tempdb..#t1'),0) <> 0
     drop table #t1

    create table #t1 (
                     ID          int identity(1,1)
                     FirstValue  varchar(20),
                     SecondValue varchar(20)
                     )

    insert into #t1 (FirstValue, SecondValue)
    select '', '1.1 Клиенты'  union all
    select '', 'Клиент 1'     union all
    select '', 'Клиент 2'     union all
    select '', 'Клиент 3'     union all
    select '', '1.2 Партнеры' union all
    select '', 'Партнер 1'    union all
    select '', 'Партнер 2'    union all
    select '', 'Партнер 3'    

    begin tran

    declare @ID          int,
            @SecondValue varchar(20)

    select @ID          = 0
           @SecondValue = ''

    while 1 = 1
    begin
    select @ID = min(ID)
      from #t1
     where ID > @ID
    if @ID is null break

    select @SecondValue = SecondValue
      from #t1
     where ID = @ID

    if isnull(@SecondValue,'') <> ''
    begin
      update #t1
      set FirstValue = (
                        select top 1 SecondValue
                          from #t1
                         where ID <= @ID
                           and SecondValue like '1.%'
                        order by ID desc
                       )
      where FirstValue = ''
    end
    end

    rollback



Получается:
https://i.stack.imgur.com/hr8u4.png

А нужно:
https://i.stack.imgur.com/CnyDf.png
...
Рейтинг: 0 / 0
13.02.2020, 20:18
    #39926432
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update через цикл While
Sadmann
Подскажите пожалуйста где я тут не прав, заранее спасибо!
Во первых, как вы отлаживаете, если у вас скрипт синтаксически неверный? Вы бы попробовали его выполнить, вы там пару запятых пропустили.

А не правы вы в том, что в UPDATE забыли добавить условие
Код: sql
1.
and ID = @ID


и поэтому первый же апдэйт измкенил все записи в таблице, а остальные апдэйты в цикле не отрабатывали из за условия
Код: sql
1.
FirstValue = ''

(которое на самом деле вообще не нужно)
...
Рейтинг: 0 / 0
13.02.2020, 20:33
    #39926440
Sadmann
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update через цикл While
За ошибки извиняюсь, студия стоит там где нет интернета, и нельзя скопировать, набирал вручную в сообщении.
За разъяснения большое спасибо!)
...
Рейтинг: 0 / 0
14.02.2020, 10:13
    #39926572
PsyMisha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update через цикл While
Sadmann

набирал вручную в сообщении


... и табуляцию всю в строках?? Уважаю!! :)
...
Рейтинг: 0 / 0
14.02.2020, 10:47
    #39926584
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update через цикл While
А в чем смысл циклы городить?
Для случая, если упорядочение по ID допускает, что 1.0 может появиться после 1.1
Предполагаю, только данный факт мог сподвигнуть на такое.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with u(FirstValue, uFirstValue) as
(select t.FirstValue
      , stuff(max(iif(t.SecondValue like '1.%'
                    , concat(convert(char(10), t.ID), t.SecondValue)
                    , ''))
              over(order by t.ID)
            , 1
            , 10
            , '')
   from #t1 t)
   
update u
   set FirstValue = uFirstValue


А если нет, то достаточно
Код: sql
1.
max(iif(t.SecondValue like '1.%', t.SecondValue, '')) over(order by t.ID) a
...
Рейтинг: 0 / 0
14.02.2020, 11:07
    #39926592
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update через цикл While
nullin, не convert(char(10), id) а str(id, 10)
...
Рейтинг: 0 / 0
14.02.2020, 12:17
    #39926629
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update через цикл While
Sadmann,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
WITH a (id, val) AS (
    SELECT  1, '1.1 Клиенты'  UNION ALL
    SELECT  2, 'Клиент 1'     UNION ALL
    SELECT  3, 'Клиент 2'     UNION ALL
    SELECT  4, 'Клиент 3'     UNION ALL
    SELECT  5, '1.2 Партнеры' UNION ALL
    SELECT  6, 'Партнер 1'    UNION ALL
    SELECT  7, 'Партнер 2'    UNION ALL
    SELECT  8, 'Партнер 3')
SELECT 
       a.id
     , z.a AS   FirstValue
     , a.val AS SecondValue
FROM 
     a
     CROSS APPLY
                (
                 SELECT TOP (1) 
                        b.val
                 FROM 
                      a AS b
                 WHERE b.id <= a.id
                       AND b.val LIKE '%[0-9].[0-9]%'
                        ORDER BY 
                                 b.id DESC
     ) AS z(a);
...
Рейтинг: 0 / 0
14.02.2020, 12:23
    #39926632
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update через цикл While
nullin, точнее без танцев с бубном немного не обошлось:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with u(FirstValue, uFirstValue) as
(select t.FirstValue
      , stuff(max(iif(t.SecondValue like '%.%' and t.SecondValue not like '[^.0-9]%'
                    , concat(str(t.ID, 10), t.SecondValue)
                    , ''))
               over(order by t.ID), 1, 10, '') uFirstValue

   from #t1 t)
   
update u
   set FirstValue = uFirstValue
 where uFirstValue like '1.%'


fiddle
...
Рейтинг: 0 / 0
14.02.2020, 12:24
    #39926634
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update через цикл While
nullin
А в чем смысл циклы городить?
Очевидно, такое задание дал препод.
Вариант с одним запросом уже дали, в соседней теме ТС.
...
Рейтинг: 0 / 0
14.02.2020, 12:27
    #39926638
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update через цикл While
Sadmann,

или так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
WITH a (id, val) AS (
    SELECT  1, '1.1 Клиенты'  UNION ALL
    SELECT  2, 'Клиент 1'     UNION ALL
    SELECT  3, 'Клиент 2'     UNION ALL
    SELECT  4, 'Клиент 3'     UNION ALL
    SELECT  5, '1.2 Партнеры' UNION ALL
    SELECT  6, 'Партнер 1'    UNION ALL
    SELECT  7, 'Партнер 2'    UNION ALL
    SELECT  8, 'Партнер 3')
SELECT 
       a.id
     , z.a AS   FirstValue
     , a.val AS SecondValue
FROM 
     a
     CROSS APPLY
                (
                 SELECT TOP (1) 
                        b.val
                 FROM 
                      a AS b
                 WHERE b.id <= a.id
                       AND b.val LIKE '%[0-9].[0-9]%'
                        ORDER BY 
                                 b.id DESC
     ) AS z(a)
WHERE a.val NOT LIKE '%[0-9].[0-9]%';
...
Рейтинг: 0 / 0
14.02.2020, 12:33
    #39926649
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update через цикл While
alexeyvg
nullin
А в чем смысл циклы городить?
Очевидно, такое задание дал препод.
Вариант с одним запросом уже дали, в соседней теме ТС.

Хорошо немножко мозги размять, делая в один проход.
...
Рейтинг: 0 / 0
14.02.2020, 12:34
    #39926650
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update через цикл While
Sadmann,

Код: sql
1.
isnull(@SecondValue,'') <> ''



Бредовое выражение, т.к null никогда не равен пустой строке и вообще какой-бы то ни было строке.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare @SecondValue char;

if isnull(@SecondValue,'') <> ''
	print 'ok'
else
	print 'bad'

if @SecondValue <> ''
	print 'ok'
else
	print 'bad'
...
Рейтинг: 0 / 0
14.02.2020, 14:26
    #39926713
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update через цикл While
Владислав Колосов
Бредовое выражение, т.к null никогда не равен пустой строке и вообще какой-бы то ни было строке.


Любое сравнение с null дает unknown а не false. В вашем простом примере @SecondValue <> '' результатом вычисление логического выражения будет unknown, и так как это не true, то выполнение уйдет в ветку else.

Достаточно поместить ваше @SecondValue <> '' в более сложное условие not (@SecondValue <> ''), и результат меняется, т.к. not от unknown это тоже unknown.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare @SecondValue char;

if not (isnull(@SecondValue,'') <> '')
	print 'ok'
else
	print 'bad'

if not (@SecondValue <> '')
	print 'ok'
else
	print 'bad'
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Update через цикл While / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]