【问题标题】:SQL DELETE FROM table records matching subquerySQL DELETE FROM 表记录匹配子查询
【发布时间】:2018-03-17 18:03:59
【问题描述】:

我有一个返回的子查询

 one_id   | two_id
--------------------
 1654838  | 1526634
 1657136  | 1526634
 1659179  | 1526634
 1659527  | 1526634
 2040608  | 1510944
 2040608  | 1516727

我有一个 table_x 之类的

 one_id   | two_id  | other_column
-----------------------------------
 1654838  | 1526634 | ...
 ...      | ...     | ...

如何从 table_x 中删除子查询结果中列出 one_idtwo_id 的记录?

如果子查询只返回 one_id 我可以使用类似

DELETE FROM table_x WHERE `one_id` IN (SELECT ...

对于给定的子查询结果是否有类似的解决方案?

【问题讨论】:

  • 从 table_x 中删除 one_id=1654838 和 two_id=1526634 ;

标签: postgresql subquery sql-delete


【解决方案1】:

更新

是的,以下答案不正确。我有机会测试它。但这应该可行:

DELETE FROM
    mytable2 AS t1
WHERE EXISTS (
    SELECT
        one_id, two_id
    FROM
        mytable1 t2
    WHERE
        t1.one_id=t2.one_id AND
        t1.two_id=t2.two_id
)

更新 2:添加一个额外的 WHERE AND 子句,它将为您提供所需的 one_id 和 two_id 值。示例:

    WHERE
        (t2.someothercol > 0 AND t2.someothercol < 10) AND
        t1.one_id=t2.one_id AND
        t1.two_id=t2.two_id

原答案

可能是这样的(虽然我无法测试):

WITH my_subquery AS (
    SELECT one_id, two_id
    FROM some_table
)
DELETE FROM table_X AS t1
WHERE t1.one_id=my_subquery.one_id AND t1.two_id=my_subquery.two_id

参考 PostgreSQL 文档:https://www.postgresql.org/docs/9.1/static/queries-with.html

【讨论】:

  • 我得到 [42P01] 错误:缺少表“子查询”位置的 FROM 子句条目:834
【解决方案2】:

我不知道对性能有什么影响,但您可以尝试以下方法:

DELETE FROM table_x WHERE CONCAT(one_id, two_id) IN (SELECT CONCAT(one_id, two_id) ...

可能还需要强制转换和/或别名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2017-10-18
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多