有三张桌子,两张上游table A and B
,一张下游table C
。中的记录table A and B
被处理并合并到table C
.
Table A ( id_a identity not null, prop, val )
Table B ( id_b identity not null, prop, val )
Table C ( id_c,
original_id [id_a or id_c],
prop, processed_val,
source_table [ 'A' or 'B' ] )
NOTE: id_a and id_b has different format they never collide.
我需要在不访问应用程序代码的情况下纠正一些应用程序行为。所以我试图附加一个触发器table C
并process_val
根据原始数据进行操作。
我可以
UPDATE C
SET processed_value = NEW_FUNCTION( coalesce(A.val,B.val) )
FROM inserted
LEFT JOIN A ON ( C.orginal_id = A.id )
LEFT JOIN B ON ( C.orginal_id = B.id )
但我认为在返回结果之前,这必须经过两个表索引。我不想使用动态查询,我想保持简单的 sql 过程。
我想知道像下面这样的东西是否有助于防止冗余查找,因为这些键不应该是NULL
,NULL
值会停止查找吗?
UPDATE C
SET processed_value = NEW_FUNCTION( coalesce(A.val,B.val) )
FROM inserted
LEFT JOIN A ON ( A.id = case when source_table='A' then C.orginal_id else NULL end )
LEFT JOIN B ON ( B.id = case when source_table='B' then C.orginal_id else NULL end )
或者在 MSSQL 中有没有其他方法可以动态切换源表(没有动态查询)?
我想你想要一个和JOIN
之间。我希望逻辑看起来更像这样:C
inserted
UPDATE C
SET processed_value = NEW_FUNCTION(coalesce(A.val, B.val))
FROM inserted i JOIN
C
ON i.id_c = C.id_C LEFT JOIN
A
ON A.id = i.original_id AND i.source_table = 'A' LEFT JOIN
B
ON B.id = C.orginal_id AND i.source_table = 'B';
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句