Найти новейшую запись кросс-таблицы на запись? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть три таблицы:

  1. Мои продукты с их идентификаторами и их функциями.
  2. - это таблица с обработками моих продуктов с идентификатором обработки, методом и датой.Обработки проводятся партиями многих продуктов, поэтому существует перекрестная таблица
  3. с идентификаторами продуктов и идентификаторами процедур и значением bool для успеха лечения.

Каждый продукт может проходить множество различных процедур, поэтому существует отношение «многие ко многим».Теперь я хочу добавить в таблицу продуктов (1.) для каждого продукта значение, показывающее метод его последней успешной обработки, если таковой имеется.

Я сделал запрос, который группирует записи в перекрестной таблице по продукту.-ID, но я не знаю, как показать метод и дату его последней обработки.

table 1:
| productID | size | weight | height | ... |
|-----------|:----:|-------:|--------|-----|
| 1         |  13  |     16 | 9      | ... |
| 2         |  12  |     17 | 12     | ... |
| 3         |  11  |     15 | 15     | ... |
| ...       | ...  | ...    | ...    | ... |

table 2:
| treatmentID |  method  |       date |
|-------------|:--------:|-----------:|
| 1           | dye blue | 01.02.2016 |
| 2           |  dye red | 01.02.2017 |
| 3           | dye blue | 01.02.2018 |
| ...         | ...      | ...        |

table 3:
| productID | treatmentID | success |
|-----------|:-----------:|--------:|
| 1         | 1           | yes     |
| 1         | 2           | yes     |
| 1         | 3           | no      |
| ...       | ...         | ...     |

Мне нужно, чтобы таблица 1 была такой:

table 1:
    | productID | size | weight | height | latest succesful method |
    |-----------|:----:|-------:|--------|-------------------------|
    | 1         |  13  |     16 | 9      |  dye red                |
    | 2         |  12  |     17 | 12     | ...                     |
    | 3         |  11  |     15 | 15     | ...                     |
    | ...       | ...  | ...    | ...    | ...                     |

Мой запрос:

 SELECT table3.productID, table2.method
 FROM table2 INNER JOIN table3 ON table2.treatmentID = table3.treatmentID
 GROUP BY table3.productID, table2.method
 HAVING (((table3.productID)=Max([table2].[date])))
 ORDER BY table3.productID DESC;

, но это НЕ показывает только одну (самую последнюю) запись, но все они.

1 Ответ

0 голосов
/ 18 декабря 2018

Самое простое решение - написать подзапрос в вашем sql или создать новый запрос в качестве подзапроса (он будет выглядеть как таблица), чтобы помочь указать (или исключить) записи, которые вы хотите видеть.

Использование схожих, но потенциально немного отличающихся исходных данных, которые вы привели только в одном примере.

Table1
| ProductID | Size | Weight | Height |
|-----------|------|--------|--------|
| 1         | 13   | 16     | 9      |
| 2         | 12   | 17     | 12     |
| 3         | 11   | 15     | 15     |

Table2
| TreatmentID | Method     | Date     |
|-------------|------------|----------|
| 1           | dye blue   | 1/2/2016 |
| 2           | dye red    | 1/2/2017 |
| 3           | dye blue   | 1/2/2018 |
| 4           | dye yellow | 1/4/2017 |
| 5           | dye brown  | 1/5/2018 |

Table3
| ProductID | TreatmentID | Success |
|-----------|-------------|---------|
| 1         | 1           | yes     |
| 1         | 2           | yes     |
| 1         | 3           | no      |
| 2         | 4           | no      |
| 2         | 5           | yes     |

Первым делом нужно получить максимум (даты) и productIds успешных обработок.

Мы сделаем это, агрегировав дату вместе с идентификаторами продуктов и "success".

SELECT Table3.productid, Max(Table2.Date) AS MaxOfdate, Table3.success
FROM Table2 INNER JOIN Table3 ON Table2.treatmentid = Table3.treatmentid
GROUP BY Table3.productid, Table3.success;

Это должно дать нам что-то вроде:

| ProductID | MaxofDate | Success |
|-----------|-----------|---------|
| 1         | 1/2/2018  | No      |
| 1         | 1/2/2017  | Yes     |
| 2         | 1/4/2017  | No      |
| 2         | 1/8/2017  | Yes     |

Мысохраню этот запрос как «обычный» запрос.Я назвал мой "Макс", вы, вероятно, должны использовать что-то более описательное.В следующем запросе вы увидите «max».

Далее мы объединим таблицы 1-3, но кроме того, мы также будем использовать этот подзапрос «max» для связи таблиц 1 и 2 по productID и MaxOfDate.to TreatmentDate, где success = "yes", чтобы найти детали самого последнего УСПЕШНОГО обращения.

SELECT table1.productid, table1.size, table1.weight, table1.height, Table2.method
FROM ((table1 INNER JOIN [max] ON table1.productid = max.productid) 
INNER JOIN Table2 ON max.MaxOfdate = Table2.date) INNER JOIN Table3 ON 
(Table2.treatmentid = Table3.treatmentid) AND (table1.productid = Table3.productid)
WHERE (((max.success)="yes"));

Дизайн будет выглядеть примерно так: Дизайн

(ps. вы можете добавлять запросы в свой редактор запросов дизайна, нажимая на вкладку «Запросы» при добавлении таблиц в свой дизайн запросов. Они действуют так же, как таблицы, но будьте осторожны, поскольку очень подробные запросы имеют тенденцию приводить к сбою Access)

Выполнение этого запроса должно дать нам окончательные результаты.

| ProductID | Size | Weight | Height | Method    |
|-----------|------|--------|--------|-----------|
| 1         | 13   | 16     | 9      | dye red   |
| 2         | 12   | 17     | 12     | dye brown |
...