2016-03-08 67 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')