0

我在 Microsoft Access 中有一个事务表,其中包含许多供应商的许多事务。我需要确定每个供应商是否有顺序交易编号。我不知道顺序是什么或每个供应商的交易数量。我需要编写一个 SQL 来识别供应商的顺序编号,并将字段设置为“1”(如果存在)。我正在考虑运行嵌套循环,首先确定每个供应商的交易数量,然后循环通过这些交易比较交易数量。有人可以帮我吗?

4

3 回答 3

0

要查找一个顺序集(2 条记录,其中一个事务号在另一个之后):

SELECT transactionId FROM tbl WHERE EXISTS 
  (SELECT * FROM tbl as t WHERE tbl.vendorId = t.vendorId 
   AND tbl.transactionId+1 = t.transactionId)
于 2011-04-16T17:34:54.037 回答
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 值比第一条记录中的值高一个以上,则表示供应商编号存在差距。

编辑:根据要求更改了上面的变量名称。

于 2011-04-16T17:47:04.430 回答
0

我不确定这是最直接的方法,但我认为它可以工作。为使用多个步骤而道歉,但 Jet 4.0 有点强迫你这样做。**

我假设所有transactionId值都是正整数,并且序列是一组均匀间隔的transactionIdvendorId。我进一步假设在(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;

根据 预测步长值(相邻序列值之间的差异)MAXMINCOUNT为每个供应商设置值:

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 逻辑 :)

于 2011-04-19T12:37:49.603 回答