chints786 Ответов: 1

Запрос на обновление столбца на основе условия


Каждый день я буду получать файл в следующем формате:-

CID	Mobile	FirstName	Lastname	UpdateIdentifier


В первый раз файл будет содержать запись таким образом:-

CID	Mobile	FirstName	Lastname	UpdateIdentifier
1	999999	ABC	        PQR	         N


Эта запись будет вставлена в две основные таблицы, скажем, таблицу А и таблицу В.

В следующий раз придет другой файл. Но на этот раз данные будут такими, как показано ниже:-

CID	Mobile	 FirstName	Lastname	UpdateIdentifier
1	999999	 ABCD	          PQR	         U


На этот раз запись будет обновлена в таблицах A и b. (т. е. firstname изменится с abc на abcd, а update itentifier изменится с N на U)

Как только UpdateIdentifier будет изменен с N на U в первый раз, мы должны вставить в него столбец Points со значением 10.

Необходимый выход будет ниже:-
CID	Mobile	FirstName	Lastname	UpdateIdentifier	Points
1	999999	ABCD	         PQR	               U	        10


В следующий раз, когда Updateitenfier будет изменен на U, мы должны разрешить обновление данных других столбцов, но столбец points не должен изменяться, так как нам нужно много точек только в первый раз, когда он изменится на U.

пожалуйста помочь.

Что я уже пробовал:

Я думаю о том, чтобы взять переменную флага в обеих таблицах и в первый раз, когда updateitenfier является U, увеличить ее до 1.

в следующий раз, когда будут поступать данные, проверьте значение флага. если это один, не ставьте точку.

Пожалуйста, помогите с кодом.

ZurdoDev

Звучит хорошо. Какой у вас вопрос?

chints786

можете ли вы помочь мне с кодом для реализации?

ZurdoDev

Конечно. Где ты застрял?

chints786

Я включил флаги в таблицы а и Б . путаница в сказать например, если изначально запись появилась в первый файл Райан и updateidentifier N, тогда обе таблицы будут иметь эту запись.. но во второй файл, если имя приходит как ryandev и обновить идентификатор У мне нужно обновить ту же запись, и increement флаг переменной 1...Как я могу добиться этого

ZurdoDev

Я действительно не понимаю, но, по сути, все, что вы делаете, звучит так:
обновленная таблица
Имя набора = 'ryandev', флаг = 1
ГДЕ CID = 1

Maciej Los

Вы имеете в виду, что вам нужен только T-SQL или что-то еще (C#, VB.NET)?

chints786

да только Tsql

1 Ответов

Рейтинг:
0

CHill60

Вы слишком усложняете ситуацию, используя две таблицы, и вы не помогли, не предоставив нам схему таблицы. Впрочем, возможно, это вам поможет...

Рассмотрим эти две таблицы...

create table demoInput
(
	CID	int,
	Mobile	varchar(30),
	FirstName	varchar(30),
	Lastname	varchar(30)
)
create table demoTarget
(
	CID	int,
	Mobile	varchar(30),
	FirstName	varchar(30),
	Lastname	varchar(30),
	UpdateIdentifier char(1),
	Points int
)
Как вы создаете demoInput это может быть входными параметрами для хранимой процедуры или фактической таблицы. Я использовал этот образец данных во время своего первого запуска
INSERT INTO demoInput (CID, Mobile, FirstName, LastName) values
(1, '12345','Joe','Bloggs'),
(2, '34567','Jane','Bloggs')
If the following code is in a stored procedure (say)  <pre lang="SQL">-- Do the updates first, otherwise you will process the input twice!
UPDATE T SET 
	Mobile = I.Mobile, UpdateIdentifier = 'U', 
	-- This bit works out whether this is the first Update
	Points = CASE WHEN Points IS NULL THEN 10 ELSE Points END,
	-- This bit works out whether it is a subsequent update
	FirstName = CASE WHEN Points IS NULL THEN T.FirstName ELSE I.FirstName END,
	Lastname = CASE WHEN Points IS NULL THEN T.Lastname ELSE I.Lastname END
	FROM demoInput I
	left outer join demoTarget T ON I.CID=T.CID
	WHERE T.CID IS NOT NULL

-- Then insert any new stuff
INSERT INTO demoTarget
SELECT I.CID, I.Mobile, I.FirstName, I.Lastname, 'N' AS UpdateIdentifier, CAST(NULL as int) AS Points
FROM demoInput I
left outer join demoTarget T ON I.CID=T.CID
WHERE T.CID IS NULL
тогда я верю, что вы получите то поведение, которое хотите.

Первый запуск с данными, как указано выше:
1	12345	Joe	Bloggs	N	NULL
2	34567	Jane	Bloggs	N	NULL

Второй запуск с данными
TRUNCATE TABLE demoInput
INSERT INTO demoInput (CID, Mobile, FirstName, LastName) values
(1, '12345999','Joe','Bloggs'),
(2, '34567999','Jane','Bloggs'),
(3, '3435566', 'New','Person')
1	12345999	Joe	Bloggs	U	0
2	34567999	Jane	Bloggs	U	0
3	3435566	        New	Person	N	NULL
После третьего запуска
TRUNCATE TABLE demoInput
INSERT INTO demoInput (CID, Mobile, FirstName, LastName) values
(1, '12345999','Joe2','Bloggs'),
(2, '34567998','Jane','Bloggs2'),
(3, '3435566', 'New','Person3')
дает
1	12345999	Joe2	Bloggs	U	10
2	34567998	Jane	Bloggs2	U	10
3	3435566	New	Person	U	10

Возможно, есть некоторые морщины, которые нужно сгладить, и ваши две целевые таблицы должны быть отсортированы, но это должно дать вам представление о том, как это сделать