我正在使用新版本替换旧的不整洁的SQL查询,因为它未能包含它应该具有的多个行。
新查询肯定包含这些缺失的行,但我想完全确定它还包括原始查询中的所有行。
这两个查询使用完全不同的表。每个查询大约是14000行。
我是否可以编写一个查询来检查QueryA是否包含QueryB没有的任何行?
答案 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)
例如,如果结果看起来像(理论上):
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服务器博客上。