redshift select distinct返回重复值

时间:2015-09-30 21:25:41

标签: 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

2 个答案:

答案 0 :(得分:6)

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

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

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

此Heap博客文章Redshift Pitfalls And How To Avoid Them

中的特定示例提供了更多信息

答案 1 :(得分:0)

也许你可以通过使用适当的连接来解决这个问题。 例如,我在表1中有重复的值,我想通过将表1的值连接到表2来获得表1的值,并且根据您的条件在连接两个表后有一些逻辑。

所以我可以做这样的事情!!

select distinct table1.col1 from table1 left outer join table2 on table1.col1 = table2.col1

这对我很有用,我从table1获得了独特的价值,可以删除dublicates