2016-03-01 8 views
1

Я считаю, что многие люди уже задали этот вопрос, поскольку я прочитал всю эту тему отсюда. Но проблема в том, что у меня есть 3 связанные таблицы вместо 2, и я не уверен, как код для этогоSQL Access 2007/2010 Выбор даты с отличным идентификатором

У меня есть таблица: tbl_Instruments, tbl_Record и tbl_Cal_By. tbl_Instruments содержит информацию о всех инструментах, включая идентификатор. tbl_Cal_By имеет информацию для тех, кто калибрует инструмент. tbl_Records располагает всеми инструментами записей и их дата калибровки. Он наследует идентификатор от tbl_Instruments как Inst_ID и имя от tbl_Cal_By как Name_ABBR.

tbl_Instruments: ID, Тип

tbl_Cal_By: Cal_ID, Name_ABBR

tbl_Records: record_id, Inst_ID, Cal_Date, Name_ABBR

Вот мой код.

SELECT tbl_Records.Inst_ID 
    ,tbl_Instruments.Type 
    ,Max(tbl_Records.Cal_Date) AS MaxOfCal_Date 
    ,tbl_Cal_By.Name_ABBR 
FROM tbl_Cal_By 
RIGHT JOIN (
    tbl_Instruments INNER JOIN tbl_Records ON tbl_Instruments.ID = tbl_Records.Inst_ID 
    ) ON tbl_Cal_By.ID = tbl_Records.BY 
GROUP BY tbl_Records.Inst_ID 
    ,tbl_Instruments.Type 
    ,tbl_Cal_By.Name_ABBR; 

Желаемый результат:

enter image description here

Любая помощь будет оценен по достоинству!

ответ

1

Вы можете сделать это несколькими способами, один из IS существует:

SELECT tbl_Records.Inst_ID 
    ,tbl_Instruments.Type 
    ,tbl_Records.Cal_Date AS MaxOfCal_Date 
    ,tbl_Cal_By.Name_ABBR 
FROM tbl_Cal_By 
RIGHT JOIN (
    tbl_Instruments INNER JOIN tbl_Records ON tbl_Instruments.ID = tbl_Records.Inst_ID 
    ) ON tbl_Cal_By.ID = tbl_Records.BY 
WHERE NOT EXISTS(SELECT 1 FROM tbl_Records t 
       WHERE t.Inst_ID = tbl_Instruments.ID 
         AND t.Cal_date > tbl_Records.Cal_Date) 

Я не совсем уверен, что синтаксис доступа и псевдонимами .. поэтому, возможно, вам придется настроить его немного - например, псевдоним первых tbl_records, чтобы он распознал его или, может быть, он сработает.

+0

Это работает отлично! Но не возражаете ли вы объяснить последнюю часть, начиная с WHERE? Извините im kinda new to sql ~~ –

+0

Конечно, я также буду признателен, если вы примете мой ответ (V). Там, где используется функция NOT EXISTS, которая проверяет, возвращает ли запрос после возврата что-то или нет. Он будет фильтровать любую строку, которая возвращает что-то там. Итак, что я сделал, для каждой записи, проверьте, есть ли более крупная дата, а затем одна, если это так - она ​​отфильтровывает ее из результата. Это оставит нам только последние даты. @JasonChan – Yossi

+0

Я знаю, что это было давно, но недавно я добавил tbl_Records.Path, и старый вопрос вернулся. Поэтому, чтобы отфильтровать его снова, я попытался добавить «AND t.Path = tbl_Records.Path», но похоже, что это неправильно? –

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

  • Нет связанных вопросов^_^