redshift select distinct返回重复值

DKo*_*arz 4 sql amazon-redshift

我有一个数据库,其中每个对象属性存储在一个单独的行中.附加的查询不会在redshift数据库中返回不同的值,但在任何兼容mysql的数据库中进行测试时都会按预期工作.

SELECT DISTINCT distinct_value 
FROM
( 
  SELECT
    uri,
    ( SELECT DISTINCT value_string 
      FROM `test_organization__app__testsegment` AS X 
      WHERE X.uri = parent.uri AND name = 'hasTestString' AND parent.value_string IS NOT NULL ) AS distinct_value 
  FROM `test_organization__app__testsegment` AS parent 
  WHERE     
    uri IN ( SELECT uri 
             FROM `test_organization__app__testsegment` 
             WHERE name = 'types' AND value_uri_multivalue = 'Document'
           )
) AS T 
WHERE distinct_value IS NOT NULL
ORDER BY distinct_value ASC
LIMIT 10000 OFFSET 0
Run Code Online (Sandbox Code Playgroud)

Ale*_*Yes 6

这不是一个错误,行为是故意的,虽然不是直截了当的.

在Redshift中,您可以在表上声明约束,但Redshift不会强制执行它们,即如果插入它们则允许重复值.这里唯一的区别是,当您SELECT DISTINCT对没有声明主键的列运行查询时,它将扫描整个列并获取唯一值,如果您在具有主键约束的列上运行相同的操作,它将只是返回输出而不执行唯一列表过滤.这是您插入重复条目时的方法.

为什么这样做?Redshift针对大型数据集进行了优化,如果您不需要检查复制或插入的每一行的约束有效性,则复制数据要快得多.如果需要,可以将主键约束声明为数据模型的一部分,但是您需要通过删除重复项或以不存在的方式设计ETL来显式支持它.

有关此Heap博客中的特定示例的更多信息,请发布Redshift陷阱以及如何避免它们