2013-09-15 4 views
0

У меня есть 3 таблицы, приведенные ниже в MS Access 2010:MS Access SQL запросов из 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 || 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 

Есть ли способ для запроса таблицы, чтобы получить результаты, как показано ниже (каждое устройство из устройств, и только в последней строке добавляется [см примера таблицы вывода] от каждого из двух других таблиц):

Query Результаты:

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 | 

Любые идеи? Заранее спасибо за чтение и помогать мне :)

+1

Где вы говорите «последняя строка из каждой из двух других таблиц», можете ли вы быть более конкретным, пожалуйста. Каковы критерии заказа? – ChrisProsser

+0

Извините за путаницу. Поэтому каждое устройство с устройств и последних строк вводится в таблицу и действия таблиц. Регулярные соединения не будут работать: S – virrion

+0

Что конкретно подразумевается под последней строкой? Если вы имеете в виду последнюю строку в этих примерах, то можем ли мы предположить, что сортировка каждого устройства по tc в матрице даст правильный порядок или мы будем использовать циклы или некоторые другие критерии? Кроме того, как насчет деятельности? – ChrisProsser

ответ

3

Я думаю, что вы хотите,

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) 

подзапросов: d и e отдельно Возвращает последнюю строку для каждый act_id.

+0

Вы спасли от траты дополнительных тонн часов, чтобы понять это ... OMG, вы удивительны; если бы я был рядом с вами в этот момент, я бы купил тебе шоколад (огромный) :) Спасибо; Спасибо!!!!!!!!! – virrion

0

Попробуйте

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

Это даст мне 10-20 строк для каждого устройства ... Обратите внимание, что идентификатор устройства не уникален в таблицах матриц и действий ... Мне нужно только одна строка для каждого устройства. Спасибо. – virrion

0

Что вы считаете «последней» строкой в ​​матрице?

Вам нужно сделать что-то вроде WHERE act_date in (SELECT max(a.act_date) from activities a where a.mat_id=d.device_id GROUP BY a.mat_id)

и что-то подобное для объединения к матрице.

Смежные вопросы