0

我有一个查询,我知道可以使用子选择来完成,但由于表大小很大(每个表 100k+ 行),我想找到一个使用连接的替代方法。这不是一个家庭作业问题,但用这样的术语分享一个例子更容易。

假设有两个表:
Students
:id :name
1 Tom
2 Sally
3 Ben

书籍
:id :student_id :book
1 1 数学 101
2 1 历史
3 2 NULL
4 3 数学 101

我想找到所有没有历史书的学生。工作子选择是:
从 id 不在的学生中选择姓名(从 book = 'History' 的书籍中选择 student_id);

这将返回 Sally 和 Ben。

感谢您的回复!

4

1 回答 1

1

性能是问题吗?或者这只是一些避免子查询的理论(家庭作业?)问题?如果是性能,那么:

SELECT *
FROM studnets s
WHERE NOT EXISTS
(SELECT id FROM books WHERE student_id = s.id AND book = 'History')

将比您在 MySQL 上执行的 IN 执行得更好(在其他一些数据库上,它们将执行等效)。这也可以改写为连接:

SELECT s.*
FROM studnets s
LEFT JOIN books b ON s.id = b.student_id AND b.book = 'History'
WHERE b.id IS NULL
于 2009-05-28T22:18:22.270 回答