我有一个数据库,其中每个对象属性都存储在单独的行中。附加的查询不会在 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
这不是错误,行为是有意为之,但并不简单。
在 Redshift 中,您可以声明对表的约束,但 Redshift 不会强制执行它们,即如果您插入重复值,它允许重复值。这里唯一的区别是当你运行时SELECT DISTINCT
针对没有声明主键的列进行查询,它将扫描整个列并获取唯一值,如果您在具有主键约束的列上运行相同的操作,它将只返回输出不执行唯一列表过滤。如果您插入重复的条目,这就是如何获得重复条目的方法。
为什么要这样做? Redshift 针对大型数据集进行了优化,如果您不需要检查复制或插入的每一行的约束有效性,复制数据的速度会更快。如果您愿意,可以将主键约束声明为数据模型的一部分,但您需要通过删除重复项或以不存在这种方式的方式设计 ETL 来显式支持它。
这篇堆博客文章中包含具体示例的更多信息红移陷阱以及如何避免它们 https://blog.heapanalytics.com/redshift-pitfalls-avoid/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)