Как я могу написать оператор выбора SQL, чтобы включить поиск из другой таблицы?
Вопрос
Я копирую данные из одной базы данных в другую и массирую данные, пока нахожусь на нем. Обе базы данных имеют таблицы, называемые клиентами и рабочими местами. Р>
Тем не менее, в базе данных «Альфа» таблица заданий не имеет отношения к таблице клиентов, где база данных "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)