“子查询返回的值超过1个。”错误SQL管理
UPDATE Contact_UDF
SET hasAttendedEvent = (
SELECT CASE WHEN c.Contact_ID IN
(SELECT DISTINCT Contact_ID
FROM Action a
WHERE a.Action_Type_ID =39) THEN 1 ELSE 0 END
FROM Contact c)
我跑SQL的这个小位设置在Contact_UDF表中的国旗,但继续运行到以下错误:“子查询返回的值超过1个。”错误SQL管理
Msg 512, Level 16, State 1, Line 1 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. The statement has been terminated.
我不能为我的生活理解为什么,因为我使用IN,而不是它描述的任何运营商。谁能帮忙?
为了说明为什么这给出了这样的错误,只需执行子查询,并得出结论,这确实返回多行:
SELECT CASE
WHEN c.Contact_ID IN
(SELECT DISTINCT Contact_ID
FROM Action a
WHERE a.Action_Type_ID =39) THEN 1
ELSE 0
END
FROM Contact c
它返回1行中联系每个记录。
你忘了一个条款,使Contact_UDF和联系之间的1对1映射:
UPDATE Contact_UDF udf
SET hasAttendedEvent =
(SELECT CASE
WHEN c.Contact_ID IN
(SELECT DISTINCT Contact_ID
FROM Action a
WHERE a.Action_Type_ID =39) THEN 1
ELSE 0
END
FROM Contact c
WHERE c.Contact_ID = udf.Contact_ID)
当然,这是假定“c.Contact_ID = udf.Contact_ID”限制子查询一行。没有关于您的模式的更多信息,我无法确定这是否属实。
试试这个:
UPDATE Contact_UDF SET hasAttendedEvent = (SELECT
CASE WHEN c.Contact_ID IN (SELECT TOP 1 Contact_ID FROM Action a WHERE a.Action_Type_ID =39) THEN 1 ELSE 0 END
FROM Contact c)
它看起来像你的子查询可以返回超过1行。您需要确保它仅返回1以使case语句正常工作。上述修改将确保它只返回1.
我不认为只是选择一个随机行是一个非常聪明的事情。这里有两种可能性,根据数据库模型查询是错误的,或者数据库中存在错误的数据。只选择top 1并不能解决问题。尝试使用'distinct'更好,如果它重复只是无关紧要。但是,如果明显失败,则必须查看数据! – Tobb 2014-10-02 09:39:09
Popovitsj和劳伦斯也拥有相当不错覆盖:
你的子查询可以返回不表现得像值的列表,多行比你可以使用'在表达中。但是,你可以使用存在的功能,而不是这样:在子查询主查询参照列 (http://technet.microsoft.com/en-us/library/ms189259(v=sql.105).aspx)
Documenation:
UPDATE Contact_UDF udf
SET hasAttendedEvent =
(SELECT CASE
WHEN exists (
(SELECT a.Contact_ID
FROM Action a
WHERE a.Action_Type_ID =39
and a.Contact_ID = c.Contact_ID)
THEN 1
ELSE 0
END
FROM Contact c
WHERE c.Contact_ID = udf.Contact_ID)
文档上存在功能 (http://technet.microsoft.com/en-us/library/ms189575(v=sql.105).aspx)
错误说**或当子查询用作表达式时** – DavidG 2014-10-02 08:58:37
您使用的是MySQL还是SQLServer? – NickyvV 2014-10-02 09:45:29
你有两个子查询。其中一个遵循“=”,另一个遵循IN。 – user2338816 2014-10-02 12:08:40