Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
Здравствуйте

Подскажите пожалуйста почему у меня возникает ошибка, при использовании в SET функции isNull() или оператора is NULL?

Таблица table_1

P LINK
--------------------------------

| NULL | 100 |
| NULL | 200 |
| NULL | 300 |
| 11 | 400 |
| NULL | 500 |
--------------------------------

UPDATE table_1
   SET P = ( select isNULL(max(P), (select isNULL(max(P), 0) + 1 from table_1))
               from table_1 
	      where link = selrow.link 
           )         
  FROM (select LINK from table_1) SELROW
 WHERE table_1.link = selrow.link
20 июн 14, 09:41    [16193277]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nechto
почему у меня возникает ошибка,

И вы даже прочитали текст этой ошбки ?
20 июн 14, 09:51    [16193319]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
aleks2
Guest
Выполните

select P
   , ( select isNULL(max(P), (select isNULL(max(P), 0) + 1 from table_1))
               from table_1 
	      where link = selrow.link 
           )         
  FROM (select LINK from table_1) SELROW
 WHERE table_1.link = selrow.link

и прослезитесь.
20 июн 14, 09:57    [16193367]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
aleks2
Выполните

select P
   , ( select isNULL(max(P), (select isNULL(max(P), 0) + 1 from table_1))
               from table_1 
	      where link = selrow.link 
           )         
  FROM (select LINK from table_1) SELROW
 WHERE table_1.link = selrow.link

и прослезитесь.


Да вы что! Ты прям для меня Америку раскрыл. Я и так знаю, что этот внутренний запрос работает без проблем.
А вот в связке с UPDATE, выдает в результате выполнения следующее.

автор
Внимание! Значение NULL исключено в агрегатных или других операциях SET.
20 июн 14, 10:18    [16193542]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nechto
А вот в связке с UPDATE, выдает в результате выполнения следующее.

автор
Внимание! Значение NULL исключено в агрегатных или других операциях SET.

1. Это не ошибка (error). Это предупреждение (warning)
2. Что непонятного в сообщении ?
20 июн 14, 10:20    [16193556]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Nechto
Я и так знаю
Значит, должны знать, что агрегатные функции игнорируют NULL?
20 июн 14, 10:27    [16193604]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4806
Nechto
aleks2
Выполните

select P
   , ( select isNULL(max(P), (select isNULL(max(P), 0) + 1 from table_1))
               from table_1 
	      where link = selrow.link 
           )         
  FROM (select LINK from table_1) SELROW
 WHERE table_1.link = selrow.link

и прослезитесь.


Да вы что! Ты прям для меня Америку раскрыл. Я и так знаю, что этот внутренний запрос работает без проблем.
А вот в связке с UPDATE, выдает в результате выполнения следующее.

автор
Внимание! Значение NULL исключено в агрегатных или других операциях SET.


Обычная ситуация, NULL в агрегатах игнорируется.
20 июн 14, 12:34    [16194621]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
+
http://msdn.microsoft.com/ru-ru/library/ms173454.aspx


Выходит функция max игнорируется в SET, я правильно понял?

И даже если я использую такое выражение isNULL(max(P), 0), то всё равно из-за мах() игнорируются все выражение в целом?
20 июн 14, 12:52    [16194774]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nechto
Выходит функция max игнорируется в SET, я правильно понял?

Выходит, что кт-то не знает разницы между результатом функции и параметром функции.
20 июн 14, 12:55    [16194798]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Nechto
+
http://msdn.microsoft.com/ru-ru/library/ms173454.aspx


Выходит функция max игнорируется в SET, я правильно понял?

И даже если я использую такое выражение isNULL(max(P), 0), то всё равно из-за мах() игнорируются все выражение в целом?
При вычислении max(P) строки с P IS NULL пропускаются.
Так понятней?
20 июн 14, 13:02    [16194842]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
Сделал так
 UPDATE table_1
    SET P = ( select isNULL(P, (select TOP 1 isNULL(P, 0) + 1 
                                           from table_1 
	   				  order by 1 desc))
                    from table_1 
	          where link = selrow.link 
            )         
   FROM (select LINK from table_1) SELROW
  WHERE table_1.link = selrow.link


Этого сообщения больше не выходит.
автор
Внимание! Значение NULL исключено в агрегатных или других операциях SET.


Только вот всё равно не так работает как надо.

P LINK
--------------------------------

