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
答案 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。
答案 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
;