代码之家  ›  专栏  ›  技术社区  ›  fmark

SQL语句中多元组对WHERE条件的有效表达方法

  •  0
  • fmark  · 技术社区  · 14 年前

    我要执行一个SQL查询,该查询在逻辑上等价于以下内容:

    DELETE FROM pond_pairs
    WHERE
      ((pond1 = 12) AND (pond2 = 233)) OR
      ((pond1 = 12) AND (pond2 = 234)) OR
      ((pond1 = 12) AND (pond2 = 8)) OR
      ((pond1 = 13) AND (pond2 = 6547)) OR
      ((pond1 = 13879) AND (pond2 = 6))
    

    pond1 pond2 对。我有一个索引 (pond1, pond2) .

    1. 按原样运行整个查询。
    2. 使用 n WHERE 条件
    3. 保存 - 庞德2 配对到一个新表中,并在 哪里 要识别的子句
    4. 将标识要删除的行的python逻辑转换为存储过程。请注意,我不熟悉编程存储过程,因此这可能涉及到陡峭的学习曲线。

    如果相关的话,我会用postgres。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Frank Heikens    14 年前

    对于要在一次删除中删除的大量pond1-pond2对,我将创建临时表并在此表上进行连接。

    -- Create the temp table:
    CREATE TEMP TABLE foo AS SELECT * FROM (VALUES(1,2), (1,3)) AS sub (pond1, pond2);
    
    -- Delete
    DELETE FROM bar 
    USING  
      foo -- the joined table
    WHERE 
      bar.pond1= foo.pond1 
    AND 
      bar.pond2 = foo.pond2;
    
        2
  •  1
  •   Tomasz Wysocki    14 年前

    我要做3个(使用连接而不是子查询)和测量删除查询的时间(不创建表和插入)。这是一个很好的起点,因为连接是非常常见和优化的程序,所以很难超过那个时间。然后你可以把这段时间和你现在的方法进行比较。

    您也可以尝试以下方法:

    1. 按索引中的相同方式排序对。
    2. 使用方法2删除。根据您的描述(可能在单个事务中)。

    在删除之前进行排序将提供更好的索引读取性能,因为硬盘缓存工作的可能性更大。

        3
  •  0
  •   Thilo    14 年前

    如果你的桌子上已经有一对了,那么3是好的。如果没有,则需要先插入它们。如果以后不需要它们,那么最好运行相同数量的DELETE语句,而不是INSERT语句。

    在循环中准备一个语句怎么样,也许是批处理的(如果Python支持的话)

    1. 开始交易
    2. 循环处理数据(在Python中),并使用一对语句运行语句(或add to batch)
    3. 犯罪

    这对是从哪里来的?如果您可以编写一个SELECT语句来标识它们,那么只需将此条件移到delete的WHERE子句中即可。

    DELETE FROM pond_pairs WHERE (pond1, ponds) in (SELECT pond1, pond2 FROM ......  )