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

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