2017-08-04 102 views
0

主表:SQL查询与2个子查询条件

MasterID | PartID 
1   1 
2   3 
3   5 

部分表:

PartID | PartName | DeleteDate 
1  Part1  NULL 
2  Part2  NULL 
4  Part4  NULL 
5  Part5  08-04-2017 

结果表:

MasterID | PartID 
2   3 
3   5 

这两个表存在于两个不同的数据库和我需要验证一个SQL查询来获取记录,如果主表有PartID不在Part表和Master表具有在零件表中被删除的任何PartID(即, DeleteDate IS NOT NULL)

我想用下面的查询,但没有得到预期的结果

Select 
    * 
FROM DBNAME.DBO.Master 
Where PartID in ( 
    Select 
     PartID 
    from Part) 
and PartID not in ( 
    Select 
     PartID 
    from Part 
    where DeleteDate is NOT NULL) 

请让我知道我可以做到这一点

+0

在发布代码或东西,应该是在等宽字体,选择粘贴什么,然后按{}键,保持它对我们来说可读! –

回答

3

一种方法是LEFT JOINMaster表到Part表,然后保留任何未映射到Part表中任何内容或映射到已删除部分的任何部分。

SELECT 
    m.PartID, 
    CASE WHEN p.partID IS NULL THEN 'missing' ELSE 'deleted' END AS status 
FROM Master m 
LEFT JOIN Part p 
    ON m.PartID = p.PartID 
WHERE 
    p.PartID IS NULL OR   -- missing part 
    p.DeleteDate IS NOT NULL -- deleted (but present) part 
+0

你会得到一个错误,因为unaliased在选择列表中参与 –

+0

哦,你只是修复它:) –

+0

在几千个SQL问题后,它更容易检测到这样的错误。 –

0

作为一种替代方式,可以使用工会针对两种情况

Select 
     t1.* 
From 
     DBNAME.DBO.Master t1,Part t2 
Where 
     t1.PartID = t2.PartID(+) and t2.PartID is null 
Union All 
Select 
     t1.* 
From 
     DBNAME.DBO.Master t1,Part t2 
Where 
     t1.PartID = t2.PartID and t2.DeleteDate is not null;