【问题标题】:DB2 create view with common table expressionDB2 使用公用表表达式创建视图
【发布时间】:2018-08-16 19:14:03
【问题描述】:

嘿,我从 AS400 上的 DB2 导出了一个视图定义,并想将其导入 DB2 LUW express-c,但每当我尝试使用 WITH 子句时,我都会遇到语法错误:

DB2 SQL 错误:SQLCODE=-104,SQLSTATE=42601,SQLERRMC=AS;MAATNUMMER,AANTAL) ;加入,驱动=4.19.77

如果我在 AS400 上的 DB2 中执行查询,它可以工作,并且根据 IBM 的文档 express-c 应该支持公用表表达式。

如果有人可以看看它并指出我正确的方向

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
);

【问题讨论】:

  • 我们将需要有关该错误的更多信息。您告诉我们的只是存在语法错误。这很笼统。 DB2-LUW 至少与 9.5 一样支持 CTE。你用的是哪个版本?
  • 我正在使用 10.5.0.5-3.10.0,我很乐意为您提供更多信息,但我得到的唯一反馈是上面的错误,我在执行时收到了一个更具描述性的错误通过我的 IDE(IntelliJ)[42601][-104] An unexpected token "AS" was found following "( WITH RTSI2SEL ". Expected tokens may include: "JOIN".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.23.42 的 sql
  • LUW express-c 中是否有 80 列的限制?我在 IBM i 上遇到了类似的意外语法错误,因为有些程序只接受 80 个字符的 SQL,而其他程序会接受更广泛的 SQL。鉴于 SQL 对空格的接受程度,易于检查:只需添加一些回车即可测试此推测。我看到你有一些 94 列宽的地方。
  • 我刚测试过,没有80列限制
  • "TIMESTAMP" 将带空格的引号视为“Order Timestamp”或 ORDTIMESAMP 会增加复杂性,但可以使列标题快速简单。

标签: db2 ibm-midrange db2-400 db2-luw


【解决方案1】:

只需删除第一个 AS 之后的多余括号即可。 IE。这在 DataStudio 中解析得很好,所以如果我有表 DDL,我相信它会创建好的。

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
;

【讨论】:

  • IBM Data Studio 不是每个人都喜欢的 SQL IDE,但它确实具有对 Db2 SQL 进行完整的本地解析的优势,因此它可以帮助识别语法错误比您返回的错误消息更好的地方来自 Db2 引擎。
猜你喜欢
  • 2019-12-09
  • 1970-01-01
  • 2021-02-22
  • 2012-11-14
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多