将 HANA 层次结构查询分配给 table 变量会导致结果不一致
Assigning a HANA hierarchy query to a table variable leads to inconsistent results
上下文
我想使用 HANA HIERARCHY_TEMPORAL 函数在具有时间间隔的 SAP KNVH 层次结构上工作;
当简单地在 SELECT 查询中使用时,它工作正常;
如果使用完全相同的查询但将其分配给 table 变量,则结果不一致。
我的问题
这个匿名块使用 HANA HIERARCHY_TEMPORAL 函数工作得很好 :
DO
BEGIN
DECLARE hierarchy_type CHAR(1);
DECLARE valid_from CHAR(8);
DECLARE valid_until CHAR(8);
hierarchy_type = 'A' ;
valid_from = '20211201' ;
valid_until = '20211201' ;
SELECT
HIERARCHY_RANK ,
HIERARCHY_TREE_SIZE ,
HIERARCHY_PARENT_RANK ,
HIERARCHY_ROOT_RANK ,
HIERARCHY_LEVEL ,
HITYP ,
VKORG ,
VTWEG ,
SPART ,
KUNNR ,
HKUNNR ,
node_id ,
parent_id ,
valid_from ,
valid_until ,
DATAB ,
DATBI
FROM HIERARCHY_TEMPORAL (
SOURCE
(
SELECT
HIERARCHY_COMPOSITE_ID(
HITYP ,
VKORG ,
VTWEG ,
SPART ,
KUNNR
) AS node_id ,
CASE HKUNNR
WHEN '' THEN NULL
ELSE HIERARCHY_COMPOSITE_ID(
HITYP ,
HVKORG ,
HVTWEG ,
HSPART ,
HKUNNR
)
END AS parent_id ,
HITYP ,
VKORG ,
VTWEG ,
SPART ,
KUNNR ,
HKUNNR ,
DATAB AS valid_from ,
DATBI AS valid_until ,
DATAB ,
DATBI
FROM SAPKTP. KNVH
WHERE
KNVH. HITYP = :hierarchy_type
)
VALID FROM :valid_from UNTIL :valid_until
);
END;
但是分配完全相同的块并在之后查询 table 变量会导致不一致的结果:
DO
BEGIN
DECLARE tbl_CLIENT_HIERARCHY TABLE (
HIERARCHY_RANK CHAR ,
HIERARCHY_TREE_SIZE CHAR ,
HIERARCHY_PARENT_RANK CHAR ,
HIERARCHY_ROOT_RANK CHAR ,
HIERARCHY_LEVEL CHAR ,
HITYP CHAR ,
VKORG CHAR ,
VTWEG CHAR ,
SPART CHAR ,
KUNNR CHAR ,
HKUNNR CHAR ,
node_id CHAR ,
parent_id CHAR ,
valid_from CHAR ,
valid_until CHAR ,
DATAB CHAR ,
DATBI CHAR
);
DECLARE hierarchy_type CHAR(1);
DECLARE valid_from CHAR(8);
DECLARE valid_until CHAR(8);
hierarchy_type = 'A' ;
valid_from = '20211201' ;
valid_until = '20211201' ;
tbl_CLIENT_HIERARCHY =
SELECT
HIERARCHY_RANK ,
HIERARCHY_TREE_SIZE ,
HIERARCHY_PARENT_RANK ,
HIERARCHY_ROOT_RANK ,
HIERARCHY_LEVEL ,
HITYP ,
VKORG ,
VTWEG ,
SPART ,
KUNNR ,
HKUNNR ,
node_id ,
parent_id ,
valid_from ,
valid_until ,
DATAB ,
DATBI
FROM HIERARCHY_TEMPORAL (
SOURCE
(
SELECT
HIERARCHY_COMPOSITE_ID(
HITYP ,
VKORG ,
VTWEG ,
SPART ,
KUNNR
) AS node_id ,
CASE HKUNNR
WHEN '' THEN NULL
ELSE HIERARCHY_COMPOSITE_ID(
HITYP ,
HVKORG ,
HVTWEG ,
HSPART ,
HKUNNR
)
END AS parent_id ,
HITYP ,
VKORG ,
VTWEG ,
SPART ,
KUNNR ,
HKUNNR ,
DATAB AS valid_from ,
DATBI AS valid_until ,
DATAB ,
DATBI
FROM SAPKTP. KNVH
WHERE
KNVH. HITYP = :hierarchy_type
)
VALID FROM :valid_from UNTIL :valid_until
);
SELECT TOP 10 * FROM :tbl_CLIENT_HIERARCHY;
END;
有人知道为什么吗?
感谢您的帮助。
一个潜在的原因可能是缺少 SIBLING ORDER BY 子句(参见 https://help.sap.com/viewer/09f734c2169c4661b1aa15c00022ab21/2021_3_QRC/en-US/c44d60a76342456f91cb51054915a32e.html )。如果没有稳定的兄弟顺序,SAP HANA 层次结构生成器函数的行为可能不确定。
实际上这个问题与 HANA 层次结构无关:我只是没有在括号中准确说明声明的 table 变量的字符数,然后将其解释为 CHAR(1)
,前导奇怪的提取结果!
上下文
我想使用 HANA HIERARCHY_TEMPORAL 函数在具有时间间隔的 SAP KNVH 层次结构上工作; 当简单地在 SELECT 查询中使用时,它工作正常; 如果使用完全相同的查询但将其分配给 table 变量,则结果不一致。
我的问题
这个匿名块使用 HANA HIERARCHY_TEMPORAL 函数工作得很好 :
DO
BEGIN
DECLARE hierarchy_type CHAR(1);
DECLARE valid_from CHAR(8);
DECLARE valid_until CHAR(8);
hierarchy_type = 'A' ;
valid_from = '20211201' ;
valid_until = '20211201' ;
SELECT
HIERARCHY_RANK ,
HIERARCHY_TREE_SIZE ,
HIERARCHY_PARENT_RANK ,
HIERARCHY_ROOT_RANK ,
HIERARCHY_LEVEL ,
HITYP ,
VKORG ,
VTWEG ,
SPART ,
KUNNR ,
HKUNNR ,
node_id ,
parent_id ,
valid_from ,
valid_until ,
DATAB ,
DATBI
FROM HIERARCHY_TEMPORAL (
SOURCE
(
SELECT
HIERARCHY_COMPOSITE_ID(
HITYP ,
VKORG ,
VTWEG ,
SPART ,
KUNNR
) AS node_id ,
CASE HKUNNR
WHEN '' THEN NULL
ELSE HIERARCHY_COMPOSITE_ID(
HITYP ,
HVKORG ,
HVTWEG ,
HSPART ,
HKUNNR
)
END AS parent_id ,
HITYP ,
VKORG ,
VTWEG ,
SPART ,
KUNNR ,
HKUNNR ,
DATAB AS valid_from ,
DATBI AS valid_until ,
DATAB ,
DATBI
FROM SAPKTP. KNVH
WHERE
KNVH. HITYP = :hierarchy_type
)
VALID FROM :valid_from UNTIL :valid_until
);
END;
DO
BEGIN
DECLARE tbl_CLIENT_HIERARCHY TABLE (
HIERARCHY_RANK CHAR ,
HIERARCHY_TREE_SIZE CHAR ,
HIERARCHY_PARENT_RANK CHAR ,
HIERARCHY_ROOT_RANK CHAR ,
HIERARCHY_LEVEL CHAR ,
HITYP CHAR ,
VKORG CHAR ,
VTWEG CHAR ,
SPART CHAR ,
KUNNR CHAR ,
HKUNNR CHAR ,
node_id CHAR ,
parent_id CHAR ,
valid_from CHAR ,
valid_until CHAR ,
DATAB CHAR ,
DATBI CHAR
);
DECLARE hierarchy_type CHAR(1);
DECLARE valid_from CHAR(8);
DECLARE valid_until CHAR(8);
hierarchy_type = 'A' ;
valid_from = '20211201' ;
valid_until = '20211201' ;
tbl_CLIENT_HIERARCHY =
SELECT
HIERARCHY_RANK ,
HIERARCHY_TREE_SIZE ,
HIERARCHY_PARENT_RANK ,
HIERARCHY_ROOT_RANK ,
HIERARCHY_LEVEL ,
HITYP ,
VKORG ,
VTWEG ,
SPART ,
KUNNR ,
HKUNNR ,
node_id ,
parent_id ,
valid_from ,
valid_until ,
DATAB ,
DATBI
FROM HIERARCHY_TEMPORAL (
SOURCE
(
SELECT
HIERARCHY_COMPOSITE_ID(
HITYP ,
VKORG ,
VTWEG ,
SPART ,
KUNNR
) AS node_id ,
CASE HKUNNR
WHEN '' THEN NULL
ELSE HIERARCHY_COMPOSITE_ID(
HITYP ,
HVKORG ,
HVTWEG ,
HSPART ,
HKUNNR
)
END AS parent_id ,
HITYP ,
VKORG ,
VTWEG ,
SPART ,
KUNNR ,
HKUNNR ,
DATAB AS valid_from ,
DATBI AS valid_until ,
DATAB ,
DATBI
FROM SAPKTP. KNVH
WHERE
KNVH. HITYP = :hierarchy_type
)
VALID FROM :valid_from UNTIL :valid_until
);
SELECT TOP 10 * FROM :tbl_CLIENT_HIERARCHY;
END;
有人知道为什么吗?
感谢您的帮助。
一个潜在的原因可能是缺少 SIBLING ORDER BY 子句(参见 https://help.sap.com/viewer/09f734c2169c4661b1aa15c00022ab21/2021_3_QRC/en-US/c44d60a76342456f91cb51054915a32e.html )。如果没有稳定的兄弟顺序,SAP HANA 层次结构生成器函数的行为可能不确定。
实际上这个问题与 HANA 层次结构无关:我只是没有在括号中准确说明声明的 table 变量的字符数,然后将其解释为 CHAR(1)
,前导奇怪的提取结果!