簡體   English   中英

在RDBMS中使用“條件”聯接表

[英]Join tables with 'condition' in RDBMS

我有3張桌子:

Persons(PersonID, PersonName, PersonAge, PersonType)

Students(StudentID (fk to Persons.PersonID), StudentRank, StudentClassID, ...)

Teachers(TeacherID (fk to Persons.PersonID), TeacherSalary, ...)

一個人只能是一種類型:學生或老師。 因此,如果我想列出所有具有該類型的人(學生或教師),我需要檢查Persons表的PersonType,然后與相應的表(學生,教師)聯接? 夠好嗎? 有人可以給我一個更好的解決方案嗎?

編輯:我使用組合:PHP + MySQL。

更新 :表的結構。

您可以使用find_in_set不是您不需要連接兩個表:

select p.Personname 
from students s,persons p
where find_in_set(s.Studentid,p.Personid)

該...

SELECT * FROM Persons JOIN Students ON Persons.PersonID = Students.StudentID

... 不會再派任何老師。

因此,您不必對PersonType進行過濾(但是,如果它以有助於提高性能的方式進行索引,則可能需要在更復雜的情況下進行過濾)。

-編輯-

好的,因此您想將所有內容“塞滿”然后在PersonName排序。 您可以通過用NULL仔細填充兩個子表之間的“間隙”來做到這一點:

SELECT *
FROM (
    SELECT Persons.*, StudentRank, StudentClassID, NULL TeacherSalary
    FROM Persons JOIN Students ON Persons.PersonID = Students.StudentID
    UNION ALL
    SELECT Persons.*, NULL StudentRank, NULL StudentClassID, TeacherSalary
    FROM Persons JOIN Teachers ON Persons.PersonID = Teachers.TeacherID
) Q
ORDER BY PersonName

有兩種技術可以為您提供幫助,在“信息”標簽下的“

您當前的設計反映了很多類表繼承。 共享主鍵可以為您帶來的好處是,能夠加強學生與人之間以及老師與人之間關系的一對一性質。 它不會在師生之間建立相互排斥的關系。

通過兩個聯接和一個聯合,可以將這三個表合並為一個視圖,以捕獲所有這些數據,並在不適用的地方使用NULL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM