Идентификатор связи с тем же пользователем

Здравствуйте, я использую SQL SERVER 2008R2 и имею таблицы, которые производят следующий вывод,

**Usertable** USERID Name LINKID 1 abc NULL 2 pqr NULL 3 str NULL 4 xyz NULL **PhoneTable** USERID PhoneNumber 1 123 2 123 3 12345 4 34567 **EmailTable** USERID EmailID 1 [email protected] 2 [email protected] 3 [email protected] 4 [email protected] 

Мое требование – если записи в PhoneTable имеют одинаковый номер PhoneNumber то тот же LINKID должен быть обновлен для USERID в USERTABLE .

И если у пользователей такой же EmailID электронной EmailID в EmailTable , то тот же LINKID должен быть обновлен для USERID в USERTABLE

Мой ожидаемый результат для UserTable,

  USERID Name LINKID 1 abc 1 2 pqr 1 3 str 1 4 xyz NULL 

Userid 4 не имеют одинаковых phonenNumber или EmailID, поэтому он должен оставаться Null. Предложите мне запрос или процедуру, чтобы получить результат. Спасибо.

 First you get user id for same phone number and email id with help of CTE and update usertable based on CTE. CREATE TABLE #Usertable(USERID INT, Name VARCHAR(100), LINKID INT) CREATE TABLE #PhoneTable(USERID INT, PH VARCHAR(100)) CREATE TABLE #EmailTable(USERID INT, Email VARCHAR(100)) INSERT INTO #Usertable (USERID , Name , LINKID ) SELECT 1,'abc',NULL UNION ALL SELECT 2,'pqr',NULL UNION ALL SELECT 3,'str',NULL UNION ALL SELECT 4,'xyz',NULL INSERT INTO #PhoneTable (USERID , PH ) SELECT 1,'123' UNION ALL SELECT 2,'123' UNION ALL SELECT 3,'12345' UNION ALL SELECT 4,'34567' INSERT INTO #EmailTable (USERID , Email) SELECT 1,'[email protected]' UNION ALL SELECT 2,'[email protected]' UNION ALL SELECT 3,'[email protected]' UNION ALL SELECT 4,'[email protected]' ;WITH CTE AS ( SELECT userid FROM #PhoneTable P1 WHERE EXISTS(SELECT 1 FROM #PhoneTable P2 WHERE P1.PH = P2.PH AND P1.USERID <> P2.USERID) UNION ALL SELECT userid FROM #EmailTable P1 WHERE EXISTS(SELECT 1 FROM #EmailTable P2 WHERE P1.Email = P2.Email AND P1.USERID <> P2.USERID) ) UPDATE #Usertable SET LINKID = A.userid FROM ( SELECT MIN(userid) userid FROM CTE ) A WHERE EXISTS(SELECT 1 FROM CTE B WHERE B.userid = #Usertable.USERID) **FOR UNIQUE LINKID** UPDATE #Usertable SET LINKID = NEWID() FROM CTE B WHERE B.userid = #Usertable.USERID SELECT * FROM #Usertable 

Как насчет:

 update usertable u set linkid = (select min(userid) from (select userid from phonetable p where p.phonenumber = (select phonenumber from phonetable p1 where p1.userid = u.userid) union all select userid from emailtable e where e.emailid = (select emailid from emailtable e1 where e1.userid = u.userid) ) ); 

