Sql 如何将值从主选择查询传递到子查询
嗨!我正在使用oracle DB并尝试运行此查询,但它在子查询中的“c.serno”上给了我标识符错误。请帮助我解决此错误?谢谢。您必须使用左外部联接,而不是如图所示的纯子查询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
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;