根据列值加入(最佳匹配)

时间:2014-06-06 11:43:26

标签: sql-server join

我有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

谢谢!

3 个答案:

答案 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的结果:

enter image description here

答案 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为空