2015-03-25 7 views
0

У меня есть две таблицы, Users и Company.Обновить таблицу со значениями из соответствующей таблицы

Я хочу передать значения из столбца Active в Users таблице в колонке Active в Company таблице, где в CompanyID соответствует ID.

Это пример таблицы. Она имеет много тысяч строк, и есть 1 на 1 отношения между Company и Users:

Users: 
CompanyID Active 
458   1 
685   1 
58   0 

Company: 
ID   Active 
5   Null 
3   Null 
58   Null 
685   Null 

Company Финальный стол должен выглядеть примерно так, где Null был заменен значением из Users таблицы.

Company: 
ID   Active 
5   Null 
3   Null 
58   0 
685   1 
+1

ли как MySQL и MS SQL Server используется здесь? (Не помечать теги, которые не задействованы ...) – jarlh

+0

Извините только SQL-сервер – Jazz

+0

Что вы пробовали? Как насчет того, когда для компании более 1 пользователя? –

ответ

2

Вы можете просто выполнить UPDATE, который использует JOIN между двумя таблицами, как так:

UPDATE c 
SET Active = u.Active 
FROM Company c 
INNER JOIN Users u ON u.CompanyId = c.ID 

Полный код рабочего образца:

CREATE TABLE #Users 
    (
     CompanyId INT , 
     Active BIT 
    ) 

INSERT INTO #Users 
     (CompanyId, Active) 
VALUES (458, 1), 
     (685, 1), 
     (58, 0) 

CREATE TABLE #Company 
    (
     ID INT , 
     Active BIT 
    ) 

INSERT INTO #Company 
     (ID, Active) 
VALUES (5, NULL), 
     (3, NULL), 
     (58, NULL), 
     (685, NULL) 

UPDATE c 
SET Active = u.Active 
FROM #Company c 
INNER JOIN #Users u ON u.CompanyId = c.ID 

SELECT * FROM #Company 

DROP TABLE #Users 
DROP TABLE #Company 

Вы заметите, что инструкция UPDATE в примере кода использует псевдонимы c и u для ссылки на две таблицы.

Оговорка:

Как указано в комментариях, это предполагает, что вы только когда-либо иметь отношение 1 к 1 между Company и Users. Если для одной и той же компании назначено более одного пользователя, вам необходимо отфильтровать Users, чтобы выбрать тот, который вы хотите использовать, иначе вы можете получить неожиданные результаты.

+0

в случае, если для компании более 1 пользователя, у вас не будет никакого контроля над тем, какой активный код является конечным результатом –

+0

@ t-clausen.dk OP обновил вопрос, чтобы заявить, что существует соотношение 1-1 – Tanner

+0

@t -clausen.dk i работал над отдельным запросом, чтобы покрыть это дело, но при необходимости обновил его до вопроса – Tanner

2

Это должно сделать трюк для вас.

DECLARE @Users TABLE (CompanyID INT, Active BIT); 
DECLARE @Companies TABLE (CompanyID INT, Active BIT); 

INSERT INTO @Users (CompanyID, Active) 
VALUES (458, 1), (685, 1), (58, 0) 

INSERT INTO @Companies (CompanyID) 
VALUES (5),(3),(58),(685) 


SELECT C.CompanyID, U.Active 
FROM @Companies AS C 
OUTER APPLY (
    SELECT TOP (1) U.Active 
    FROM @Users AS U 
    WHERE U.CompanyID = C.CompanyID 
    ORDER BY U.Active DESC 
    ) AS U(Active) 

Результат:

CompanyID Active 
------------------ 
5   NULL 
3   NULL 
58   0 
685   1 
1

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

UPDATE 
    Company 
SET Active = (SELECT top 1 Active 
       FROM Users 
       WHERE CompanyId = Company.id 
       ORDER BY Active DESC) 
0
UPDATE Company 
SET Company.Active = u.Active from Users u 
where Company.ID = u.CompanyID 
+0

, как правило, полезно добавить какое-то объяснение к ответам, иначе оно будет автоматически отправлено на проверку для того, чтобы быть только код. – Tanner

+0

@Tanner спасибо, сделаю –