我有一个查询,我知道可以使用subselect完成,但由于大表大小(每个表100k +行)我想找到一个使用连接的替代方法。这不是一个家庭作业问题,但是用这样的术语分享一个例子会更容易。
假设有两个表:
学生
:id:名字
1个汤姆
2萨利
3奔
书籍
:ID:student_id数据:书
1 1数学101
2个1历史
3 2 NULL
4 3数学101
我想找到所有没有历史书的学生。工作子选择是:
从身份不在的学生中选择姓名(从book ='History'的书中选择student_id);
这使Sally和Ben回归。
感谢您的回复!
答案 0 :(得分: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