我有两张桌子,一张是另一张桌子的副本。 (我必须删除父母中不再存在的记录)。运行此查询有效,但需要大约1分钟才能完成。我知道NOT EXISTS更快,因为我不会为每一行运行子查询,但不会返回任何结果。
SELECT mlscopy.listing_listnum
FROM mlscopy
WHERE mlscopy.listing_listnum
NOT IN (SELECT mls_cvrmls.listing_listnum FROM mls_cvrmls)
我将澄清,这里的问题是父母随着时间的推移而变化,我必须从孩子那里删除/添加记录。所以我一直坚持要从child中删除list_listnum不存在的孩子。
这是不存在的查询
SELECT mlscopy.listing_listnum
FROM mlscopy
WHERE
NOT EXISTS (SELECT mls_cvrmls.listing_listnum FROM mls_cvrmls)
想出来
SELECT mlscopy.listing_listnum
FROM mlscopy
WHERE NOT EXISTS (
SELECT mls_cvrmls.listing_listnum
FROM mls_cvrmls
WHERE mlscopy.listing_listnum = mls_cvrmls.listing_listnum
)
答案 0 :(得分:2)
尝试这种变化,看看它是否更好:
SELECT mlscopy.listing_listnum
FROM mlscopy
LEFT JOIN mls_cvrmls
ON mlscopy.listing_listnum = mls_cvrmls.listing_listnum
WHERE mls_cvrmls.listing_listnum IS NULL
答案 1 :(得分:0)
试试这个:
CREATE INDEX i_listnum ON mls_cvrmls(listing_listnum ASC)
尝试使用LEFT JOIN
或NOT EXISTS
重写查询可能不会产生太大的影响,因为查询优化器可以解决这个问题。
然而,通过mls_cvrmls
快速找到listing_listnum
中的行的意思只能提高效果(但需要额外的空间)。
另一种选择可能是:
SELECT listing_listnum FROM mlscopy
MINUS
SELECT listing_listnum FROM mls_cvrmls
答案 2 :(得分:0)
SELECT mlscopy.listing_listnum
FROM mlscopy A
NOT EXISTS
(
SELECT *
FROM mls_cvrmls B
WHERE B.listing_listnum = A.listing_listnum
);