比较两个大型SQL查询

时间:2011-07-22 13:33:00

标签: sql

我正在使用新版本替换旧的不整洁的SQL查询,因为它未能包含它应该具有的多个行。

新查询肯定包含这些缺失的行,但我想完全确定它还包括原始查询中的所有行。

这两个查询使用完全不同的表。每个查询大约是14000行。

我是否可以编写一个查询来检查QueryA是否包含QueryB没有的任何行?

6 个答案:

答案 0 :(得分:9)

你可以这样做。

Select  * FROM 
(
QUERY A GOES HERE 
) AS A
LEFT JOIN
(
QUERY B GOES HERE 
) AS B
ON A.Col1=B.Col1 AND A.Col2=B.Col2 ....
WHERE B.Col1 IS NULL

您可以在“on子句”中包含所有列,也可以只包含确保行相同所需的列,例如主键。

答案 1 :(得分:2)

假设两个查询都返回同一个表中的主键列:

select *
from (QueryA) a
where a.PK not in (select PK from (QueryB) b)

请注意,parantheses意味着这些是子查询。

答案 2 :(得分:1)

  1. 从旧查询中选择结果到临时表中。
  2. 从新查询中选择结果到另一个临时表中。
  3. 从一个表到另一个表的外部连接,等同于所有列。
  4. 添加一个where子句,仅返回一侧或另一侧有空值的行。
  5. 例如,如果结果看起来像(理论上):

    UserId | FirstName | LastName | Email
    

    然后将每个查询运行到具有相同结构的单独临时表中,例如#resOld和'#resNew'。

    然后:

    SELECT
        *
    
    FROM #resOld OLD
    
    LEFT OUTER JOIN #redNew NEW -- LEFT OUTER JOIN, so we still retain rows which don't match
        ON  NEW.UserId    = OLD.UserId
        AND NEW.FirstName = OLD.FirstName
        AND NEW.LastName  = OLD.LastName
        AND NEW.Email     = OLD.Email
    
    WHERE OLD.UserID IS NULL -- Only retain rows where we didn't match. Can use any field from OLD which cannot be null by design.
    

    当一个结果集中的行与另一个结果集中的行不匹配时,此查询将仅返回行。

    编辑:这比它需要的更复杂,您可以反转连接条件并删除WHERE,如下所示:

    SELECT
        *
    
    FROM #resOld OLD
    
    INNER JOIN #redNew NEW -- Inner join where rows are different.
        ON  NEW.UserId    != OLD.UserId
        AND NEW.FirstName != OLD.FirstName
        AND NEW.LastName  != OLD.LastName
        AND NEW.Email     != OLD.Email
    

答案 3 :(得分:1)

您可以使用LEFT OUTER JOIN吗?

SELECT
  *
FROM
  ( < put query 1 here > ) AS Query1
LEFT JOIN
  ( < put query 2 here > ) AS Query2
    ON  Query1.Field1 = Query2.Field1
    AND Query1.Field2 = Query2.Field2
    AND Query1.Field3 = Query2.Field3
    etc, etc
WHERE
  Query2.Field1 IS NULL

答案 4 :(得分:1)

如果你能够进入SQL Server,你可以这样做:

<Query 1>
EXCEPT
<Query 2>

<Query 2>
EXCEPT
<Query 1>

这将只输出另一个查询中不存在的记录。它检查结果集中的所有字段。

我包含了两个方向,因为如果EXCEPT语句的下半部分中有更多记录,那么这些记录不会显示为异常。

答案 5 :(得分:1)

简单的方法是使用查询和查询联合以及分组依据。

在此处查看示例: http://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx在Jeff的SQL服务器博客上。