Сборка схемы для вышеуказанного случая

 CREATE TABLE #USER (USERID INT, NAME VARCHAR(20), LINKID INT) INSERT INTO #USER SELECT 1 AS USERID, 'abc' AS NAME, NULL AS LINKID UNION ALL SELECT 2 , 'pqr' , NULL UNION ALL SELECT 3 , 'str', NULL UNION ALL SELECT 4 , 'xyz', NULL UNION ALL SELECT 5 , 'jkl', NULL UNION ALL SELECT 6 , 'mno', NULL CREATE TABLE #PhoneTable (USERID INT, PhoneNumber VARCHAR(20) ) INSERT INTO #PhoneTable SELECT 1 AS USERID, '123' PhoneNumber UNION ALL SELECT 2 AS USERID, '123' UNION ALL SELECT 3 AS USERID, '12345' UNION ALL SELECT 4 AS USERID, '34567' UNION ALL SELECT 5 AS USERID, '15233' UNION ALL SELECT 6 AS USERID, '15233' CREATE TABLE #EmailTable (USERID INT, EmailID VARCHAR(50) ) INSERT INTO #EmailTable SELECT 1 AS USERID, '[email protected]' EmailID UNION ALL SELECT 2 AS USERID, '[email protected]' UNION ALL SELECT 3 AS USERID, '[email protected]' UNION ALL SELECT 4 AS USERID, '[email protected]' 

Теперь обновите их индивидуально, как

 --updating with Checking #PhoneTable ;WITH CTE AS ( SELECT PhoneNumber , ROW_NUMBER() OVER(ORDER BY (SELECT 1))+(SELECT ISNULL(MAX(LINKID),0) FROM #USER) LINKID FROM #PhoneTable GROUP BY PhoneNumber HAVING COUNT(DISTINCT USERID)>1 ) UPDATE U SET U.LINKID = C.LINKID FROM #USER U INNER JOIN #PhoneTable P ON U.USERID = P.USERID INNER JOIN CTE C ON P.PhoneNumber = C.PhoneNumber --updating with Checking #EmailTable ;WITH CTE AS ( SELECT EmailID , ROW_NUMBER() OVER(ORDER BY (SELECT 1))+(SELECT ISNULL(MAX(LINKID),0) FROM #USER) LINKID FROM #EmailTable GROUP BY EmailID HAVING COUNT(DISTINCT USERID)>1 ) UPDATE U SET U.LINKID = C.LINKID FROM #USER U INNER JOIN #EmailTable E ON U.USERID = E.USERID INNER JOIN CTE C ON E.EmailID = C.EmailID 

Для уникального поколения LINKID я взял ISNULL(MAX(LINKID),0) и добавил его в ROW_NUMBER

  • Создание динамического SQL с помощью команды + = в некоторых случаях усекает предыдущий контент
  • Разница между внутренним соединением VS Inner Remote Join
  • Обновление XML, хранящегося в столбце XML в SQL Server
  • Можно ли моделировать родительские отношения с дочерними элементами в одной таблице с помощью внешних ключей?
  • Я пытаюсь заполнить данные из таблицы1 в таблицу2. Правильно ли мой SQL-запрос?
  • Обратитесь к другой таблице и возвращайте данные, смежные с результатом Max ()
  • Найдите промежутки времени в SQL Server 2012?
  • Добавьте значения столбца и добавьте результат в новую таблицу
  • Печать подстроки до и после слэша '/' из строки
  • Как раскрыть эту таблицу
  • Функция SQL MAX () возвращает все результаты
  • Interesting Posts

    Hibernate JPQL CURRENT_DATE не работает на SQL Server

    Как вы обрабатываете ведение журнала с помощью SSRS?

    SQL Подразумеваемые значения Null в объединенной таблице

    Объединить значения, основанные на идентификаторе

    В Sql Query может быть указано только одно выражение

    SQL Server две таблицы с одинаковыми столбцами, но выберите данные без нулевого

    SQL Server: результаты с левым соединением уменьшают количество строк, чем в левой таблице

    Смешать XML-родителей и детей в MSSQL

    Не удается привязать RelocateFile при использовании командлета Restore-SqlDatabase

    SQL, как сделать среднее значение, когда ячейка имеет значение больше 0

    «CSS-подобные» резервные каскадные данные в SQL Server 2005

    Можете ли вы просмотреть связанные свойства сервера в MS SQL Server Management Studio без отказа от сервера?

    Справка по запросам базы данных SQL Server

    Получение числа недель в месяц из столбца Datetime

    Идентификатор нескольких частей не может быть привязан к внутреннему соединению с подзапросом

    Давайте будем гением компьютера.