Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Teradata-错误2646优化查询_Sql_Optimization_Teradata - Fatal编程技术网

Sql Teradata-错误2646优化查询

Sql Teradata-错误2646优化查询,sql,optimization,teradata,Sql,Optimization,Teradata,谢谢你的回答 这是一个编辑: SELECT 'SYSA', t1.lieu_stkph_cd, Sum (t1.mt_pnu_cpta_dev_rep), Sum (t2.mt_util_dev_rep) FROM (SELECT a.id_auto, a.dt_art, c.lieu_stkph_cd, a.mt_pnu_cpta_dev_rep FROM prod_v_ec_dossier_a_sysa c

谢谢你的回答

这是一个编辑:

SELECT 'SYSA', 
   t1.lieu_stkph_cd, 
   Sum (t1.mt_pnu_cpta_dev_rep), 
   Sum (t2.mt_util_dev_rep) 
FROM   (SELECT a.id_auto, a.dt_art, c.lieu_stkph_cd, 
           a.mt_pnu_cpta_dev_rep 
    FROM   prod_v_ec_dossier_a_sysa c 
           INNER JOIN db_ftg_srs_prod_v.v_autorisation_a a 
                   ON a.id_doss = c.dosscta_no 
                      AND a.cd_prd_cpta = c.prct_no 
                      AND a.cd_entite_cpta = c.entite_cd 
    WHERE  c.pma_cd = '') AS t1
LEFT JOIN (SELECT a.id_auto, a.dt_art, c.lieu_stkph_cd, 
           b.mt_util_dev_rep 
    FROM   prod_v_ec_dossier_a_sysa c 
           INNER JOIN db_ftg_srs_prod_v.v_autorisation_a a 
                   ON a.id_doss = c.dosscta_no 
                      AND a.cd_prd_cpta = c.prct_no 
                      AND a.cd_entite_cpta = c.entite_cd 
           INNER JOIN db_ftg_srs_prod_v.v_utilisation_a b 
                      ON a.dt_art = b.dt_art 
                      AND a.id_auto = b.id_auto 
    WHERE  c.pma_cd = '') AS t2 
             ON  T1.id_auto = t2.id_auto 
            and T1.dt_art = T2.dt_art and t1.lieu_stkph_cd = t2.lieu_stkph_cd
GROUP  BY 1, 
          2
这是此查询的结果:

LIEU_STKPH_CDPNU金额使用金额
1 200 € 250欧元

我解释说,这不准确:

db_ftg_srs_产品_v.v_自动化_a与db_ftg_srs_产品_v.v_利用率_a链接
-ID\u AUTO
-DT_艺术
但我可以有1个ID_AUTO用于X使用,因此通过此查询,我将乘以X使用PNU金额,这是不正确的

授权表

ID\u自动菜单金额
1100欧元

利用率表

ID\u自动ID\u使用量
1 1 100欧元
1 2 150欧元

因此,我必须将这些值分开:

预期结果

LIEU_STKPH_CDPNU金额使用金额
1 100 € 250欧元

你知道吗

提前感谢

Christophe

您的第一个查询是可以的,因为您确实可以

 SELECT ( select ... ) as field 1, 
        ( select ... ) as field 2, 
但是你的第二个动作是交叉连接

 SELECT *
 FROM ( select ... ) as query1,
      ( select ... ) as query2
使用query1 x query2行创建查询

你想要:

 SELECT query.*
 FROM ( SELECT ( select ... ) as field1,
               ( select ... ) as field2
        .....
      ) as query

在这里对数据之间的关系进行大的猜测。您应该使用一个实际的
JOIN
子句和一个
ON
来连接,以解释如何将这两个子查询组合在一起。比如:

SELECT 'SYSA', 
       t1.lieu_stkph_cd, 
       Sum (t1.mt_pnu_cpta_dev_rep), 
       Sum (t2.mt_util_dev_rep) 
FROM   (SELECT c.lieu_stkph_cd, 
               a.mt_pnu_cpta_dev_rep 
        FROM   prod_v_ec_dossier_a_sysa c 
               INNER JOIN db_ftg_srs_prod_v.v_autorisation_a a 
                       ON a.id_doss = c.dosscta_no 
                          AND a.cd_prd_cpta = c.prct_no 
                          AND a.cd_entite_cpta = c.entite_cd 
        WHERE  c.pma_cd = '') AS t1
   INNER JOIN (SELECT c.lieu_stkph_cd, 
               b.mt_util_dev_rep 
        FROM   prod_v_ec_dossier_a_sysa c 
               INNER JOIN db_ftg_srs_prod_v.v_autorisation_a a 
                       ON a.id_doss = c.dosscta_no 
                          AND a.cd_prd_cpta = c.prct_no 
                          AND a.cd_entite_cpta = c.entite_cd 
               INNER JOIN db_ftg_srs_prod_v.v_utilisation_a b 
                       ON a.dt_art = b.dt_art 
                          AND a.id_auto = b.id_auto 
        WHERE  c.pma_cd = '') AS t2 
    ON T1.lieu_stkph_cd = t2.lieu_stkph_cd
GROUP  BY 1, 
          2 

有几种方法可以消除相乘的值,例如在联接之前进行聚合

SELECT 'SYSA', 
   t1.lieu_stkph_cd, 
   t1.mt_pnu_cpta_dev_rep, 
   t2.mt_util_dev_rep 
FROM   (SELECT a.id_auto, a.dt_art, c.lieu_stkph_cd, 
           a.mt_pnu_cpta_dev_rep 
    FROM   prod_v_ec_dossier_a_sysa c 
           INNER JOIN db_ftg_srs_prod_v.v_autorisation_a a 
                   ON a.id_doss = c.dosscta_no 
                      AND a.cd_prd_cpta = c.prct_no 
                      AND a.cd_entite_cpta = c.entite_cd 
    WHERE  c.pma_cd = '') AS t1
LEFT JOIN (SELECT a.id_auto, a.dt_art, c.lieu_stkph_cd, 
           Sum(b.mt_util_dev_rep) AS mt_util_dev_rep 
    FROM   prod_v_ec_dossier_a_sysa c 
           INNER JOIN db_ftg_srs_prod_v.v_autorisation_a a 
                   ON a.id_doss = c.dosscta_no 
                      AND a.cd_prd_cpta = c.prct_no 
                      AND a.cd_entite_cpta = c.entite_cd 
           INNER JOIN db_ftg_srs_prod_v.v_utilisation_a b 
                      ON a.dt_art = b.dt_art 
                      AND a.id_auto = b.id_auto 
    WHERE  c.pma_cd = ''
    GROUP  BY 1, 
          2          ) AS t2 
             ON  T1.id_auto = t2.id_auto 
            AND T1.dt_art = T2.dt_art AND t1.lieu_stkph_cd = t2.lieu_stkph_cd
但似乎不需要联接两个派生表,这将返回相同的结果:

SELECT 'SYSA', 
   t1.lieu_stkph_cd, 
   -- this value is multiplied by the number of rows 
   -- so simply divide by that number to revert the multiplication 
   Sum (a.mt_pnu_cpta_dev_rep) / Count(*), 
   Sum (b.mt_util_dev_rep) 
FROM prod_v_ec_dossier_a_sysa c 
JOIN db_ftg_srs_prod_v.v_autorisation_a a 
  ON a.id_doss = c.dosscta_no 
AND a.cd_prd_cpta = c.prct_no 
AND a.cd_entite_cpta = c.entite_cd 
JOIN db_ftg_srs_prod_v.v_utilisation_a b 
  ON a.dt_art = b.dt_art 
 AND a.id_auto = b.id_auto 
WHERE  c.pma_cd = ''
GROUP  BY 1, 
          2

2646不再有假脱机空间
是错误吗?当假脱机空间用完时,不需要优化查询。这只意味着Teradata准备在下游再次查询数据以完成计划的临时结果集已对用户用完。当您处理非常大的数据时,当您意外地导致交叉连接时,或者当您的用户/配置文件有少量假脱机余量时,可能会发生这种情况。在您的例子中,您加入了T1和T2,但是您没有提供导致错误的ON子句。T1和T2之间的关系是什么?向我们展示db模式、样本数据、当前和预期输出。请阅读,这里是学习如何提高问题质量和获得更好答案的好地方。试着在yes中创建一个示例,从最初的帖子来看,它看起来确实像笛卡尔产品,这将使您满意(谢谢Dieter:)我选择您的第一个解决方案。然而,我得到了一个新的错误2616“编译期间发生了数字溢出”。我想我必须转换数值?谢谢@克里斯托夫:可能,检查源数据类型(十进制?),并将精度提高到38位。