Вот более простой подход, который, я считаю, по сути эквивалентен:
select a.name
from Patient a
inner join Account b on a.PatientID = b.PatientID
inner join AccountType c on b.Accountno = c.Accountno
inner join Item d on c.Itemno = d.Itemno
group by c.Accountno, a.name
having Count(*) >= (Select Count(*) FROM AccountType);
Этот подход немного проще.Это дает дополнительное преимущество, заключающееся в большей вероятности использования индексов в таблицах - если вы выполняете соединения между тем, что по сути является «таблицами соединений» в памяти, вы не получаете преимущества от индексов, которые существуют для физических таблиц впамять.
Я также обычно называю имена таблиц псевдонимами, используя последовательные буквы - «a», «b», «c», «d», как вы можете видеть.Я обнаружил, что когда я пишу сложные запросы, мне легче следовать за ними.«a» - первая таблица в соединении, «b» - вторая и т. д.