从2个表中选择笛卡尔积,其中不等于(<>)条件; PostgreSQL的

时间:2017-09-27 19:24:10

标签: sql postgresql performance where-clause cartesian-product

我需要两个表MINUS组合的笛卡尔积,其中两个表在一个字段中具有相同的值。

SELECT 
    table1.field1,
    table1.field2,
    table2.field3,
    table2.field4
FROM 
    table1, table2
WHERE 
    table1.field1 <> table2.field3;

现在,让我们假设table1和table2每个都有一百万条记录,并且这些字段已编入索引。 在合理的时间内检索结果集的最有效方法是什么? 有没有更好的方法来编写此查询?

1 个答案:

答案 0 :(得分:1)

除了问题中已经给出的方法之外,我能想到的唯一方法是

SELECT 
  table1.field1,
  table1.field2,
  table2.field3,
  table2.field4
FROM 
  table1, table2
EXCEPT -- Postgresql, MINUS in Oracle
    SELECT 
  table1.field1,
  table1.field2,
  table2.field3,
  table2.field4
FROM 
  table1, table2
WHERE field1=field3;

假设field1field3被编入索引,并且数据库对完整的笛卡尔联接进行了一些优化,那么可能更快,它可能会运行完全相同方式(使用EXPLAIN),可能会更糟!