我有一个存储过程,它生成一个随机浮点数作为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行历史/日志进行排序,以找到没有合作伙伴的行。
答案 0 :(得分: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}的ID,但没有相应的{Phase = 2}这种方式来编写查询:
SELECT IDRand FROM TwoCol WHERE PhaseID = 1
EXCEPT
SELECT IDRand FROM TwoCol WHERE PhaseID = 2
答案 1 :(得分:0)
对不起这里的长度,但我希望它可以帮助下一个人来...
如上所述,我将随机id分成两个字段 - 第一个带有随机id,第二个带有“phase”id。使用上面的except语句可以返回已启动的随机ID列表(存在阶段1)但缺少第二个/完成阶段。
但是,由于我不想花时间单独查找每个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语句会导致忽略不同部分(请参阅下面的链接),因为我指定选择all。此外,我将需要改进我的随机数范围和/或添加日期代码,以防止重复。如果我碰巧两次获得相同的随机数,并且如果一个完成且一个失败,那么失败的那个(没有阶段2)将不会出现在EXCEPT语句查询结果中,因为存在任何匹配的完成阶段将满足EXCEPT条款。它没有检查每个起始阶段是否存在完成阶段,只是存在具有匹配随机id的完成阶段。
如果我的随机数字方案导致重复,我可以在表中有16个具有相同随机ID的条目(假设随机ID为1337)。 RID为1337的偶数条目看起来还不错,即使我可能只有偶数个错误(在数据库中检查偶数条目实际上并不是检查错误的好方法,我认为虽然我可以计算1的相位ID的数量,并将其与pid为2的那些计数进行比较,以验证我的查询结果)。在这16个条目中,假设有6个条目正确完成(第1阶段和第2阶段),其余4个以某种方式失败。由于数据库中的条目存在于RID 1337且PID为2,因此4个故障都不会出现。
感谢你指点我正确的方向,巴里!
=============================================== =========
以下链接似乎与EXCEPT运算符示例相比其他站点更深入,尽管它更老(断言只返回不同的结果,而不是所有结果)。
=============================================== =========
Pinal Dave的一般summarization运营商:
其中一个JR。开发人员前一天问我,SQL Server是否有与Oracle中的MINUS子句类似的操作。
当然,SQL Server中的EXCEPT子句与Oracle中的MINUS操作完全相似。 EXCEPT查询和MINUS查询返回第一个查询中未在第二个查询中返回的所有行。 EXCEPT查询和MINUS查询中的每个SQL语句必须在具有相似数据类型的结果集中具有相同数量的字段。