编写此SQL查询的最有效方法是什么?

时间:2009-07-29 08:07:27

标签: sql mysql

我有两个ID列表。列表A和列表B.这两个列表实际上都是SQL查询的结果(分别是QUERY A和QUERY B)。

如果它们出现在列表B中,我想通过删除列表A中的ID来“过滤”列表A.

例如,如果列表A看起来像这样:

1,2,3,4,7

和列表B看起来像这样:

2,7

然后'过滤'列表A应该删除ID 2和7,所以应该是这样的:

1,3,4

我想写一个像这样的SQL查询(当然是伪代码):

SELECT id FROM(QUERYA)as temp_table,其中id不在(QUERYB)

4 个答案:

答案 0 :(得分:3)

使用经典SQL:

select [distinct] number
from list_a
where number not in (
    select distinct number from list_b
);

我已将第一个"distinct"放在方括号中,因为我不确定您是否要删除重复项(删除括号或整个单词)。第二个"distinct"应保留,以防万一您的DBMS没有优化IN条款。

可能更快(测量,不要猜测)左边的连接沿着以下几行:

select [distinct] list_a.number from list_a
left join list_b on list_a.number = list_b.number
where list_b.number is null;

"[distinct]"相同的交易。

答案 1 :(得分:2)

答案 2 :(得分:1)

查询:

select id 
from ListA
where id not in (
    select id 
    from ListB)

会给你想要的结果。

答案 3 :(得分:1)

我不确定哪种方式最好。正如我之前的印象,穿孔可能会有很大不同,取决于坐姿和桌子的大小。

1

select id 
from ListA
where id not in (
    select id 
    from ListB)

2

select ListA.id 
from ListA
left join ListB on ListA.id=ListB.id
where ListB.id is null

3

select id 
from ListA
where not exists (
    select * 
    from ListB where ListB.id=ListA.id)

2)通常应该是最快的,因为内部连接不是子查询。

有些人可能会建议3)而不是1)因为它使用“存在”而不会从表中读取数据。