oracle 如果第一个查询不返回任何内容,则返回第二个查询的结果,否则不返回任何内容

gpnt7bae  于 2023-11-17  发布在  Oracle
关注(0)|答案(2)|浏览(181)

我在生成执行以下操作的查询时遇到问题

If query1 returns 0 rows
    then return results of query2
else
    return nothing

字符串
联合和联合不是答案
第一个查询看起来像这样:

SELECT aa.id from A aa JOIN B bb on aa.id=bb.pid where bb.pid = 10 and aa.sid IS NOT NULL


第二个查询看起来像这样:

SELECT aa.id from A aa JOIN B bb on aa.id=bb.pid where bb.pid = 10 and aa.sid IS NULL


我已经可以运行第二个查询并返回sid列,然后检查它是否存在于结果中,但我希望弄清楚如何将其作为单个查询来执行。

fdx2calv

fdx2calv1#

主要思想是过滤NOT EXISTS query 1-result,类似于:

select ... "query2" where not exists (select ... "query1")

字符串
对你来说就是:

SELECT aa.id from A aa JOIN B bb on aa.id=bb.pid
where bb.pid = 10 and aa.sid IS NULL
  AND NOT EXISTS (
      SELECT aa.id from A aa JOIN B bb on aa.id=bb.pid
      where bb.pid = 10 and aa.sid IS NOT NULL)

mwyxok5s

mwyxok5s2#

不要使用两个查询,在一个查询中完成所有查询。
在Oracle 12中,您可以使用ORDER BY首先对非NULL行进行排序,然后是NULL行,然后是FETCH FIRST ROW WITH TIES以获取所有非NULL的行,然后如果它们不存在,则是NULL行,然后您可以使用内联视图进行过滤,以仅显示NULLsid行:

SELECT id
FROM   (
  SELECT aa.id, aa.sid
  FROM   A aa
         JOIN B bb
         on aa.id=bb.pid
  WHERE  bb.pid = 10
  ORDER BY CASE WHEN aa.sid IS NULL THEN 1 ELSE 0 END ASC
  FETCH FIRST ROW WITH TIES
)
WHERE  sid IS NULL;

字符串
如果您使用的是Oracle 11或更早版本,则可以使用RANK分析函数:

SELECT id
FROM   (
  SELECT aa.id,
         aa.sid,
         RANK() OVER (ORDER BY CASE WHEN aa.sid IS NULL THEN 1 ELSE 0 END ASC)
           AS rnk
  FROM   A aa
         JOIN B bb
         on aa.id=bb.pid
  WHERE  bb.pid = 10
)
WHERE  rnk = 1
AND    sid IS NULL;


或者使用解析函数COUNT来计算非NULLsid值的数量:

SELECT id
FROM   (
  SELECT aa.id,
         aa.sid,
         COUNT(aa.sid) OVER () AS num_sid
  FROM   A aa
         JOIN B bb
         on aa.id=bb.pid
  WHERE  bb.pid = 10
)
WHERE  num_sid = 0;


或者你可以使用NOT EXISTS(尽管这将比前面的查询效率低,因为它将从表中读取两次,而前面的查询只从表中读取一次):

SELECT aa.id
FROM   A aa
       JOIN B bb
       on aa.id=bb.pid
WHERE  bb.pid = 10
AND    aa.sid IS NULL
AND    NOT EXISTS(
         SELECT 1
         FROM   A aa
                JOIN B bb
                on aa.id=bb.pid
         WHERE  bb.pid = 10
         AND    aa.sid IS NOT NULL
       );


fiddle

相关问题