0

我正在将数据从一个数据库复制到另一个数据库,并在处理数据时对数据进行按摩。这两个数据库都有名为 Clients 和 Jobs 的表。

但是,在数据库“Alpha”中,Jobs 表与 Clients 表没有关系,而数据库“Epsilon”则有。Alpha 的 Jobs 表仅在 nvarchar 列中包含 Clients 名称。

当我将它插入到 Epsilon 的 Jobs 表中时,我需要一个 select 语句来按名称在 Client 表中查找 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 列来查找数据,但我不知道它的语法。

4

3 回答 3

3

你需要的是一个加入。与几乎每个人在开始时的想法相反,联接不需要在数据库模式中定义关系。他们只要求您要比较的两列具有相同的类型(编辑见评论)。

问题是你想要哪个加入。因为没有定义关系,所以可能存在有工作的客户和没有工作的客户,以及有客户的工作和没有的工作。

我假设您想要所有存在的 JOBS,并且在 ClientId 与 CLIENTS 表匹配的地方引入 ClientId,并且在不存在该关系的地方将 ClientId 保留为空。我们可以使用 LEFT JOIN 来做到这一点。Jobs LEFT JOIN 客户将在 LEFT 中引入所有记录,即使与右侧的客户定义的关系不存在。我们可以颠倒这两个并做一个 RIGHT JOIN,但这不是人们通常做的。我将留给您阅读其他类型的联接及其工作原理。

所以你的选择语句看起来像:

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 的数据类型不同,则可以在运行查询之前编辑架构以使它们彼此一致。

于 2009-05-03T15:21:20.363 回答
2
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

这是一个非常乐观的联接,但即使需要对其进行修改,这也应该可以为您提供大致的思路。

于 2009-05-03T15:15:06.853 回答
1

插入 Epsilon.dbo.Jobs (ClientId, Name, Location, DateCreated) select c.ClientId, Name, Location, DateCreated from Alpha.dbo.Jobs as j inner join Epsilon.dbo.Clients as c On (j.ClientId = c .ClientId)

于 2009-05-03T15:13:52.863 回答