2011-10-04 265 views
0

我有我的內部連接部門下面的問題。從我的oracle中,當我已經關閉它時,它會一直提示我缺少右括號。我需要獲取收集所有項目的患者姓名。SQL內部連接部門

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); 

回答

1

這裏有一個簡單的方法,我認爲本質上是相同的:

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'是第二個,等等。

+0

感謝您的評論。在嘗試了兩個提供的答案之後。它在第一行是p.name,提示我'不是一個表達式的組'。但它不能按p.name分組。不會有任何結果顯示。有任何想法嗎? – JLearner

+0

我編輯了查詢來試圖解決這個問題。我相信這可能會奏效。基本上,要做這樣的選擇,問題可能就是a.name需要逐列分組。雖然,如果您按照Accountno分組,但仍然會出現一些問題,但只能選擇名稱。 –

+0

同樣的結果。沒有顯示行。右邊應該顯示五行。當我加入表格時,我沒有看到任何行。有任何想法嗎? – JLearner

1

這聽起來像你只是想

SELECT p.name 
    FROM patient p 
     INNER JOIN account a ON (a.patientID = p.patientID) 
     INNER JOIN accountType accTyp ON (accTyp.accountNo = a.accountNo) 
     INNER JOIN item i ON (i.itemNo = accTyp.itemNo) 
GROUP BY accTyp.itemNo 
HAVING COUNT(*) = (SELECT COUNT(*) 
        FROM accountType); 

注意,具有A1的別名和Al的別名是相當混亂。你想選擇更有意義,更有區別的別名。

+0

我有一個錯誤,顯示第1行中沒有表達式。這是oracle希望我通過p.name進行分組。但這是不可能的。不會有任何記錄顯示 – JLearner