2013-04-08 66 views
0

我知道如何找到表是不可少的,但两个查询之间的共同值,获得缺失的记录?2个查询不表

查询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' 

结果:

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.问题是,第一个查询使用相同的表格,但使用过滤器。

+0

这是不是真的清楚自己想要什么。如果第一个查询返回你想要的结果,那么问题是什么? - 也许提供更多关于预期结果的细节? – 2013-04-08 14:24:33

回答

2

假设你的意思是你想从结果中的所有记录从查询2不在结果从查询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在第二个查询要么因为它可能会降低性能和h对结果没有影响。

更多文档:EXCEPT and 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 
+0

这正是我之后的!感谢一百万SELECT DISTINCT GENG.GlGroup FROM RPZCGenGroup耿 除非 SELECT GENG.GlGroup FROM MCMGenHistory GENH RIGHT OUTER JOIN RPZCGenGroup耿 ON GENG.ExpenseCode = SUBSTRING(GENH.GlCode,13,3) WHERE SUBSTRING(GENH 。'G1'='P' – user1546143 2013-04-09 13:15:57

5

当你把你的标准的JOIN标准之外你有效地把你的OUTER JOININNER 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 
+0

良好的捕获在右边的外部+ where子句 - >内部 – Alkini 2013-04-08 14:54:22

+0

这不起作用,因为首先GENH没有列GLGROUP – user1546143 2013-04-09 13:13:30

+0

然后使用'GENH.GlCode'。使用哪个字段并不重要。看起来你从@ Alkini的帖子得到了这个,尽管你很好,很酷。 – 2013-04-09 14:08:39