Использование псевдонимов в предложении ON в JOIN
Новое в переполнении стека (и кодирование в целом).
Я провел некоторое исследование, но не смог найти ответ на следующую проблему:
Как можно объединить две таблицы ПО результатам функций, примененных к измерениям, а не самим измерениям?
т.е. я хочу объединить следующие две таблицы в нижнем регистре результатов функции lower() вместо того, чтобы объединять неоднозначные измерения регистра в том виде, как они есть.
SELECT
lower(first_name) as firstname
,lower(last_name) as lastname
,lower(email) as email1
,total_donated
From BensData.Donations As a
JOIN EACH
(Select
lower(first_name) as first
,lower(last_name) as last
,lower(email) as email2
,sum(amount) as total_donated
From BensData.Donations
GROUP BY email2, first, last) As b
ON a.email1=b.email2 AND a.firstname=b.first AND a.lastname=b.last
Это не позволяет мне присоединяться к псевдонимам, которые я создаю в первой таблице (а), однако, если я присоединяюсь к исходным измерениям в таблице a (first_name и last_name), тогда результаты основываются на неоднозначных измерениях регистра и дают нежелательный результат.
Я надеюсь, что это было ясно.
Спасибо за любую помощь!
3 ответа
Спасибо всем за помощь!
Особенно звездочка, которая указала мне правильное направление! Основное отличие его и моего кода в том, что у моего нет псевдонимов таблиц, добавленных в начале каждого измерения первого предложения SELECT (например, **a.** fistname, **a.** фамилия, --- -> имя, фамилия)
По какой-то причине BigQuery продолжал выдавать мне ошибку из-за псевдонимов таблиц.
Вот код, который работал.
SELECT
firstname
,lastname
,email1
,total_donated
FROM
(SELECT
lower(first_name) as firstname
,lower(last_name) as lastname
,lower(email) as email1
From BensData.Donations) As a
JOIN EACH
(Select
lower(first_name) as first
,lower(last_name) as last
,lower(email) as email2
,sum(float(amount)) as total_donated
From BensData.Donations
GROUP BY email2, first, last) As b
ON a.email1=b.email2 AND a.firstname=b.first AND a.lastname=b.last
Спасибо всем за помощь!
Попробуйте использовать два подзапроса, как это:
SELECT
a.firstname
,a.lastname
,a.email1
,a.total_donated
FROM
(SELECT
lower(first_name) as firstname
,lower(last_name) as lastname
,lower(email) as email1
,total_donated
From BensData.Donations) As a
JOIN EACH
(Select
lower(first_name) as first
,lower(last_name) as last
,lower(email) as email2
,sum(amount) as total_donated
From BensData.Donations
GROUP BY email2, first, last) As b
ON a.email1=b.email2 AND a.firstname=b.first AND a.lastname=b.last
В исходном запросе a - это просто псевдоним для BensData.Donations, поэтому вы можете объединять только поля, присутствующие в этой таблице.
Я никогда не слышал о join each
и это не задокументировано как синтаксис для соединений MySQL (см. здесь).
Попробуй это from
пункт:
From BensData.Donations a JOIN
(Select lower(first_name) as first, lower(last_name) as last,
sum(amount) as total_donated
From BensData.Donations
GROUP BY first, last
) b
ON a.firstname = b.first AND a.lastname = b.last
В вашей версии также отсутствовали запятые в подзапросе между столбцами.
Для ясности, вы должны написать from
пункт как:
ON lower(a.firstname) = b.first AND lower(a.lastname) = b.last
или удалите lower()
из подзапроса. В противном случае вы зависите от параметров сортировки по умолчанию для сервера, базы данных и таблицы. on
пункт действительно делает.