Sql 链接ID到同一用户

Sql 链接ID到同一用户,sql,sql-server,sql-server-2008,sql-server-2012,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Sql Server 2012,Sql Server 2008 R2,您好,我使用的是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 **EmailTab

您好,我使用的是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     abc@gmail.com
  2     pqr@gmail.com
  3     abc@gmail.com
  4     xyz@gmail.com
我的要求是,若PhoneTable中的记录具有相同的PhoneNumber,则应对USERTABLE中的两个用户ID更新相同的LINKID

若用户在EmailTable中具有相同的EmailID,则应对USERTABLE中的两个用户ID更新相同的LINKID

我对UserTable的预期输出是

 USERID  Name LINKID
  1     abc    1
  2     pqr    1
  3     str    1
  4     xyz    NULL
Userid 4没有相同的phonenNumber或EmailID,因此它应该保持为Null。 建议我查询或程序以获得结果。谢谢。

那么:

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, 'abc@gmail.com' EmailID
UNION ALL
SELECT 2 AS USERID, 'pqr@gmail.com'
UNION ALL
SELECT 3 AS USERID, 'abc@gmail.com'
UNION ALL
SELECT 4 AS USERID, 'xyz@gmail.com'
现在,像这样单独更新它们

--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生成,我已采用ISNULLMAXLINKID 0并将其添加到第_NUMBER

@行选项:请参阅添加的标记。是否可以使用merge和output子句执行此操作?但从LINKID 1在这两种情况下的位置开始?@Shakermirza,使用Newid函数生成它。1只是一个示例,您的查询对我来说很好,但我需要一个唯一的ID为LINKEDID生成相同的电话号码或电子邮件使用NEWID功能。现在它得到不同的LINKEDID为每个用户,我需要相同的ID为匹配的用户在我声明变量为NEWID,它为我工作,谢谢你Mansoor。
--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