Sql server 基于列值的联接(最佳匹配)

Sql server 基于列值的联接(最佳匹配),sql-server,join,Sql Server,Join,我有3列作为加入的基础->ID、帐户、客户。可以有多行包含相同的ID值 我想根据1)身份证、2)账户、3)客户优先加入 因此,在下面的示例中,@UserData中应该填充的用户代码应该是“u11z”,因为所有列都包含一个值 我该怎么做?下面是我迄今为止的代码 UPDATE @UserData SET UserCode = ur.UserCode FROM @UserData uA INNER JOIN UserReference ur ON uA.ID = ur.ID

我有3列作为加入的基础->ID、帐户、客户。可以有多行包含相同的ID值

我想根据1)身份证、2)账户、3)客户优先加入

因此,在下面的示例中,@UserData中应该填充的用户代码应该是“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))
用户参考表:

Cust       Account      ID       UserCode
234         NULL      9A2346     u12x
234         Test      9A2346     u11z
NULL        NULL      9A2346     u30s
@用户数据表:

Cust       Account      ID       UserCode
234         Test      9A2346     NULL

谢谢

这就是你想要的吗?很难理解你的要求

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;
最后一次
选择的结果


如果我正确理解了你的问题

如果一行中任何一个具有空值的列都会降低优先级,那么您可以使用下面这样的查询来检查一行中空值的计数,这可能不是一个完整的答案,但是一种可能的方法

选择计数(*) 从表名
如果Col1为NULL,而Col2为NULL,则可以尝试以下操作。我加入表格,计算匹配的数量,并对它们进行排名。然后选择排名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

这是SQL Server的吗?给我们两张桌子的行。你能提供ddl或小提琴来玩吗?由于
((ua.Account=ur.Account)或(ur.Account=ur.Account))((ua.Account=ur.Account)或TRUE)(TRUE)
客户同上,您的代码将无法正常工作。也就是说,您的join等于
uA.ID=ur.ID
I更新了我的问题以提供示例数据。谢谢,有没有过这样一种情况,即ID存在于一个表中,而不存在于另一个表中?