Как я могу получить данные из той же таблицы в одном запросе в мс доступа - PullRequest
0 голосов
/ 25 октября 2018

У меня проблема с моим SQL-доступом к SQL-запросу.Я хочу, чтобы каждый ReportPosition Из Report .В каждом ReportPosition есть Pknr от покойного, его имя и фамилия и его тип.А также имя и фамилия pknr соответствующего пенсионера

У меня есть следующие таблицы:

ReportPosition

+-----------------------+---------------+----------+
| 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 |
+----------+-----------+------------+--------------+--------------+

deceasedType

+--------+-------------+
| 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;

Мне нужно что-то вроде самостоятельного соединения, потому что я должен присоединиться к пенсионеру с пенсионером.Я прав?

На данный момент я не получаю все нужные столбцы.а также не каждый набор данных, который я хочу.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Пока вам не нужны Bez умершего типа, вам просто нужно добавить таблицы ReportPosition и Pensioner, где вы добавляете таблицу Pensioner дважды:

enter image description here

Затем добавьте поля, которые вы хотите вернуть, где вы думаете о 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:

enter image description here

Затем можно заменить поле 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;
0 голосов
/ 25 октября 2018

Я не отследил вашу точную ошибку, но построитель запросов в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...