2013-02-15 90 views
0

我有父表和多個子表與外鍵約束。Sql查詢加入Oracle

School Table 

School ID EduDetails Genders Address_id EDUTYPE 
    1  2   M   3   FGN 

與子表像

Education Details 
EDU ID EducationType 
    2  Online 

AKA Name 
School Id AKA Name 
    1  Test School 
    1  School Test 

Gender Table 
Gender ID Gender Desc 
     M  Male 

我使用LEFT OUTER JOIN家長和學校的表來獲取結果。

但我的問題是,如果AKA表有5個計數匹配學校Id和性別表只有1個記錄爲該學校Id。

所以結果帶有5個重複的行與學校信息和其他子表信息。

有沒有解決此問題的任何解決方法。我試圖通過函數使用子查詢和row_number。但它不適合我。任何人都可以幫助我解決這個問題。

在此感謝您的時間在尋找這個問題。

我需要的輸出應該是這樣的

School_id AKA Name  GenderDesc EductaionType 
    1  Test School Male  Online 
    1  School Test   

所以我需要有NULL值的不匹配的記錄。

+0

的問題是你的查詢產生笛卡爾乘積。什麼是您想要的結果,然後我們可以幫助構建您的查詢。 – sgeddes 2013-02-15 17:29:28

+0

你的「子表」並不全是子表。 「教育細節」和「性別表」實際上就是*家長*表 - 也就是說,「學校表」是他們的孩子,反之亦然 - 但最好把他們想象成「查找表」。 (然而,「AKA Name」確實是一個子表。) – ruakh 2013-02-15 17:43:42

+0

我剛剛更新了預期結果。 – skumar 2013-02-15 17:56:34

回答

1

既然你想要AKA名字表中的所有記錄,我已經加入了爲每行獲得Row_Number。然後在其他表上使用該Row_Number,LEFT JOIN

SELECT S.SchoolId, 
    SA.AKAName, 
    G.GenderName, 
    ED.EducationType 
FROM School s 
    JOIN 
    (SELECT SchoolId, 
     AKAName, 
     ROW_NUMBER() OVER (PARTITION BY SchoolId ORDER BY AKAName) rn 
     FROM SchoolAKA 
    ) SA ON S.SchoolID = SA.SchoolId 
    LEFT JOIN 
    (SELECT EDUID, 
     EducationType, 
     ROW_NUMBER() OVER (ORDER BY EducationType) rn 
     FROM EduDetails 
    ) ED ON S.EDUID = ED.EDUID AND SA.rn = ED.rn 
    LEFT JOIN 
    (SELECT GenderId, 
     GenderName, 
     ROW_NUMBER() OVER (ORDER BY GenderName) rn 
     FROM Genders 
    ) G ON S.GenderId = G.GenderId AND SA.rn = G.rn 

這裏是SQL Fiddle

而且這裏的結果:

SCHOOLID AKANAME  GENDERNAME EDUCATIONTYPE 
1   School Test Male   Online 
1   Test School (null)  (null) 
+0

謝謝你somuch!它按預期工作。 – skumar 2013-02-15 18:47:46