select *
from ((select 'Temp', r.*
from tab1 r
where (r.fa, r.date, r.status) not in (select r1.fa, r1.date, r1.status from tab2 r1)
) union all
(select 'report', r.*
from tab2 r
where (r.fa, r.date, r.status) not in (select r1.fa, r1.date, r1.status from tab1 r1)
)
) temp
order by fa;
随着数据的增加,查询时间也在增加。即使数据不断增加,请提供优化时间的解决方案
最佳答案
所以你想要数据 A + B -(a 与 B 相交)。为此,您使用 1 个 union 和 2 个 not in 子句。我试图消除以下查询中的那些:
SELECT *
FROM(
SELECT X.*, COUNT(DISTINCT CN) OVER(PARTITION BY r.fa,r.date,r.status) CNT
FROM (
SELECT 'Temp' CN,r.*
FROM tab1 r
UNION ALL
SELECT 'report' CN,r.*
FROM tab2 r
)X)Y
WHERE Y.CNT=1
基本上,首先您应该使用 UNION ALL 而不是 UNION 选择所有记录。之后过滤掉两个表(tab1,tab2)中出现的记录,以便您可以使用分析功能。
关于mysql - 优化sql中以下查询时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40906837/