Sql 在两个表中引用列别名

Sql 在两个表中引用列别名,sql,apache-spark,hiveql,wso2-das,Sql,Apache Spark,Hiveql,Wso2 Das,我有两个配置单元SQL表,它们由以下列组成 表1 |customer_id | ip_address| 区域表 |country_name | region_name| 我试过了 getCountry是UDF,当IP地址为 这是传递给它的。我想用这个国家的名字来创建另一个国家 列,其中包含区域_表中的相应区域。我想要 以获取下表作为我的输出 关于我在查询中遗漏了什么,您有什么想法吗?对于Oracle,您不能在同一查询的WHERE子句中引用SELECT语句中定义的列别名!!因为数据库引擎首先计

我有两个配置单元SQL表,它们由以下列组成

表1

|customer_id | ip_address|
区域表

|country_name | region_name|
我试过了

getCountry是UDF,当IP地址为 这是传递给它的。我想用这个国家的名字来创建另一个国家 列,其中包含区域_表中的相应区域。我想要 以获取下表作为我的输出


关于我在查询中遗漏了什么,您有什么想法吗?

对于Oracle,您不能在同一查询的WHERE子句中引用SELECT语句中定义的列别名!!因为数据库引擎首先计算WHERE子句并标识符合条件的行,然后继续获取查询的SELECT部分中定义的列

select      c.customer_id
           ,c.ip_address
           ,getCountry(c.ip_address) as Country
           ,r.region_name 

from                table_1         c

            join    region_table    r

            on      r.country_name = 
                    getCountry(c.ip_address)
在您的情况下,正确的查询应该是

select 
  table_1.customer_id, 
  table_1.ip_address, 
  getCountry(ip_address) AS Country, 
  region_table.region_name 
FROM table_1 
JOIN region_table ON region_table.country_name = getCountry(table_1 .ip_address); 

对于Oracle,不能引用同一查询的WHERE子句中SELECT语句中定义的列别名!!因为数据库引擎首先计算WHERE子句并标识符合条件的行,然后继续获取查询的SELECT部分中定义的列

在您的情况下,正确的查询应该是

select 
  table_1.customer_id, 
  table_1.ip_address, 
  getCountry(ip_address) AS Country, 
  region_table.region_name 
FROM table_1 
JOIN region_table ON region_table.country_name = getCountry(table_1 .ip_address); 

谢谢这样就搞定了,谢谢!这样就解决了,解释是错误的。SELECT子句中的表达式不能在其他子句中识别,没有任何逻辑限制。这是一个解析的问题,而不是执行的问题,因为整个语句都是预先知道的,所以这是不需要动脑筋的。例如Teradata确实支持它,您可以随时使用别名,包括WHERE子句,甚至SELECT子句本身。@DuduMarkovitz在Oracle中,您可以在外部查询或WITH子句中引用内部查询中的列别名,但在使用同一WHERE子句派生列别名时,不能将其作为WHERE子句的一部分。示例选择全名,emp_id从选择first_name | |‘|‘| | last_name作为全名,emp_id从emp选择,其中全名='John Smith'完全可以。对于Oracle sql,按时间顺序,在选择之前发生。我不知道Teradata,因此我将把我的评论限制在我的答案中更新的Oracle上。这不是任何顺序的问题。将别名视为宏—可以在语句文本中的任何位置搜索和替换的文本。如果我给你的语句是select 1 as xxx,xxx+1 as y from t,其中xxx=1,你就完全知道我的意思了。@DuduMarkovitz,而且,列别名不仅仅是解析的问题。由于列别名允许使用任何名称,解析器无法知道什么应该是正确的表达式。考虑这个例子,从EMP中选择角色作为指定,指定为角色,角色=“管理器”。在这种情况下,如果在解析器级别处理此列别名引用,则会产生歧义。我相信所有符合ANSI sql的RDBMS都会阻止在WHERE子句中引用列别名,而WHERE子句用于派生列别名@DuduMarkovitz,如果引用表t有一个名为xxx的列,这不会导致歧义吗?假设表t是xxx编号,yyy varchar10,那么查询如何从其中xxx=1的t中选择1作为xxx,xxx+1作为y?在基于WHERE条件选择行时,它会考虑表或列别名中的数据是否从查询的一部分中选择?解释是错误的。SELECT子句中的表达式不能在其他子句中识别,没有任何逻辑限制。这是一个解析的问题,而不是执行的问题,因为整个语句都是预先知道的,所以这是不需要动脑筋的。例如Teradata确实支持它,您可以随时使用别名,包括WHERE子句,甚至SELECT子句本身。@DuduMarkovitz在Oracle中,您可以在外部查询或WITH子句中引用内部查询中的列别名,但在使用同一WHERE子句派生列别名时,不能将其作为WHERE子句的一部分。示例选择全名,emp_id从选择first_name | |‘|‘| | last_name作为全名,emp_id从emp选择,其中全名='John Smith'完全可以。对于Oracle sql,按时间顺序,在选择之前发生。我不知道Teradata,因此我将把我的评论限制在我的答案中更新的Oracle上。这不是任何顺序的问题。将别名视为宏—可以在语句文本中的任何位置搜索和替换的文本。如果我给你的语句是select 1 as xxx,xxx+1 as y from t,其中xxx=1,你就完全知道我的意思了。@DuduMarkovitz,而且,列别名不仅仅是解析的问题。由于列别名允许使用任何名称,解析器无法知道什么应该是正确的表达式。考虑这个例子,从EMP中选择角色作为指定,指定为角色,角色=“管理器”。在这种情况下,如果在解析器级别处理此列别名引用,则会产生歧义。我相信所有符合ANSI sql的RDBMS都会阻止在WHERE子句中引用列别名,而WHERE子句用于派生列别名@DuduMarkovitz,如果引用表TH,这不会导致歧义吗 作为名为xxx的列?假设表t是xxx编号,yyy varchar10,那么查询如何从其中xxx=1的t中选择1作为xxx,xxx+1作为y?在基于WHERE条件选择行时,它会从表查询或列别名中选择数据来选择查询的一部分吗?
select 
  table_1.customer_id, 
  table_1.ip_address, 
  getCountry(ip_address) AS Country, 
  region_table.region_name 
FROM table_1 
JOIN region_table ON region_table.country_name = getCountry(table_1 .ip_address);