0

我有一个看起来很复杂的选择,它返回一个 id 数组。我现在想使用这个 id 数组

DELETE FROM cart_items WHERE id in (

    SELECT id AS the_count 
    FROM cart_items 
    GROUP BY session_code 
    HAVING COUNT(session_code) > 100

);

我想做的是使用内部选择(有效)作为IN删除的数组...

此代码引发错误:

“您不能在 FROM 子句中指定目标表 'cart_items' 进行更新”

4

3 回答 3

1

用子选择试试这个并提供新的别名

DELETE FROM cart_items WHERE id in (
SELECT cart_items_todelete.id FROM (
    SELECT id  
    FROM cart_items 
    GROUP BY session_code 
    HAVING COUNT(session_code) > 100 
) cart_items_todelete  

);
于 2013-09-22T10:53:36.767 回答
0

我真的想知道您是否不应该使用这样的查询?

DELETE FROM cart_items WHERE id IN (
    SELECT c.id FROM (
        SELECT  a.id AS id FROM
            cart_items a, (
                SELECT session_code
                FROM cart_items
                GROUP BY session_code
                HAVING COUNT(session_code) > 100
        ) b
        WHERE
            a.session_code = b.session_code
    ) c
);

您的查询和此处的答案中建议的一次不计入 ID 可能不同的数量。同一会话的 ID 并不总是相同,对吧!

你会

  • 首先找到出现超过100次的会话代码
  • 查找all具有此会话代码的 id
  • 最后删除那些行

希望这是您想要实现的目标。

于 2013-09-22T12:34:47.173 回答
0

您是否考虑过使用 EXISTS 子句:

DELETE
  FROM cart_items TGT
 WHERE EXISTS
      (SELECT 'x'
         FROM cart_items SRC
        WHERE SRC.session_code = TGT.session_code
        GROUP BY session_code
       HAVING COUNT(session_code) > 100
      );
于 2013-09-22T13:29:40.300 回答