更新特定日期之前的多行

时间:2013-11-15 16:32:17

标签: sql-server

我正在使用一个对其业务层进行了更新的网站,所以现在我需要转换旧数据以匹配新数据的保存方式。我正在编写一个SQL查询,用于更新成员表上的几个数据列,其中person_id与成员和注册代码表匹配,注册代码存在于reg cod表中,并且该reg代码被标记为已使用在注册码表上的某个日期之前。

UPDATE vs_member
SET premium_acct = 1, tenant_reg_key = (
SELECT DISTINCT tenant_reg_key 
FROM vs_tenant_reg_key_tbl t
WHERE person_id = t.person_id)
WHERE person_id in (
SELECT t2.person_id
FROM vs_tenant_reg_key_tbl t2
WHERE person_id = t2.person_id AND t2.used = 1 AND premium_acct = 0 AND date_joined <= '2013-11-08')

我收到一条错误说明以下内容:子查询返回的值超过1。当子查询遵循=,!=,&lt;,&lt; =,&gt;,&gt; =或子查询用作表达式时,不允许这样做。

不完全确定如何处理,任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

在您的子选择中,WHERE person_id = t.person_id可能没有按您的想法行事。

考虑使用连接而不是子选择来编写UPDATE语句。也许这样的事情会做你想要的。

UPDATE V
   SET premium_acct = 1, tenant_reg_key = T.tenant_reg_key
  FROM vs_member V
  INNER JOIN vs_tenant_reg_key_tbl T ON T.person_id = V.person_id
  WHERE T.used = 1 AND T.premium_acct = 0 AND T.date_joined < '2013-11-08'

答案 1 :(得分:0)

检查查询的以下部分是否返回多个条目:

SELECT DISTINCT tenant_reg_key 
FROM vs_tenant_reg_key_tbl t
WHERE person_id = t.person_id

如果是这样,您将无法将tenant_reg_key设置为此查询的结果,因为它实际上是尝试添加多个值 - 一次,请注意 - 一个条目。