【问题标题】:ConcatRelated() Function to provide Unique Values on a FormConcatRelated() 函数在表单上提供唯一值
【发布时间】:2020-04-07 07:26:49
【问题描述】:

我已经开始开发一个 Access 数据库供我的机构使用,从事件管理开始。我一直在尝试开发一种表格,作为我们所有事件的主索引,以及打开调查相关表格以供调查员使用的中心。我开发了三个常规表和一个联结表:

  • 调查 - 一般信息
  • 目标
  • 受害者
  • 目标/受害者加入者

General Info Table 与 Targets 具有一对多的关系,而 Targets 和 Victims 具有通过 joiner 表连接的多对多关系。该连接表也是指控和结果所在的位置,因此每个目标和受害者都有自己的相关指控和结果。

我运行了两个查询;一个名为 Tar/VicQuery 的文件,其中包含从上述相关表格中收集的信息:

InternalIncidentID  TargetID    TargetFullName  VictimID    VictimFullName  Offense(s)  Outcome(s)
JAW-1               TAR-1       Smith Davie     VIC-1       Harris Michelle Neglect    Substantiated
JAW-1               TAR-1       Smith Davie     VIC-2       Jones Mary      Neglect    Substantiated
JAW-2               TAR-2       Thimble John    VIC-3       Man Joseph      Abuse      Substantiated
JAW-2               TAR-3       Rocket Sammy    VIC-3       Man Joseph      Abuse      Substantiated
JAW-2               TAR-4       Berkowitz Josh  VIC-3       Man Joseph      Abuse      Substantiated
JAW-3               TAR-5       McGowen Melissa VIC-4       Root James      Theft      Founded
JAW-3               TAR-5       McGowen Melissa VIC-5       Lopez Randy     Theft      Founded
JAW-3               TAR-5       McGowen Melissa VIC-6       Martino Bruno   Theft      Founded
JAW-3               TAR-6       Thimble John    VIC-4       Root James      Theft      Unfounded
JAW-3               TAR-6       Thimble John    VIC-5       Lopez Randy     Theft      Unfounded
JAW-3               TAR-6       Thimble John    VIC-6       Martino Bruno   Theft      Founded

还有另一个运行上述查询的查询,称为 TargetQuery:

InternalIncidentID  TargetName
JAW-1               Smith Davie, Smith Davie
JAW-2               Thimble John, Rocket Sammy, Berkowitz Josh
JAW-3               McGowen Melissa, McGowen Melissa, McGowen Melissa, Thimble John, Thimble John, Thimble John

上述查询使用 Allen Browne 的 ConcatRelated 方法来组合具有相同事件 ID 的数据行并连接调查的目标。我遵循了that Allen expresses on this page 的说明,包括创建相关模块、粘贴他的函数,然后尝试将其用作查询的一部分。我还希望在另一个(或相同,如果可能的话)查询中对与案件相关的受害者进行相同的查询。

TargetQuery 的 SQL 代码:

SELECT DISTINCT [Tar/Vic Query].InternalIncidentID, ConcatRelated("TargetFullName","[Tar/Vic Query]","InternalIncidentID= " & [Tar/Vic Query].[InternalIncidentID]) AS TargetName
FROM [Tar/Vic Query];

如上所示,结果与我希望达到的结果非常接近。理想的情况是重复名称不再作为连接的一部分出现。 我该如何做到这一点?

我尝试使用唯一值来解决这个问题,这在一个方面有很大帮助(将记录数从 11 减少到 3),但没有解决“Davie Smith”在该字段中多次出现的问题案(在这种情况下,他有两个受害者,如第一表所示)。不幸的是,这只是我的难题之一,因为我对 Access 和 SQL 还很陌生。我希望,到此结束时,我的表单将如下所示(在目标和受害者名称之前有更多字段,但你明白了):

  InternalIncidentID    TargetName                                 VictimName 
    JAW-1               Smith Davie                                Harris Michelle, Jones Mary
    JAW-2               Thimble John, Rocket Sammy, Berkowitz Josh Man Joseph
    JAW-3               McGowen Melissa Thimble John               Root James, Lopez Randy, Martino Bruno

