Sql 基于多个列值相等,将一个表中的多行设置为另一个表中的多行

Sql 基于多个列值相等,将一个表中的多行设置为另一个表中的多行,sql,Sql,我试图运行一个相当复杂的查询。两张桌子不同步。在处理的一个步骤中,一个16位的值从一个表复制到另一个表,并被截断为仅10位 我用几条信息把16位数的完整数字复制过来。我试图找到10位值与16位值的前10位匹配的地方,以及这两个表中其他三条信息匹配的地方。综合起来,他们几乎100%确定我们有一个独特的入口。这是我的查询的当前迭代: UPDATE DB1.TABLE1 SET ID = ( SELECT b.ID FROM DB2.TABLE1 b INNER DB1.TABLE1 a ON le

我试图运行一个相当复杂的查询。两张桌子不同步。在处理的一个步骤中,一个16位的值从一个表复制到另一个表,并被截断为仅10位

我用几条信息把16位数的完整数字复制过来。我试图找到10位值与16位值的前10位匹配的地方,以及这两个表中其他三条信息匹配的地方。综合起来,他们几乎100%确定我们有一个独特的入口。这是我的查询的当前迭代:

UPDATE DB1.TABLE1
SET ID =
(
SELECT b.ID
FROM DB2.TABLE1 b
INNER DB1.TABLE1 a 
ON left(b.ID, 10) = a.ID
WHERE len(a.ID) = 10
AND a.STORE = b.STORE
AND a.DOCTYPE = b.DOCTYPE
AND a.DOCDATE = b.DOCDATE
)

问题是,它告诉我子查询返回多个结果。但我想要多个结果。我尝试在括号后添加另一个
WHERE
语句,并复制子查询的最后四行,但这也不起作用。我还尝试使用
WHERE EXISTS
并复制整个
SELECT
语句,但这也给em带来了多结果错误。这里缺少什么?

您的语句试图将DB1.TABLE1中的每一行更新为子查询返回的内容。这不仅不是您想要的,而且由于子查询返回多个值,语句失败

您需要做的是将两个表作为update语句的一部分进行关联,如下所示:

UPDATE DB1.TABLE1
SET ID = b.ID
FROM DB1.TABLE1 a
  INNER JOIN DB2.TABLE1 b
  ON left(b.ID, 10) = a.ID
    AND a.STORE = b.STORE
    AND a.DOCTYPE = b.DOCTYPE
    AND a.DOCDATE = b.DOCDATE
WHERE len(a.ID) = 10

这似乎是可行的,因为它不会给出错误并正在进行更改,但我仍然得到一些令人困惑的结果。最初,在我的测试数据库中,我有2行处于新的正确状态,匹配16位数字,77行不正确。查询只声明更改了27行,但有79行处于正确的匹配状态。我仍在研究这个问题,但假设它是一致的,我会检查这是正确的答案。谢谢。由于其他一些问题,我们在DB2.TABLE1中添加了重复的条目,这导致select语句返回重复。你知道UPDATE命令是否会在执行过程中更改值,从而导致它“忽略”最初可能匹配的内容吗?嗯,这是一个有趣的问题。我不确定,但考虑到您正在更新一个列,该列也用于联接条件,这似乎是合理的。