如何在 ms 访问中的一个查询中从同一个表中获取数据
Posted
技术标签:
【中文标题】如何在 ms 访问中的一个查询中从同一个表中获取数据【英文标题】:How can I get data from the same table in one query in ms access 【发布时间】:2018-10-25 07:29:43 【问题描述】:我的 ms access sql 查询有问题。 我想从 Report 中获取每个 ReportPosition。在每个 ReportPosition 中都有一个来自死者的 Pknr,它的名字和姓氏及其类型。以及匹配的养老金领取者的 pknr 名和姓
我有以下表格:
报告位置
+-----------------------+---------------+----------+
| ReportPositionId(PK1) | ReportId(PK1) | Pknr(FK) |
+-----------------------+---------------+----------+
| 1 | 1 | 123121 |
| 2 | 1 | 456451 |
| 3 | 1 | 789782 |
+-----------------------+---------------+----------+
养老金领取者
+----------+-----------+------------+--------------+--------------+
| PKNR(PK) | LastName | FirstName | PKNRdeceased | deceasedType |
+----------+-----------+------------+--------------+--------------+
| 123121 | Lastname1 | Firstname1 | 123120 | 1 |
| 456451 | Lastname2 | Firstname2 | 456450 | 1 |
| 789782 | Lastname3 | Firstname3 | 789780 | 2 |
| 123120 | Lastname4 | Firstname4 | 0 | 0 |
| 456450 | Lastname5 | Firstname5 | 0 | 0 |
| 789780 | Lastname6 | Firstname6 | 0 | 0 |
+----------+-----------+------------+--------------+--------------+
已故类型
+--------+-------------+
| TypeId | Bez |
+--------+-------------+
| 0 | Pensioner |
| 1 | Widow |
| 2 | first Child |
+--------+-------------+
我需要以下输出:
+----------------+----------+--------+-----------+------------+---
| ReportPosition | ReportId | PKNR | lastname | firstname |
+----------------+----------+--------+-----------+------------+---
| 1 | 1 | 123121 | lastname1 | firstname1 |
| 2 | 1 | 456451 | lastname2 | firstname2 |
| 3 | 1 | 789782 | lastname3 | firstname3 |
+----------------+----------+--------+-----------+------------+---
--+--------------+--------------+---------------------+--------------------+
| deceasedtype | PKNRdeceased | lasttname deaceased | firstname deceased |
--+--------------+--------------+---------------------+--------------------+
| 1 | 123120 | lastname4 | firstname4 |
| 1 | 456450 | lastname5 | firstname5 |
| 2 | 789780 | lastname6 | firstname6 |
--+--------------+--------------+---------------------+--------------------+
我已经尝试过了,但没有得到想要的结果: 我使用了从访问中自动创建查询,因为手动编写查询对我来说很难。
SELECT ReportPosition.ReportPositionId, ReportPosition.ReportId, ReportPosition.PKNR, deceased.lastname, deceased.firstname, PensionerType.Bez, Pensioner.PKNR, Pensioner.lastname, Pensioner.firstname
FROM (PensionerType INNER JOIN (ReportPosition INNER JOIN Pensioner AS deceased ON ReportPosition.PKNR = deceased.PKNR) ON PensionerType.TypeId = deceased.PensionerType) INNER JOIN Pensioner ON deceased.PKNR = Pensioner.pknrdeceased
WHERE ReportPosition.ReportId=1;
我需要像 selfjoin 这样的东西,因为我必须和养老金领取者一起加入养老金领取者,对吗?
目前我什至没有得到我需要的所有列。也不是我想要的每个数据集。
【问题讨论】:
很抱歉,由于复制和更改了查询,我没有更改号码。对于我提供的表格,查询可能不是 100% 正确的。它的用途主要是显示我已经尝试过什么样的陈述。由于原始表具有不同的数据值和列名,因此查询中可能仍然存在一些错误,因为我无法用我的数据对其进行测试。 【参考方案1】:只要你不需要死者类型的Bez
,你只需要添加ReportPosition
和Pensioner
表,这里你添加了两次Pensioner
表:
然后,添加您想要返回的字段,您将Pensioner_1
视为“死者”。结果查询的 SQL 应该类似于:
SELECT ReportPosition.ReportPositionId, ReportPosition.ReportId,
Pensioner.PKNR, Pensioner.LastName, Pensioner.FirstName, Pensioner.deceasedType, Pensioner.PKNRdeceased,
Pensioner_1.LastName AS [Lastname deceased], Pensioner_1.FirstName AS [Firstname deceased]
FROM Pensioner AS Pensioner_1 INNER JOIN
(Pensioner INNER JOIN ReportPosition ON Pensioner.PKNR = ReportPosition.Pknr)
ON Pensioner_1.PKNR = Pensioner.PKNRdeceased;
当然,您可以将别名从 Pensioner_1
更改为 deceased
。
添加:
如果要显示Bez
字段(而不是TypeId
),则必须添加deceasedType
表:
然后您可以将deceasedType
字段与新添加的表中的Bez
字段进行交换。已编辑查询的 SQL 将类似于以下内容:
SELECT ReportPosition.ReportPositionId, ReportPosition.ReportId,
Pensioner.PKNR, Pensioner.LastName, Pensioner.FirstName, deceasedType.Bez, Pensioner.PKNRdeceased,
Pensioner_1.LastName AS [Lastname deceased], Pensioner_1.FirstName AS [Firstname deceased]
FROM deceasedType INNER JOIN
((Pensioner AS Pensioner_1 INNER JOIN Pensioner
ON Pensioner_1.PKNR = Pensioner.PKNRdeceased) INNER JOIN
ReportPosition ON Pensioner.PKNR = ReportPosition.Pknr)
ON deceasedType.TypeId = Pensioner.deceasedType;
【讨论】:
谢谢你这对我有用。但是有没有办法显示“Bez”而不是 typeId?这对于更好的用户体验来说会很好。但它不是必须的。 很高兴听到这个消息,谢谢。至于Bez
字段,我在答案中添加了扩展查询。 :-)【参考方案2】:
我没有找到您的确切错误,但 Access 中的查询生成器创建了一个非常混乱的连接表示法,我很难阅读。
据我所知,以下应该可以工作:
SELECT ReportPosition.ReportPositionId, ReportPosition.ReportId, ReportPosition.PKNR, deceased.lastname, deceased.firstname, PensionerType.Bez, Pensioner.PKNR, Pensioner.lastname, Pensioner.firstname
FROM (((Pensioner
INNER JOIN Pensioner AS deceased ON deceased.PKNR = Pensioner.pknrdeceased)
INNER JOIN PensionerType ON PensionerType.TypeId = deceased.PensionerType)
INNER JOIN ReportPosition ON ReportPosition.PKNR = deceased.PKNR)
WHERE ReportPosition.ReportId=1;
【讨论】:
感谢您的尝试。翻译语句并将 where 部分中的 ReportId 更改为“3”后,即使报表 3 中有 33 个数据集,它仍显示零数据集。 那么请提供minimal reproducible example。这适用于正确设置表上的示例数据(所有数字类型的字段类型为长整数)。以上是关于如何在 ms 访问中的一个查询中从同一个表中获取数据的主要内容,如果未能解决你的问题,请参考以下文章