我正在尝试将数据库中的字段更新为其连接值的总和:
UPDATE P
SET extrasPrice = SUM(E.price)
FROM dbo.BookingPitchExtras AS E
INNER JOIN dbo.BookingPitches AS P ON E.pitchID = P.ID
AND P.bookingID = 1
WHERE E.[required] = 1
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我收到以下错误:
"An aggregate may not appear in the set list of an UPDATE statement."
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
在服务器上执行了更新SQL查询,这在以后引起了许多问题.
如何获取最近2个月内执行的更新查询列表,以便我可以跟踪确切的有问题的SQL查询?
我正在编写一个Django-ORM增强版,它尝试缓存模型并推迟模型保存直到事务结束.这几乎已经完成,但是我在SQL语法中遇到了意想不到的困难.
我不是一个DBA,但据我所知,数据库并不能真正有效地处理许多小问题.几个更大的查询要好得多.例如,最好使用大批量插入(比如一次100行)而不是100个单行.
现在,从我所看到的,SQL并没有真正提供任何语句来对表执行批量更新.这个词似乎令人困惑,我会解释我的意思.我有一个任意数据数组,每个条目描述一个表中的一行.我想更新表中的某些行,每个行都使用数组中相应条目的数据.这个想法非常类似于批量插入.
例如:我的表可以有两列"id"和"some_col".现在描述用于在批处理更新的数据阵列由三个条目的(1, 'first updated'),(2, 'second updated')和(3, 'third updated').更新前表中包含行:(1, 'first'),(2, 'second'),(3, 'third').
我来到这篇文章:
这似乎做我想要的,但我最终无法弄清楚语法.
我还可以删除所有需要更新的行,并使用批量插入重新插入它们,但我发现很难相信这实际上会更好.
我使用PostgreSQL 8.4,因此这里也可以使用一些存储过程.然而,当我计划最终开源项目时,任何更便携的想法或方法在不同的RDBMS上做同样的事情是最受欢迎的.
后续问题:如何批量"插入或更新"/"upsert"语句?
检测结果
我已经执行了100次10次插入操作,分布在4个不同的表中(总共1000个插入).我使用PostgreSQL 8.4后端在Django 1.3上进行了测试.
这些是结果:
结论:在单个connection.execute()中执行尽可能多的操作.Django本身带来了巨大的开销.
免责声明:除了默认主键索引之外,我没有引入任何索引,因此插入操作可能会因此而运行得更快.
当你运行类似于:
UPDATE table SET datetime = NOW();
Run Code Online (Sandbox Code Playgroud)
在具有1 000 000 000条记录的表上,查询需要10秒才能运行,所有行是否具有完全相同的时间(分钟和秒),还是会有不同的时间?换句话说,是时候是查询开始还是每行更新?
我正在运行MySQL,但我认为这适用于所有dbs.
我试图在MS-SQL上执行此操作,但只是在逐行返回错误
update #temp
Set Dos=Count(1)
From Temp_Table2010 s
where Id=s.Total and s.total in (Select Id from #temp)
group by s.Total
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个性能良好的问题.
对于所有行,我的表字段的一个字段设置为0.但我想在更新查询中通过步骤1更新为增量值.
我怎么能在mysql中做到这一点?
我有一个相关的问题,但这是我的谜题的另一部分.
我想从UPDATEd的行中获取列的OLD VALUE - 不使用触发器(也不使用存储过程,也不使用任何其他额外的非SQL /查询实体).
我的查询是这样的:
UPDATE my_table
SET processing_by = our_id_info -- unique to this worker
WHERE trans_nbr IN (
SELECT trans_nbr
FROM my_table
GROUP BY trans_nbr
HAVING COUNT(trans_nbr) > 1
LIMIT our_limit_to_have_single_process_grab
)
RETURNING row_id;
Run Code Online (Sandbox Code Playgroud)
如果我可以在子查询结束时执行"FOR UPDATE ON my_table",那将是devine(并修复我的其他问题/问题).但是,这不起作用:不能有这个AND"GROUP BY"(这对于计算trans_nbr的COUNT是必要的).然后我可以直接使用那些trans_nbr并进行查询以获得(即将成为)之前的processing_by值.
我尝试过这样做:
UPDATE my_table
SET processing_by = our_id_info -- unique to this worker
FROM my_table old_my_table
JOIN (
SELECT trans_nbr
FROM my_table
GROUP BY trans_nbr
HAVING COUNT(trans_nbr) > 1
LIMIT our_limit_to_have_single_process_grab
) sub_my_table
ON old_my_table.trans_nbr = sub_my_table.trans_nbr …Run Code Online (Sandbox Code Playgroud) 似乎我对条件查询有很大的问题:(我必须做一个有条件的更新.我在这里写下我想做的事情:
if(select tipo from abbonamento where idU=17)='punti' then
update abbonamento set punti=punti-1
else
update abbonamento set bonus=bonus-1
Run Code Online (Sandbox Code Playgroud)
显然这不起作用.任何的想法?
我有这样的查询(在函数中):
UPDATE some_table SET
column_1 = param_1,
column_2 = param_2,
column_3 = param_3,
column_4 = param_4,
column_5 = param_5
WHERE id = some_id;
Run Code Online (Sandbox Code Playgroud)
param_x我的函数的参数在哪里.有没有办法不更新那些param的列NULL?例如-如果param_4和param_5是NULL,然后只更新前三列,离开旧值column_4和column_5.
我现在这样做的方式是:
SELECT * INTO temp_row FROM some_table WHERE id = some_id;
UPDATE some_table SET
column_1 = COALESCE(param_1, temp_row.column_1),
column_2 = COALESCE(param_2, temp_row.column_2),
column_3 = COALESCE(param_3, temp_row.column_3),
column_4 = COALESCE(param_4, temp_row.column_4),
column_5 = COALESCE(param_5, temp_row.column_5)
WHERE id = some_id;
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
我想用另一个表中的数据更新mySql中的表.
我有两个表"人"和"业务".人员表通过名为"business_id"的列链接到业务表.
必要的表结构,主键是星号(表:列):人物:*business_id,*sort_order,电子邮件业务:*business_id,电子邮件
我想用人员表中的电子邮件更新业务表电子邮件列,就像这样(我知道我在这里遗漏了一些东西):
UPDATE business b SET email = (SELECT email from People p where p.business_id = b.business_id AND sort_order = '1') WHERE b.email = '';
Run Code Online (Sandbox Code Playgroud)
这有意义吗?可能吗?