Sql 在两个表中引用列别名
我有两个配置单元SQL表,它们由以下列组成 表1Sql 在两个表中引用列别名,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语句中定义的列别名!!因为数据库引擎首先计
|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);