4 запроса в выписке - PullRequest
       8

4 запроса в выписке

0 голосов
/ 30 января 2019

У меня 4 запроса

1.query = (select /*smthing*/ from my_table where /*conditions*/ and rownum = 1)
2.query = (select /*smthing*/ from my_table where /*conditions*/ and rownum = 1)
3.query = (select /*smthing*/ from my_table where /*conditions*/ and rownum = 1)
4.query = (select /*smthing*/ from my_table where /*conditions*/ and rownum = 1)

Все запросы работают нормально.

Я хочу использовать CASE statement:

 Case 
      when 1.query = NULL then 2.query
      when 2. query = NULL then 3.query
      else 4.query
 END

Iхочу получить только 1 результат .Но он возвращает более 1 результата.

Как я могу это исправить?

Ответы [ 4 ]

0 голосов
/ 30 января 2019

Я бы объединил все это в одно выражение:

select s.*
from (select /*smthing*/,
             row_number() over (order by case when <conditions1> then 1
                                              when <conditions2> then 2
                                              when <conditions3> then 3
                                              when <conditions4> then 4
                                              else 5
                                         end
                               ) as seqnum
      from my_table 
     ) s
where seqnum = 1
0 голосов
/ 30 января 2019

В схеме Скотта со следующими данными:

SQL> select * from dept order by deptno;

    DEPTNO DNAME                LOC
---------- -------------------- --------------------
        10 ACCOUNTING           NEW YORK
        20 RESEARCH             DALLAS
        30 SALES                CHICAGO
        40 OPERATIONS           BOSTON

SQL> select * from emp  order by deptno;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7782 CLARK      MANAGER         7839 09.06.81       2450                    10
      7839 KING       PRESIDENT            17.11.81      10000                    10
      7934 MILLER     CLERK           7782 23.01.82       1300                    10
      7566 JONES      MANAGER         7839 02.04.81       2975                    20
      7902 FORD       ANALYST         7566 03.12.81       3000                    20
      7876 ADAMS      CLERK           7788 12.01.83       1100                    20
      7369 SMITH      CLERK           7902 17.12.80        920                    20
      7788 SCOTT      ANALYST         7566 09.12.82       3000                    20
      7521 WARD       SALESMAN        7698 22.02.81       1250        500         30
      7844 TURNER     SALESMAN        7698 08.09.81       1500          0         30
      7499 ALLEN      SALESMAN        7698 20.02.81       1600        300         30
      7900 JAMES      CLERK           7698 03.12.81        950                    30
      7698 BLAKE      MANAGER         7839 01.05.81       2850                    30
      7654 MARTIN     SALESMAN        7698 28.09.81       1250       1400         30

14 rows selected.

SQL> select * from bonus;

ENAME      JOB              SAL       COMM
---------- --------- ---------- ----------
KING       PRESIDENT       1000        100

запрос, использующий UNION (что означает, что список столбцов всех запросов, которые вы используете, должны совпадать по числу и типу данных), может выглядеть следующим образом;первый возвращенный столбец показывает, какому запросу принадлежит результирующий набор.

SQL> with
  2    q1 as (select 'q1' what, deptno, dname, null from dept  where deptno = &par_deptno),
  3    q2 as (select 'q2' what, deptno, ename, job  from emp   where job = '&par_job'),
  4    q3 as (select 'q3' what, null  , ename, job  from bonus where ename = '&par_ename'),
  5    --
  6    qc1 as (select count(*) cnt from q1),
  7    qc2 as (select count(*) cnt from q2),
  8    qc3 as (select count(*) cnt from q3)
  9    --
 10  select q1.* from q1 join qc1 on 1 = 1 join qc2 on 1 = 1 where qc1.cnt > 0
 11  union all
 12  select q2.* from q2 join qc2 on 1 = 1 join qc1 on 1 = 1 where qc2.cnt > 0 and qc1.cnt = 0
 13  union all
 14  select q3.* from q3 join qc3 on 1 = 1 join qc1 on 1 = 1 join qc2 on 1 = 1
 15      where qc3.cnt > 0 and qc1.cnt = 0 and qc2.cnt = 0;
Enter value for par_deptno: 10
Enter value for par_job: CLERK
Enter value for par_ename: WHO

WH     DEPTNO DNAME                NULL
-- ---------- -------------------- ---------
q1         10 ACCOUNTING

SQL> /
Enter value for par_deptno: 15
Enter value for par_job: CLERK
Enter value for par_ename: WHO

WH     DEPTNO DNAME                NULL
-- ---------- -------------------- ---------
q2         20 SMITH                CLERK
q2         20 ADAMS                CLERK
q2         30 JAMES                CLERK
q2         10 MILLER               CLERK

SQL> /
Enter value for par_deptno: 15
Enter value for par_job: NONE
Enter value for par_ename: KING

WH     DEPTNO DNAME                NULL
-- ---------- -------------------- ---------
q3            KING                 PRESIDENT

SQL>
0 голосов
/ 30 января 2019

Вы можете сделать это несколькими различными способами, одним из простых способов является следующий:

  select * from(
    (query1)
    UNION
    (query2)
     UNION
    (query3)
     UNION
    (query4)   ) where rownum = 1

это означает:

  select * from(
    (select /*smthing*/ from my_table where /*conditions*/ and rownum = 1)
    UNION
    (select /*smthing*/ from my_table where /*conditions*/ and rownum = 1)
     UNION
    (select /*smthing*/ from my_table where /*conditions*/ and rownum = 1)
     UNION
    (select /*smthing*/ from my_table where /*conditions*/ and rownum = 1)
  ) where rownum = 1

порядок запросов важен.

0 голосов
/ 30 января 2019

В SQL = не используется с NULL.Всегда пытайтесь использовать IS NULL или NOT NULL и т. Д. Попробуйте, как показано ниже:

Case 
      when 1.query IS NULL then 2.query
      when 2. query IS NULL then 3.query
      else 4.query
 END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...