簡體   English   中英

Oracle SQL當數據集的數量是動態的時,有一種方法可以找到存儲在同一個表中的數據集的交集

[英]Oracle SQL Is there a way to find intersections of data sets stored in same table when number of data sets are dynamic

想象一下以下數據集。 (這不是我正在處理的完全相同的問題,但這只是一個證明要求的簡單示例)

Student ID,  Course ID
S1           C1
S1           C2
S1           C3
S2           C1
S2           C3
S3           C1
S3           C2

在上述數據集中,每個學生都在課程數量下注冊。 我想知道哪些學生正在考慮這個表中的所有原因。

因此,如果我使用INTERSECT關鍵字,它將如下所示。

SELECT student_id FROM <table> where course_id = 'C1'
INTERSECT
SELECT student_id FROM <table> where course_id = 'C2'
INTERSECT
SELECT student_id FROM <table> where course_id = 'C3'

顯然,這項工作只有在課程清單得到修復后才能實現。

有沒有辦法做到這一點,課程列表是動態的,只使用SQL。

我可以寫一個PLSQL函數來做到這一點。 但隨后將為每個唯一的課程ID執行一個游標,並且交叉將由PLSQL代碼完成。

我希望看看是否有可能盡可能多地將其卸載到SQL引擎(可能使用分析函數),因為涉及的數據集可能很大。

嘗試這樣的事情:

SELECT student_id FROM <table> 
WHERE course_id IN (SELECT course_id FROM <anothertable>) 
GROUP BY student_id 
HAVING COUNT(DISTINCT course_id)=(SELECT COUNT(DISTINCT course_id) FROM <anothertable>)

這樣,您可以確保為<anothertable> course_id <anothertable>指定的每個course_id注冊每個返回的student_id

這稱為“關系部門”,另請參閱https://www.red-gate.com/simple-talk/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/

編輯(戈登):

問題中只提到一個表,因此查詢為:

SELECT student_id
FROM t
GROUP BY student_id 
HAVING COUNT(DISTINCT course_id) = (SELECT COUNT(DISTINCT course_id) FROM t)

Oracle允許您使用COUNT(DISTINCT)作為分析函數。 所以,你可以這樣做:

SELECT DISTINCT student_id 
    FROM   (SELECT student_id, 
                  COUNT(DISTINCT course_id) 
                  OVER ( PARTITION BY student_id  )  AS course_per_student, 
                  COUNT(DISTINCT course_id) OVER ()  AS available_courses 
        FROM   t) 
WHERE  course_per_student = available_courses 

DEMO

暫無
暫無

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

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