对不起这里的长度,但我希望它可以帮助下一个出现的人......
如上所述,我将随机 id 分成两个字段 - 第一个带有随机 id,第二个带有“阶段”id。使用上面的 except 语句可以返回已启动(阶段 1 存在)但缺少第二/完成阶段的随机 id 列表。
但是,由于我不想花时间单独查找每个 RID,因此我将 EXCEPT 语句包装在 IN 语句中,如下所示。这使我可以控制实际返回哪些字段。
SELECT randomid, phaseid, info, type, time
FROM history
WHERE randomid IN (
SELECT randomid FROM history WHERE phaseid = '1'
EXCEPT
SELECT randomid FROM history WHERE phaseid = '2'
)
注意:像我一样包装 EXCEPT 语句会导致不同部分(请参阅下面的链接)被忽略,因为我指定全选。此外,我将需要改进我的随机数范围或添加日期代码以防止重复。如果我碰巧两次获得相同的随机数,如果一个完成,一个失败,则失败的一个(没有阶段 2)将不会显示在 EXCEPT 语句查询结果中,因为存在任何匹配的完成阶段将满足 EXCEPT 子句。它不会检查是否每个开始阶段都有一个完成阶段,只是存在一个具有匹配随机 id 的完成阶段。
如果我的随机数字方案很差,导致重复,我可以在表中有 16 个具有相同随机 id 的条目(假设随机 id 是 1337)。RID 为 1337 的偶数条目看起来不错,即使我可能只是有偶数个错误(现在我认为检查数据库中的偶数条目确实不是检查错误的好方法其中,尽管我可以计算为 1 的阶段 id 的数量并将其与 pid 为 2 的阶段 id 的数量进行比较,以验证我的查询结果)。在这 16 个条目中,假设 6 个已正确完成(第 1 阶段和第 2 阶段),其余 4 个以某种方式失败。由于数据库中存在 RID 1337 且 PID 为 2 的条目,因此 4 个故障都不会出现。
感谢您为我指明正确的方向,巴里!
==================================================== ======
以下链接似乎比其他站点更深入地使用 EXCEPT 运算符示例,尽管它较旧(statiung 只返回不同的结果,而不是所有结果)。
http://www.databasejournal.com/features/mssql/article.php/3602601/Except-Operator-in-SQL-Server-2005.htm
==================================================== ======
Pinal Dave对算子的一般总结:
JR之一。前天开发人员问我,SQL Server 有没有类似Oracle 中的MINUS 子句的操作。
Absolutely, EXCEPT clause in SQL Server is exactly similar to MINUS operation in Oracle. The EXCEPT query and MINUS query returns all rows in the first query that are not returned in the second query. Each SQL statement within the EXCEPT query and MINUS query must have the same number of fields in the result sets with similar data types.