我分别在表A和B上定义了两个视图AV和BV。这两个视图都有一个硬编码列,其定义为DATATABLE。 AV中DATATABLE的值为'TABLEA',而BV中的值为'TABLEB'。
方案1:执行以下查询:
SELECT DATATABLE FROM
( SELECT DATATABLE, SERIAL FROM AV
UNION ALL
SELECT DATATABLE, SERIAL FROM BV
) T0
WHERE SERIAL in ('X','Y')
GROUP BY 1
预期结果是:
TABLEA
TABLEB
查询返回的结果是:
TABLEB
NULL
(NULL与Null值一样,不是字符串'NULL';在teradata sql助手中显示为'?')
方案2:执行以下查询:
SELECT DATATABLE,SERIAL FROM
( SELECT DATATABLE, SERIAL FROM AV
UNION ALL
SELECT DATATABLE, SERIAL FROM BV
) T0
WHERE SERIAL in ('X','Y')
GROUP BY 1,2
预期结果是:
TABLEA, X
TABLEA, Y
TABLEB, X
TABLEB, Y
查询返回的结果是:
TABLEA, NULL
TABLEB, X
TABLEB, Y
方案3:执行以下查询:
SELECT DATATABLE,COUNT(*) FROM
( SELECT DATATABLE, SERIAL FROM AV
UNION ALL
SELECT DATATABLE, SERIAL FROM BV
) T0
WHERE SERIAL in ('X','Y')
GROUP BY 1
预期结果是:
TABLEA, 100326622
TABLEB, 18048052
查询返回的结果是:
TABLEA, 100326622
TABLEB, 18048052
方案4::添加更多的列或将查询与其他表连接在一起将为DATATABLE列设置预期的结果,即值'TABLEA'和'TABLEB'。
当我为上述四个场景获取解释计划时,我发现前两个场景使用的是表A上定义的JOIN INDEX(命名为AJ),而其他场景则直接使用表而不是JOIN INDEX。反复尝试后,我发现无论何时优化器使用在表A上定义的JOIN INDEX AJ而不是访问表directky,都会导致DATATABLE列的输出错误。
我对Teradata和JOIN INDEX都没有太多经验。我无法弄清楚此奇怪输出背后的任何其他原因。在这种情况下有什么可能的解决方案?