0

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

查询一:

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'

结果:

10
7
8
5
1
6
9
4

查询 2:

SELECT DISTINCT GENG.GlGroup 
from RPZCGenGroup GENG

结果:

1
10
2
3
4
5
6
7
8
9

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

4

2 回答 2

5

当您在标准之外添加标准时,JOIN您实际上将您的标准OUTER JOIN变成了INNER JOIN. 如果我理解正确,您希望加入标准的 GENG.GlGroup 值不适用,那么为什么不将所有剔除标准保留在OUTER JOIN逻辑中并从 RPZCGenGroup 获取 GENH.GlGroup 为 Null 的记录?

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 
于 2013-04-08T14:37:44.783 回答
2

假设您的意思是您想要Query 2结果中不在Query 1结果中的所有记录,那么一种快速简便的方法是使用EXCEPT

[Query 2]
EXCEPT
[QUERY 1]

具体来说:

SELECT DISTINCT GENG.GlGroup 
FROM RPZCGenGroup GENG
EXCEPT
SELECT 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'

您可能也不想DISTINCT在第二个查询中使用,因为它可能会降低性能并且对结果没有影响。

更多文档:EXCEPT 和 INTERSECT @ MSDN

看起来您真正想要的是 RPZCGenGroup 中的所有记录,这些记录在MCMGenHistory中没有任何匹配的记录,且 GlCode以“P”开头。快速简便的版本是使用NOT EXISTS

SELECT GENG.GlGroup 
FROM RPZCGenGroup GENG
WHERE NOT EXISTS (
    SELECT 
    FROM MCMGenHistory GENH
    WHERE substring(GENH.GlCode,13,3) = GENG.ExpenseCode
        AND SUBSTRING(GENH.GlCode,1,1)='P'
)

的性能NOT EXISTS可能是一个问题,因此您可以/应该用适当的外部连接替换它(也请注意@Love2Learn 的评估):

SELECT GENG.GlGroup 
FROM RPZCGenGroup GENG
    LEFT OUTER JOIN MCMGenHistory GENH
        ON substring(GENH.GlCode,13,3) = GENG.ExpenseCode
            AND SUBSTRING(GENH.GlCode,1,1)='P'
WHERE GENH.GlCode IS NULL
于 2013-04-08T14:23:58.737 回答