поиск записей в таблице, где в связанной таблице есть хотя бы одна запись с полем даты не более 3 месяцев с этого момента () - PullRequest
1 голос
/ 02 сентября 2011

У нас есть база данных проекта в MSACCESS со следующими таблицами: таблица PROJECTS с конечно идентификатором и подробностями проекта.Таблица КОММЕНТАРИИ с ИД, ДАТА и текстовое поле комментария.

КОММЕНТАРИИ связаны с ПРОЕКТАМИ с отношением один-много.(проект может иметь несколько комментариев)

Мне нужен запрос, который выбирает все проекты с хотя бы одним комментарием с датой менее 3 месяцев.

Я попытался выполнить внутреннее объединение и правильно настроил фильтр, но я подумал, что с отчетливой или отличной строкой я могу отфильтровать двойные числа, но msaccess не примет синтаксис.

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

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

 "OR count(SELECT projectid FROM comments WHERE (( ( comments.commentdate ) BETWEEN Dateadd("m", -3, DATE()) AND DATE()))) =0 

1 Ответ

1 голос
/ 03 сентября 2011

Поскольку вам, кажется, нужны отдельные проекты, но не связанные с ними комментарии, есть несколько способов сделать это.

LEFT Join Distinct

SELECT DISTINCT projects.* 
FROM   projects 
       LEFT JOIN comments 
         ON projects.id = comments.projectid 
WHERE  (( ( comments.commentdate ) BETWEEN Dateadd("m", -3, DATE()) AND DATE() ) 
       ) or comments.projectid is null

ВЛЕВО Присоединиться к группе от

SELECT projects.id, 
   projects.fielda,
   [....]
FROM   projects 
       LEFT JOIN comments 
         ON projects.id = comments.projectid 
WHERE  (( ( comments.commentdate ) BETWEEN Dateadd("m", -3, DATE()) AND DATE() ) 
       ) or comments.projectid is null
GROUP BY 
   projects.id, 
   projects.fielda,
   [....]

В пункте

SELECT *
FROM   projects 
WHERE  id IN (SELECT projectid
          FROM   comments 
          WHERE  (( ( comments.commentdate ) BETWEEN 
                    Dateadd("m", -3, DATE()) AND DATE() 
                  ))) 

Пункт существует

SELECT * 
FROM   projects 
WHERE  EXISTS (SELECT * 
               FROM   comments 
               WHERE  ( comments.commentdate ) BETWEEN 
                      Dateadd("m", -3, DATE()) AND DATE() 
                      AND ( projects.id = comments.projectid )) 
     OR NOT EXISTS (SELECT * 
               FROM comments
               WHERE projects.id = comments.projectid)

ВНУТРЕННЕЕ СОЕДИНЕНИЕ В ИННЕЙНУЮ ПЛАТУ С СОЮЗОМ В ЛЕВОЕ СОЕДИНЕНИЕ SELECT * FROM projects INNER JOIN (SELECT DISTINCT projectid FROM comments WHERE (( ( comments.commentdate ) BETWEEN Dateadd("m", -3, DATE()) AND DATE() ))) comment ON projects.id = comment.projectid UNION ALL SELECT * FROM projects LEFT JOIN comments ON projects.id = comment.projectid WHERE comment.projectid is null

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...