如何在子查询-SQL中重用列值

如何在子查询-SQL中重用列值,sql,oracle,join,where-clause,Sql,Oracle,Join,Where Clause,我有一个示例查询- SELECT person_number, result_value, elementname FROM (SELECT prd.person_number, dependent.dob, dependent.person_id , dependent.payr

我有一个示例查询-

SELECT person_number, 
           result_value, 
           elementname 
    FROM   (SELECT
                   prd.person_number, 
                   dependent.dob, 
                   dependent.person_id ,
                   dependent.payroll_id
            FROM   pay_pay_relationships_dn prd, 
                   (SELECT dependent.person_id, 
                           dependent.dob, 
                           dependent.person_number 
                    FROM   dependent_tab dependent, 
                           pay_payroll_rel_actions pra 
                    WHERE  pra.payroll_relationship_id = 
                           dependent_tab.payroll_relationship_id 
                           AND Trunc(sysdate) BETWEEN dependent.effective_start_date 
                                                      AND 
                                                      dependent.effective_end_date) dependent
                    
            WHERE  dependent.payroll_id = prd.payroll_id 
                   AND prd.effective_date BETWEEN :p_start_date AND :p_end_date) 
           

是否有一种方法可以在子查询中使用ppa.effective_date-dependent而不是truncsystate

您的查询没有定义别名ppa,因此让我假设您指的是prd.effective_date而不是ppa.effective_date

如果是,那么您描述的是横向连接。这在Oracle 12c版启动版本中得到支持,使用横向或交叉/外部应用语法:


请注意,我还在from子句到stanard中用逗号重写了隐式连接,带有on关键字的显式连接-隐式连接是几十年前的一种旧语法,不应该在新代码中使用。

别名ppa在哪里定义?也许其中一个已经定义了?你是说珠三角生效日期?你为什么需要这个?此查询中不需要嵌套子查询。@SayanMalakshinov为什么会这样?您选择不使用正确、明确、标准、可读的联接语法有什么原因吗?至少OP显示的查询不需要侧向/交叉应用。由于横向视图解相关转换,您的查询将由CBO从横向连接重写为内部连接。隐式连接是一种古老的语法——基本上是原生Oracle语法,CBO将几乎所有ANSI显式连接转换为自己的原生语法。
SELECT 
    person_number, 
    result_value, 
    elementname 
FROM (
    SELECT
        prd.person_number, 
        dep.dob, 
        dep.person_id ,
        dep.payroll_id
    FROM pay_pay_relationships_dn prd
    CROSS APPLY (
        SELECT 
            dep.person_id, 
            dep.dob, 
            dep.person_number 
        FROM dependent_tab dep
        INNER JOIN pay_payroll_rel_actions pra 
            ON pra.payroll_relationship_id = dep.payroll_relationship_id 
        WHERE 
            dep.payroll_id = prd.payroll_id 
            AND prd.effective_date BETWEEN dep.effective_start_date AND dep.effective_end_date
    ) dep
    WHERE prd.effective_date BETWEEN :p_start_date AND :p_end_date
) t