我在Microsoft Access中有一个事务表,其中包含许多供应商的许多事务。我需要确定每个供应商是否有连续的交易编号。我不知道序列是什么或每个供应商的交易数量。我需要编写一个SQL来识别供应商的顺序编号,并将字段设置为“1”(如果存在)。我在考虑运行嵌套循环,首先确定每个供应商的事务数,然后循环这些事务来比较事务数。任何人都可以帮助我吗?
答案 0 :(得分:0)
要查找一个连续集(2个记录,其中一个事务编号跟随另一个事务编号):
SELECT transactionId FROM tbl WHERE EXISTS
(SELECT * FROM tbl as t WHERE tbl.vendorId = t.vendorId
AND tbl.transactionId+1 = t.transactionId)
答案 1 :(得分:0)
我会使用一个查询来查找任何供应商的编号差距,如果返回任何记录,那么您没有所有供应商的顺序编号。
SELECT *
FROM tblTransaction As T1
WHERE (
SELECT TOP 1 T2.transactionID
FROM tblTransaction As T2
WHERE T1.vendorID = T2.vendorID AND
T1.transactionID < T2.transactionID
ORDER BY T2.transactionID
) - T1.transactionID > 1
这样做,对于表中的每条记录,在同一个表中查找编号最小的其他transactionID,该表对于同一供应商,并且具有比第一个更高编号的transactionID。如果该记录的transactionID值比第一个记录中的值高一个以上,则表示供应商的编号差距。
编辑:根据要求更改上面的变量名称。
答案 2 :(得分:0)
我不确定这是最简单的方法,但我认为它可行。抱歉使用多个步骤,但Jet 4.0强迫一个人这样做。**
我假设所有transactionId
值都是正整数,并且序列是由transactionId
组成的均匀间隔vendorId
值的集合。我进一步假设(vendorId, transactionId)
上有一个密钥。
第一步,消除无效行,例如需要至少三行才能确定一个序列(所有其他行是通过还是失败?);可能也希望在此处过滤掉其他垃圾(例如,具有NULL
值的行/组):
CREATE VIEW tbl1
AS
SELECT T1.vendorId, T1.transactionId
FROM tbl AS T1
WHERE EXISTS (
SELECT T2.vendorId
FROM tbl AS T2
WHERE T2.vendorId = T1.vendorId
GROUP
BY T2.vendorId
HAVING COUNT(*) > 2
);
找到每个供应商的最低价值(稍后会派上用场):
CREATE VIEW tbl2
AS
SELECT vendorId, MIN(transactionId) AS transactionId_min
FROM tbl1
GROUP
BY vendorId;
通过减去每个供应商的最低值,使所有序列从零开始(transactionId_base_zero
):
CREATE VIEW tbl3
AS
SELECT T1.vendorId, T1.transactionId,
T1.transactionId - T2.transactionId_min AS transactionId_base_zero
FROM tbl1 AS T1
INNER JOIN tbl2 AS T2
ON T1.vendorId = T2.vendorId;
根据每个供应商的MAX
,MIN
和COUNT
设置值预测步长值(相邻序列值之间的差异):
CREATE VIEW tbl4
AS
SELECT vendorId,
MAX(transactionId_base_zero) / (COUNT(*) - 1)
AS transactionId_predicted_step
FROM tbl3;
测试每个序列值的预测步长值是否为真(即伪代码)this_transactionId - step_value = prior_transactionId
(省略最低transactionId
,因为它没有先前值!):
SELECT DISTINCT T.vendorId
FROM tbl3 AS T
WHERE T.transactionId_base_zero > 0
AND NOT EXISTS (
SELECT *
FROM tbl3 AS T3
INNER JOIN tbl4 AS T4
ON T3.vendorId = T4.vendorId
WHERE T.vendorId = T3.vendorId
AND T.transactionId_base_zero
- T4.transactionId_predicted_step
= T3.transactionId_base_zero
);
上述查询应返回vendorId
值不是连续的供应商transactionId
。
**在我的辩护中,我遇到了几个错误Jet 4.0我不得不围绕解决方法进行编码。是的,我知道错误是在Jet 4.0(或其OLE DB提供程序)中,因为a)我使用SQL Server双重检查结果,b)他们违反逻辑! (甚至是SQL自己奇怪的3VL逻辑:)