我正在将数据从一个数据库复制到另一个数据库,并在我处理数据时按摩数据。两个数据库都有名为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)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top