对此可以提供的任何帮助/教育将不胜感激。我很清楚我目前对该计划的理解存在差距,并感谢就这个问题向我提供的所有耐心。以下是我在提出这个问题之前查看过的本网站和其他地方的主题:

Source 1 Source 2 Source 3 Source 4 Source 5

【问题讨论】:

  • 如果我不清楚,我很抱歉;我希望在上面的第二个表格中显示类似“Smith Davie,Smith Davie”的字段,如果他是唯一的目标,则只说“Smith Davie”。同样,我想突出显示从第一个表的排列连接的一个字段中的所有目标。我在上面的 SQL 查询代码中也使用了 DISTINCT。
  • InternalIncidentID 是文本,所以需要多加引号:"[InternalIncidentID]="""& [Tar/Vic Query].[InternalIncidentID] & """"
  • ID 字段真的是文本类型,还是您实际上将自动编号 ID 保存到这些字段中并显示相关的描述性值?换句话说,什么是 PK/FK 链接字段?建议不要在命名约定中使用空格或标点符号/特殊字符。
  • 每个表中的 PK 是一个自动编号,其格式为 JAW、TAR 或 VIC,并在编号前加一个“-”。 Internal Incident ID 是 General info 表的 PK 和 Target 表的外键,TargetID 是 Target Table 的 PK,VictimID 是 Victim Table 的 PK。后两者连接在一个联结表上,该联结表同时具有 TargetID 和 VictimID 作为 PK,以创建多对多关系。
  • 那么 InternalIncidentID 真的是一个数字字段,带有前缀显示格式?

标签: sql forms ms-access module concatenation


【解决方案1】:

Allen 的过程只允许为函数提供 WHERE 条件。我见过的其他版本允许传递整个 SQL 语句。

必须构建 2 个查询,为每个 InternalIncidentID 返回 DISTINCT 值 - 一个用于目标,一个用于受害者。这些查询将成为对 Allen 函数的每次调用的来源。

qryIncTargets

SELECT DISTINCT InternalIncidentID, TargetFullName FROM [Tar/Vic Query];

qryIncVictims

SELECT DISTINCT InternalIncidentID, VictimFullName FROM [Tar/Vic Query];

qry连接

SELECT Investigations.InternalIncidentID, 
ConcatRelated("TargetFullName","qryIncTargets","InternalIncidentID='" & [InternalIncidentID] & "'") AS Tars, 
ConcatRelated("VictimFullName","qryIncVictims","InternalIncidentID='" & [InternalIncidentID] & "'") AS Vics
FROM Investigations;

可以消除 [Tar/Vic Query],而是使用 [Target/Victim Joiner] 到 [Target(s)] 和 [Victim(s)] 的 JOIN 构建两个 DISTINCT 查询。

【讨论】:

  • 很抱歉没有尽快回复您;工作和我的新生儿让我远离。一旦我删除了连接查询中的内部 ('),您上面的代码就成功了。我多次使用这个概念并管理我正在寻找的结果。非常感谢您的帮助!
【解决方案2】:

这篇文章有点老了,但只是在尝试做类似的事情时偶然发现它(或者实际上可能完全相同......)。我从一个表中拉出,并使用 Allen Browne 的 ConcatRelated 方法将每个 ID 汇总为一行,值以逗号分隔。

我发现 ConcatRelated 函数的一个简单 mod 将消除在逗号分隔的汇总中重复的值。

来自:

'Build SQL string, and get the records.
strSql = "SELECT " & strField & " FROM " & strTable
If strWhere <> vbNullString Then
    strSql = strSql & " WHERE " & strWhere
End If

到:

'Build SQL string, and get the records.
strSql = "SELECT DISTINCT " & strField & " FROM " & strTable
If strWhere <> vbNullString Then
    strSql = strSql & " WHERE " & strWhere
End If

离开这里以防将来对某人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 2014-03-18
    • 2020-10-21
    • 1970-01-01
    相关资源
    最近更新 更多