| NULL | 100 |
| NULL | 200 |
| NULL | 300 |
| 11 | 400 |
| NULL | 500 |
--------------------------------

На выходе должно получиться так:

P LINK
--------------------------------

| 12 | 100 |
| 13 | 200 |
| 14 | 300 |
| 11 | 400 |
| 15 | 500 |
--------------------------------

Не могу понять, почему не получатся? :(
20 июн 14, 13:38    [16195164]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nechto
Не могу понять, почему не получатся?

начните с написания select-а
20 июн 14, 13:40    [16195175]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Nechto,

кстати, а зачем апдейтить все строки, если надо только P IS NULL?
Зачем прибавлять 1 к общему максимуму по таблице?
Да и максимум только в пределах конкретного LINK...
А по выходной картинке видна глобальная нумерация.
Напрашивается прибавление к глобальному максимуму ROW_NUMBER()OVER() для P IS NULL
20 июн 14, 13:54    [16195278]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
iap
Nechto,

кстати, а зачем апдейтить все строки, если надо только P IS NULL?
Зачем прибавлять 1 к общему максимуму по таблице?
Да и максимум только в пределах конкретного LINK...
А по выходной картинке видна глобальная нумерация.
Напрашивается прибавление к глобальному максимуму ROW_NUMBER()OVER() для P IS NULL
Для старых версий можно прибавлять и COUNT(*), но тогда для одинаковых LINK получится один и тот же номер.
20 июн 14, 13:55    [16195292]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
Glory
Nechto
Не могу понять, почему не получатся?

начните с написания select-а


Селект я смотрел, если его запустить отдельно без update то P будут все 12.

Может, я не совсем понимаю очерёдность, выполнения логики update

Очередность:
1. Выполняется загрузка всех LINK
2. Выполняет сравнение в where и построчно выполняет присвоение значений в set и сохраняет в таблицу
3. Синхронно с пунктом 2., выполняет запрос столько раз сколько сколько найдено строк в пункт 1

 UPDATE table_1 
SET P =( select isNULL(P, (select TOP 1 isNULL(P, 0) + 1
from table_1
order by 1 desc))
from table_1
where link = selrow.link
)

FROM (select LINK from table_1) SELROW
WHERE table_1.link = selrow.link

А работает данный запрос, как будто, сначала данные собираются, потом по каждой строке отрабатывает пункт 2. А потом все данные попадают в поле "P". из-за это все значения в поле P равны 11.

Я правильно понимаю?
20 июн 14, 14:05    [16195350]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
update table_1
   set P = case LINK
             when 100 then 12
             when 200 then 13
             when 300 then 14
             else 15
          end
 where LINK <> 400

вот готовое решение.
оно, пожалуй, лучшее до тех пор, пока ТС не опишет обновляемые данные несколько подробнее )
20 июн 14, 14:06    [16195354]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nechto
Селект я смотрел, если его запустить отдельно без update то P будут все 12.

А что тогда должно было поменяться в UPDATE ?

Nechto
2. Выполняет сравнение в where и построчно выполняет присвоение значений в set и сохраняет в таблицу

Вот с чего вы решили, что UPDATE построчно выполняется ? Да еще "Синхронно с пунктом 2., выполняет запрос столько раз сколько сколько найдено строк в пункт 1" ?
20 июн 14, 14:07    [16195360]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
[quot Glory]
Nechto
Вот с чего вы решили, что UPDATE построчно выполняется ? Да еще "Синхронно с пунктом 2., выполняет запрос столько раз сколько сколько найдено строк в пункт 1" ?


Ну да соответственно и пункт 3. выполняется столько же раз. Только вот пункт 3., будет возвращать "12", если только данные, поочерёдно не будут вноситься в таблицу.
20 июн 14, 14:12    [16195386]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nechto
Ну да соответственно и пункт 3. выполняется столько же раз.


Сначала формируется значения для всех записей
Потому эти значения заносятся в таблицу
20 июн 14, 14:14    [16195396]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
Glory
Nechto
Селект я смотрел, если его запустить отдельно без update то P будут все 12.

А что тогда должно было поменяться в UPDATE ?


Результат
     P          LINK               
--------------------------------

| 12 | 100 |
| 13 | 200 |
| 14 | 300 |
| 11 | 400 |
| 15 | 500 |
--------------------------------

А получает так
     P          LINK               
--------------------------------

