Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Ошибка в 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

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

Откуда: Москва
Сообщений: 4804
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

Откуда: Москва
Сообщений: 47001
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

Откуда: Москва
Сообщений: 47001
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

Откуда: Москва
Сообщений: 47001
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

Откуда: Москва
Сообщений: 47001
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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить