2016-03-08 59 views
1

所有單行我有這個表的多個列。主鍵是(type,ref,code)與行類型t1t2和兩個有效的狀態(V)和無效(I)複製數據庫表

每一個無效的行狀態t1應該有一個有效的行中的狀態t2, 但我的表已經與無效狀態的一些行沒有有效的行中的狀態t2

例子:

type | ref | code | state ..... 
---------------------------------------- 
    t1  | 1  | c1  | V 
    t1  | 2  | c1  | V 
    t1  | 3  | c1  | I 
    t2  | 3  | c1  | V 
    t1  | 4  | c1  | V 
    t1  | 5  | c1  | I 

,所以我需要複製缺少的行

我使用

INSERT INTO table (type,ref,code,state) 
SELECT 't2',ref,code,'V' FROM table 
WHERE EXISTS (SELECT ref,code,count(*) from table GROUP BY ref,code HAVING count(*)=1) 
AND state='I' 

,但我發現

Violation of PRIMARY KEY 

我試着與

WHERE NOT EXISTS (SELECT ref,code,count(*) from table GROUP BY ref,code HAVING count(*)>1) 
AND state='I' 

並沒有什麼hapend。任何DEA如何執行此操作?

回答

1

您可以使用以下查詢來獲取要被複制行:

SELECT type, ref, code, state 
FROM mytable AS t1 
WHERE state = 'I' AND type = 't1' AND 
     NOT EXISTS (SELECT 1 
        FROM mytable AS t2 
        WHERE t1.ref = t2.ref AND t1.code = t2.code AND 
         state = 'V' AND type = 't2') 

因此,INSERT語句可以是這樣的:

INSERT INTO mytable 
SELECT 't2', ref, code, 'V' 
FROM mytable AS t1 
WHERE state = 'I' AND type = 't1' AND 
     NOT EXISTS (SELECT 1 
        FROM mytable AS t2 
        WHERE t1.ref = t2.ref AND t1.code = t2.code AND 
         state = 'V' AND type = 't2') 
1

如果它是一個主鍵,必須是唯一的,而不是空的定義。所以如果你需要兩個或更多國家需要另一個表,或者另一個字段(如果只有兩個),但比獲得尋求查詢

0

試試這個代碼。

INSERT INTO #TAB 
    SELECT 't2', REF, CODE, 'V' FROM #TAB WHERE stateS='I' 
    AND REF NOT IN (SELECT REF FROM #TAB WHERE stateS='V' AND typeSS='T2')