我们这样做:
SELECT x from d where x not in
(
SELECT xx FROM a
INNER JOIN aa ON a.col = aa.col
UNION
SELECT xx FROM b
INNER JOIN bb on a.col = bb.col
)
当我们单独运行子查询时,它会在10秒内执行并返回0条记录,因为INNER JOIN中使用的其中一个表是空白的
但是,当我们运行整个查询时,它会继续运行超过2个小时并且永远不会结束。
当运行整个查询时,我们希望看到来自d的所有数据,但为什么查询会挂起?
答案 0 :(得分:1)
听起来子查询正在为d中的每个x运行。尝试将其作为CTE,如果未通过临时表,则预先计算子查询,然后仅使用它从x中排除记录。
--CTE:
WITH subq AS
(
SELECT xx FROM a
INNER JOIN aa ON a.col = aa.col
UNION
SELECT xx FROM b
INNER JOIN bb on a.col = bb.col
)
SELECT x from d left join subq on subq.xx = d.x where subq.xx is null
临时表方法完全相同,只需为col xx创建一行临时表(我不确定您的数据类型是什么),并使用子查询填充它。
答案 1 :(得分:0)
试试这个
SELECT x from d where x not in
(select isnull(xx,'-9999999') from
(
SELECT xx FROM a
INNER JOIN aa ON a.col = aa.col
UNION
SELECT xx FROM b
INNER JOIN bb on a.col = bb.col
)
)
答案 2 :(得分:0)
试试这个
select x from d
where not exists(Select top 1 1 from a inner join aa on a.col = aa.col where d.x = xx)
and not exists (Select top 1 1 from b inner join bb on a.col = bb.col where d.x = xx)