我使用ADODB为excel从我的撤消表(Access数据库)撤消条目的列表。然后,用户将选择其中一个"撤销:"由_MODIFIED_BY和_MODIFIED_TIME的唯一组合定义,然后能够检索与之相关的所有记录。一种方便的方法是通过ID:s的列表来检索。
对于第一个查询,我希望创建一个所有相关ID的列表(命名为_ORIG_ID:s),如下所示:
SELECT Count(*), [_MODIFIED_BY], [_MODIFIED_TIME], CONCAT([_ORIG_ID],',') AS _REL_IDS
FROM ANALYSES_UNDO
GROUP BY [_MODIFIED_BY], [_MODIFIED_TIME]
ORDER BY [_MODIFIED_TIME] DESC
然后用户将从这个查询中选择一条记录,然后我将从另一个表中提取这些ID:s,如下所示:
SELECT * FROM ANALYSES WHERE ID IN(XXX)
我将用_REL_IDS中返回的任何内容替换XXX。
是否可以构造这个查询。ACCESS SQL甚至可以加入这样的字段吗?我知道没有一个叫做CONCAT的函数是这样工作的,但是定义它只是为了演示我的需求。
您不需要连接数据,在第二部分中使用原始查询作为子查询会更简单。
原始查询(不带concat位)
SELECT Count(*), [_MODIFIED_BY], [_MODIFIED_TIME], FIRST([_ORIG_ID])
FROM ANALYSES_UNDO
GROUP BY [_MODIFIED_BY], [_MODIFIED_TIME]
ORDER BY [_MODIFIED_TIME] DESC
注意FIRST([_ORIG_ID])
部分-它返回一个正确的id,第二个查询可以比较它的字段,如下所示:
SELECT *
FROM ANALYSES
INNER JOIN ANALYSES_UNDO ON ANALYSES.ID = ANALYSES_UNDO.[_ORIG_ID]
WHERE
ANALYSES_UNDO.[_MODIFIED_BY] = (SELECT U.[_MODIFIED_BY] FROM ANALYSES_UNDO U WHERE U.[_ORIG_ID] = XXX)
AND ANALYSES_UNDO.[_MODIFIED_TIME] = (SELECT U.[_MODIFIED_TIME] FROM ANALYSES_UNDO U WHERE U.[_ORIG_ID] = XXX)
传递给第二个查询的参数XXX
只需要是单个[_ORIG_ID]
,查询将返回具有相同MODIFIED_TIME
和MODIFIED_BY
的所有其他记录
我终于找到了一种适合我的方法,通过下面的查询使用返回的[_MODIFIED_BY]=XXX和[_MODIFIED_TIME]=YYY:
SELECT * FROM ANALYSES WHERE ID=
ANY(SELECT [_ORIG_ID] FROM ANALYSES_UNDO WHERE [_MODIFIED_BY]=XXX AND [_MODIFIED_TIME]=YYY)