如何编写SQL select语句以包含来自另一个表的查找?
题
我正在将数据从一个数据库复制到另一个数据库,并在我处理数据时按摩数据。两个数据库都有名为Clients和Jobs的表。
然而,在数据库“Alpha”中, Jobs表与Clients表没有关系,其中数据库“Epsilon”表示数据库“Epsilon”。确实。 Alpha的Jobs表只在nvarchar列中有客户端名称。
当我将它插入Epsilon的Jobs表中时,我需要一个select语句来查看Client表中客户端ID的名称。
我未完成的SQL语句如下所示:
insert into Epsilon.dbo.Jobs (ClientId, Name, Location, DateCreated)
select ????, Name, Location, DateCreated from Alpha.dbo.Jobs
我该怎么修改这个????包含Epsilon中Clients表中的ClientId?我知道我需要使用Jobs中的Name列查找数据,但我无法弄清楚这个的语法。
解决方案
insert into Epsilon.dbo.Jobs (ClientId, Name, Location, DateCreated)
select c.ClientID, a.Name, a.Location, a.DateCreated from Alpha.dbo.Jobs a
join Epsilon.dbo.Client c on c.Name = a.ClientName
这是一个相当乐观的联接,但即使需要修改,这应该给你一般的想法。
其他提示
您需要的是加入。加入,与开始时几乎所有人都想到的相反,不需要在数据库的模式中定义关系。他们只要求您要比较的两列具有相同的类型(编辑请参阅注释)。
问题是你想要哪个加入。因为没有定义关系,所以可能有客户端有工作,客户端没有,有工作的客户和工作没有。
我假设您希望存在所有JOBS,并且ClientId与CLIENTS表匹配的位置引入ClientId,并且该关系不存在以使ClientId保持为空。我们可以通过LEFT JOIN完成此操作。作业LEFT JOIN客户端将引入LEFT上的所有记录,即使在右侧客户端定义的关系不存在的情况下也是如此。我们可以扭转这两个并做一个正确的联接,但这不是人们通常做的事情。我将留给您阅读其他类型的联接以及它们如何工作。
所以你的select语句看起来像:
select ClientId, Name, Location, DateCreated
from Alpha.dbo.Jobs as J LEFT JOIN
Alpha.dbo.Clients as C ON j.ClientName = c.ClientName
如果Jobs.ClientName与c.ClientName的数据类型不同,则可以在运行查询之前编辑架构,以使它们彼此一致。
插入Epsilon.dbo.Jobs (ClientId,名称,位置, 创建日期) 从Alpha.dbo.Jobs中选择c.ClientId,Name,Location,DateCreated为j 内部联接Epsilon.dbo.Clients为c On (j.ClientId = c.ClientId)