我有3列基于我的JOIN - > ID,账户,客户。可以有多个行包含相同的ID值。
我想优先考虑我的加入1)身份证,2)账户,3)客户。
所以在下面的例子中,应该在@UserData中填充的UserCode应该是' u11z'因为所有列都包含值。
我该怎么做?在我的代码下面......
UPDATE @UserData
SET UserCode = ur.UserCode
FROM @UserData uA
INNER JOIN UserReference ur
ON uA.ID = ur.ID
AND ((ua.Account = ur.Account) OR (ur.Account = ur.Account))
AND ((ua.Cust = ur.Cust) OR (ur.Cust = ur.Cust))
UserReference TABLE:
Cust Account ID UserCode
234 NULL 9A2346 u12x
234 Test 9A2346 u11z
NULL NULL 9A2346 u30s
@UserData TABLE:
Cust Account ID UserCode
234 Test 9A2346 NULL
谢谢!
答案 0 :(得分:1)
USE tempdb;
CREATE TABLE UserReference
(
ID VARCHAR(255) NULL
, Account VARCHAR(255) NULL
, Cust INT NULL
, UserCode VARCHAR(255)
);
INSERT INTO UserReference VALUES ('9A2346', NULL, 234, 'A');
INSERT INTO UserReference VALUES ('9A2346', 'TEST', 234, 'B');
INSERT INTO UserReference VALUES ('9A2346', NULL, NULL, 'C');
DECLARE @UserData TABLE
(
ID VARCHAR(255) NULL
, Account VARCHAR(255) NULL
, Cust INT NULL
, UserCode VARCHAR(255)
);
INSERT INTO @UserData
SELECT UR.ID, UR.Account, UR.Cust, NULL
FROM dbo.UserReference UR;
UPDATE @UserData
SET UserCode = ur.UserCode
FROM @UserData uA
INNER JOIN UserReference ur
ON uA.ID = ur.ID
AND ua.Account = ur.Account
AND ua.Cust = ur.Cust;
SELECT *
FROM @UserData;
最后SELECT
的结果:
答案 1 :(得分:1)
您可以尝试以下操作。我加入了桌子,计算了比赛的数量,并对它们进行了排名。然后选择排名1.
; with userCte (userCodeA, userCodeB, rank)
as
(
select a.usercode, b.usercode,
rank() over (partition by a.id order by case when a.cust = b.cust then 1 else 0 end +
case when a.account = b.account then 1 else 0 end +
case when a.id = b.id then 1 else 0 end desc) as rank
from userdata a
join userreference b
on a.id = b.id or a.account = b.account or a.id = b.id
)
select * from userCte
--update userCte
--set userCodeA = userCodeB
where rank = 1
答案 2 :(得分:0)
如果我理解你的问题......
如果行中具有空值的任何col将降低优先级,那么您可以使用类似下面的查询来检查行中的空值计数,这可能不是一个完整的答案,而是一种可能的方法...
SELECT count(*) FROM TableName 其中Col1为空,Col2为空