我有两个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)
答案 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)因为它使用“存在”而不会从表中读取数据。