Вы можете использовать «табличное выражение» для присоединения дополнительных данных вместо «скалярного подзапроса».
Скалярные подзапросы ограничены одной строкой (ваша может возвращать несколько строк) и одним столбцом (ваш явно пытается вернуть более одного столбца).
Например, вы можете сделать:
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);