Использование псевдонимов в предложении 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 пункт действительно делает.

Другие вопросы по тегам