| 12 | 100 |
| 12 | 200 |
| 12 | 300 |
| 11 | 400 |
| 12 | 500 |
--------------------------------
20 июн 14, 14:16    [16195409]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
Nechto
Glory
пропущено...

А что тогда должно было поменяться в UPDATE ?


Результат
     P          LINK               
--------------------------------

| 12 | 100 |
| 13 | 200 |
| 14 | 300 |
| 11 | 400 |
| 15 | 500 |
--------------------------------

А получает так
     P          LINK               
--------------------------------

| 12 | 100 |
| 12 | 200 |
| 12 | 300 |
| 11 | 400 |
| 12 | 500 |
--------------------------------


значит надо изменит 12 на 15
20 июн 14, 14:17    [16195419]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nechto
Glory
пропущено...

А что тогда должно было поменяться в UPDATE ?


Результат
     P          LINK               
--------------------------------

| 12 | 100 |
| 13 | 200 |
| 14 | 300 |
| 11 | 400 |
| 15 | 500 |
--------------------------------
А получает так
     P          LINK               
--------------------------------

| 12 | 100 |
| 12 | 200 |
| 12 | 300 |
| 11 | 400 |
| 12 | 500 |
--------------------------------

Вопрос был - если ваш select возвращает такие результаты, то почему в update должны быть другие результаты ?
У вас мышление построчной работы с таблицами.
20 июн 14, 14:19    [16195436]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Nechto,

Вы ответы читаете?
Или не стоит и стараться?
20 июн 14, 14:21    [16195448]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
iap
Nechto,
Вы ответы читаете?
Или не стоит и стараться?


Конечно читаю. то что я привёл в примере это краткий запрос, для простоты восприятия.

UPDATE table_1
SET P = ( select isNULL(P, РОВНУМ ВЫ ПРЕДЛАГАЕТЕ ЗДЕСЬ ИСПОЛЬЗОВАТЬ (select TOP 1 isNULL(P, 0) + 1
from table_1
order by 1 desc)
)
from table_1

where link = selrow.link
)
FROM (select LINK from table_1) SELROW
WHERE table_1.link = selrow.link
20 июн 14, 14:31    [16195545]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
Glory
Nechto
пропущено...


Результат
     P          LINK               
--------------------------------

| 12 | 100 |
| 13 | 200 |
| 14 | 300 |
| 11 | 400 |
| 15 | 500 |
--------------------------------
А получает так
     P          LINK               
--------------------------------

| 12 | 100 |
| 12 | 200 |
| 12 | 300 |
| 11 | 400 |
| 12 | 500 |
--------------------------------

Вопрос был - если ваш select возвращает такие результаты, то почему в update должны быть другие результаты ?
У вас мышление построчной работы с таблицами.


Ну вот этот кусочек скрипта, разве не должен менять всю картину
UPDATE table_1
SET P = ( select isNULL(P,
(select TOP 1 isNULL(P, 0) + 1
from table_1
order by 1 desc)
)
from table_1
where link = selrow.link
)
FROM (select LINK from table_1) SELROW
WHERE table_1.link = selrow.link
20 июн 14, 14:34    [16195580]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Nechto
Конечно читаю
Обманывать нехорошо.
Вам виднее, конечно...
20 июн 14, 14:35    [16195595]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nechto
Ну вот этот кусочек скрипта, разве не должен менять всю картину

Не должен
20 июн 14, 14:36    [16195605]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
iap
Nechto
Конечно читаю
Обманывать нехорошо.
Вам виднее, конечно...


Поверьте на слово. Врать мне ни к чему.
Поняв что со своим способом реализации я зашёл в тупик, курю ваш.
20 июн 14, 14:40    [16195641]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
iap
Nechto,

кстати, а зачем апдейтить все строки, если надо только P IS NULL?
Зачем прибавлять 1 к общему максимуму по таблице?
Да и максимум только в пределах конкретного LINK...
А по выходной картинке видна глобальная нумерация.
Напрашивается прибавление к глобальному максимуму ROW_NUMBER()OVER() для P IS NULL


По ходу дела ROW_NUMBER()OVER(), тоже не подходит. Поскольку он производит нумерацию всегда с самого начала.
Может вы как то по другому реализацию запроса представляете, напишите пожалуйста?
20 июн 14, 15:10    [16195877]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nechto
По ходу дела ROW_NUMBER()OVER(), тоже не подходит. Поскольку он производит нумерацию всегда с самого начала.

