我用新版本替换旧的不整齐的SQL查询,因为它没有包含它应该有的几行。比较两个大的SQL查询
新的查询当然包含这些缺失的行,但我想完全确定它还包括原始查询中的所有行。
这两个查询使用完全不同的表。每个查询是~14000行。
是否有我可以编写的查询检查QueryA是否包含QueryB没有的任何行?
我用新版本替换旧的不整齐的SQL查询,因为它没有包含它应该有的几行。比较两个大的SQL查询
新的查询当然包含这些缺失的行,但我想完全确定它还包括原始查询中的所有行。
这两个查询使用完全不同的表。每个查询是~14000行。
是否有我可以编写的查询检查QueryA是否包含QueryB没有的任何行?
你可以做这样的事情。
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
您可以包括在“关于条款”中的所有列,也可以只包括你需要保证行是相同的,如主键列。
这是完美的。谢谢! – Urbycoz
例如,如果结果看起来像(理论上):
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
你能用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
如果你能得到它到SQL Server,你可以做:
<Query 1>
EXCEPT
<Query 2>
<Query 2>
EXCEPT
<Query 1>
这只会说不会在其他查询存在输出记录。它检查结果集中的所有字段。
我包含两个方向,因为如果在EXCEPT
声明的较低部分有更多记录,则这些记录不会显示为例外。
简单的方法是使用QueryA和QueryB和Group By的联合。
查看这里的一个例子: http://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx在Jeff的SQL服务器博客上。
这比较了两个_tables_,而不是_queries_。 – Urbycoz
你能告诉我们主键列是什么吗?每个查询中的哪些字段对每一行都是唯一的。 –
对不起。这两个查询只返回一个字段。很明显,它们在两者中都有相同的名称。该字段不包含重复值。 – Urbycoz