比方说,在一个典型的大学数据库系统中,哪条SQL语句可以找到所有还没有学生注册的班级?(注册过程为10天,现在是第3天)。
其他SQL语句解决方案可能是什么?
详细信息:
假设大学有许多部门,每个部门都有不同的班级,比如心理学1A,在不同的时间由几个不同的老师授课,心理学10,数学110等。
发布于 2010-04-23 21:54:29
有一些基本技术可用于标识表A中不在表B中的记录。每种技术都有自己的优点,并且根据数据分布和数据量的不同,每种技术都可能表现良好,也可能表现不佳。此外,筛选列中出现的空值可能会导致不同的结果(尽管这似乎不太可能,但在问题中描述的特定场景中,这是一个考虑因素)。最后,并不是所有的SQL都支持所有这些语法。
最直接的可能是NOT IN:
select *
from classes
where id not in
( select class_id
from registrations
)
/
接下来是相关的NOT EXISTS:
select *
from classes
where not exists
( select null
from registrations
where registrations.class_id = classes.id
)
/
然后是反联接:
select *
from classes
full outer join registrations
on (classes.id = registrations.class_id )
where registrations.class_id is null
/
最后是减号运算符:
select id
from classes
minus
select class_id
from registrations
/
这最后一个语法写起来相当快,但是很明显在细节上就失败了。如果我们想要更多来自类的列,这些列不在注册中,那么我们需要将其作为子查询提供给select on CLASSES。因此,它不像其他语法那样广泛适用,但在某些情况下很有用。
发布于 2010-04-23 21:17:36
以下是使用FULL OUTER JOIN
的一种选择
SELECT *
FROM Class
FULL OUTER JOIN StudentClass
ON Class.Id = StudentClass.ClassId
WHERE StudentClass.ClassId IS NULL
还可以将子查询与NOT IN
一起使用
SELECT *
FROM Class
WHERE Id NOT IN
( SELECT ClassId
FROM StudentClass
)
发布于 2010-04-23 21:17:52
您可以使用左连接,当没有要连接的内容时,它会保留在NULL中
SELECT class
FROM classes c
LEFT JOIN students s ON c.class = s.class
WHERE s.name IS NULL
https://stackoverflow.com/questions/2698787
复制相似问题