SQL在另一个字符串中查找字符串

时间:2017-06-07 11:49:30

标签: sql sql-server

我有两张桌子:

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的子字符串。

或者我是否需要使用临时表?

2 个答案:

答案 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;

您的代码很难理解,因为您定义了表tblFootblBar,但示例代码使用了不同的表名。

另请注意,这假设只有一个匹配项。您可能希望子查询中有top 1以避免运行时错误。