入學批次、層次、專業多選時,課程下拉框需顯示「所有選中專業共有的課程」(交集)。
StringBuilder sql = new StringBuilder("SELECT model FROM ");
for (int i=0; i 1) {
for (int i=1; i
StringBuilder sql = new StringBuilder("SELECT model FROM ");
for (int i=0; i 1) {
for (int i=1; i
-- MySQL 8.0+
SELECT model FROM TeachingPlan_CourseDetail WHERE specialId = :sid1
INTERSECT
SELECT model FROM TeachingPlan_CourseDetail WHERE specialId = sid2
INTERSECT ...;
-- 老版本用 EXISTS/IN 模擬
SELECT model FROM TeachingPlan_CourseDetail t1
WHERE specialId = :sid1
AND EXISTS (SELECT 1 FROM TeachingPlan_CourseDetail t2 WHERE t2.model = t1.model AND t2.specialId = :sid2)
AND EXISTS ...;
| 方案 | 優點 | 缺點 | 適用版本 |
|---|---|---|---|
| 臨時表 + WHERE | 兼容性好,邏輯直觀 | SQL 動態拼接複雜,需別名管理 | 全版本 |
| CROSS JOIN + ON | 語義清晰,優化器友好 | 大數據集 Cartesian Product 風險 | 全版本 |
| INTERSECT | 標準 SQL、簡潔、性能佳 | 需 MySQL 8.0+ | 8.0+ |
| EXISTS 子查詢 | 兼容舊版,索引友好 | 多專業時 SQL 膨脹 | 全版本 |
INTERSECT 或 EXISTSIN (...) 查詢詳情CROSS JOIN 產生笛卡爾積