2014-10-02 106 views
0
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,而不是它描述的任何运营商。谁能帮忙?

+0

错误说**或当子查询用作表达式时** – DavidG 2014-10-02 08:58:37

+0

您使用的是MySQL还是SQLServer? – NickyvV 2014-10-02 09:45:29

+0

你有两个子查询。其中一个遵循“=”,另一个遵循IN。 – user2338816 2014-10-02 12:08:40

回答

1

为了说明为什么这给出了这样的错误,只需执行子查询,并得出结论,这确实返回多行:

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”限制子查询一行。没有关于您的模式的更多信息,我无法确定这是否属实。

-2

试试这个:

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.

+1

我不认为只是选择一个随机行是一个非常聪明的事情。这里有两种可能性,根据数据库模型查询是错误的,或者数据库中存在错误的数据。只选择top 1并不能解决问题。尝试使用'distinct'更好,如果它重复只是无关紧要。但是,如果明显失败,则必须查看数据! – Tobb 2014-10-02 09:39:09

0

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

相关问题