table1
::::::::::::::::::::::::::::::::::
id | id_data | id_t | value
1 | 43 | 1 |
2 | 46 | 1 | 111,112,113
3 | 43 | 2 |
4 | 46 | 2 | 90,5
table2
:::::::::::::::::::::::::::::::::::
id_value | cat
112 | cat1
5 | cat2
Привет, мне нужна помощь здесь, если это возможно, пожалуйста.
Мне нужно обновить table1.value, где id_data равно 43, с помощью table2.cat, где id_value = цифры после значения ',' 'до следующего',' если они есть для каждой группы в 'id_t'
Я попытался с помощью простого запроса, но он возвращает некоторый нуль, но «значение» не может быть нулевым.
update table1
set value = (select cat from table2
where convert(nvarchar,id_value) = substring(value,5,3))
where id_data='43'
Я пытался включить CHARINDEX, чтобы взять из «,», но я просто не могу понять, как это работает.
В идеале это должно выглядеть так:
::::::::::::::::::::::::::::::::::
id | id_data | id_t | value
1 | 43 | 1 | cat1
2 | 46 | 1 | 111,112,113
3 | 43 | 2 | cat2
4 | 46 | 2 | 90,5
Может ли кто-нибудь указать мне правильное направление, пожалуйста?
Я думаю, это просто.. но я все еще учусь...
заранее спасибо.
::::::::::::::::
ОБНОВЛЕНИЕ1
WITH UpdateableCTE AS
(
SELECT t1.id
,t1.id_data
,t1.id_t
,SecondNr
,(
SELECT t2.cat
FROM @table2 AS t2 WHERE t2.id_value=SecondNr
) AS NewCat
,t1.value
FROM @table1 AS t1
OUTER APPLY(SELECT CAST('<x>' + REPLACE(x.value,',','</x><x>') + '</x>' AS XML).value('/x[2]','int')
FROM @table1 AS x
WHERE x.id_t=t1.id_t AND x.value IS NOT NULL AND id_data='46') AS ID(SecondNr)
WHERE t1.value IS NULL
)
UPDATE UpdateableCTE SET value=NewCat;
--somehow where id_data='43'
Я оставлю здесь одну таблицу, которая больше похожа на настоящую со всеми id_data и полями:
17974492 1 999251 somevalue
17974493 2 999251 somevalue
17974494 3 999251 somevalue
17974495 4 999251 somevalue
17974496 5 999251 somevalue
17974497 43 999251 (thishsouldbeupdated)
17974498 6 999251 somevalue
17974499 7 999251 somevalue
17974500 46 999251 111,311
17974501 8 999251 somevalue
17974502 9 999251 somevalue
17974503 10 999251 somevalue
17974504 11 999251 somevalue
17974505 12 999251 somevalue
17974506 13 999251 somevalue
17974507 1 999252 somevalue
17974508 2 999252 somevalue
17974509 3 999252 somevalue
17974510 4 999252 somevalue
17974511 5 999252 somevalue
17974512 43 999252 (thisshouldbeupdated)
17974513 6 999252 somevalue
17974514 7 999252 somevalue
17974515 46 999252 98,98
17974516 8 999252 somevalue
17974517 9 999252 somevalue
17974518 10 999252 somevalue
17974519 11 999252 somevalue
17974520 12 999252 somevalue
17974521 13 999252 somevalue
cat1
, потому что в следующей строке сid_data=46
есть112
где-то между запятыми, а вы установилиcat2
, потому что в следующей строке есть5
? Это странно и ужасно пахнет... - person Shnugo   schedule 14.06.2017id_t
группирует их в первой таблице, и каждая «группа» имеет записьid_data 46
, где один идентификатор, который должен присоединиться к каждомуid_t
, равен (вторая запись после «,»). Мне нужно обновитьid_data 43
для каждого id_t - person vvic   schedule 14.06.2017111,112,5,113
? Вы бы взялиcat
,cat2
или оба? Всегда ли наid_t
приходится ровно две строки? Какова цельid_data
? Находится ли столбецid
в строгом порядке (идентификатор строки с номерами CSV всегда будет id+1)? - person Shnugo   schedule 14.06.2017111,112,5,113
, он все равно должен принимать cat1, так как вторая часть строки (112) - единственная, которая мне нужна. Вот почему я подумал, что должен использоватьcharindex
для извлечения второй части строки. Наidt
больше строк, это просто пример для упрощения, но это текущее обновление в любом случае не должно касаться других.id_data
определяет, какой тип данных находится внутри, например:43=category
,46(from, to ,)= id of the category
, конечный пользователь — это тот, кто пишет идентификатор категории в 46. Да,id
— это автонумер. Спасибо за ваше время. - person vvic   schedule 14.06.2017cat
. Если вам нужна помощь, просто позвоните... - person Shnugo   schedule 14.06.2017