使用sql从as400提取数据时出现问题

ars1skjm  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(338)

我正在编写一个sql请求,使用不同的关系从as400导出数据。我想这样写以减少时间并提高etl的性能(我至少有2900万行要在etl中使用它)。
sql语句:

SELECT  A.x1, A.x2, A.x3, A.x4, A.x5,
        (SELECT B.y1, B.y2, B.y3, C.w1 as w 
        FROM TEST1 AS B inner join TEST2 AS C ON ((C.w2=B.y4) and (C.w3=B.y5)) 
        where (B.y6 = 2)),
        E.q1

FROM TEST3 AS A
LEFT OUTER JOIN TEST1 AS B ON (A.x6 = B.y7)
LEFT OUTER JOIN TEST4 AS E ON ((A.x6 = E.q2) AND (A.x7 = E.q3))

这个错误我真的需要帮助
我有个例外:
滴度 : microsoft visual studio
异常de hresult:0xc020009 erreur sur traitement[源[2]] : 代码d'erreur ssis dts\u e\u oledberror。这是我最喜欢的产品。代码d'erreur : 0x80004005。取消注册是有争议的。来源 : « ibmda400命令 » hresult公司 : 0x80004005说明 : « sql0412:sous需求ê不佩服,车加科隆é原因……:拉索斯雷库ê德昂公共关系é科隆大学élorsque l'autre办事处é兰德杜公关公司é表示最简单的表达式。影响,需求ê特佩特莱尔兹é你是一个多面手吗?你是一个多面手吗?你是一个多面手吗é苏丹。公平…:名称修改é我é反悔é需要多少钱ê我要去科隆é奥特雷苏丹é兰德杜公关公司é表达你的观点。 ».

isr3a4wc

isr3a4wc1#

错误的原因是子查询返回了多个列。alwayslearning已经说过了。
但下一个问题是子查询返回多行。
除非

SELECT B.y1, B.y2, B.y3, C.w1 as w 
FROM TEST1 AS B inner join TEST2 AS C ON ((C.w2=B.y4) and (C.w3=B.y5)) 
where (B.y6 = 2)

只返回一行。注意,子查询没有与外部select相关的条件。在子查询中使用别名b不会将其与外部select关联,因为它是在内部select中重新定义的 FROM TEST1 AS B . 这使得别名在子查询中是本地的,并且在子查询的外部select中隐藏了b的用法。如果这不是您想要的,即使它是,您应该始终遵循sql中的一个简单规则,不要重复使用alises。

dly7yett

dly7yett2#

您可以使用“表表达式”而不是“标量子查询”来联接额外的数据。
标量子查询仅限于一行(您的子查询可能返回多行)和一列(您的子查询显然试图返回多个列)。
例如,您可以执行以下操作:

SELECT  A.x1, A.x2, A.x3, A.x4, A.x5,
        f.y1, f.y2, f.y3, f.w,
        E.q1
FROM TEST3 AS A
LEFT OUTER JOIN TEST1 AS B ON (A.x6 = B.y7)
LEFT OUTER JOIN TEST4 AS E ON ((A.x6 = E.q2) AND (A.x7 = E.q3))
left join (
  SELECT B.y1, B.y2, B.y3, C.w1 as w 
  FROM TEST1 AS B -- you should avoid reusing the same alias B, but OK
  inner join TEST2 AS C ON ((C.w2=B.y4) and (C.w3=B.y5)) 
  where (B.y6 = 2)
) f on 1 = 1 -- what's the join condition? I assume you want all rows to match

编辑以加速查询
您正在选择表中的所有行 A ; 那一定很慢。然而,由于您的连接是相等的连接,它们可以从索引中获益匪浅;以下索引可以加快查询速度:

create index ix1 on TEST1 (y7, x1, x2, x3, x4, x5);

create index ix2 on TEST1 (y6, y1, y2, y3);

create index ix3 on TEST4 (q2, q3, q1);

create index ix4 on TEST2 (w2, w3, w1);

相关问题