Как я могу написать оператор выбора SQL, чтобы включить поиск из другой таблицы?

StackOverflow https://stackoverflow.com/questions/817283

  •  03-07-2019
  •  | 
  •  

Вопрос

Я копирую данные из одной базы данных в другую и массирую данные, пока нахожусь на нем. Обе базы данных имеют таблицы, называемые клиентами и рабочими местами.

Тем не менее, в базе данных «Альфа» таблица заданий не имеет отношения к таблице клиентов, где база данных "Epsilon" делает. У таблицы Alpha Jobs просто есть имя клиента в столбце nvarchar.

Мне нужен оператор select для поиска идентификатора клиента в таблице Client по его имени, когда я вставляю его в таблицу Jobs в Epsilon.

Мой незаконченный оператор SQL выглядит следующим образом:

insert into Epsilon.dbo.Jobs (ClientId, Name, Location, DateCreated)
    select ????, Name, Location, DateCreated from Alpha.dbo.Jobs

Как я могу изменить это так, чтобы ???? содержит ClientId из таблицы «Клиенты» в Epsilon? Я знаю, что мне нужно искать данные с помощью столбца Имя в Jobs, но я не могу понять синтаксис для этого.

Это было полезно?

Решение

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

Это довольно оптимистичное объединение, но даже если его нужно изменить, это должно дать вам общее представление.

Другие советы

Что вам нужно, так это соединение. Объединения, вопреки тому, что почти все думают при запуске, не требуют определенных отношений в схеме базы данных. Они просто требуют, чтобы два сравниваемых столбца имели одинаковый тип ( edit см. Комментарии).

Вопрос в том, какое присоединение вы хотите. Поскольку отношения не определены, могут быть клиенты, у которых есть задания, и клиенты, у которых их нет, и задания, у которых есть клиенты, и задания, у которых их нет.

Я предполагаю, что вы хотите, чтобы все существующие JOBS и где ClientId совпадает с таблицей CLIENTS, вносят в ClientId, и где это отношение не существует, чтобы оставить ClientId нулевым. Мы можем сделать это с левым соединением. Вакансии 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, имя, местоположение,   Дата создания)       выберите c.ClientId, Name, Location, DateCreated из Alpha.dbo.Jobs как j   внутреннее объединение Epsilon.dbo.Clients as c On   (j.ClientId = c.ClientId)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top