簡體   English   中英

在JOIN的ON子句中使用別名

[英]Using Aliases in the ON Clause of a 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)中創建的別名,但是,如果我加入表a中的原始維度(first_name和last_name),則結果基於大小寫不明確的維度,並給出不良結果。

我希望這很清楚。

謝謝你的幫助!

嘗試使用兩個子查詢,如下所示:

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子句的實際作用。

感謝大家的幫助!

特別扣人心弦的人向我指出了正確的方向! 他的代碼和我的代碼的主要區別在於,我的代碼沒有在第一個SELECT子句的每個維的前面附加表別名(例如** a。** fistname,** a。** lastname,- ->名字,姓氏)

由於某種原因,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

感謝你的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM