Oracle 变更为存在

Oracle 变更为存在,oracle,exists,Oracle,Exists,我有两个问题: 问题#1 问题2 如何将第一次查询的clrn\u id和第二次查询的B.eid更改为EXISTS函数?bankid、branchid和ackt\u id是否也可以更改为EXISTS函数 提前谢谢 我希望它能帮助您: SELECT B.eid FROM JBB B JOIN ( ( SELECT eid FROM pbank A WHERE (bankid,branchid) IN (

我有两个问题:

问题#1

问题2

如何将第一次查询的
clrn\u id
和第二次查询的
B.eid
更改为EXISTS函数?
bankid
branchid
ackt\u id
是否也可以更改为EXISTS函数


提前谢谢

我希望它能帮助您:

SELECT B.eid
FROM JBB B
JOIN
(
    (
        SELECT eid
        FROM pbank A
        WHERE (bankid,branchid) IN 
        (
            SELECT bankid  ,branchid  
            FROM pbranch 
            WHERE sourceid = 'BNIATB'
            AND estat='A'
        )
        AND ESTAT = 'A'
        AND acct_type = 'S'
        AND acct_id = (
                select max(D.acct_id) 
                from pbank D 
                where D.eid = A.eid
                AND D.ESTAT = 'A'
                AND D.acct_type = 'S')
     )
) C on B.eid = c.EID
SELECT B.eid
FROM JBB B
where exists
(
    SELECT 1
    FROM pbank A
    WHERE exists
        (
            SELECT 1 
            FROM pbranch PB
            WHERE PB.sourceid = :1
            AND PB.estat=:2
            and PB.bankid  = A.bankid
            AND PB.branchid  = A.branchid
        )
        AND ESTAT = :2
        AND acct_type = :3
        AND A.eid = B.eid
        AND acct_id = (
                select max(D.acct_id) 
                from pbank D 
                where D.eid = A.eid
                AND D.eid = B.eid
                AND D.ESTAT = :2
                AND D.acct_type = :3)
)
您可以将其更改为存在的
,但您可能希望
加入

SELECT B.eid
  FROM JBB B
  JOIN ( SELECT eid, estat, acct_type, acct_id
              , max(acct_id) over ( partition by eid ) as max_acct
           FROM pbank 
                ) A
    ON b.eid = a.eid
  JOIN pbranch C
    ON a.bankid = c.bankid
   AND a.branchid = c.brahchid
 WHERE c.sourceid = :1
   AND c.estat = :2
   AND a.ESTAT = :3
   AND a.acct_type = :4
   AND a.acct_id = a.max_acct
通过使用分析函数
max()
,您无需进行子选择;我认为,以这种方式做事也要清楚得多


并且,新添加的查询变成:

SELECT A1.clrn_id, A1.gpgroup, A1.cl_id
  FROM p_dtl A1
  JOIN gp_cl_rn run
    ON A1.clrn_id = run.clrn_id
 WHERE A1.PYMT_DT = TO_DATE(:1 ,'YYYY-MM-DD') 
   AND run.clrn_id = a1.clrn_id 
   AND run.finalized_ind = :2
我注意到您显式地使用了
to_date()
函数,这意味着您将日期存储为字符串。这是不好的做法,从长远来看可能会给你带来麻烦。。。尽可能避免


是一个;这与聚合函数
max()
的作用完全相同,只是它不需要GROUP BY,而是为结果集中的每一行返回相同的结果

此特定用法返回每个
eid
的最大
帐户id
。有很多分析函数,但最好的办法是自己尝试一下。网上也有

使用连接并不一定比存在的
更快,它只是取决于您的目标。对于所有的事情,我都会建议你尝试这两种方法,看看什么更适合你的特殊情况


一般来说,它们有不同的目的<代码>存在时
用于在找到满足条件的单行时停止“计算”行。加入,做一切。在你的情况下,因为你想要的一切,他们之间可能没有什么可选择的,但我会一直使用加入;只需确保您的索引是正确的。

您确定这两个查询是等效的吗?需要注意的一件事是当内部select返回空值时的行为。@YPERCU可能非常接近,但不确定它是否是正确的联接类型。您能详细解释一下(
max(acct_id))over(按eid分区)
?我对这一点完全不熟悉:)哦,使用联接而不是EXISTS有什么性能差异吗?顺便说一句,谢谢你的快速回复!我认为绑定变量需要编辑,
estat
应该具有相同的绑定,对吗?我刚刚编辑了我的:)@RedFux227,我已经更新了我的答案。但是绑定变量是正确的;你不能重复使用它们。所以estat不应该包含相同的变量?不过,谢谢你的解释!哦,所以我可以选择使用JOIN或Exists,对吗?它们都将返回相同的值,对吗?提前谢谢!谢谢你的快速回复!顺便问一下,选择1是什么意思?为什么不改为使用SELECT eid?@RedFux227,这没什么区别;它们在功能上是等价的,您不会使用该值。如果需要,您可以使用
select null…
select*…
。优化器非常聪明,知道您不想返回任何内容。所以我仍然可以使用select eid,对吗?我认为使用select*会减慢查询速度hahaha@RedFux227不,不会的。在
exists
子查询中,您可以编写任何您想要的内容,并且不会减慢查询速度。。。优化器很好。这取决于RDBMS引擎,设置
select 1
以提高性能是很好的做法。也许对于ORACLE来说没有区别,但是对于其他RDBMS来说,它会减慢查询速度。当您使用
select*
时,所有列都将返回,因此它会减慢查询速度。另一个原因:当我看到
select 1
时,我知道它是
如果存在的话(
:)。
SELECT B.eid
  FROM JBB B
  JOIN ( SELECT eid, estat, acct_type, acct_id
              , max(acct_id) over ( partition by eid ) as max_acct
           FROM pbank 
                ) A
    ON b.eid = a.eid
  JOIN pbranch C
    ON a.bankid = c.bankid
   AND a.branchid = c.brahchid
 WHERE c.sourceid = :1
   AND c.estat = :2
   AND a.ESTAT = :3
   AND a.acct_type = :4
   AND a.acct_id = a.max_acct
SELECT A1.clrn_id, A1.gpgroup, A1.cl_id
  FROM p_dtl A1
  JOIN gp_cl_rn run
    ON A1.clrn_id = run.clrn_id
 WHERE A1.PYMT_DT = TO_DATE(:1 ,'YYYY-MM-DD') 
   AND run.clrn_id = a1.clrn_id 
   AND run.finalized_ind = :2
max(acct_id) over ( partition by eid )