【问题标题】:MS Access SQL query from 3 tables来自 3 个表的 MS Access SQL 查询
【发布时间】:2013-09-19 20:37:30
【问题描述】:

我在 MS Access 2010 中有 3 个表格,如下所示:

表格:设备

   id | device_id | Company | Version | Revision |
   -----------------------------------------------
   1  | dev_a     | Almaras | 1.5.1   | 0.2A     |
   2  | dev_b     | Enigma  | 1.5.1   | 0.2A     |
   3  | dev_c     | Almaras | 1.5.1   | 0.2C     |
*Field: device_id is Primary Key Unique String
*Field ID is just an auto-number column 

表格:活动

   id | act_id | act_date   | act_type | act_note |
   ------------------------------------------------
    1 | dev_a  | 07/22/2013 | usb_axc  | ok       |
    2 | dev_a  | 07/23/2013 | usb_axe  | ok       | (LAST ROW for dev_a)
    3 | dev_c  | 07/22/2013 | usb_axc  | ok       | (LAST ROW for dev_c)
    4 | dev_b  | 07/21/2013 | usb_axc  | ok       | (LAST ROW for dev_b)
*Field: act_id contains device_id; NOT UNIQUE
*Field ID is just an auto-number column 

表格:矩阵

  id | mat_id | tc    | ts | bat | cycles |
  -----------------------------------------
  1  | dev_a  | 2811  | 10 | 99  | 200    |
  2  | dev_a  | 2911  | 10 | 97  | 400    |
  3  | dev_a  | 3007  | 10 | 94  | 600    |
  4  | dev_a  | 3210  | 10 | 92  | 800    | (LAST ROW for dev_d)
  5  | dev_b  | 1100  | 5  | 98  | 100    |
  6  | dev_b  | 1300  | 8  | 93  | 200    |
  7  | dev_b  | 1411  | 11 | 90  | 300    | (LAST ROW for dev_b)
  8  | dev_c  | 4000  | 27 | 77  | 478    | (LAST ROW for dev_c)
*Field: mat_id contains device_id; NOT UNIQUE
*Field ID is just an auto-number column 

有没有办法查询表以获得如下所示的结果(来自设备的每个设备,并且仅从其他两个表中添加了最后一行 [参见示例输出表]):

查询结果:

device_id | Company | act_date   | act_type | bat | cycles |
------------------------------------------------------------
device_a  | Almaras | 07/23/2013 | usb_axe  |  92 |   800  |
device_b  | Enigma  | 07/21/2013 | usb_axc  |  90 |   300  |
device_c  | Almaras | 07/22/2013 | usb_axc  |  77 |   478  |

有什么想法吗?提前感谢您阅读并帮助我:)

【问题讨论】:

  • 您在哪里说“其他两张桌子的最后一行”,请您说得更具体一点。订购标准是什么?
  • 很抱歉造成混淆。因此,每个设备从设备和最后一行输入到表格矩阵和活动中。常规连接不起作用:S
  • 最后一行到底是什么意思?如果您指的是这些示例中的最后一行,那么我们是否可以安全地假设按矩阵中的 tc 对每个设备进行排序将给出正确的顺序,或者我们应该使用循环还是其他一些标准?还有,活动呢?
  • 依赖数据库以特定顺序返回行不是一个好习惯,除非您能够在 order by 子句中逻辑地描述该顺序。这可能适用于 MS Access,但不适用于许多 RDBMS。
  • 我明白你的意思。但是,整个过程是由其他人设计的。我现在将添加一些自动编号列来记住层次结构。谢谢!

标签: sql database ms-access vba ms-access-2010


【解决方案1】:

试试

SELECT devices.device_id, devices.Company, activities.act_data, activities.act_type, matrix.bat, matrix.cycles
FROM devices
LEFT JOIN activities
ON devices.device_id = activities.act_id
LEFT JOIN matrix
ON devices.device_id = matrix.mat_id;

【讨论】:

  • 这将为每个设备提供 10-20 行...请注意,设备 ID 在矩阵和活动表中不是唯一的...每个设备我只需要一行。谢谢。
【解决方案2】:

我认为是你想要的,

SELECT  a.device_id, a.Company,
        b.act_date, b.act_type,
        c.bat, c.cycles
FROM    ((((devices AS a
        INNER JOIN activities AS b
            ON a.device_id = b.act_id)
        INNER JOIN matrix AS c
            ON  a.device_id = c.mat_id)
        INNER JOIN
        (
            SELECT  act_id, MAX(act_date) AS max_date
            FROM    activities
            GROUP   BY act_id
        ) AS d  ON b.act_id = d.act_id AND b.act_date = d.max_date)
        INNER JOIN
        (
            SELECT  mat_id, MAX(tc) AS max_tc
            FROM    matrix
            GROUP   BY mat_id
        ) AS e  ON c.mat_id = e.mat_id AND c.tc = e.max_tc)

子查询:de 分别获取每个 act_id 的最新行。

【讨论】:

  • 您节省了花费额外的大量时间来弄清楚...... OMG,你太棒了;如果此刻我在你身边,我会给你买一块巧克力(大块的):)谢谢;谢谢!!!!!!!!!
【解决方案3】:

您认为 Matrix 中的“最后”一行是什么?

你需要做类似的事情 WHERE act_date in (SELECT max(a.act_date) from activities a where a.mat_id=d.device_id GROUP BY a.mat_id)

和矩阵的连接类似。

【讨论】:

    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多