Sql 如何在ms access中通过一次查询从同一个表中获取数据

Sql 如何在ms access中通过一次查询从同一个表中获取数据,sql,ms-access,join,Sql,Ms Access,Join,我的ms access sql查询有问题。 我想从一份报告中获得每个报告职位。在每个ReportPosition中,都有一个死者的Pknr,其名字、姓氏和类型。以及匹配养老金领取者的pknr名字和姓氏 我有以下表格: 报告职位 +-----------------------+---------------+----------+ | ReportPositionId(PK1) | ReportId(PK1) | Pknr(FK) | +-----------------------+-----

我的ms access sql查询有问题。 我想从一份报告中获得每个报告职位。在每个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         |
--+--------------+--------------+---------------------+--------------------+
我已经试过了,但是没有得到想要的结果: 我使用access自动创建查询,因为手动编写查询对我来说太难了

    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;
我需要像自我加入这样的东西,因为我必须加入养老金领取者和养老金领取者,对吗


目前我甚至没有得到我需要的所有专栏。而且也不是我想要的所有数据集。

我还没有追踪到您的确切错误,但是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;

我还没有找到您的确切错误,但是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;

只要您不需要已故类型的
Bez
,您只需要添加
ReportPosition
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;
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;
当然,您可以将别名从
养老金领取者1
更改为
已故者

添加:

如果要显示
Bez
字段(如果
TypeId
),则必须添加
decesedtype
表:

然后,您可以通过新添加的表中的
Bez
字段交换
decesedtype
字段。已编辑查询的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;
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
,您只需要添加
ReportPosition
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;
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;
当然,您可以将别名从
养老金领取者1
更改为
已故者

添加:

如果要显示
Bez
字段(如果
TypeId
),则必须添加
decesedtype
表:

然后,您可以通过新添加的表中的
Bez
字段交换
decesedtype
字段。已编辑查询的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;
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;

很抱歉,由于抄袭和更改了查询,我没有更改号码。对于我提供的表,查询可能不是100%正确。它的用途主要是显示我已经尝试过什么样的陈述。由于原始表具有不同的数据值和列名,查询中可能仍存在一些错误,因为我无法使用数据对其进行测试。很抱歉,由于复制和更改了查询,我没有更改编号。对于我提供的表,查询可能不是100%正确。它的用途主要是显示我已经尝试过什么样的陈述。由于原始表具有不同的数据值和列名,查询中可能仍存在一些错误,因为我无法使用数据对其进行测试。感谢您的尝试。翻译语句并将where部分中的ReportId更改为“3”后,即使报表3中有33个数据集,也显示零个数据集。然后请提供一个。这适用于正确设置表上的示例数据(所有数字类型的字段类型均为长整数)。感谢您的尝试。翻译语句并将where部分中的ReportId更改为“3”后,即使报表3中有33个数据集,也显示零个数据集。然后请提供一个。这适用于正确设置表上的示例数据(所有数字类型的字段类型均为长整数)。谢谢,这对我有用。但是没有办法显示“Bez”而不是typeId吗?这将是一个更好的用户体验。但这不是必须的。很高兴听到这个消息,谢谢。至于
Bez
字段,我在答案中添加了一个扩展查询。:-)谢谢你,这对我有用。但是没有办法显示“Bez”而不是typeId吗?这将是一个更好的用户体验。但这不是必须的。很高兴听到这个消息,谢谢。至于
Bez
字段,我在答案中添加了一个扩展查询。:-)