微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何查询 MS-Access 中只有最后一个明细行的主从结果?

如何解决如何查询 MS-Access 中只有最后一个明细行的主从结果?

我有以下主表

.------------------.
| id | parent_name | 
.------------------.
| 1  | Mike        |
| 2  | Sarah       |
| 3  | Danial      |
| 4  | Alex        |
.------------------.

并具有以下子表详细信息:

.------------------------------------------.
| id | parent_id | child_name | birth year |
.------------------------------------------.
| 1  |   1       | mandy      |  2000      |
| 2  |   1       | mark       |  2003      |
| 3  |   1       | mathew     |  2005      |
| 4  |   2       | sandy      |  1998      |
| 5  |   2       | sharon     |  2006      |
| 6  |   3       | david      |  2001      |
.------------------------------------------.

在上面的例子中,我故意选择孩子的名字的第一个字母与其父母的名字相匹配,只是为了更容易理解这种关系,即使每个孩子都使用 {{1} }.

我想要的是所有父母的列表(4 行),并从 children 表中找到匹配的 4 行,只选择每个尊敬的父母的最后一个孩子。

parent_id

在 oracle 中,这很容易:

.-------------------------------.
| id | parent_name | last_child |
.-------------------------------.
| 1  | Mike        | mathew     |
| 2  | Sarah       | sharon     |
| 3  | Danial      | david      |
| 4  | Alex        | (null)     |
.-------------------------------.

但我正在努力在 MS Access 中生成相同的结果.. MS Access 不接受子查询(用于选择同一父母的最大出生年份的孩子)。

是否有更好的方法在 MS Access 中获得结果?

解决方法

Access 确实支持子查询,但您使用的是交叉连接,因此您永远不会在那里获得空值。

相反,左连接并在 FROM 子句中执行子查询。 顺便说一下,您的查询在 Oracle 中同样会失败。此处 Access 和 Oracle 之间没有相关差异。

SELECT
   p.id,p.parent_name,c.child_name last_child
FROM
   parents_table p
   LEFT JOIN
    (
        SELECT *
        FROM children_table c
        WHERE c.birth_year = (SELECT MAX(c2.birth_year) FROM children_table c2 WHERE c2.parent_id = c.parent_id)
    ) c
    ON p.id = c.parent_id

Access 有时使用 EXISTS 会更好,因此重写为:

SELECT
   p.id,c.child_name last_child
FROM
   parents_table p
   LEFT JOIN
    (
        SELECT *
        FROM children_table c
        WHERE EXISTS(SELECT 1 FROM children_table c2 WHERE c2.parent_id = c.parent_id HAVING c.birth_year = MAX(c2.birth_year))
    ) c
    ON p.id = c.parent_id
,

如果你只想要孩子的名字,你可以使用相关子查询:

call

这可以利用 select p.*,(select top 1 child_name from children_table as ct where ct.parent_id = p.id order by ct.birth_year desc,ct.child_name ) as youngest_child_name from parents_table as p; 上的索引。有了索引,我希望这会很快。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。