我有两张桌子:
tblFoo :
Id | MessageId | SenderName
tblBar :
MessageId | Name
我需要使用来自tblBar的MessageId更新tblFoo中的所有行,其中SenderName以Name开头。 e.g。
tblFoo :
Id | MessageId | SenderName
-------+-----------+--------------------
365175 | NULL | x.y.z.abc.def.ghi
535646 | NULL | a.b.c.fjdkf.dsfjdsf:a
535647 | NULL | a.b.c.sdjskfj.dsfjds:b
tblBar :
MessageId | Name
--------------------------------------+--------
9B30FCD1-F063-4B7F-887B-65288C3681D3 | x.y.z
56FBEF0F-8C29-4614-8894-4F64A515659A | a.b.c
因此,tblFoo
Id=365175
最终会以MessageId = 9B30FCD1-F063-4B7F-887B-65288C3681D3
结束,而Id=535646
会以MessageId = 56FBEF0F-8C29-4614-8894-4F64A515659A
结束,而Id=535647
最终会以MessageId=
56FBEF0F-8C29-4614-8894-4F64A515659A
结束begin transaction
update tblFoo
set MessageId =
(
select MessageId
from tblBar
where [Name] ???
);
rollback transaction
到目前为止我已经
了where [Name] like
我无法做到
curl -fsSL 'https://sks-keyservers.net/pks/lookup?op=get&search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e' | sudo apt-key add -
sudo add-apt-repository "deb https://packages.docker.com/1.13/apt/repo/ \
ubuntu-$(lsb_release -cs) \
main"
sudo apt-get update
sudo apt-get -y install docker-engine
as [Name]是SenderName的子字符串。
或者我是否需要使用临时表?
答案 0 :(得分:1)
您可以使用内部联接,如下所示。
update foo set messageid = br.messageid
from
tblFoo foo
inner join
tblBar br
on foo.senderName like ltrim(br.Name) + '%'
答案 1 :(得分:0)
您的代码看起来像SQL Server。您可以使用以下内容执行此操作:
update h
set MessageDefinitionId = (select MessageDefinitionId
from Sentilan2.msg.tblMessageDefinition md
where h.SenderName like md.[Name] + '%'
);
from h;
您的代码很难理解,因为您定义了表tblFoo
和tblBar
,但示例代码使用了不同的表名。
另请注意,这假设只有一个匹配项。您可能希望子查询中有top 1
以避免运行时错误。