所以我的PHP应用程序中有很多SQL查询(可能超过1000个查询),每个查询都区分它的id和日期,如下所示:
SELECT dataid, date_input, value FROM app_inputdata WHERE date_input='2013-03-10' AND dataid='2337'
查询需要很长时间才能完成,因此我正在尝试批处理。如何执行此操作,如果查询不匹配任何行,它仍应返回-
为value
值的行。
答案 0 :(得分:0)
您可以构建如下的单个查询:
SELECT dataid, date_input, value
FROM app_inputdata
WHERE
(date_input='2013-03-10' AND dataid='2337')
OR (date_input='...' AND dataid='..')
OR (...) -- and so on
获取不存在的行会使您的查询更加复杂。我建议在PHP方面做这件事。但是,如果你坚持,这就是-
作为不存在的行的值的方法:
SELECT data.date_input, data.dataid, COALESCE(app_inputdata.value, '-') as value
FROM (SELECT unnest(ARRAY[2337, 2338, ...]) as dataid, unnest(ARRAY['2013-03-10', '2013-03-11', ...]::date[]) as date_input) as data
LEFT JOIN app_inputdata ON app_inputdata.date_input = data.date_input AND app_inputdata.dataid = data.dataid
答案 1 :(得分:0)
假设您有很多(比如数百或数千)date_input
和dataid
对,并且应该针对app_inputdata
表进行检查,这样做的有效方法是首先上传这些成对临时表,然后进行单选。
代码,创建临时表:
create table pg_temp.input_filter(date_input date, dataid int);
插入date_input和dataid对:
insert into pg_temp.input_filter values (?,?);
然后选择您需要的数据:
select f.date_input, f.dataid,coalesce(d.value,'-') as value
from pg_temp.input_filter f
left join app_inputdata d on d.date_input=f.date_input and d.dataid=f.dataid;
答案 2 :(得分:0)
我有同样的要求,我在想也许我们可以使用函数,创建一个接受参数数组的sql函数,对于你的情况,可能有两种 - “date_input”和“dataid”,在函数中,我们可以循环所有参数并将所有返回结果保存在另一个数组中,我在我的项目中尝试过,但没有做性能比较。
谢谢,
约翰尼