SELECT由于JOIN INDEX返回意外结果

时间:2018-07-19 09:26:50

标签: sql teradata

我分别在表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都没有太多经验。我无法弄清楚此奇怪输出背后的任何其他原因。在这种情况下有什么可能的解决方案?

0 个答案:

没有答案