You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

一对多关联表SQL查询问题:获取主表ID、子表最后Evento与首次DataInserimento

问题排查与解决方案

现有一对多关联的主表Subattivita和子表Eventi(关联字段为Subattivita.ID与Eventi.IDSubattivita),需要查询主表ID、子表对应最后一条记录的Evento值,以及子表首次的DataInserimento值。执行自行编写的SQL时,Access提示需输入u.Evento的值,无法得到预期结果,现排查错误并提供正确方案。

表结构与示例数据

主表Subattivita

IDContenuto
1测试
2测试2
3测试3
4测试4
5测试5
6测试6
7测试7
9绘制图纸
10测试8

子表Eventi

IDIDSubattivitaEventoCommentoDataInserimento
11Aperta自动插入01/08/2024
22Aperta自动插入01/08/2024
33Aperta自动插入01/08/2024
44Aperta自动插入01/08/2024
55Aperta自动插入02/08/2024
86Aperta自动插入02/08/2024
97Aperta自动插入02/08/2024
129Aperta自动插入02/08/2024
1310Aperta自动插入02/08/2024
141RemarksTesto105/08/2024
152RemarksTesto205/08/2024
163RemarksTesto306/08/2024
174RemarksTesto406/08/2024
185RemarksTesto507/08/2024
196RemarksTesto808/08/2024
207RemarksTesto909/08/2024
219RemarksTesto1209/08/2024
229Remarks继续绘制图纸。09/08/2024
239Caricata图纸已上传。09/08/2024
249Chiusa图纸已批准09/08/2024

期望查询结果

IDLastEventoFirstDataInserimento
1Remarks01/08/2024
2Remarks01/08/2024
3Remarks01/08/2024
4Remarks01/08/2024
5Remarks02/08/2024
6Remarks02/08/2024
7Remarks02/08/2024
9Chiusa02/08/2024
10Aperta02/08/2024

尝试的SQL语句

SELECT 
    t.ID, 
    u.Evento as LastEvento, 
    p.DataInserimento as FirstDataInserimento
FROM 
    ((Subattivita t
INNER JOIN 
    (SELECT IDSubattivita, MAX(ID) as MaxID FROM Eventi GROUP BY IDSubattivita) u ON t.ID = u.IDSubattivita)
INNER JOIN 
    (SELECT IDSubattivita, MIN(ID) as MinID FROM Eventi GROUP BY IDSubattivita) p ON t.ID = p.IDSubattivita);

错误原因分析

子查询u仅返回IDSubattivita和MaxID两个字段,并未包含Evento字段,因此Access会将u.Evento识别为未定义参数,弹出输入框要求赋值。同理,子查询p也只返回IDSubattivita和MinID,缺少DataInserimento字段,这也是导致异常的原因之一。

正确的查询方案

需要将子查询得到的最大/最小ID,再次关联回Eventi表,获取对应的Evento和DataInserimento值。以下是适配Access的SQL语句:

SELECT 
    t.ID,
    last_event.Evento AS LastEvento,
    first_data.DataInserimento AS FirstDataInserimento
FROM 
    Subattivita t
LEFT JOIN 
    (
        SELECT e1.IDSubattivita, e1.Evento
        FROM Eventi e1
        INNER JOIN 
            (SELECT IDSubattivita, MAX(ID) AS MaxID FROM Eventi GROUP BY IDSubattivita) e2
            ON e1.ID = e2.MaxID
    ) last_event ON t.ID = last_event.IDSubattivita
LEFT JOIN 
    (
        SELECT e1.IDSubattivita, e1.DataInserimento
        FROM Eventi e1
        INNER JOIN 
            (SELECT IDSubattivita, MIN(ID) AS MinID FROM Eventi GROUP BY IDSubattivita) e2
            ON e1.ID = e2.MinID
    ) first_data ON t.ID = first_data.IDSubattivita
WHERE 
    last_event.IDSubattivita IS NOT NULL OR first_data.IDSubattivita IS NOT NULL;

说明

  • 使用LEFT JOIN可确保即使主表无对应子表记录时也能返回结果(若不需要此类记录,可改为INNER JOIN)
  • 子查询last_event通过最大ID关联Eventi表,获取每个IDSubattivita对应的最后一条Evento值
  • 子查询first_data通过最小ID关联Eventi表,获取每个IDSubattivita对应的首次DataInserimento值
  • WHERE子句用于过滤无任何子表记录的主表行(若需保留这类行,可删除该条件)

内容的提问来源于stack exchange,提问作者Luca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:42:06