簡體   English   中英

關系代數中的“分組依據和擁有”子句查詢的等效項是什么?

[英]What is the equivalent for a Group By and Having clause query in Relational Algebra?

范例:

7.查找在同一天拜訪過同一專業的兩名不同醫生的患者。

   SELECT       p.pid , d.speciality, v.date
   FROM         Patient p
   JOIN         Visits v ON v.pid = p.pid
   JOIN         Doctors d ON d.did = v.did
   GROUP BY     p.pname, d.speciality, v.date
   HAVING   COUNT(DISTINCT d.did) = 2

您如何為此編寫合法的RA?

基本上,RA中GroupBy和Haveing子句的等效性是什么?

有人問同樣的, 這里沒有得到回答

您實際上並不需要嘗試轉換SQL,也可以考慮在問題上給出RA解決方案:

“查找在同一天拜訪了兩位相同專業的不同醫生的患者”

我們首先結合患者,探訪和醫生

Patients x Visits x Doctors

由於我們有兩次訪問和兩位醫生,因此我們需要另一個表“訪問和醫生”表。 我們不能按原樣使用它們,因為否則我們將無法區分它們。 因此,重命名\\rho

Patients x \\rho_V1(Visits) x \\rho_D1(Doctors) x \\rho_V2(Visits) x \\rho_D2(Doctors)

接下來,我們需要選擇“匹配”組合

\sigma_{Patients.pid = V1.pid /\ 
        Patients.pid = V2.pid /\ 
        V1.date = V2.date /\ 
        V1.did = D1.did /\ 
        V2.did = D2.did /\
        D1.did != D2.did /\
        D1.speciality = D2.speciality}
 (Patients x \rho_V1(Visits) x \rho_D1(Doctors)  x 
             \rho_V2(Visits) x \rho_D2(Doctors))

接下來,我們需要找到患者,即在pid投影

\pi_{Patients.pid} 
(\sigma_{Patients.pid = V1.pid /\ 
        Patients.pid = V2.pid /\ 
        V1.date = V2.date /\ 
        V1.did = D1.did /\ 
        V2.did = D2.did /\
        D1.did != D2.did /\
        D1.speciality = D2.speciality}
 (Patients x \rho_V1(Visits) x \rho_D1(Doctors)  x 
             \rho_V2(Visits) x \rho_D2(Doctors)))

通過這種方式,您發現患者在同一天至少拜訪了同一專業的至少兩名不同的醫生。 如果您需要找到正好拜訪過兩位醫生的那些患者,則應記住恰好2 =至少2-至少3 ,即,

\pi_{Patients.pid} 
(\sigma_{Patients.pid = V1.pid /\ 
        Patients.pid = V2.pid /\ 
        V1.date = V2.date /\ 
        V1.did = D1.did /\ 
        V2.did = D2.did /\
        D1.did != D2.did /\
        D1.speciality = D2.speciality}
 (Patients x \rho_V1(Visits) x \rho_D1(Doctors)  x 
             \rho_V2(Visits) x \rho_D2(Doctors)))
-
\pi_{Patients.pid} 
(\sigma_{Patients.pid = V1.pid /\ 
        Patients.pid = V2.pid /\ 
        Paitents.pid = V3.pid /\
        V1.date = V2.date /\ 
        V2.date = V3.date /\
        V1.did = D1.did /\ 
        V2.did = D2.did /\
        V3.did = D3.did /\
        D1.did != D2.did /\
        D1.did != D3.did /\
        D2.did != D3.did /\
        D1.speciality = D2.speciality /\
        D2.speciality = D3.speciality}
 (Patients x \rho_V1(Visits) x \rho_D1(Doctors)  x 
             \rho_V2(Visits) x \rho_D2(Doctors)  x
             \rho_V3(Visits) x \rho_D3(Doctors) ))

暫無
暫無

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

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