1

我有一个存储过程,它生成一个随机浮点数作为 ID 标记,一旦它被调用,它就会将随机数 + .1 存储到历史/日志表中,然后最终结果以相同的随机数存储数字 +.2(作为排序器/排序器)。

是否有一种简单的方法可以动态查询填充了这些序列号的列(如下例所示)并验证它们的数量(对)是否为偶数,以便轻松确保存储过程始终正确处理?

1568.1
1568.2
8452.1
8452.2
9886.1
9886.2
5455.1
3682.1
3682.2
4857.1
4857.2

在上面的示例数据中,我想要一个警告 5455.1 存在的查询,因为它没有第二部分 (5455.2),因为我的存储过程记录了第二个带有调用结果的条目(成功或失败)。

当然,我需要它不仅提醒我存在问题/奇数(因为我可以简单地在桌子上进行计数,看看数字是否相等来确定),我希望能够选择不匹配所以我不会通过 10,000 行历史/日志来查找没有合作伙伴的行。

4

2 回答 2

1

首先,您的 ID-Key 不应该是一列,而应该是两列。也就是说,而不是

CREATE TABLE OneCol  (IDKey DECIMAL(6, 1) Primary Key);

你应该有类似的东西:

CREATE TABLE TwoCol  
(
    IDRand INT, 
    PhaseID TINYINT
    Primary Key  (IDRand, PhaseID)
)

然后假设您要查找的特定异常是具有 {Phase=1) 但没有对应的 {Phase=2} 的 ID,这是编写查询的一种方式:

SELECT IDRand FROM TwoCol WHERE PhaseID = 1
EXCEPT
SELECT IDRand FROM TwoCol WHERE PhaseID = 2
于 2012-01-17T04:51:23.493 回答
0

对不起这里的长度,但我希望它可以帮助下一个出现的人......

如上所述,我将随机 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.

于 2012-01-17T15:15:10.343 回答