I have issue with my inner join division below. From my oracle, it keep prompt me missing right parenthesis when I have already close it. I’ll need to get the names of the patient who have collected all items.
Select P.name
From ((((Select Patientid From Patient) As P
Inner Join (Select Accountno, Patientid From Account) As A1
on P.PatientID = A1.PatientID)
Inner Join (Select Accountno, Itemno From AccountType) As Al
On A1.Accountno = Al.Accountno)
Inner Join (Select Itemno From Item) As I
On Al.Itemno = I.Itemno)
Group By Al.Itemno
Having Count(*) >= (Select Count(*) FROM AccountType);
Here’s a simpler approach that I believe is essentially equivalent:
This approach is a bit simpler. It has the added benefit of being much more likely to use indexes on the tables — if you do joins between what are essentially ‘join tables’ in memory, you don’t get the benefit of the indexes that exist for the physical tables in memory.
I also usually alias table names using sequential letters — ‘a’, ‘b’, ‘c’, ‘d’ as you can see. I find that when I’m writing complicated queries it makes it easier for me to follow. ‘a’ is the first table in the join, ‘b’ is the second, etc.