我有一个像这样的维度表:
my_Table
pk1 Primary key
pk2 Primary key
pk3 Primary key
col1
col2
col3
...
并使用过程使用 MERGE INTO 语句填充此表:
MERGE INTO my_Table dest
USING
( SELECT <columns>
FROM <tables>
WHERE <conditions> ) src
ON
(dest.pk1 = src.pk1 AND dest.pk2 = src.pk2 AND pk3 = src.pk3)
WHEN MATCHED THEN UPDATE SET dest.col1 = src.col1 ,
dest.col2 = src.col2 ,
dest.col3 = src.col3
WHEN NOT MATCHED THEN INSERT (pk1, pk2, pk3, col1, col2, col3)
VALUES (src.pk1, src.pk2, src.pk3, src.col1, src.col2, src.col3);
我的问题是查询' src '返回一些具有相同主键的行,但它们没有重复的行,例如
| pk1 | pk2 | pk3 | col1 | col2 | col3 |
--------------------------------------------------
| 100 | abc | x99 | 6000,00 | 01/01/2010 | 50,00 |
| 100 | abc | x99 | 0,00 | 01/01/2010 | 30,00 |
| 110 | rty | b50 | 345,00 | 08/10/2009 | 10,00 |
| 120 | xyz | y91 | 1200,00 | 13/02/2009 | 12,50 |
| 120 | xyz | y91 | 1200,00 | 13/02/2009 | 0,00 |
| 120 | xyz | y91 | 1200,00 | 13/02/2009 | 0,00 |
| 120 | xyz | y91 | 1200,00 | 13/02/2009 | 0,00 |
因此,当我调用我的程序时,它会返回唯一约束违反错误。
这个问题可以解决什么问题?顺便说一句,我不是查询src
的作者......
如果我需要修改src
我应该为pk (100,abc,x99):
| pk1 | pk2 | pk3 | col1 | col2 | col3 |
--------------------------------------------------
| 100 | abc | x99 | 6000,00 | 01/01/2010 | 80,00 |
对于pk (120,xyz,y91)我会:
| pk1 | pk2 | pk3 | col1 | col2 | col3 |
--------------------------------------------------
| 120 | xyz | y91 | 1200,00 | 13/02/2009 | 12,50 |
提前感谢任何建议。
答案 0 :(得分:1)
很明显,必须使用src
完成某些操作才能使其返回唯一的主键。如果您不太关心表格中数据的质量,可以使用聚合并更改它,例如到
select pk1, pk2, pk3, max(col1), max(col2), sum(col3)
from ...
where ...
group by pk1, pk2, pk3
但是你可能需要更复杂的处理才能理解这些东西。
编辑:先将sum
更改为max
,以反映问题中的修改
答案 1 :(得分:0)
如果您确定没有主键冲突。请尝试检查col1,col2和col3是否没有任何唯一约束。也许唯一约束违规不是来自主键字段。
请注意与我们分享您的“错误消息”?