Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将值从主选择查询传递到子查询_Sql_Sql Server_Database_Oracle_Subquery - Fatal编程技术网

Sql 如何将值从主选择查询传递到子查询

Sql 如何将值从主选择查询传递到子查询,sql,sql-server,database,oracle,subquery,Sql,Sql Server,Database,Oracle,Subquery,嗨!我正在使用oracle DB并尝试运行此查询,但它在子查询中的“c.serno”上给了我标识符错误。请帮助我解决此错误?谢谢。您必须使用左外部联接,而不是如图所示的纯子查询 SELECT c.serno, NVL ( (SELECT t1.newvalue FROM ( SELECT newvalue FROM applog WHER

嗨!我正在使用oracle DB并尝试运行此查询,但它在子查询中的“c.serno”上给了我标识符错误。请帮助我解决此错误?谢谢。

您必须使用左外部联接,而不是如图所示的纯子查询

    SELECT c.serno,
       NVL (
          (SELECT t1.newvalue
             FROM (  SELECT newvalue
                       FROM applog
                      WHERE     TABNAME = 'cextension'
                            AND rowserno = c.serno -- ERROR
                            AND colname = 'A11103'
                   ORDER BY datetimestamp DESC) t1
            WHERE ROWNUM = 1),
          (SELECT t2.newvalue
             FROM (  SELECT newvalue
                       FROM archapplog
                      WHERE     TABNAME = 'cextension'
                            AND rowserno = c.serno -- ERROR
                            AND colname = 'A11103'
                   ORDER BY datetimestamp DESC) t2
            WHERE ROWNUM = 1)) AS "JoinCreditShieldProgram"
  FROM caccounts c

一个可能更容易阅读和理解的查询(尽管您需要测试性能)是:


个人而言,如果我必须从两个单独的表中获取最后一个值,然后必须在这两个表之间进行NVL,我更喜欢使用最后一个值分析函数

SELECT c.serno,
     NVL(t1.newvalue, t2.newvalue) AS "JoinCreditShieldProgram"
FROM   caccounts c
       LEFT OUTER JOIN (SELECT rowserno,
                               newvalue,
                               row_number() OVER (PARTITION BY rowserno ORDER BY datetimestamp DESC) rn
                        FROM   applog
                        WHERE  tabname = 'cextension'
                        AND    colname = 'A11103') t1 ON c.serno = t1.rowserno AND t1.rn = 1
       LEFT OUTER JOIN (SELECT rowserno,
                               newvalue,
                               row_number() OVER (PARTITION BY rowserno ORDER BY datetimestamp DESC) rn
                        FROM   archapplog
                        WHERE  tabname = 'cextension'
                        AND    colname = 'A11103') t2 ON c.serno = t2.rowserno AND t2.rn = 1;

第一个问题是对查询使用旧的联接语法。您需要了解这种关系,并且您的查询对您来说相当复杂。您指出这与oracle数据库关联,但您有一个sql server标记。这似乎不正确。另外,您能否澄清抛出的错误?您使用的是MS SQL Server还是Oracle?不要标记未涉及的产品。这将从applog和archapplog中没有任何值的caccounts中筛选出行。此处需要左外部联接,而不是内部联接。此外,OP正在从applog和archapplog中查找最新的行,而不是所有的行。是的,为了得到准确的结果,需要进行一些更改,因此,我更新了我的查询。希望它能按需要工作。恐怕它仍在进行内部连接。如果使用ANSI join语法,就可以避免这个问题。(谓词中所有a和b列上缺少(+)表示您实际上在进行内部联接)
I am not sure why you are using inline view in your query statement.
It is not required you can directly put "rownum" limit and even in more simple way, like below-

SELECT * 
FROM   (SELECT c.serno, 
               Nvl (a.newvalue, b.newvalue) AS "JoinCreditShieldProgram" 
        FROM   caccounts c 
               LEFT OUTER JOIN applog a 
                            ON c.serno = a.rowserno 
               LEFT OUTER JOIN archapplog b 
                            ON c.serno = b.rowserno 
        WHERE  a.tabname = 'cextension' 
               AND a.colname = 'A11103' 
               AND b.tabname = 'cextension' 
               AND b.colname = 'A11103' 
        ORDER  BY a.datetimestamp DESC, 
                  b.datetimestamp DESC) 
WHERE  rownum = 1; 
SELECT c.serno,
     NVL(t1.newvalue, t2.newvalue) AS "JoinCreditShieldProgram"
FROM   caccounts c
       LEFT OUTER JOIN (SELECT rowserno,
                               newvalue,
                               row_number() OVER (PARTITION BY rowserno ORDER BY datetimestamp DESC) rn
                        FROM   applog
                        WHERE  tabname = 'cextension'
                        AND    colname = 'A11103') t1 ON c.serno = t1.rowserno AND t1.rn = 1
       LEFT OUTER JOIN (SELECT rowserno,
                               newvalue,
                               row_number() OVER (PARTITION BY rowserno ORDER BY datetimestamp DESC) rn
                        FROM   archapplog
                        WHERE  tabname = 'cextension'
                        AND    colname = 'A11103') t2 ON c.serno = t2.rowserno AND t2.rn = 1;
SELECT DISTINCT
  c.serno, 
  LAST_VALUE(logs.newvalue) over 
    ( partition by logs.rowserno order by logs.datetimestamp 
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS "JoinCreditShieldProgram"
FROM
  caccounts c
LEFT JOIN
  (
    SELECT rowserno, newvalue, datetimestamp 
    FROM applog
    WHERE tabname = 'cextension' AND colname = 'A11103'
    UNION
    SELECT rowserno, newvalue, datetimestamp 
    FROM archapplog
    WHERE tabname = 'cextension' AND colname = 'A11103'
  ) logs
ON
  c.serno = logs.rowserno;