从2个查询而不是表中获取丢失的记录

use*_*143 0 sql sql-server sql-server-2008

我知道如何找到缺少但两个查询的表之间的公共值?

查询1:

SELECT DISTINCT GENG.GlGroup
FROM MCMGenHistory GENH 
    RIGHT OUTER JOIN RPZCGenGroup GENG 
        ON GENG.ExpenseCode = substring(GENH.GlCode,13,3)
WHERE SUBSTRING(GENH.GlCode,1,1)='P'
Run Code Online (Sandbox Code Playgroud)

结果:

10
7
8
5
1
6
9
4
Run Code Online (Sandbox Code Playgroud)

查询2:

SELECT DISTINCT GENG.GlGroup 
from RPZCGenGroup GENG
Run Code Online (Sandbox Code Playgroud)

结果:

1
10
2
3
4
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)

我想要丢失的记录,例如2和3.问题是第一个查询使用相同的表但使用过滤器.

Eri*_*ice 5

当您在条件之外添加标准时,JOIN您可以有效地将其OUTER JOIN转换为INNER JOIN.如果我理解正确你想要加入条件的GENG.GlGroup值不适用,那么为什么不在OUTER JOIN逻辑中保留所有的剔除标准并从RPZCGenGroup获取GENH.GlGroup为空的记录?

SELECT  DISTINCT GENG.GlGroup
FROM    MCMGenHistory GENH 
RIGHT   OUTER JOIN RPZCGenGroup GENG 
        ON  GENG.ExpenseCode=substring(GENH.GlCode,13,3)
        AND SUBSTRING(GENH.GlCode,1,1)='P'
WHERE   GENH.GlCode Is Null 
Run Code Online (Sandbox Code Playgroud)