Получение значений по многим таблицам, включая MAX и NULL - PullRequest
0 голосов
/ 14 февраля 2011

Так что я попытаюсь объяснить настройку БД

tblEDS

eID | eVal1     | eVal2
-------------------------------------
1   | Monday    | Joe
2   | Tuesday   | Bob
3   | Wednesday | Jan
4   | Thursday  | Pete

tblPatient (я понимаю, что это не лучший дизайн БД!)

pID | pVal1     | pVal2 | pEDS
------------------------------
1   | Monday    | 123   | 1
2   | Tuesday   | 456   | 2

tblPatientRecords

pID | rID
------------
1   | 1
1   | 2
2   | 3
2   | 4

tblRecords

rID | rVal1 | rVal2
-------------------
1   | Ok    | Boy
2   | Well  | Man
3   | Dead  | Kid
4   | Dead  | Girl

Мне нужен запрос для получения всех записей в tblAlert независимо от того, имеет ли оно соответствующее значение в tblPatient или нет. Для каждой записи, которая существует в tblPatient, мне нужен соответствующий максимальный rID и соответствующие значения, возвращенные, т.е.

eID | eVal1     | eVal2 | pID  | pVal1   | pVal2 | rID  | rVal1  | rVal2     
-------------------------------------------------------------------------
1   | Monday    | Joe   | 1    | Monday  | 123   | 2    | Well   | Man
2   | Tuesday   | Bob   | 2    | Tuesday | 456   | 4    | Dead   | Girl
3   | Wednesday | Jan   | NULL | NULL    | NULL  | NULL | NULL   | NULL   
4   | Thursday  | Pete  | NULL | NULL    | NULL  | NULL | NULL   | NULL   

Есть намного больше столбцов для tblEDS, tblPatient и tblRecords, но здесь они не показаны

1 Ответ

2 голосов
/ 14 февраля 2011
SELECT
  a.eID,
  a.eValue,
  t.pID,
  t.pName,
  t.rID,
  t.rValue
FROM tblAlert a
  LEFT JOIN (
    SELECT
      p.pID,
      p.pName,
      p.eID,
      r.rID,
      r.rValue
    FROM tblPatient p
      INNER JOIN (
        SELECT pID, MAX(rID) AS rID
        FROM tblPatientRecords
        GROUP BY pID
      ) pr ON p.pID = pr.pID
      INNER JOIN tblRecords r ON pr.rID = r.rID
  ) t ON a.eID = t.eID
...