Database 是否为每条记录查找交叉表的最新条目?
我有三张桌子:Database 是否为每条记录查找交叉表的最新条目?,database,ms-access,ms-access-2016,Database,Ms Access,Ms Access 2016,我有三张桌子: 我的产品及其ID和功能 是一个表,其中包含我的产品的治疗方法以及治疗ID、方法和日期。治疗是在许多产品的批次中进行的,因此有一个交叉表 产品ID和治疗ID以及治疗成功的布尔值 每种产品都可以经过许多不同的处理,因此存在多对多关系。现在,我想在产品表(1)中为每种产品添加一个值,该值显示最近成功治疗的方法(如果有) 我做了一个按产品ID对交叉表条目进行分组的查询,但我不知道如何显示它最后一次处理的方法和日期 table 1: | productID | size | weight
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 |
| ... | ... | ... |
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"));
我需要表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;
但这并不是只显示一个(最新的)条目,而是所有条目。这里最简单的解决方案是在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 |
首要任务是获得成功治疗的最大(日期)和ProductID
我们将通过将日期与productID和“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”,你可能应该用更具描述性的词。您将在下一个查询中看到“max”
接下来,我们将表1-3连接在一起,但除此之外,我们还将使用这个“max”子查询将表1和表2按productID和MaxOfDate链接到TreatmentDate,其中success=“yes”查找最近成功治疗的详细信息
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 |
| ... | ... | ... |
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"));
设计将如下所示:
(另外,在向查询设计中添加表时,您可以通过单击“查询”选项卡向设计查询编辑器中添加查询。它们的行为就像表一样,只是要小心,因为非常详细的查询往往会阻碍访问)
运行此查询将给出最终结果
| ProductID | Size | Weight | Height | Method |
|-----------|------|--------|--------|-----------|
| 1 | 13 | 16 | 9 | dye red |
| 2 | 12 | 17 | 12 | dye brown |
请您也添加一些示例数据(包括表名和字段标题)和预期输出。用于格式化表格。我们还可以看到您已经构建的查询的SQL语句吗?是的,尝试概括所有内容。谢谢你的编辑。我今天病了,但会尽快试试这个。谢谢,这看起来很棒!谢谢,你做得很好。谢谢你这么多的努力!