2016-09-18 56 views
0

考慮我有兩個查詢與下面的結果集...第一個結果集是爲學生,所以有關教師的所有列是空的..第二個結果集是有關的相關學生輔導員和列都爲空且二者共享一些常見的列.. 學生:如何合併Oracle的所有聯盟的結果

uid f_name m_name l_name class school Section Dept. Branch Title 
1 abc c  dey 2  NYU 1 null null  null 
2 cde d  rey 3  CU  2 null null  null 
3 xyz r  mey 4  LSU 3 null null  null 

老師:

uid f_name m_name l_name class school Section Dept. Branch Title 
4 wss c  tey null null  null Science Biology Asso.Prof 
2 cde d  rey null null  null Arts  Music Asso.Prof 
5 rrr r  jey null null  null Science Chemistry Prof 

如果您在上面的結果集看,UID 2共同的結果集,這基本上意味着一位教授可以同時也是一名學生......現在我想將這兩個查詢加入/合併成一個通用結果集,稱爲「用戶」,他們基本上是老師和學生。

「用戶」的結果集應該是唯一的UID。如果我使用UNION ALL,將有上UID 2.重複我需要一個查詢,可以合併列單行......結果集應該是:

1 abc c  dey 2  NYU 1 null null  null 
2 cde d  rey 3  CU  2 Arts Music  Asso.Prof 
3 xyz r  mey 4  LSU 3 null null  null 
4 wss c  tey null null  null Science Biology Asso.Prof 
5 rrr r  jey null null  null Science Chemistry Prof 

注以上2,它既有學生和教授的詳細信息在一行...

我如何在Oracle中實現這一目標?感謝你的幫助。

+0

我認爲UNION在這裏不是正確的方法。你的2個查詢的來源是什麼?請顯示SQL。無論是學生還是老師,都有一個存儲「人員」的源表,或者你有兩個不同的表格,這是不好的設計。對於這兩種情況,有兩種不同的方法,我不知道應該選擇哪一種,因爲您沒有提供足夠的信息。 –

+0

@ThomasG這兩個查詢是複雜的連接查詢,但都使用一個常見的來源,稱爲「人員」。但是無法區分一個人是學生還是教師,只是存儲了個人和他的細節。這可能是一個糟糕的設計,但它已經被放置並用於其他數百萬個其他地方......假設有另外兩張桌子,學生和老師......所以內心加入的學生,人員和其他一些與學生相關的桌子給了我所有的學生細節..同樣,內部加入教師表與人,其他人的數據表給我所有的教師的詳細信息。 –

+0

看完整的外部加入學生與老師在uid –

回答

1

正如評論已經提到,這是一個糟糕的設計(或使用好的設計可能是一個貧窮的解決方案)。如果基表是「人」(僅包含與學生和教師同類的信息,例如UID,姓名,出生日期,電子郵件等),則「學生」(以UID作爲外鍵,並顯示只有特定於學生的特徵)和「老師」(對於教師或教師而言是相同的),那麼設計就很好,並且可以直接從這些基表中獲得所需的最終輸出,而不是從您編寫的其他查詢的結果中獲得所需的最終輸出。 jva在他/她的回答中沿着這些線顯示了一些東西。

如果你真的必須忍受它,使用你現有的查詢方式是使用union all - 但你必須group by uid,併爲每一列必須選擇max(...) - 例如max(f_name)max(school)。使用列別名SELECT子句中,例如select .... , max(school) as school, ...

或者稍微更有效(但有一定的風險),group by id, f_name, m_name, l_name只爲剩餘的列選擇max(...)。風險是在一個地方m_nameN而在另一個地方它是空的;也就是說,您的數據在內部不一致。 (如果全部來自一個基本表,「人」,那麼這個風險就不應該存在。)

+0

我改變了我的解決方案,使得在查詢一我加入學生與人,也使確保返回的UID不在教師相關表中。所以,這樣我就可以確保(學生只有排除老師)聯盟(僅限教師)。似乎工作正常。感謝您的輸入 –

+0

'union all'和'group by'方法可能比您所描述的要快。嘗試兩種方式並決定。祝你好運! – mathguy

1

這將是通用的方法:

SELECT persons.id 
     ,nvl(<some_student_field>, <same_teacher_field) as some_common_field 
     ,... 
FROM persons 
    LEFT OUTER JOIN students on (person.id = students.person_id) 
    LEFT OUTER JOIN teachers on (person.id = teachers.person_id) 
WHERE <mandatory_field_for_students> IS NOT NULL 
    OR <mandatory_field_for_teachers> IS NOT NULL