首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Left-Join -如果两个值在TableB中都不为null或在TableB中缺少行,则获取值

SQL Left-Join -如果两个值在TableB中都不为null或在TableB中缺少行,则获取值
EN

Stack Overflow用户
提问于 2018-09-05 04:52:40
回答 3查看 74关注 0票数 6

http://sqlfiddle.com/#!18/d1cf0/6

代码语言:javascript
复制
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‘来指示哪些记录已经被处理。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-05 05:48:03

在我看来,您可能想找出“不好的条件”不是exist...kinda双负的行?

代码语言:javascript
复制
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
      )
    )
票数 2
EN

Stack Overflow用户

发布于 2018-09-05 04:57:23

您可以使用NOT IN

代码语言:javascript
复制
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中的列,您仍然可以连接到它。

代码语言:javascript
复制
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))
票数 1
EN

Stack Overflow用户

发布于 2018-09-05 06:29:26

通过利用COUNT只计算非空值这一事实,并检查DETAILSHeaderID值的计数与DETAIL_VALUE_1DETAIL_VALUE_2值的计数是否相同,可以做到这一点。此查询也适用于DETAILS中没有行的情况,因为所有COUNT值都为0。

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
HEADERID
2
3

SQLFiddle

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52173845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档