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)
这不是一个错误,行为是故意的,虽然不是直截了当的.
在Redshift中,您可以在表上声明约束,但Redshift不会强制执行它们,即如果插入它们则允许重复值.这里唯一的区别是,当您SELECT DISTINCT对没有声明主键的列运行查询时,它将扫描整个列并获取唯一值,如果您在具有主键约束的列上运行相同的操作,它将只是返回输出而不执行唯一列表过滤.这是您插入重复条目时的方法.
为什么这样做?Redshift针对大型数据集进行了优化,如果您不需要检查复制或插入的每一行的约束有效性,则复制数据要快得多.如果需要,可以将主键约束声明为数据模型的一部分,但是您需要通过删除重复项或以不存在的方式设计ETL来显式支持它.
有关此Heap博客中的特定示例的更多信息,请发布Redshift陷阱以及如何避免它们