2017-01-16 4 views
2

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

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

Структура таблицы:

CREATE TABLE [dbo].[membermobilenumberisnull](
[TransId] [bigint] NOT NULL, 
[member_id] [int] NOT NULL, 
[gendertype] [int] NULL, 
[relationship_rs_code] [nvarchar](2) NULL, 
[ration_card_id] [int] NOT NULL, 
[uid] [nvarchar](16) NULL, 
[member_dob] [datetime] NULL, 
[member_name_en] [nvarchar](150) NULL, 
[mother_name_en] [nvarchar](150) NULL, 
[father_name_en] [nvarchar](150) NULL, 
[member_age] [smallint] NULL, 
[nationality] [nvarchar](150) NULL, 
[MobileNumber] [nvarchar](20) NULL, 
[IsUpdated] [bigint] NULL, 
[UpdationDate] [datetime] NULL, 
[IsDeleted] [bigint] NULL, 
[DeletionDate] [datetime] NULL, 
[CreationDate] [datetime] NULL, 
[UpdatedBy] [nvarchar](250) NULL, 
[DeletedBy] [nvarchar](250) NULL, 
[MobileNumber1] [nvarchar](20) NULL, 
[MobileFlag] [nvarchar](250) NULL 
) ON [PRIMARY] 

GO 

Примеры данных

TransId  member_dob member_name_en  member_age nationality MobileNumber UpdationDate CreationDate 
252238402 12-09-1985 PUSHPINDER SINGH 31   IND       NULL   30-07-2016 
252238403 12-09-1985 PUSHPINDER SINGH 31   IND   8626934377  NULL   30-07-2016 
260846102 03-06-1984 VUDDHI DEVI   32   IND   9459209701  19-10-2016  14-08-2016 
260846105 03-06-1984 VUDDHI DEVI   32   IND   NULL       14-08-2016 

Ожидаемый результат:

TransId  member_dob member_name_en  member_age nationality  MobileNumber UpdationDate CreationDate 
252238402 12-09-1985 PUSHPINDER SINGH 31   IND    8626934377  NULL   30-07-2016 
252238403 12-09-1985 PUSHPINDER SINGH 31   IND    8626934377  NULL   30-07-2016 
260846102 03-06-1984 VUDDHI DEVI   32   IND    9459209701  19-10-2016  14-08-2016 
260846105 03-06-1984 VUDDHI DEVI   32   IND    9459209701  19-10-2016  14-08-2016 

Tha НКС заранее

Пример прилагается: enter image description here

+1

Измените свой вопрос, включив соответствующую таблицу DDL, некоторые данные образца как DML и желаемые результаты. –

+0

@ ZoharPeled done, пожалуйста, проверьте –

+0

«Первичный ключ - это сложная комбинация клавиш из нескольких элементов». Это странно. Первичный ключ таблицы-члена должен в идеале быть именем участника или номером участника. Я предполагаю, что здесь мы говорим о какой-то таблице транзакций? Должна быть таблица реальных членов с соответствующим первичным ключом. Вы можете использовать свои записи транзакций, чтобы обновить таблицу участников. Либо с программированием, проходящим через данные, либо с помощью триггера, либо посредством группировки запросов с помощью 'member_name_en' и указания соответствующей функции агрегирования для каждого поля, например. 'Макс (MobileNumber)'. –

ответ

1

Предположим, ваш комбинированный PK является member_dob,member_name_en,member_age

UPDATE M1 
SET  M1.MobileNumber  = ISNULL(NULLIF(M1.MobileNumber,''),M2.MobileNumber) 
     ,M1.UpdationDate = ISNULL(M1.UpdationDate,M2.UpdationDate) 
FROM Member AS M1 
    INNER JOIN Member AS M2 ON M1.TransId <> M2.TransId 
           AND M1.member_dob = M2.member_dob 
           AND M1.member_name_en = M2.member_name_en 
           AND M1.member_age = M2.member_age 
+0

не работает :( –

+0

может у PLZ объяснить wts вопрос u fcd сейчас, если поле мобильного номера содержит пустую строку, вы можете использовать (. .ISNULL (NULLIF (M1.MobileNumber, ''), M2.MobileNumber) ..) –

+0

Я сделал, но я думаю, что его обновление само по себе из того же транзита, а не другого –

0

Попробуйте

WITH t2 AS (
SELECT member_dob, member_name_en, member_age, nationality, MobileNumber 
FROM <<table>> 
WHERE MobileNumber IS NOT NULL 
) 
UPDATE t1 
SET MobileNumber = t2.MobileNumber 
FROM <<table>> t1 JOIN t2 
ON t1.member_dob = t2.member_dob 
AND t1.member_name_en = t2.member_name_en 
AND t1.member_age = t2.member_age 
AND t2.nationality = t2.nationality 
WHERE t1.MobileNumber IS NULL 
+0

не работает :(0 строк затронуты –

0

Кажется, что вы хотите посмотреть на member_name_en и принимать значение от того, что из его записей, предпочитая не- null over null. Затем просто соберите и используйте MIN или MAX, чтобы выбрать такое значение.

update m 
    set member_dob = src.max_member_dob 
    , member_age = src.max_member_age 
    , nationality = src.max_nationality 
     etc. 
from membermobilenumberisnull m 
(
    select 
    member_name_en, 
    max(member_dob) as max_member_dob, 
    max(member_age) as max_member_age, 
    max(nationality) as max_nationality, 
    etc. 
    from membermobilenumberisnull 
    group by member_name_en 
) src on src.member_name_en = m.member_name_en; 
Смежные вопросы