【发布时间】:2019-11-04 21:10:03
【问题描述】:
我在使用 Redshift 时遇到异常行为,其中带有内部联接的基本查询刚刚停止按预期工作。
提供下面的查询,
SELECT D.asin, D.client_account_id
FROM ams.t_asin_segmentation_detail A_0
INNER JOIN ams.t_asin_segmentation_value B
ON A_0.ASIN_SEGMENTATION_VALUE_ID = B.ID AND A_0.IS_DELETED = 'N' AND A_0.IS_ACTIVE = 'Y' AND
B.IS_DELETED = 'N' AND B.IS_ACTIVE = 'Y' AND B.ID IN (900)
INNER JOIN ams.t_asin_segmentation_type C
ON B.ASIN_SEGMENTATION_TYPE_ID = C.ID AND C.IS_DELETED = 'N' AND C.IS_ACTIVE = 'Y' AND
C.ID = 1687 AND C.BUSINESS_UNIT_ID = 15
INNER JOIN ams.t_asin D ON A_0.asin_id = D.ID AND D.is_active = 'Y' and D.is_deleted = 'N';
此查询仅返回不正确的单行。它应该返回超过 1000 行。
当我以不同的方式编写相同的查询时,只需删除表别名为 D 的最后一个 JOIN 并以这种方式编写,
SELECT asin, client_account_id
FROM ams.t_asin
WHERE id IN (SELECT DISTINCT A_0.asin_id
FROM ams.t_asin_segmentation_detail A_0
INNER JOIN ams.t_asin_segmentation_value B
ON A_0.ASIN_SEGMENTATION_VALUE_ID = B.ID AND A_0.IS_DELETED = 'N' AND
A_0.IS_ACTIVE = 'Y' AND
B.IS_DELETED = 'N' AND B.IS_ACTIVE = 'Y' AND B.ID IN (900)
INNER JOIN ams.t_asin_segmentation_type C
ON B.ASIN_SEGMENTATION_TYPE_ID = C.ID AND C.IS_DELETED = 'N' AND C.IS_ACTIVE = 'Y' AND
C.ID = 1687 AND C.BUSINESS_UNIT_ID = 15)
AND is_active = 'Y'
AND is_deleted = 'N';
这将开始获取正确数量的行,而查询本身没有任何逻辑变化。
我对原始查询进行了进一步调整,只是将别名为 D 的表替换为 LEFT JOIN 的 INNER JOIN,令人惊讶的是,它开始提供正确的行数。需要注意的是,即使使用 LEFT JOIN,SELECT 语句仍会从别名为 D 的表中获取列,如下所示,
SELECT D.asin, D.client_account_id
FROM ams.t_asin_segmentation_detail A_0
INNER JOIN ams.t_asin_segmentation_value B
ON A_0.ASIN_SEGMENTATION_VALUE_ID = B.ID AND A_0.IS_DELETED = 'N' AND A_0.IS_ACTIVE = 'Y' AND
B.IS_DELETED = 'N' AND B.IS_ACTIVE = 'Y' AND B.ID IN (900)
INNER JOIN ams.t_asin_segmentation_type C
ON B.ASIN_SEGMENTATION_TYPE_ID = C.ID AND C.IS_DELETED = 'N' AND C.IS_ACTIVE = 'Y' AND
C.ID = 1687 AND C.BUSINESS_UNIT_ID = 15
LEFT JOIN ams.t_asin D ON A_0.asin_id = D.ID AND D.is_active = 'Y' and D.is_deleted = 'N';
如果有人能提供发生这种情况的任何理由,我们将不胜感激。
【问题讨论】:
-
你只有一行
A_0.asin_id = D.ID AND D.is_active = 'Y' and D.is_deleted = 'N'和那些D.ID, D.is_Active, D.is_deleted进入你的SELECT子句,看看发生了什么。 -
@JNevill 准确地说,有 1023 行限定了连接条件而不是一行。这可以通过第二个查询来确定,我仍然有相同的条件并且只使用 WHERE IN 而不是 INNER JOIN。
标签: sql amazon-redshift