1

私はこれを正常に照会します:

SELECT * FROM tableA
WHERE NOT (column1 IN 
(SELECT column1 FROM tableB) AND columnDate='9999-12-31');

約35000k tableA(3500 万) のレコードがあり、tableB5k (5,000) のレコードがあります。5 分以内にtableA除くすべてのレコードを取得します。tableB

問題は、(同じレコード数の別の例で) 3 つの列 (キー) を使用して同じ結果を達成しようとしたときです。

SELECT * FROM tableA
WHERE NOT (column1 || column2 || column3 IN 
(SELECT column1 || column2 || column3 FROM tableB) AND columnDate='9999-12-31');

1 時間 40 分tableAを除くすべてのレコードを取得します....!tableB

より効率的にクエリを実行できますか?

4

2 に答える 2

2
SELECT * FROM tableA a
WHERE NOT EXISTS
(SELECT null FROM tableB where a.column1=column1 and a.column2=column2 and a.column3=column3)
AND columnDate<>'9999-12-31'
于 2012-10-31T15:05:59.173 に答える
0

1 つの方法は、左結合のフィルタリングです。

select  * 
from    tableA a
left join
        tableB b
on      b.col1 = a.col1
        and b.col2 = a.col2
        and b.col3 = a.col3
where   a.columnDate <> '9999-12-31'
        and b.id is null -- No match found in B
于 2012-10-31T15:04:46.947 に答える