当NOT IN与返回NULL的SUBQUERY一起使用时,查询挂起

时间:2016-01-25 05:46:59

标签: sql sql-server

我们这样做:

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的所有数据,但为什么查询会挂起?

3 个答案:

答案 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)