2017-09-27 110 views
0

我需要两个表的笛卡尔乘积MINUS组合,其中两个表在一个字段中具有相同的值。从2个表中选择不等于(<>)的笛卡尔积; postgresql

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

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

+0

请注意where条款中NOT EQUAL条件。我需要两个表MINUS组合的笛卡尔乘积,其中两个表在一个字段中具有相同的值。谢谢。 – zlatko

+5

这似乎是一种非常合理的方式来生成笛卡尔产品,除非两个字段相同。 – JNevill

+0

这是一个Tera的结果,4个Tera的字段,每个字段的内容有多少个字节?你有多少内存?如果将结果分成多个部分,可以使用结果,可以通过十个步骤中的“AND t1.f1> 0 AND t1.f1 <= 100000”来使用。两个查询之一是否有排序的密钥?你可以阅读这两个表(2兆行)的列,并将它们与编程语言结合起来,但也许postgresql足够聪明来解决问题本身。 –

回答

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),它可能会更糟!