Вернуть части двух разных записей из одной таблицы в одном запросе - PullRequest
1 голос
/ 01 мая 2009

Хотя фактическая схема немного сложнее, мне будет проще разобраться в следующем.

В одной таблице у меня есть список вакансий:

<b>Job   Status  Open date   Close date</b>
1      Closed   04/29/2009   04/30/2009
2      Open     04/30/2009  
3      Open     04/30/2009  

.. а в другом у меня есть список заметок, связанных с заданиями:

<b>ID  Job   Type    Date       Text</b>
1    1     Open     04/29/2009   Please fix my printer
2    1     Close    04/30/2009   Printer fixed
3    2     Open     04/30/2009   Please fix my monitor
4    2     Update   04/30/2009   Part required
5    3     Open     05/01/2009   Please fix my mouse

Каждое задание будет иметь заметку «Открыть», необязательно одну или несколько заметок «Обновление» и необязательно заметку «Закрыть». Очевидно, в поле Job есть отношение один-много.

Я хотел бы иметь один запрос, который возвращает список вакансий, дату открытия, вступительную заметку и, если имеется, заключительную заметку, например:

<b>Job   Status  Open date   Open note             Close note</b>
1      Closed   04/29/2009   Please fix my printer    Printer fixed
2      Open     04/30/2009   Please fix my monitor
3      Open     04/30/2009   Please fix my mouse

Мои попытки сделать это всегда терпят неудачу, потому что я получаю следующее:

<b>Job   Status  Open date   Open note             Close note</b>
1      Closed   04/29/2009   Please fix my printer
1      Closed   04/29/2009                            Printer fixed
2      Open     04/30/2009   Please fix my monitor
2      Open     04/30/2009   
3      Open     05/01/2009   Please fix my mouse
3      Open     05/01/2009   

.. или:

<b>Job   Status  Open date   Open note             Close note</b>
1      Closed   04/29/2009   Please fix my printer
1      Closed   04/29/2009                            Printer fixed
2      Open     04/30/2009   Please fix my monitor
3      Open     05/01/2009   Please fix my mouse

Я использую SQL в Access 2003, и хотя возможный запрос будет поступать из внешнего интерфейса Excel через ADO, в настоящий момент я пытаюсь заставить его работать только из Access.

Ответы [ 3 ]

7 голосов
/ 01 мая 2009

Что говорит 1800 Информация, но это не будет работать правильно без предиката, ограничивающего объединение открытыми и закрытыми примечаниями, соответственно:

select a.job, a.status, a.opendate, 
       b.note as opennote, c.note as closenote 
from job a
     join note b on (a.job = b.job and b.type = 'Open')
     left outer join note c on (a.job = c.job and c.type = 'Closed');
0 голосов
/ 05 мая 2009

Решение, предложенное tpdi, сработало, когда я создал команду в Access, но затем бросил воблер «выражение выражения не поддерживается», когда я попытался отредактировать его или выполнить запрос через ADODB из Excel.

Закрытие MDB и повторное открытие было достаточно, чтобы я мог запустить его снова, но как только я попытался просмотреть / отредактировать его в представлениях SQL или QBE, он начал бы генерировать исключения. В конце концов я не смог открыть или отредактировать запрос, даже после «сжатия и восстановления» - предположительно, из-за внутреннего повреждения в Access.

Как ни странно, я смог заставить его работать, сославшись на запрос (SELECT * FROM noteReport;) - странно. Похоже, что мой первоначальный успех был случайностью, так как я не смог воссоздать точный запрос и заставить его снова работать.

Однако в конечном итоге мне удалось воспроизвести желаемый отчет следующим образом:

SELECT a.callReference, b.callPriority, datevalue(INT(a.openedDT)),
  b.callerFirstName & ' ' & b.callerSurname AS Caller, c.noteText, d.noteText 
FROM ((tblMain AS a 
  INNER JOIN tblCalldetails AS b ON a.callreference=b.callReference) 
  LEFT JOIN tblNotes AS c ON a.callReference=c.callReference) 
  LEFT JOIN tblNotes AS d ON a. callReference =d.callReference
WHERE a.status = 'Closed' 
  AND c.noteType='Open' 
  AND d.noteType='Closing' 
  AND INT(a.closedDT) = #5/1/2009#;

Публикация этого здесь так же, как для моей выгоды, так и для любого другого, кто может найти это через Google.

0 голосов
/ 01 мая 2009

По сути, вам нужно использовать таблицу заданий в качестве управляющей таблицы для запроса, а затем два соединения с таблицей примечаний. Первое соединение - это внутреннее соединение для «открытой» заметки - это внутреннее соединение, потому что всегда будет открытая заметка. Второе соединение - это внешнее соединение для «закрытой» заметки, поскольку там не может быть закрытой заметки. Примерно так:

select job.job, status, opendate, opennote.note, closenote.note from
  job left inner join note opennote on opennote.job = job.job
      left outer join note closenote on closenote.job = job.job

Возможно, синтаксис в доступе немного или сильно отличается, но это общая идея.

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