А прибавить к полученным номерам смещение непредставлется возможном, да ?
20 июн 14, 15:12    [16195900]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
Glory
Nechto
По ходу дела ROW_NUMBER()OVER(), тоже не подходит. Поскольку он производит нумерацию всегда с самого начала.

А прибавить к полученным номерам смещение непредставлется возможном, да ?


Как вы это представляете, напишите пожалуйста? Я уже весь измаялся и запутался.
20 июн 14, 15:16    [16195922]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nechto
Как вы это представляете, напишите пожалуйста?

Прибавить - это оператор +
20 июн 14, 15:17    [16195930]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
Nechto
Как вы это представляете, напишите пожалуйста? Я уже весь измаялся и запутался.



новерно вы пока не решили


исползуйте етот скрипт

и изучите немножко MSSQL


CREATE TABLE #table1
(
	P int NULL
	,Link int NOT NULL
);
INSERT INTO #table1
SELECT NULL, 100
UNION ALL SELECT NULL, 200
UNION ALL SELECT NULL, 300
UNION ALL SELECT 11, 400
UNION ALL SELECT NULL, 500; 


select * from #table1;

WITH Base AS (SELECT MAX(COALESCE(P,0)) AS MP FROM #table1)
	,OffSet AS (SELECT *, ROW_NUMBER() OVER (ORDER BY Link) AS rn FROM #table1 WHERE P IS NULL)
UPDATE S
SET P = B.MP + S.rn
FROM OffSet S, Base B;

select * from #table1;
20 июн 14, 15:34    [16196074]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
а у вас версия mssql какая?болше 2005?
20 июн 14, 15:45    [16196156]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
yaxta
UPDATE S
SET P = B.MP + S.rn
FROM OffSet S, Base B;

сие конечно шедевр :)
20 июн 14, 16:01    [16196311]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
Maxx
yaxta
UPDATE S
SET P = B.MP + S.rn
FROM OffSet S, Base B;

сие конечно шедевр :)



а что сдес шедевр

ето второй вариант



CREATE TABLE #table1
(
	P int NULL
	,Link int NOT NULL
);
INSERT INTO #table1
SELECT NULL, 100
UNION ALL SELECT NULL, 200
UNION ALL SELECT NULL, 300
UNION ALL SELECT 11, 400
UNION ALL SELECT NULL, 500; 


select * from #table1;


