2017-05-28 61 views
0

我有一個table1的如下內連接並更新

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 

我想根據stage_table更新表1。正如你所看到的,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) 

請幫忙。

+0

我刪除了不兼容的數據庫標記。只標記你真正使用的數據庫。 –

+2

您使用的是什麼DBMS? MySQL的? SQL Server? PostgreSQL的? – Passerby

+0

mysql sqlite mariadb在原來的問題。一般強烈建議只添加需要查詢的數據庫。 –

回答

0

的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

如果user_ID是主鍵,如何插入它?它拋出的異常,因爲user_id是主要的..如果我刪除它的主鍵,但是user_ID的重複條目將在那裏 – Sanvi

+0

如果user_id已經存在於table1中,它不應該插入**(其中t1.user_id爲空)**你可能已經實現了不同於我的意圖。如果我們使用真實的表格名稱,通常對各方來說更容易。 –

0

在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;