1

你好,我使用SQL Server 2008 R2和具有產生以下的輸出表,鏈接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應該更新的USERIDUSERTABLE

如果用戶有相同EmailIDEmailTable,然後同LINKID應該是既USERID用戶表

我的預期用戶表輸出,

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

用戶ID 4不要更新」 t有相同的phonenNumber或EmailID,所以它應該保持爲空。 向我建議查詢或程序讓我得到結果。謝謝。

+1

@選項:查看已添加的標籤。 – 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只是一個例子,你的查詢對我來說看起來很不錯,但是我需要使用NEWID()函數爲相同的電話號碼或Emailid生成一個唯一的LINKEDID ID。 – Ruhaan

+0

現在它爲每個用戶獲取不同的LinkedId,我需要相同的Id來匹配用戶 – 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到ROW_NUMBER