我有一個如下表:
studentNo courseNo
s001 c001
s001 c002
s002 c001
s002 c002
s003 c001
s003 c003
我可以知道如何獲得與學生 s001 完全相同課程的 studentNo 嗎?非常感謝。
uj5u.com熱心網友回復:
您想計算每個學生的課程數,然后將表連接到自己的表中,以便不同學生學習相同課程且課程總數相同,然后計算連接中匹配行的總數等于課程總數:
WITH course_count (studentno, courseno, num_courses) AS (
SELECT t.*,
COUNT(courseNo) OVER (PARTITION BY studentno)
FROM table_name t
)
SELECT c.studentno
FROM course_count c
INNER JOIN course_count s
ON ( c.courseno = s.courseno
AND c.studentno != s.studentno
AND c.num_courses = s.num_courses )
WHERE s.studentno = 's001'
GROUP BY c.studentno
HAVING COUNT(c.courseno) = MAX(s.num_courses);
其中,對于(擴展的)樣本資料:
CREATE TABLE table_name (studentNo, courseNo) AS
SELECT 's001', 'c001' FROM DUAL UNION ALL
SELECT 's001', 'c002' FROM DUAL UNION ALL
SELECT 's002', 'c001' FROM DUAL UNION ALL
SELECT 's002', 'c002' FROM DUAL UNION ALL
SELECT 's003', 'c001' FROM DUAL UNION ALL
SELECT 's003', 'c003' FROM DUAL UNION ALL
SELECT 's004', 'c002' FROM DUAL UNION ALL
SELECT 's004', 'c001' FROM DUAL UNION ALL
SELECT 's004', 'c003' FROM DUAL UNION ALL
SELECT 's005', 'c001' FROM DUAL
輸出:
學生號 s002
db<>在這里擺弄
uj5u.com熱心網友回復:
您沒有指定您使用的資料庫;但是,大多數使用 Oracle SQL Developer 作為工具的人都使用 Oracle 資料庫。假設確實如此,這里有一個選擇。
樣本資料:
SQL> select * from study order by studentno, courseno;
STUDENTNO COURSENO
---------- ----------
s001 c001
s001 c002
s002 c001
s002 c002
s003 c001
s003 c003
s004 c001
s004 c002
s004 c003
9 rows selected.
tempCTE匯總了每個學生的所有課程。listagg的order by條款確保課程將被正確排序。
然后,在最后select一條陳述句(從第 7 行開始)中,查詢回傳學生(不是s001(第 9 行),因為您將其余部分與 進行比較s001)其課程串列與課程串列相同對于學生s001(這是第 10 - 12 行中的子查詢回傳的內容)。
SQL> with temp as
2 (select studentno,
3 listagg(courseno, ';') within group (order by courseno) courses
4 from study
5 group by studentno
6 )
7 select studentno
8 from temp
9 where studentno <> 's001'
10 and courses = (select courses
11 from temp
12 where studentno = 's001');
STUDENTNO
----------
s002
SQL>
同樣,使用自聯接:
SQL> with temp as
2 (select studentno,
3 listagg(courseno, ';') within group (order by courseno) courses
4 from study
5 group by studentno
6 )
7 select b.studentno
8 from temp a join temp b on a.studentno <> b.studentno
9 and a.courses = b.courses
10 where a.studentno = 's001';
STUDENTNO
----------
s002
SQL>
uj5u.com熱心網友回復:
編輯:我的解決方案有缺陷。稍后我下班回來時會修復它。現在,檢查發布的解決方案 MTO。因為它確實回傳了預期的結果美好的一天,并有一個美好的一周。現在還是星期一早上,所以我可能錯了。但這應該可以根據需要
這里需要的是一個子查詢,子查詢會回傳S001的所有課程。然后外部查詢將使用結果回傳所有具有相同課程的學生。請注意,每個學生的結果將顯示一次
SELECT DISTINCT studentNo
FROM tableName
WHERE CourseNo IN (
SELECT CourseNo
FROM TableName
WHERE studentNo = 's001'
)
小提琴:https ://www.db-fiddle.com/f/8k2Ye6deGSjLj9o9THYyys/0
2 號小提琴:https : //www.db-fiddle.com/f/8k2Ye6deGSjLj9o9THYyys/1 第二個小提琴不是最好的設計,但它應該按照你的要求做
小提琴 2 的代碼
SELECT DISTINCT studentNo
FROM test
WHERE studentNo NOT IN (
SELECT studentNo
FROM test
WHERE CourseNo NOT IN (
SELECT CourseNo
FROM test
WHERE studentNo = 's001'
)
AND studentNo != 's001'
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/483087.html
