Когда я запускаю свой запрос на реальных таблицах, я получаю сообщение об ошибке:
Correlated subqueries that reference other tables are not supported unless they can be de-correlated, such as by transforming them into an efficient JOIN
Вот точный запрос, который я выполняю:
SELECT
CASE WHEN addresses LIKE '%,%'
THEN
(
SELECT STRING_AGG(DISTINCT address) addresses
FROM VW_CLEAN.TABLE_1
WHERE member_id = el.member_id
AND eligible_month < el.eligible_month
GROUP BY member_id, eligible_month
ORDER BY eligible_month DESC
LIMIT 1
)
END AS address,
eligible_month,
member_id
FROM
(
SELECT STRING_AGG(DISTINCT address) addresses, eligible_month, member_id FROM
(
SELECT DISTINCT address, eligible_month, member_id
FROM VW_CLEAN.TABLE_1
UNION ALL
SELECT DISTINCT address, eligible_month, member_id
FROM VW_CLEAN.TABLE_2
)
GROUP BY eligible_month, member_id
) el
WHERE member_id IS NOT NULL
AND eligible_month IS NOT NULL
Но когда я подготовил тот же запрос, но для тестовых данных, используя «WITH AS», он выполняется без ошибки.
#standardSQL
WITH table_1 AS (
SELECT "201905" AS month, "11111" AS member, "123" AS address
UNION ALL
SELECT "201903" AS month, "11111" AS member, "234" AS address
UNION ALL
SELECT "201902" AS month, "11111" AS member, "345" AS address
UNION ALL
SELECT "201902" AS month, "22222" AS member, "456" AS address
UNION ALL
SELECT "201901" AS month, "22222" AS member, "567" AS address
),
table_2 AS (
SELECT "201904" AS month, "11111" AS member, "678" AS address
)
SELECT
a.member,
a.month,
(
SELECT STRING_AGG(address) address
FROM table_1
WHERE member = a.member
AND month < a.month
GROUP BY member, month
ORDER BY month DESC
LIMIT 1
) AS previous_address
FROM
(
SELECT STRING_AGG(address) address, month, member
FROM
(
SELECT month, member, address
FROM table_1
UNION ALL
SELECT month, member, address
FROM table_2
)
GROUP BY month, member
HAVING member = '11111' AND month = '201905'
) a
Так в чем же разница между реальными таблицами и таблицами, созданными с использованием «WITH AS»?
Редактору требуется больше текста для сохранения описания, поэтому я добавляю ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ ТЕКСТ