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位。