使用GROUP BY的SQL查询返回字段的连接列表



我使用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_TIMEMODIFIED_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)

相关内容

  • 没有找到相关文章

最新更新