【问题标题】:Multiple data check in one query一次查询中的多个数据检查
【发布时间】:2012-03-02 19:08:50
【问题描述】:

我有以下问题。我在数据库中有 2 个表 - table1 和 table2。

Table1
id| val1| val2
--------------
1 | 234 | 342
2 | 325 | 356
...

Table2
id | uid | val 
--------------
1  | 5   | 234
2  | 6   | 362
3  | 5   | 123

如果 val 存在于 table1 (table2.val=table1.va1 or table2.val > table1.vall) 中,我想检查 table2 中的每条记录。 在表 1 中大约有 200 万条记录。表2中几千。 如果查询结果为真,我想从 table2 中删除行。

是否可以在一个查询中执行此操作? mysql或postgresql

性能很重要。

【问题讨论】:

  • Table1 中没有名为val的列
  • “如果 val 存在于 table2 中,则对于 table2 中的每条记录”肯定其中之一应该是 table1!
  • 此外,我们需要有关如何加入这些表的信息,例如Table2 中的 uid 是否引用 Table1 中的 id
  • 其实uid指的是另外一张表。这两个表没有链接到任何键

标签: mysql sql database postgresql


【解决方案1】:

假设(t2.val = t1.val1) or (t1.val2 > t2.val)条件:

delete table2
from table2 t2
inner join table1 t1 on (t2.val = t1.val1) or (t1.val2 > t2.val)

【讨论】:

  • 执行时间为 161 秒。是否可以更快地执行此查询?
【解决方案2】:
delete t 
from #table2 t 
inner join #table1 t2 
on t.val = t2.val or t2.val>t.val

【讨论】:

    【解决方案3】:

    假设Table2 中的uid 引用Table1 中的id(并且两个表都不包含空值),这将返回Table1 中满足您的存在条件的行:

    SELECT * 
      FROM Table1
     WHERE EXISTS (
                   SELECT * 
                     FROM Table2 
                    WHERE Table2.uid = Table1.id
                          AND (
                               Table2.val = Table1.val1
                               OR Table2.val > Table1.val2
                              )
                  );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 2019-04-08
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      相关资源
      最近更新 更多