UPDATE t1
SET P = T.P1
FROM #table1  t1
CROSS Apply
(SELECT TOP 1 isNULL(P, 0) + 1 P1 FROM #table1 as  t2 WHERE t1.link=t2.link)T
20 июн 14, 16:20    [16196482]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
yaxta
а что сдес шедевр

declare @t table (i int, c int)
declare @t2 table (i int, c int)
insert into @t (i,c)
select 1,1
union
select 2,2
insert into @t2 (i,c)
select 3,1
union
select 4,2

select
  x = t.i +t1.i
from @t t, @t2 t1 
20 июн 14, 16:32    [16196568]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
Maxx
yaxta
а что сдес шедевр

select
  x = t.i +t1.i
from @t t, @t2 t1 


нет шедевр етот скрипт
20 июн 14, 16:40    [16196623]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Maxx
yaxta
а что сдес шедевр

declare @t table (i int, c int)
declare @t2 table (i int, c int)
insert into @t (i,c)
select 1,1
union
select 2,2
insert into @t2 (i,c)
select 3,1
union
select 4,2

select
  x = t.i +t1.i
from @t t, @t2 t1 
В Base ведь гарантированно одна запись.
И это спасает.
20 июн 14, 18:54    [16197337]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
iap,

спасибо вам ребята
iap и maxx

спасибо за вниманию етот скрипт
20 июн 14, 22:52    [16198330]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
yaxta,

ребята ест другой вариант тоже
с помошю Apply
UPDATE t1 SET 
	P = T.NewP
FROM table_1 t1
CROSS APPLY (
	SELECT NewP = ISNULL(MAX(p),0)+1 
	FROM table_1 t2 
	WHERE t1.link = t2.link
) t
20 июн 14, 23:29    [16198563]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
yaxta
Nechto
Как вы это представляете, напишите пожалуйста? Я уже весь измаялся и запутался.



новерно вы пока не решили


исползуйте етот скрипт

и изучите немножко MSSQL


CREATE TABLE #table1
(
	P int NULL
	,Link int NOT NULL
);
INSERT INTO #table1
SELECT NULL, 100
UNION ALL SELECT NULL, 200
UNION ALL SELECT NULL, 300
UNION ALL SELECT 11, 400
UNION ALL SELECT NULL, 500; 


select * from #table1;

WITH Base AS (SELECT MAX(COALESCE(P,0)) AS MP FROM #table1)
	,OffSet AS (SELECT *, ROW_NUMBER() OVER (ORDER BY Link) AS rn FROM #table1 WHERE P IS NULL)
UPDATE S
SET P = B.MP + S.rn
FROM OffSet S, Base B;

select * from #table1;


Этот вариант тоже не подходит. Поскольку данные в этом случае в update опять же используются статические, тоже самое и с использованием с APLLY.
Вся загвоздка в том, что select отрабатывает когда данные в поле P равны NULL, и результат уже грубо говоря статический попадает в UPDATE.

Вот что я пытаюсь получить, попробую объяснить на примере корретки.
     
P LINK Atrb_1
--------------------------------

| NULL | 100 | 1 -- # ищем значение P(?) по Atrb_1(1). Не нашли, значить ищем максимальное значение P + 1 и сохраняем (12).
| NULL | 200 | 1 -- # ищем значение P(?) по Atrb_1(1). Нашли, значить (12) сохраняем.
| NULL | 300 | 3 -- # ищем значение P(?) по Atrb_1(3). Нашли, значить (11) сохраняем.
| 11 | 400 | 3 -- # ищем значение P(?) по Atrb_1(3). Нашли, значить (11) сохраняем.
| NULL | 500 | 1 -- # ищем значение P(?) по Atrb_1(1). Нашли, значить (12) сохраняем.
| NULL | 600 | 4 -- # ищем значение P(?) по Atrb_1(4). Не нашли, значить ищем максимальное значение P + 1 и сохраняем (13).
| NULL | 100 | 4 -- # ищем значение P(?) по Atrb_1(4). Нашли, значить (13) сохраняем.
--------------------------------

В результате на выходе получаем:
    
P LINK Atrb_1
--------------------------------

| 12 | 100 | 1
| 12 | 200 | 1
| 11 | 300 | 3
| 11 | 400 | 3
| 12 | 500 | 1
| 13 | 600 | 4
| 13 | 100 | 4
--------------------------------

Такой способ не может работать как корретка. чтобы каждый SET выполнял динамичный поиск значения P по атрибутам.
UPDATE B SET 
	   P = T.NewP
  FROM TestDB.dbo.Test B
 CROSS APPLY ( select NewP = isNULL(P, (select TOP 1 isNULL(P, 0) + 1 
                                          from TestDB.dbo.Test 
	   				                     order by 1 desc)) 
                 from TestDB.dbo.Test 
	            where link = B.LINK) T



Поэтому я и пробовал, реализовать что - то вроде этого.
UPDATE table_1
    SET P = ( select isNULL(P, (select TOP 1 isNULL(P, 0) + 1 
                                           from table_1 
	   				  order by 1 desc))
                    from table_1 
	          where link = selrow.link 
            )         
   FROM (select LINK from table_1) SELROW
  WHERE table_1.link = selrow.link


Но к сожалению не выходит.
22 июн 14, 12:14    [16202377]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
invm
Member

Откуда: Москва
Сообщений: 9438
declare @t table (P int, Link int, Attrib_1 int);

insert into @t
values
(NULL, 100, 1),
(NULL, 200 , 1),
(NULL, 300, 3),
(11, 400, 3),
(NULL, 500, 1),
(NULL, 600, 4),
(NULL, 100, 4);

with x as
(
 select
  *,
  max(P) over (partition by t.Attrib_1) as max_Pa,
  max(P) over () as max_P,
  dense_rank() over (partition by case when exists(select 1 from @t where Attrib_1 = t.Attrib_1 and P is not null) then 1 end order by t.Attrib_1) as r
 from
  @t t
)
update x
 set
  P = isnull(max_Pa, max_P + r)
where
 P is null;

select * from @t;
22 июн 14, 13:33    [16202487]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
Классно, то что надо Спасибо!!!. Теперь с фильтрацией по одному полю работает.

А фильтрация по нескольким атрибутам не работает. Надо было мне сразу ещё в начале темы описать полностью, что я пытаюсь сделать.

declare @t table (P int, Link int, N1 nvarchar(10), N2 nvarchar(10), Atrb_1 int);
insert into @t
values
(NULL, 100, 'L1', 'L2', 10),
(NULL, 200, 'T', 'N1', 3),
(NULL, 300, 'N1', 'N2', 3),
(NULL, 400, 'N2', 'F', 1),
(NULL, 500, 'R', 'R1', 10),
(11, 600, null, 'UT', 1),
(NULL, 700, 'UT', null, 1);
(NULL, 800, null, null, 1);
(NULL, 900, null, null, 1);


В общем выше, я указал массив с данными, по которым нужно произвести фильтрацию. На самом деле атрибутов порядка 7-ми ну не суть важно, поскольку фильтрация по ним будет аналогичная. Самая проблемная на мой взгляд фильтрация это N1 и N2.

Моя задача по названия N1 и N2 собрать отрезки, учитывая атрибутику.

К примеру из выше указанного массива на выходе должно получиться следующее:

P | Link | N1 | N2 | Atrb_1
----------------------------------------
12 100 L1 L2 10
13 200 T N1 3
13 300 N1 N2 3
14 400 N2 F 1
15 500 R R1 10
11 600 null UT 1
11 700 UT null 1
23 июн 14, 14:09    [16206502]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
Продолжение сообщения выше. Случайно Enter нажал.

16    600      null    null      1
16 700 nul null 1


К сообщению приложен файл. Размер - 2Kb
23 июн 14, 14:11    [16206525]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
Вернусь к вопросу.

Вот исходные данные
DECLARE @T TABLE (ID int, P int, N1 nvarchar(10), N2 nvarchar(10), ARGM1 int, ARGM2 int, ARGM3 nvarchar(4));
INSERT INTO @T (ID, P, N1, N2, ARGM1, ARGM2, ARGM3)
         SELECT 1001 ID, null P, 'K' N1, 'N1' N2, 1 A1, 1 A2, '0007' A3 UNION ALL
         SELECT 1002,    null,   'N1',   'N2',    1,    1,    '0007'    UNION ALL
	 SELECT 1003,    null,   'N2',   'D',     1,    1,    '0007'    UNION ALL
	 SELECT 1004,    null,   'N1',   'N3',    1,    2,    '0007'    UNION ALL
	 SELECT 1005,    null,   'D',    'R',     1,    1,    '0007'    UNION ALL
	 SELECT 1006,    null,   'R',    'R1',    1,    1,    '0002'    UNION ALL
	 SELECT 1007,    null,   'R1',   'TT',    1,    1,    '0002'    UNION ALL
	 SELECT 1008,    null,   'D1',   'RE',    1,    1,    '0007'    UNION ALL
	 SELECT 1009,    null,   'D2',   'RE',    1,    1,    '0007'; 


Группировка по атрибутам получилась
SELECT *,  
       -- По аргументам (Все работает так как надо.)
       DENSE_RANK() over( partition by case when exists(select 1 from @T where  ARGM1 = T.ARGM1 AND ARGM2 = T.ARGM2 AND ARGM3 = T.ARGM3) then 1 end 
	                      order by t.ARGM1, t.ARGM2, t.ARGM3) as TestARGM 
  FROM @T t

А вот по наименнованию не получается.
SELECT *,
       -- По наименнованию (Не работает)
       DENSE_RANK() over( partition by case when exists(select 1 from R1 where ((N1 = t.N1 OR N2 = t.N1) OR (N1 = t.N2 OR N2 = t.N2))) then 1 end 
	                order by t.N1, t.N2) as TestARGM,
  FROM @T t


А вообще мне нужно одновременная группировка по наименнованию и атрибутом. В итоге должно получиться так:

-- ID P N1 N2 A1 A2 A3 ARGMUNION
--------------------------------------------------------
--1001 null K N1 1 1 0007 1
--1002 null N1 N2 1 1 0007 1
--1003 null N2 D 1 1 0007 1
--1004 null N1 N3 1 2 0007 2
--1005 null D R 1 1 0007 1
--1006 null R R1 1 1 0002 3
--1007 null R1 TT 1 1 0002 3
--1008 null D1 RE 1 1 0007 4
--1009 null D2 RE 1 1 0007 4

А это так для наглядности, графический результат

К сообщению приложен файл. Размер - 39Kb
27 фев 15, 13:32    [17320810]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в update при использовании isNull() или is Null  [new]
Nechto
Member

Откуда:
Сообщений: 825
Народ помогите плиз?
1 мар 15, 16:49    [17328345]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft SQL Server Ответить