您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

了解基本的SQL查询

了解基本的SQL查询

这是 范围的问题 。Oracle会从最内层的子查询开始,并向外验证标识符。如果我们将表别名添加到您的原始查询中,则情况可能会变得更加清晰:

SELECT t1.tran_number 
  FROM table_a t1
  WHERE t1.customer_id IN 
          (SELECT t1.customer_id  
             FROM table_b t2 
            WHERE t2.customer_key = 89564 
                  AND (   t2.other_phn_area_code 
                       || t2.other_phnum_pfx_num 
                       || t2.other_phnum_sfx_num IN 
                          (123456789))) 
       AND t1.phn_area_code || t1.phnum_pfx_num || t1.phnum_sfx_num IN (123456789)

实际上,外部查询使用子查询作为EXISTS的测试,即仅检查CUSTOMER_KEY和其他列的给定值是否存在。如果这不是您想要的,则应在子查询中更改列名。(这是一个很好的选择:您可能会从主查询中得到令人困惑的结果,这就是为什么要单独调查子查询的原因)。

在这些情况下使用别名始终是一种好习惯。如果您对子查询使用了这样的别名:

....
  WHERE t1.customer_id IN 
          (SELECT t2.customer_id  
             FROM table_b t2 
            WHERE t2.customer_key = 89564 
....

错误将立即显而易见。

sqlReference确实在子查询中解释了作用域的操作,但是很难找到。什么它说是这样的:

“ Oracle通过在子查询中命名的表中然后在父语句中命名的表中查找子查询中的不合格列”

您可以在PL / sql文档中找到关于范围定义的更清晰的解释;sql查询以相同的方式工作。了解更多

SQLServer 2022/1/1 18:53:22 有407人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