我有2张桌子。一个人有所有邀请的客人的数据。其他人都参加了派对。我如何检查未使用SQL的访客。假设有500,000名客人受邀,300,000位客人到场,您能否高效率假设。
如果我们必须使用脚本说bash脚本来自动化它。脚本会是什么样的?
答案 0 :(得分:1)
我不确定该名称是否足够独特,但是,这是一个查询,它将从一个表中获取另一个表中不存在的行:
SELECT name
FROM tablea
WHERE NOT EXISTS
(SELECT name FROM tableb)
;
答案 1 :(得分:1)
有时,集合运算符是最简单的:
select name from invited
minus
select name from attended
答案 2 :(得分:0)
如果定义了合适的索引,我会使用反连接模式
SELECT i.guest
FROM invited i
-- anti-join exclude
LEFT
JOIN attended a
ON a.guest = i.guest
WHERE a.guest IS NULL
可以使用其他查询模式返回等效结果。
例如,带有相关子查询的NOT EXISTS
。
SELECT i.guest
FROM invited i
WHERE NOT EXISTS ( SELECT 1
FROM attended a
WHERE a.guest = i.guest
)
EXPLAIN
输出可能会显示相同的查询访问计划。
为了获得这些查询的最佳性能,我们需要定义索引
ON attended (guest)
答案 3 :(得分:0)
基于之前的评论,我想展示一下MINUS和ANTI JOIN之间的区别
我有一张大约1.8M的INVITED表和大约1.1M的GUESTS(参加者)
使用MINUS,
select name from invited
minus
select name from attended
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | | 14364 (100)| |
| 1 | MINUS | | | | | | |
| 2 | SORT UNIQUE | | 1835K| 10M| 21M| 8977 (1)| 00:00:01 |
| 3 | TABLE ACCESS FULL| INVITED | 1835K| 10M| | 3038 (1)| 00:00:01 |
| 4 | SORT UNIQUE | | 1101K| 6451K| 12M| 5388 (1)| 00:00:01 |
| 5 | TABLE ACCESS FULL| GUESTS | 1101K| 6451K| | 1824 (1)| 00:00:01 |
---------------------------------------------------------------------------------------
使用ANTI JOIN
SELECT i.name
FROM invited i
-- anti-join exclude
LEFT
JOIN guests g
ON g.name = i.name
WHERE g.name IS NULL
;
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | | 7744 (100)| |
|* 1 | HASH JOIN RIGHT ANTI| | 1835K| 21M| 18M| 7744 (1)| 00:00:01 |
| 2 | TABLE ACCESS FULL | GUESTS | 1101K| 6451K| | 1824 (1)| 00:00:01 |
| 3 | TABLE ACCESS FULL | INVITED | 1835K| 10M| | 3038 (1)| 00:00:01 |
----------------------------------------------------------------------------------------
正如您所看到的,ANTI JOIN方法不需要执行排序,最终只需MINUS版本的一半。