如何防止SQL DW中没有主键的重复项?

时间:2018-11-29 13:51:39

标签: sql-server azure azure-sql-database azure-storage azure-sqldw

SQL DW不支持主键或代理键或UNIQUE。

https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-tables-overview

如何防止重复行?据我所知,一个受支持的选项//var materialized = items.ToList(); return items.Select(s => new Models.Project() { ... }).ToList(); 不能阻止这种情况,它只是在每一行的列中插入一个唯一的IDENTITY值。

INT

2 个答案:

答案 0 :(得分:1)

通过检查值是否不存在来防止重复行。

通常,在数据仓库中,您是将一批数据从一个表移动到另一个表。

假设我有两个表,名称为src和dst:

src (code,desc)
dst (code,desc)

仅当dst中不存在代码时,我才想将src的行追加到dst。

典型的方法是使用NOT EXISTS子句:

insert into dst
select s.code, s.dest
from   src s
where not exists (
       select 1
       from   dest d
       where  d.code = s.code);

如果您希望代码和desc的组合是唯一的,只需扩展WHERE子句:

insert into dst
select s.code, s.dest
from   src s
where not exists (
       select 1
       from   dest d
       where  d.code = s.code
              and d.desc = s.desc);

因为您正在使用Azure SQL数据仓库,所以有可能要对群集的列存储索引执行此操作。请注意有关批次大小的文档。如果您的批次较小,则质量指数可能会降低,性能也会下降。在这种情况下,请使用CTAS算法重新创建维度,或使用HEAP表代替CCI。

https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-best-practices#optimize-clustered-columnstore-tables

答案 1 :(得分:0)

检查打击

CREATE TABLE #T1
(   
    C1 INT IDENTITY(1,1)    NOT NULL,
    C2 VARCHAR(30)              NULL
)
--WITH
--(   DISTRIBUTION = HASH(C2),
--    CLUSTERED COLUMNSTORE INDEX
--);

INSERT INTO #T1 VALUES (NULL);    
INSERT INTO #T1 VALUES (NULL);

select *
from (
select *
,Rank_1 = row_number() over(partition by Check_1 order by C1)
from (
SELECT *
--,Rank_1 = row_number() over(partition by C1 order by C1)
,Check_1 = case when isnull(C2,'N/A') = 'N/A' then 'DupVals' else 'Non-DupVals' end
FROM #T1
) a
)b
where Rank_1 = 1
;