Sql 链接ID到同一用户
您好,我使用的是SQL SERVER 2008R2,其中的表生成以下输出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
**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