Было бы что-то вроде улучшения, используя подзапрос в соединении, чтобы получить нужные числа?
Select id, name, title, dept
FROM table1 a
INNER JOIN table2 b ON a.id = b.table1id
INNER JOIN table3 c ON b.table3id = c.id
INNER JOIN table4 d ON d.id = b.table4id
INNER JOIN (select max(sdate) from table2 group by table1id) new1 ON new1.table1id = a.id
WHERE typeid =
(
SELECT min(type_id) /* i want primary type appointments */
FROM table2
WHERE sdate < getdate() and (edate > getdate() or edate IS NULL)
AND sdate = (select max(sdate) from table2 where table1id = a.id)
AND typeid in (100, 102)
)
AND b.sdate < getdate() and (b.edate > getdate() or b.edate IS NULL)
AND b.sdate = new1.sdate
Вы также можете попытаться найти предложение HAVING в GROUP BY. Я думаю, что вы сможете сделать что-то вроде:
Select id, name, title, dept
FROM table1 a
INNER JOIN table2 b ON a.id = b.table1id
INNER JOIN table3 c ON b.table3id = c.id
INNER JOIN table4 d ON d.id = b.table4id
WHERE b.sdate < getdate() and (b.edate > getdate() or b.edate IS NULL)
AND typeid in (100, 102)
GROUP BY id, name, title, dept
HAVING b.sdate = max(sdate)
AND typeid = min(type_id)
Однако вышеприведенное может потянуть min и max для всего списка, а не для каждого a.id. Я забыл, можете ли вы использовать раздел в параметре max, чтобы указать, на что максить больше, или я думаю об Oracle там. Если нет, вы всегда можете использовать подзапрос, который получает лучшую запись для каждого a.id.