DB2 使用通用 table 表达式创建视图
DB2 create view with common table expression
嘿,我从 AS400 上的 DB2 导出了一个视图定义,并想将其导入 DB2 LUW express-c,但是每当我尝试使用 WITH
子句时,我总是遇到语法错误:
DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=AS;MAATNUMMER, AANTAL)
;JOIN, DRIVER=4.19.77
如果我在 AS400 上的 DB2 中执行查询,它可以工作,并且根据 IBM 的文档,express-c 应该支持常见的 table 表达式。
如果有人能看一看并指出正确的方向
CREATE VIEW VIEWRTSGEPLAND (
LOCATIE3,
LOCATIE4,
DISKNR,
MAAT,
MAATNUM,
SKU,
AANTAL,
SOORT,
BRON,
DATUM,
VOLGNR,
STATUS,
GEBRUIKER,
PROGRAMMA,
KBNUMMER,
STATUSKB,
"TIMESTAMP")
AS(
WITH
SEL1TF (TFLKNA, TFDSNR, TFMBKD, MAATNUMMER, AANTAL) AS (
-- selectie op TF + cross join NOS002 om 1 row per maat te bekomen
SELECT TF.TFLKNA, TF.TFDSNR, TF.TFMBKD, NOS002.MAATNUMMER,
SUM(TF.TFTA01 * NOS002.M01 + TF.TFTA02 * NOS002.M02 +
TF.TFTA03 * NOS002.M03 + TF.TFTA04 * NOS002.M04 +
TF.TFTA05 * NOS002.M05 + TF.TFTA06 * NOS002.M06 +
TF.TFTA07 * NOS002.M07 + TF.TFTA08 * NOS002.M08 +
TF.TFTA09 * NOS002.M09 + TF.TFTA10 * NOS002.M10 +
TF.TFTA11 * NOS002.M11 + TF.TFTA12 * NOS002.M12 +
TF.TFTA13 * NOS002.M13 + TF.TFTA14 * NOS002.M14 +
TF.TFTA15 * NOS002.M15 + TF.TFTA16 * NOS002.M16) AS AANTAL
FROM LFILES.TF TF
CROSS JOIN AJR.NOS002 NOS002
-- geen where, ook niet op de winkel 37 - 28
GROUP BY TF.TFLKNA, TF.TFDSNR, TF.TFMBKD, NOS002.MAATNUMMER
),
SELTF (TFLKNA, TFDSNR, TFMBKD, MAATNUMMER, AANTAL) AS (
-- eliminatie van de groepen die 0 zijn nu pas voor de leesbaarheid +
-- geen 2x schrijven van de berekening
SELECT SEL1TF.TFLKNA, SEL1TF.TFDSNR, SEL1TF.TFMBKD,
SEL1TF.MAATNUMMER, SEL1TF.AANTAL
FROM SEL1TF SEL1TF
WHERE SEL1TF.AANTAL <> 0
)
-- main select
SELECT E5XT.E5XTLKNR AS LOCATIE3,
E5XT.E5XTLKKD AS LOCATIE4,
SELTF.TFDSNR AS DISKNR,
NOS001.MAATOMSCHR AS MAAT,
NOS001.MAATNUM AS MAATNUM,
CAST((DIGITS(SELTF.TFDSNR) CONCAT '.' CONCAT DIGITS(NOS001.MAATNUM)) AS CHAR(11)) AS SKU,
CAST(SELTF.AANTAL AS DEC(6, 0)) AS AANTAL,
CAST('GEPLAND IN' AS CHAR(20)) AS SOORT,
CAST('power.LFILES.TF' AS CHAR(30)) AS BRON,
CURRENT_DATE AS DATUM,
CAST(0 AS DEC(9, 0)) AS VOLGNR,
CAST(SPACE(1) AS CHAR(1)) AS STATUS,
CAST(SPACE(10) AS CHAR(10)) AS GEBRUIKER,
CAST(SPACE(10) AS CHAR(10)) AS PROGRAMMA,
CAST(0 AS DEC(9, 0)) AS KBNUMMER,
CAST(SPACE(2) AS CHAR(2)) AS STATUSKB,
CURRENT_TIMESTAMP AS TIMESTAMP
FROM SELTF SELTF
INNER JOIN LFILES.E5XT E5XT
ON SELTF.TFLKNA = E5XT.E5XTLKNR
INNER JOIN AJR.NOS001 NOS001
ON SELTF.TFMBKD = NOS001.MSMBKD
AND SELTF.MAATNUMMER = NOS001.MAATNUMMER
);
去掉第一个AS后面多余的括号即可。 IE。这在 DataStudio 中解析得很好,所以如果我有 table DDL,我相信它会创建 OK。
CREATE VIEW VIEWRTSGEPLAND (
LOCATIE3,
LOCATIE4,
DISKNR,
MAAT,
MAATNUM,
SKU,
AANTAL,
SOORT,
BRON,
DATUM,
VOLGNR,
STATUS,
GEBRUIKER,
PROGRAMMA,
KBNUMMER,
STATUSKB,
"TIMESTAMP")
AS
--( <<<<< REMOVE THIS BRACKET
WITH SEL1TF (TFLKNA, TFDSNR, TFMBKD, MAATNUMMER, AANTAL)
AS (
-- selectie op TF + cross join NOS002 om 1 row per maat te bekomen
SELECT TF.TFLKNA, TF.TFDSNR, TF.TFMBKD, NOS002.MAATNUMMER, SUM(TF.TFTA01 * NOS002.M01 + TF.TFTA02 * NOS002.M02 + TF.TFTA03 * NOS002.M03
+ TF.TFTA04 * NOS002.M04 + TF.TFTA05 * NOS002.M05 + TF.TFTA06 * NOS002.M06
+ TF.TFTA07 * NOS002.M07 + TF.TFTA08 * NOS002.M08 + TF.TFTA09 * NOS002.M09
+ TF.TFTA10 * NOS002.M10 + TF.TFTA11 * NOS002.M11 + TF.TFTA12 * NOS002.M12
+ TF.TFTA13 * NOS002.M13 + TF.TFTA14 * NOS002.M14 + TF.TFTA15 * NOS002.M15
+ TF.TFTA16 * NOS002.M16) AS AANTAL
FROM LFILES.TF TF
CROSS JOIN AJR.NOS002 NOS002
-- geen where, ook niet op de winkel 37 - 28
GROUP BY TF.TFLKNA, TF.TFDSNR, TF.TFMBKD, NOS002.MAATNUMMER
),
SELTF (TFLKNA, TFDSNR, TFMBKD, MAATNUMMER, AANTAL)
AS (
-- eliminatie van de groepen die 0 zijn nu pas voor de leesbaarheid +
-- geen 2x schrijven van de berekening
SELECT SEL1TF.TFLKNA, SEL1TF.TFDSNR, SEL1TF.TFMBKD, SEL1TF.MAATNUMMER, SEL1TF.AANTAL
FROM SEL1TF SEL1TF
WHERE SEL1TF.AANTAL <> 0
)
-- main select
SELECT
E5XT.E5XTLKNR AS LOCATIE3, E5XT.E5XTLKKD AS LOCATIE4, SELTF.TFDSNR AS DISKNR, NOS001.MAATOMSCHR AS MAAT, NOS001.MAATNUM AS MAATNUM, CAST((DIGITS(SELTF.TFDSNR) CONCAT '.' CONCAT DIGITS(NOS001.MAATNUM))
AS CHAR(11)) AS SKU, CAST(SELTF.AANTAL AS DEC(6, 0)) AS AANTAL, CAST('GEPLAND IN' AS CHAR(20)) AS SOORT, CAST('power.LFILES.TF' AS CHAR(30)) AS BRON, CURRENT_DATE AS DATUM, CAST(0 AS DEC(9, 0)) AS VOLGNR, CAST(SPACE(1) AS CHAR(1)) AS STATUS, CAST(SPACE(10) AS CHAR(10)) AS GEBRUIKER, CAST(SPACE(10) AS CHAR(10)) AS PROGRAMMA, CAST(0 AS DEC(9, 0)) AS KBNUMMER, CAST(SPACE(2) AS CHAR(2)) AS STATUSKB, CURRENT_TIMESTAMP AS TIMESTAMP
FROM SELTF SELTF
INNER JOIN LFILES.E5XT E5XT
ON SELTF.TFLKNA = E5XT.E5XTLKNR
INNER JOIN AJR.NOS001 NOS001
ON SELTF.TFMBKD = NOS001.MSMBKD
AND SELTF.MAATNUMMER = NOS001.MAATNUMMER
--) <<<<< REMOVE THIS BRACKET
;
嘿,我从 AS400 上的 DB2 导出了一个视图定义,并想将其导入 DB2 LUW express-c,但是每当我尝试使用 WITH
子句时,我总是遇到语法错误:
DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=AS;MAATNUMMER, AANTAL) ;JOIN, DRIVER=4.19.77
如果我在 AS400 上的 DB2 中执行查询,它可以工作,并且根据 IBM 的文档,express-c 应该支持常见的 table 表达式。
如果有人能看一看并指出正确的方向
CREATE VIEW VIEWRTSGEPLAND (
LOCATIE3,
LOCATIE4,
DISKNR,
MAAT,
MAATNUM,
SKU,
AANTAL,
SOORT,
BRON,
DATUM,
VOLGNR,
STATUS,
GEBRUIKER,
PROGRAMMA,
KBNUMMER,
STATUSKB,
"TIMESTAMP")
AS(
WITH
SEL1TF (TFLKNA, TFDSNR, TFMBKD, MAATNUMMER, AANTAL) AS (
-- selectie op TF + cross join NOS002 om 1 row per maat te bekomen
SELECT TF.TFLKNA, TF.TFDSNR, TF.TFMBKD, NOS002.MAATNUMMER,
SUM(TF.TFTA01 * NOS002.M01 + TF.TFTA02 * NOS002.M02 +
TF.TFTA03 * NOS002.M03 + TF.TFTA04 * NOS002.M04 +
TF.TFTA05 * NOS002.M05 + TF.TFTA06 * NOS002.M06 +
TF.TFTA07 * NOS002.M07 + TF.TFTA08 * NOS002.M08 +
TF.TFTA09 * NOS002.M09 + TF.TFTA10 * NOS002.M10 +
TF.TFTA11 * NOS002.M11 + TF.TFTA12 * NOS002.M12 +
TF.TFTA13 * NOS002.M13 + TF.TFTA14 * NOS002.M14 +
TF.TFTA15 * NOS002.M15 + TF.TFTA16 * NOS002.M16) AS AANTAL
FROM LFILES.TF TF
CROSS JOIN AJR.NOS002 NOS002
-- geen where, ook niet op de winkel 37 - 28
GROUP BY TF.TFLKNA, TF.TFDSNR, TF.TFMBKD, NOS002.MAATNUMMER
),
SELTF (TFLKNA, TFDSNR, TFMBKD, MAATNUMMER, AANTAL) AS (
-- eliminatie van de groepen die 0 zijn nu pas voor de leesbaarheid +
-- geen 2x schrijven van de berekening
SELECT SEL1TF.TFLKNA, SEL1TF.TFDSNR, SEL1TF.TFMBKD,
SEL1TF.MAATNUMMER, SEL1TF.AANTAL
FROM SEL1TF SEL1TF
WHERE SEL1TF.AANTAL <> 0
)
-- main select
SELECT E5XT.E5XTLKNR AS LOCATIE3,
E5XT.E5XTLKKD AS LOCATIE4,
SELTF.TFDSNR AS DISKNR,
NOS001.MAATOMSCHR AS MAAT,
NOS001.MAATNUM AS MAATNUM,
CAST((DIGITS(SELTF.TFDSNR) CONCAT '.' CONCAT DIGITS(NOS001.MAATNUM)) AS CHAR(11)) AS SKU,
CAST(SELTF.AANTAL AS DEC(6, 0)) AS AANTAL,
CAST('GEPLAND IN' AS CHAR(20)) AS SOORT,
CAST('power.LFILES.TF' AS CHAR(30)) AS BRON,
CURRENT_DATE AS DATUM,
CAST(0 AS DEC(9, 0)) AS VOLGNR,
CAST(SPACE(1) AS CHAR(1)) AS STATUS,
CAST(SPACE(10) AS CHAR(10)) AS GEBRUIKER,
CAST(SPACE(10) AS CHAR(10)) AS PROGRAMMA,
CAST(0 AS DEC(9, 0)) AS KBNUMMER,
CAST(SPACE(2) AS CHAR(2)) AS STATUSKB,
CURRENT_TIMESTAMP AS TIMESTAMP
FROM SELTF SELTF
INNER JOIN LFILES.E5XT E5XT
ON SELTF.TFLKNA = E5XT.E5XTLKNR
INNER JOIN AJR.NOS001 NOS001
ON SELTF.TFMBKD = NOS001.MSMBKD
AND SELTF.MAATNUMMER = NOS001.MAATNUMMER
);
去掉第一个AS后面多余的括号即可。 IE。这在 DataStudio 中解析得很好,所以如果我有 table DDL,我相信它会创建 OK。
CREATE VIEW VIEWRTSGEPLAND (
LOCATIE3,
LOCATIE4,
DISKNR,
MAAT,
MAATNUM,
SKU,
AANTAL,
SOORT,
BRON,
DATUM,
VOLGNR,
STATUS,
GEBRUIKER,
PROGRAMMA,
KBNUMMER,
STATUSKB,
"TIMESTAMP")
AS
--( <<<<< REMOVE THIS BRACKET
WITH SEL1TF (TFLKNA, TFDSNR, TFMBKD, MAATNUMMER, AANTAL)
AS (
-- selectie op TF + cross join NOS002 om 1 row per maat te bekomen
SELECT TF.TFLKNA, TF.TFDSNR, TF.TFMBKD, NOS002.MAATNUMMER, SUM(TF.TFTA01 * NOS002.M01 + TF.TFTA02 * NOS002.M02 + TF.TFTA03 * NOS002.M03
+ TF.TFTA04 * NOS002.M04 + TF.TFTA05 * NOS002.M05 + TF.TFTA06 * NOS002.M06
+ TF.TFTA07 * NOS002.M07 + TF.TFTA08 * NOS002.M08 + TF.TFTA09 * NOS002.M09
+ TF.TFTA10 * NOS002.M10 + TF.TFTA11 * NOS002.M11 + TF.TFTA12 * NOS002.M12
+ TF.TFTA13 * NOS002.M13 + TF.TFTA14 * NOS002.M14 + TF.TFTA15 * NOS002.M15
+ TF.TFTA16 * NOS002.M16) AS AANTAL
FROM LFILES.TF TF
CROSS JOIN AJR.NOS002 NOS002
-- geen where, ook niet op de winkel 37 - 28
GROUP BY TF.TFLKNA, TF.TFDSNR, TF.TFMBKD, NOS002.MAATNUMMER
),
SELTF (TFLKNA, TFDSNR, TFMBKD, MAATNUMMER, AANTAL)
AS (
-- eliminatie van de groepen die 0 zijn nu pas voor de leesbaarheid +
-- geen 2x schrijven van de berekening
SELECT SEL1TF.TFLKNA, SEL1TF.TFDSNR, SEL1TF.TFMBKD, SEL1TF.MAATNUMMER, SEL1TF.AANTAL
FROM SEL1TF SEL1TF
WHERE SEL1TF.AANTAL <> 0
)
-- main select
SELECT
E5XT.E5XTLKNR AS LOCATIE3, E5XT.E5XTLKKD AS LOCATIE4, SELTF.TFDSNR AS DISKNR, NOS001.MAATOMSCHR AS MAAT, NOS001.MAATNUM AS MAATNUM, CAST((DIGITS(SELTF.TFDSNR) CONCAT '.' CONCAT DIGITS(NOS001.MAATNUM))
AS CHAR(11)) AS SKU, CAST(SELTF.AANTAL AS DEC(6, 0)) AS AANTAL, CAST('GEPLAND IN' AS CHAR(20)) AS SOORT, CAST('power.LFILES.TF' AS CHAR(30)) AS BRON, CURRENT_DATE AS DATUM, CAST(0 AS DEC(9, 0)) AS VOLGNR, CAST(SPACE(1) AS CHAR(1)) AS STATUS, CAST(SPACE(10) AS CHAR(10)) AS GEBRUIKER, CAST(SPACE(10) AS CHAR(10)) AS PROGRAMMA, CAST(0 AS DEC(9, 0)) AS KBNUMMER, CAST(SPACE(2) AS CHAR(2)) AS STATUSKB, CURRENT_TIMESTAMP AS TIMESTAMP
FROM SELTF SELTF
INNER JOIN LFILES.E5XT E5XT
ON SELTF.TFLKNA = E5XT.E5XTLKNR
INNER JOIN AJR.NOS001 NOS001
ON SELTF.TFMBKD = NOS001.MSMBKD
AND SELTF.MAATNUMMER = NOS001.MAATNUMMER
--) <<<<< REMOVE THIS BRACKET
;