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

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

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

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

Мой незаконченный оператор SQL выглядит так:

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

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

Ответы [ 3 ]

3 голосов
/ 03 мая 2009

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

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

Я предполагаю, что вы хотите, чтобы все существующие JOBS, и где ClientId совпадает с таблицей CLIENTS, вносят в ClientId, и где это отношение не существует, чтобы оставить ClientId нулевым. Мы можем сделать это с левым соединением. Вакансии LEFT JOIN Клиенты будут вносить все записи в LEFT, даже если отношения, определенные с Клиентами справа, не существуют. Мы могли бы поменять их и сделать ПРАВИЛЬНОЕ СОЕДИНЕНИЕ, но люди обычно этого не делают. Я оставлю это вам, чтобы прочитать о других типах объединений и о том, как они работают.

Таким образом, ваш оператор выбора будет выглядеть так:

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, вы можете отредактировать схему перед выполнением запроса, чтобы привести их в соответствие друг с другом.

2 голосов
/ 03 мая 2009
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

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

1 голос
/ 03 мая 2009

вставить в Epsilon.dbo.Jobs (ClientId, имя, местоположение, Дата создания) выберите c.ClientId, Name, Location, DateCreated из Alpha.dbo.Jobs как j внутреннее объединение Epsilon.dbo.Clients as c On (j.ClientId = c.ClientId)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...