我正在编写一个SQL请求,以使用不同的关系从AS400导出数据。我想这样写,以减少时间并提高ETL的性能(我在ETL中至少有2900万行可以使用它)。
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))
我确实需要此错误的帮助
我有这个例外:
TITRE:Microsoft Visual StudioHRESULT异常:0xC0202009Erreur sur Traitement [来源[2]]:d'erreur SSIS代码DTS_E_OLEDBERROR。 OLE DB的产品。代码d'erreur:0x80004005取消注册OLE DB est负责。来源:«IBMDA400命令»结果:0x80004005描述:«SQL0412:非固定的汽车,汽车加上d'une Colonnerésultat原因。 。 。 。 。 :独特的表达方式和独特的表达方式都非常重要。效果好,效果好,价格低廉,构成专家名单和财产授予。 fair下。 。 。 :修订《反倾销法》,以表达方式来表达自己的观点。 »。
您可以使用“表表达式”代替“标量子查询”来连接额外的数据。
标量子查询仅限于一行(您可能返回多行)和一列(您显然试图返回不止一列)。
例如,您可以做:
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);
错误的原因是子查询返回的列不止一列。 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)
仅返回单行。注意,子查询没有与外部选择相关的条件。在子查询中使用别名B不会将其与外部选择相关联,因为它在FROM TEST1 AS B
的内部选择中已重新定义。这使得别名在子查询中是本地的,并在子查询的外部选择中隐藏了B的使用。如果这不是您想要的,即使它不是您想要的,也应始终遵循SQL中的简单规则,请勿重复使用别名。