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

时间:2012-04-09 18:17:53

标签: 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 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语句,但这也会导致多个结果错误。我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

您的语句正在尝试将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