У меня есть таблица1, как показано ниже

user_ID country  status  role
-------- ------ ------- -----
keshav   SG        Active  Admin
Bargav   IN        Active  Subuser
Sanvi     GB       Active   subuser
yellin    CN       Active    subuser

У меня есть другая таблица stage_table, как показано ниже

user_ID  country   role 
-------  -------  ------
keshav     SG      Admin
Sanvi      GB      subuser
Manav      IN      subuser 

Я хочу обновить table1 на основе stage_table. Как вы можете видеть, stage_table не имеет записи Bargav, поэтому я хочу обновить строку table1 Bargav со статусом «InActive», а запись Manav новая, поэтому обновите ее, как есть, со статусом «Active». Таким образом table1 должен быть таким, как показано ниже

user_ID  country  status Role 
-------  -------  ------  -----
keshav   SG        Active  Admin
Bargav   IN        InActive  Subuser
Sanvi     GB       Active   subuser
yellin    CN       Active    subuser
Manav     In       Active    subuser

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

select * 
from table1 
inner join stage_table on table1.user_ID = stage_table.user_ID 
                       and (update table.status ="InActive" 
                            where table1.user_Id != stage_table.user_ID) 

Пожалуйста помоги.

sql
0
Sanvi 28 Май 2017 в 05:30

2 ответа

Лучший ответ

MySQL / Mariadb и (я думаю) SQLite будут использовать традиционную конструкцию SQL, такую как следующее, где вам нужно выполнить вставку и обновление как отдельные запросы:

INSERT INTO table1 (user_ID, country, status, role)
SELECT t2.user_ID, t2.country,'Active' as Status, t2.role 
FROM table2 t2
LEFT JOIN table1 t1 ON t1.user_id = t2.user_id
WHERE t1.user_id IS NULL
;

UPDATE  table1 t1
LEFT JOIN table2 t2 ON t1.user_id = t2.user_id
SET t1.status = CASE WHEN t2.user_id IS NULL THEN 'InActive' ELSE 'Active' END
;
0
Used_By_Already 28 Май 2017 в 03:54

В MS SQL Server вы можете использовать следующие два запроса для обновления и вставки соответственно -

-- For Update
UPDATE T1
SET T1.[STATUS] = (
    CASE 
        WHEN T2.[USER_ID] IS NULL
            THEN 'INACTIVE'
        ELSE T1.[STATUS]
        END
    )
FROM TABLE1 T1
LEFT OUTER JOIN STAGE_TABLE T2 ON T1.[USER_ID] = T2.[USER_ID];

-- For Insert
INSERT INTO TABLE1 (
    [USER_ID]
    ,COUNTRY
    ,[STATUS]
    ,[ROLE]
    )
SELECT T2.[USER_ID]
    ,T2.COUNTRY
    ,'Active'
    ,T2.[ROLE]
FROM TABLE1 T1
RIGHT OUTER JOIN STAGE_TABLE T2 ON T1.[USER_ID] = T2.[USER_ID]
WHERE T1.[USER_ID] IS NULL;
0
Sachin Ailwar 28 Май 2017 в 04:10