我想做以下事情;什么是最简单的方法?
SELECT id FROM (1,2,3) WHERE ID NOT IN (SELECT id FROM table)
这个想法不是通过首先将表ID加载到脚本中来增加我的python脚本的内存使用量。 我能想到的唯一方法是使用WITH查询构建一个临时表,这有点冗长。
答案 0 :(得分:0)
select id from (values (1),(2),(3)) as s(id)
except
select id from table
用Psycopg做到这一点:
id_list = ['1','2','3']
q = """
select array_agg(id)
from (
select id from (values {}) s(id)
except
select id from table
) t;
""".format(','.join(['%s'] * len(id_list)))
print cur.mogrify(q, [(id,) for id in id_list])
# cur.execute(q, [(id,) for id in id_list])
输出:
select array_agg(id)
from (
select id from (values ('1'),('2'),('3')) s(id)
except
select id from table
) t;
答案 1 :(得分:0)
提供的答案就像魅力一样,但是我无法使用内置字符串格式的psycopg2,因为每个值都需要在提供的答案中使用括号,除了构建查询字符串外,还不确定是否有办法解决问题手动
select array_agg(ids)
from (
select unnest(ARRAY['1', '2'])
except
select unnest(array_agg(sku::text)) from table
) t (ids);
以下是另一种方法,因为psycopg2有python list> postgres数组转换器
{{1}}