【问题标题】:Joining tables using a new alias column as the key使用新的别名列作为键连接表
【发布时间】:2016-01-28 15:49:21
【问题描述】:

当我尝试将 2 个表与我的数据连接起来时,我收到一条错误消息,指出我的引用不明确,或者我的原始表没有别名列。

这是我第一个使用 sql 的项目之一,对我来说是一个重要的学习点,所以我很感激你的指导。

这是我的代码。

WITH 
RentDotComOnly AS
(
  SELECT 
    concat(DATE_PART(mm,archived_apartments.week),clean_zip) AS "monthlyzip",
    COUNT(clean_zip) AS "rent_count_clean_zip", 
    AVG((low_price+high_price)/2) AS "rent_avg_price", 0.85*min(low_price) AS "rent_lower_bound", 1.15*max(high_price) AS "rent_upper_bound"
  FROM 
    archived_apartments 
  WHERE 
    source_type in (29,36,316) 
    AND week between '2015-07-06' and '2015-10-12' 
    AND is_house <> 1  
    AND archived_apartments.high_price <> 0 
  GROUP BY monthlyzip
),
AllRJData AS
(
  SELECT
    concat(DATEPART(mm,archived_apartments.week),clean_zip) AS "monthlyzip",
    COUNT(clean_zip) AS "all_count_clean_zip", 
    AVG((low_price+high_price)/2) AS "all_avg_price"
  FROM 
    archived_apartments 
  WHERE 
    week between '2015-07-06' and '2015-10-12' 
    AND is_house <> 1  
  GROUP BY monthlyzip
)
SELECT 
  concat(DATE_PART(mm,archived_apartments.week),clean_zip) AS "monthlyzip",
  COUNT(archived_apartments.clean_zip) as filtered_count_clean_zip, 
  RentDotComOnly.rent_count_clean_zip, RentDotComOnly.rent_avg_price, RentDotComOnly.rent_lower_bound, RentDotComOnly.rent_upper_bound,
  AllRjData.all_count_clean_zip, AllRjData.all_avg_price
FROM
archived_apartments 
JOIN AllRJData 
ON concat(DATE_PART(mm,archived_apartments.week),archived_apartments.clean_zip) = AllRJData.monthlyzip
JOIN RentDotComOnly
ON concat(DATE_PART(mm,archived_apartments.week),archived_apartments.clean_zip) = RentDotComOnly.monthlyzip
WHERE 
  archived_apartments.week between '2015-07-06' and '2015-10-12'
  AND archived_apartments.is_house <> 1 
  AND archived_apartments.high_price <> 0 
  AND archived_apartments.low_price > RentDotComOnly.rent_lower_bound
  OR archived_apartments.high_price < RentDotComOnly.rent_upper_bound
  AND archived_apartments.week between '2015-07-06' and '2015-10-12'
  AND archived_apartments.is_house <> 1 
  AND archived_apartments.high_price <> 0 
GROUP BY monthlyzip
RentDotComOnly.rent_count_clean_zip, RentDotComOnly.rent_avg_price, RentDotComOnly.rent_lower_bound, RentDotComOnly.rent_upper_bound, 
AllRjData.all_count_clean_zip, AllRjData.all_avg_price
ORDER BY monthlyzip

【问题讨论】:

  • 为什么是mysql-workbench标签?
  • 请用您真正使用的数据库标记您的问题。 Redshift 不支持名为datepart() 的函数(redshift 名称中有连字符)。
  • 感谢 cmets。错误是“[Amazon](500310) 无效操作:列引用“monthlyzip”不明确;” - 我将 datepart() 更改为 date_part() 并且错误仍然存​​在。

标签: sql sql-server mysql-workbench amazon-redshift


【解决方案1】:

问题是您在联接中引用的monthlyzip 列不明确。您有三个带有该列的表,您指的是哪个表?

如果 archived_apartments 上存在monthly_zip,您可以这样做:

FROM
archived_apartments JOIN
AllRJData 
ON archived_apartments.monthlyzip = AllRJData.monthlyzip
JOIN RentDotComOnly 
ON archived_apartments.monthlyzip = RentDotComOnly.monthlyzip

但听起来monthly_ziparchived_apartments 中不存在,因此您实际上无法加入该字段。相反,你必须加入你用来制作monthlyzip的公式:

FROM
archived_apartments JOIN
AllRJData 
ON concat(DATEPART(mm,archived_apartments.week),archived_apartment.clean_zip)  = AllRJData.monthlyzip
JOIN RentDotComOnly 
ON concat(DATEPART(mm,archived_apartments.week),archived_apartment.clean_zip)  = RentDotComOnly.monthlyzip

【讨论】:

  • 感谢您的评论,因为这也是我的逻辑。但是,使用这种方法我得到错误:[Amazon](500310) Invalid operation: column archived_apartments.monthlyzip 不存在;
  • 听起来monthlyzip 列在archived_apartments 上不存在。您想在这里加入哪个专栏?
  • 我正在尝试使用我创建的不是现有列的密钥,注意:concat(DATEPART(mm,archived_apartments.week),clean_zip) AS "monthlyzip
  • 我明白了,但我们在您的FROM 中讨论表archived_apartments。该表中不存在该列,因此您不能将其用作联接的一部分。您说FROM archived_apartments JOIN AllRJData,但您的ON 没有引用您archived_apartments 中的任何列。如果archived_apartmentsAllRJData 没有关系,那么您不能加入两者。相反,您必须加入用于制作该列的公式。我会用它的工作原理更新答案。
  • 感谢 JNeville,我关注了,但我需要根据日期和邮政编码进行分组和求和,因此我的尝试是为所有表创建密钥。这里有什么解决方案?
猜你喜欢
  • 2018-06-13
  • 2013-11-11
  • 2015-02-03
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 2012-10-26
相关资源
最近更新 更多