Sql server 更新特定日期之前的多行
我正在使用一个对其业务层进行更新的网站,因此现在我需要转换旧数据以匹配新数据的保存方式。我正在编写一个SQL查询,用于更新成员表上的两个数据列,其中person_id在成员表和注册码表上匹配,注册码出现在注册码表上,注册码被标记为在注册码表的某个日期之前使用Sql server 更新特定日期之前的多行,sql-server,Sql Server,我正在使用一个对其业务层进行更新的网站,因此现在我需要转换旧数据以匹配新数据的保存方式。我正在编写一个SQL查询,用于更新成员表上的两个数据列,其中person_id在成员表和注册码表上匹配,注册码出现在注册码表上,注册码被标记为在注册码表的某个日期之前使用 UPDATE vs_member SET premium_acct = 1, tenant_reg_key = ( SELECT DISTINCT tenant_reg_key FROM vs_tenant_reg_key_tbl t W
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。当子查询在=、!=、=或者当子查询用作表达式时
不确定如何处理,请提供帮助。检查查询的以下部分是否返回多个条目:
SELECT DISTINCT tenant_reg_key
FROM vs_tenant_reg_key_tbl t
WHERE person_id = t.person_id
如果是这样,您将无法为此查询结果设置tenant\u reg\u key,因为它实际上是在尝试向一个条目添加多个值(请注意,一次)。在您的子选择中,person\u id=t。person\u 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'