2017-09-27 101 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),它可能會更糟!