1

Здравствуйте Я использую SQL SERVER 2008R2 и есть таблицы, которые производят следующие выходные,Link ID для того же пользователь

**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] 

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

И если пользователи имеет тот же EmailID в EmailTable, тогда же LINKID должны быть обновлены для обоих USERID в USERTABLE

Мой ожидается выход для UserTable есть

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

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

+1

@Option: см. добавленные теги. – Wanderer

+0

может сделать это с помощью слияния и вывода? – atoms

+1

Но откуда LINKID 1 идет в обоих случаях? –

ответ

2
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 
+0

1 был просто примером, ваш запрос выглядит хорошо для меня, но мне нужен уникальный идентификатор для LINKEDID, который будет создан для тех же Phonenumbers или Emailid с помощью функции NEWID(). – Ruhaan

+0

Теперь, получая разные ссылки LinkedId для каждого пользователя, мне нужен тот же идентификатор для соответствия пользователям. – Ruhaan

+0

После того, как я объявил переменную для newid(), она работает для меня, спасибо Mansoor. – Ruhaan

0

Как насчет:

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) 
       ) 
      ); 
0

Построение схемы для вышеупомянутого случая

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) и adde d it до ROW_NUMBER