powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Update через цикл While
13 сообщений из 13, страница 1 из 1
Update через цикл While
    #39926424
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.
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
Update через цикл While
    #39926432
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sadmann
Подскажите пожалуйста где я тут не прав, заранее спасибо!
Во первых, как вы отлаживаете, если у вас скрипт синтаксически неверный? Вы бы попробовали его выполнить, вы там пару запятых пропустили.

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


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

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

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


... и табуляцию всю в строках?? Уважаю!! :)
...
Рейтинг: 0 / 0
Update через цикл While
    #39926584
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в чем смысл циклы городить?
Для случая, если упорядочение по 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
Update через цикл While
    #39926592
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nullin, не convert(char(10), id) а str(id, 10)
...
Рейтинг: 0 / 0
Update через цикл While
    #39926629
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Update через цикл While
    #39926632
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Update через цикл While
    #39926634
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nullin
А в чем смысл циклы городить?
Очевидно, такое задание дал препод.
Вариант с одним запросом уже дали, в соседней теме ТС.
...
Рейтинг: 0 / 0
Update через цикл While
    #39926638
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Update через цикл While
    #39926649
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
nullin
А в чем смысл циклы городить?
Очевидно, такое задание дал препод.
Вариант с одним запросом уже дали, в соседней теме ТС.

Хорошо немножко мозги размять, делая в один проход.
...
Рейтинг: 0 / 0
Update через цикл While
    #39926650
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Update через цикл While
    #39926713
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Бредовое выражение, т.к 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
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Update через цикл While
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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