如何在没有主键的情况下防止SQL DW中的重复



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

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

如何防止重复的行?据我所知,一个受支持的选项IDENTITY并不能阻止这种情况,它只是在每行的列中插入一个唯一的INT值。

CREATE TABLE dbo.T1
(   
C1 INT IDENTITY(1,1)    NOT NULL,
C2 VARCHAR(30)              NULL
)
WITH
(   DISTRIBUTION = HASH(C2),
CLUSTERED COLUMNSTORE INDEX
);
INSERT INTO dbo.T1 VALUES (NULL);    
INSERT INTO dbo.T1 VALUES (NULL);
-- You will see two rows
SELECT * FROM dbo.T1;

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

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

假设我有两个表,名称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://learn.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-best-practices#optimize-集群列存储表

检查打击

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
;

最新更新