Мне нужна помощь в понимании этой ошибки, которую я получаю в BigQuery:
LEFT OUTER JOIN нельзя использовать без условия, равного полям с обеих сторон соединения .
Я пытаюсь использовать оператор case, чтобы изменить строки, выбранные для объединения, в зависимости от значения в строке левой таблицы. Я делаю нечто подобное в некоторых других местах, и это работает, поэтому часть меня думает, что я могу ошибаться в отношении псевдонимов таблиц и имен столбцов, но я не могу понять это. Вот минимальный пример того, что я пытаюсь сделать:
WITH t1 AS (
SELECT "milk" AS dairy,
1 AS id,
2 AS other_id
UNION ALL
SELECT "yogurt" AS dairy,
3 AS id,
4 AS other_id
UNION ALL
SELECT "cheese" AS dairy,
5 AS id,
6 AS other_id
),
t2 AS (
SELECT "blue" AS color,
1 AS id
UNION ALL
SELECT "red" AS color,
4 AS id
)
SELECT
t1.*, t2
FROM t1
LEFT JOIN t2 ON
CASE
WHEN t1.dairy = 'milk' THEN t1.id = t2.id
WHEN t1.dairy = 'yogurt' THEN t1.other_id = t2.id
END
Результат, который я хотел бы видеть:
Как вы можете видеть в желаемом результате, когда значение для dairy
равно milk
, я хочу, чтобы id
из t2
равнялся столбцу id
в t1
, но когда значение для dairy
это yogurt
, я хочу, чтобы id
из t2
равнялся столбцу other_id
в t1
.
Я искал объяснение, но не могу понять это. Я также попробовал предлагаемое решение здесь , но получил ту же ошибку, поэтому я думаю, что я просто что-то путаю с именами таблиц или псевдонимами.
Пожалуйста, помогите!
ОБНОВЛЕНИЕ
Мне удалось избавиться от ошибки, переписав case case следующим образом:
SELECT
t1.*, t2
FROM t1
LEFT JOIN t2 ON
CASE
WHEN t1.dairy = 'milk' THEN t1.id
WHEN t1.dairy = 'yogurt' THEN t1.other_id
END = t2.id
Однако в моей реальной проблеме мне нужно присоединиться к третьему столу аналогичным образом. Если t2.color
равно blue
, я хочу присоединиться на основе t2.id = t3.id
, но если t2.color
равно red
, я хочу присоединиться на основе t2.id = t3.other_id
. Как только я это делаю, возникает та же ошибка. Вот полный пример моей попытки:
WITH t1 AS (
SELECT "milk" AS dairy,
1 AS id,
2 AS other_id
UNION ALL
SELECT "yogurt" AS dairy,
3 AS id,
4 AS other_id
UNION ALL
SELECT "cheese" AS dairy,
5 AS id,
6 AS other_id
),
t2 AS (
SELECT "blue" AS color,
1 AS id
UNION ALL
SELECT "red" AS color,
4 AS id
),
t3 AS (
SELECT "sunny" AS weather,
1 AS id,
10 AS other_id
UNION ALL
SELECT "cloudy" AS weather,
11 AS id,
4 AS other_id
)
SELECT
t1.*, t2, t3
FROM t1
LEFT JOIN t2 ON
CASE
WHEN t1.dairy = 'milk' THEN t1.id
WHEN t1.dairy = 'yogurt' THEN t1.other_id
END = t2.id
LEFT JOIN t3 ON
CASE
WHEN t2.color = 'blue' THEN t3.id
WHEN t2.color = 'red' THEN t3.other_id
END = t2.id
Но теперь возникает та же ошибка:
LEFT OUTER JOIN нельзя использовать без условия, равного равенству полей из обе стороны объединения.
Если я удаляю соединение t3
, оно работает правильно. Вот еще несколько изображений таблиц и желаемого результата в случае, если это поможет: