http://sqlfiddle.com/#!18/d1cf0/6
TABLE HEADER
(
[HeaderID] VARCHAR(3),
[description] VARCHAR(50),
[ProcessStatus] bit
);
TABLE DETAILS
(
[HeaderID] VARCHAR(3),
[DETAIL_VALUE_1] VARCHAR(50),
[DETAIL_VALUE_2] VARCHAR(50)
);
SELECT DISTINCT
H.HEADERID
FROM
HEADER H
LEFT JOIN
DETAILS D ON H.HeaderID = D.HeaderID
AND (D.DETAIL_VALUE_1 IS NOT NULL AND
D.DETAIL_VALUE_2 IS NOT NULL)
WHERE H.ProcessStatus = 0根据SQL Fiddle中提供的示例数据,上面的查询返回1,2,3..
我需要查询只返回2,3,因为头1有一条记录,其中DETAIL_VALUE_1不为null,但DETAIL_VALUE_2为null。
这些表可能有million+记录。头表是锚点,也就是说,头表将具有标志'ProcessStatus‘来指示哪些记录已经被处理。
提前谢谢。
发布于 2018-09-05 05:48:03
在我看来,您可能想找出“不好的条件”不是exist...kinda双负的行?
select
H.HEADERID
from
HEADER H
where
not exists
(
select *
from
Details D
where
H.HeaderID= D.HeaderID
and
(
D.DETAIL_VALUE_1 IS NULL
or
D.DETAIL_VALUE_2 IS NULL
)
)发布于 2018-09-05 04:57:23
您可以使用NOT IN
SELECT H.HEADERID
FROM HEADER H
WHERE HeaderID not in (select d.HeaderID from DETAILS d where (DETAIL_VALUE_1 is null or DETAIL_VALUE_2 is null))请注意,我没有对表执行JOIN操作,而且我删除了DISTINCT,因为这两个命令都不需要。
http://sqlfiddle.com/#!18/d1cf0/15/0
如果您计划使用DETAILS中的列,您仍然可以连接到它。
SELECT DISTINCT H.HEADERID
FROM HEADER H
LEFT JOIN DETAILS D on
D.HeaderID = H.HeaderID
WHERE H.HeaderID not in (select d.HeaderID from DETAILS d where (DETAIL_VALUE_1 is null or DETAIL_VALUE_2 is null))发布于 2018-09-05 06:29:26
通过利用COUNT只计算非空值这一事实,并检查DETAILS中HeaderID值的计数与DETAIL_VALUE_1和DETAIL_VALUE_2值的计数是否相同,可以做到这一点。此查询也适用于DETAILS中没有行的情况,因为所有COUNT值都为0。
SELECT H.HeaderID
FROM HEADER H
LEFT JOIN DETAILS D ON H.HeaderID= D.HeaderID
GROUP BY H.HeaderID
HAVING COUNT(D.HeaderId) = COUNT(D.DETAIL_VALUE_1) AND COUNT(D.HeaderID) = COUNT(D.DETAIL_VALUE_2)输出:
HEADERID
2
3SQLFiddle
https://stackoverflow.com/questions/52173845
复制相似问题