r***o 发帖数: 1526 | 1 请教各位DB高手个SQL问题
现在有个#Temp Table
Name T_ID Count
-------------------
A
A
B
C
X
--------------------
和 Table T
T_ID Name
--------------------
1 A
2 B
3 C
---------------------
现在要Update #Temp table from T WHERE T.Name = #Temp.Name
最后#Temp table的结果应该是
Name T_ID Count
-------------------
A 1 2
A 1 2
B 2 1
C 3 1
X NULL 0
--------------------
这个Update该怎么写? |
B*****g 发帖数: 34098 | 2 如果觉得问题复杂,先把问题拆分。
先想想怎么得到T_ID,再想想怎么得到Count。
如果需要,怎么把两步换成一步。再想还有其他优化方法吗?
【在 r***o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 请教各位DB高手个SQL问题 : 现在有个#Temp Table : Name T_ID Count : ------------------- : A : A : B : C : X : --------------------
|
r***o 发帖数: 1526 | 3 好像只能两步了
UPDATE #Temp SET T_ID = T.T_ID FROM T INNER JOIN #Temp ON #Temp.Name = T.
Name
UPDATE #Temp SET Count = TCount FROM
(SELECT Count(*) TCount, T_ID FROM #Temp GROUP BY T_ID) T
INNER JOIN #Temp ON #Temp.T_ID = T.T_ID
【在 B*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 如果觉得问题复杂,先把问题拆分。 : 先想想怎么得到T_ID,再想想怎么得到Count。 : 如果需要,怎么把两步换成一步。再想还有其他优化方法吗?
|
B*****g 发帖数: 34098 | 4 set a=a1, b=b1?
【在 r***o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 好像只能两步了 : UPDATE #Temp SET T_ID = T.T_ID FROM T INNER JOIN #Temp ON #Temp.Name = T. : Name : UPDATE #Temp SET Count = TCount FROM : (SELECT Count(*) TCount, T_ID FROM #Temp GROUP BY T_ID) T : INNER JOIN #Temp ON #Temp.T_ID = T.T_ID
|
s**********o 发帖数: 14359 | 5 只能两步走,想飞很可能会摔在地上的,还是一步一步地爬比较容易 |
y****w 发帖数: 3747 | 6 update temp x set (t_id, count) = ( select t.t_id, count(*) from t join
temp t1 on t.name = t1.name where t1.name = x.name group by t.t_id,t.name) |
B*****g 发帖数: 34098 | 7 你这个效率?
【在 y****w 的大作中提到】![](/moin_static193/solenoid/img/up.png) : update temp x set (t_id, count) = ( select t.t_id, count(*) from t join : temp t1 on t.name = t1.name where t1.name = x.name group by t.t_id,t.name)
|
y****w 发帖数: 3747 | 8 你说怎么更快?update query?
要这个query都很慢,如果索引也在,那就别update了,把结果insert/load到新表好了.
【在 B*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 你这个效率?
|
B*****g 发帖数: 34098 | 9 没想呢,不过inner join不合适,0出不来
【在 y****w 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 你说怎么更快?update query? : 要这个query都很慢,如果索引也在,那就别update了,把结果insert/load到新表好了.
|
y****w 发帖数: 3747 | 10 这是小节阿,前面后面处理下都可以阿. nullif/coalesce/case阿
【在 B*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 没想呢,不过inner join不合适,0出不来
|
|
|
B*****g 发帖数: 34098 | 11 再想想,不好加的
【在 y****w 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这是小节阿,前面后面处理下都可以阿. nullif/coalesce/case阿
|
y****w 发帖数: 3747 | 12 update temp x set (t_id, count) = ( select t.t_id, count(t1.t_id) from temp
t1 left join t on t.name = t1.name where t1.name = x.name group by t.t_id,t
.name)
【在 y****w 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这是小节阿,前面后面处理下都可以阿. nullif/coalesce/case阿
|
B*****g 发帖数: 34098 | 13 outer join,又掉一块,这题很难呀,哈哈。我一会也琢磨一下,最近根本没心思写
SQL
temp
,t
【在 y****w 的大作中提到】![](/moin_static193/solenoid/img/up.png) : update temp x set (t_id, count) = ( select t.t_id, count(t1.t_id) from temp : t1 left join t on t.name = t1.name where t1.name = x.name group by t.t_id,t : .name)
|
y****w 发帖数: 3747 | 14 update t set a=(select..), b = (select...)*写*起来会更容易些.
【在 B*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : outer join,又掉一块,这题很难呀,哈哈。我一会也琢磨一下,最近根本没心思写 : SQL : : temp : ,t
|
s**********o 发帖数: 14359 | 15 UPDATE还是尽量不要JOIN来JION去吧,很容易出错的,而且容易自己把自己LOCK了 |
y****w 发帖数: 3747 | 16 compact的写法从锁上看应该是一样的,因为一步到位还减少了死锁的可能性--从另
一个角度看就是少了make atomic的开销.
另外对目标表也减少了i/o.
【在 s**********o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : UPDATE还是尽量不要JOIN来JION去吧,很容易出错的,而且容易自己把自己LOCK了
|
y****w 发帖数: 3747 | 17 "自己把自己LOCK"?
【在 s**********o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : UPDATE还是尽量不要JOIN来JION去吧,很容易出错的,而且容易自己把自己LOCK了
|