我正在使用一个对其业务层进行了更新的网站,所以现在我需要转换旧数据以匹配新数据的保存方式。我正在编写一个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; =或子查询用作表达式时,不允许这样做。
不完全确定如何处理,任何帮助将不胜感激。
答案 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设置为此查询的结果,因为它实际上是尝试添加多个值 - 一次,请注意 - 一个条目。