Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / добавить строку в вывод select, если её нет в таблице / 10 сообщений из 10, страница 1 из 1
04.08.2021, 15:53
    #40088667
amadis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавить строку в вывод select, если её нет в таблице
Уважаемые коллеги, прошу подсказки:

есть таблица T

Код: plaintext
1.
2.
3.
4.
col1|col2
---------
A   |  1
B   |  2

Иногда в ней нет строки В. Надо написать запрос, который всегда выводит строки А и В, даже если нет строки В, но в этом случае в col2 должно выводиться 0.

Т.е. в случае
Код: plaintext
1.
2.
3.
4.
col1|col2
---------
A   |  1
B   |  2

выводится
Код: plaintext
1.
2.
A   |  1
B   |  2

А в случае если Т
Код: plaintext
1.
2.
3.
col1|col2
---------
A   |  1


выводится
Код: plaintext
1.
2.
A   |  1
B   |  0

Сейчас делаю так:
Код: sql
1.
2.
3.
4.
5.
select col1, sum(col2) B from (
        SELECT col1, col2 FROM T
         UNION
        SELECT 'B' col1, 0 col2 FROM T;
) group by col1


но понимаю, что можно как-то более красиво... Подскажите, пожалуйста, как...
...
Рейтинг: 0 / 0
04.08.2021, 16:13
    #40088679
amadis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавить строку в вывод select, если её нет в таблице
Ой, простите,
Код: sql
1.
2.
3.
4.
5.
select col1, sum(col2) B from (
        SELECT col1, col2 FROM T
         UNION
        SELECT 'B' col1, 0 col2 FROM dual;
) group by col1


конечно же
...
Рейтинг: 0 / 0
04.08.2021, 16:51
    #40088684
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавить строку в вывод select, если её нет в таблице
amadis
Ой, простите,
конечно же

UNION ALL

ps
можно
a full outer join b on (b.col1=a.col1)
запутано и некрасиво

.....
stax
...
Рейтинг: 0 / 0
04.08.2021, 17:04
    #40088686
amadis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавить строку в вывод select, если её нет в таблице
Stax,

UNION, UNION ALL - мне кажется, что тут без разницы...
...
Рейтинг: 0 / 0
04.08.2021, 17:07
    #40088688
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавить строку в вывод select, если её нет в таблице
amadis
Stax,

UNION, UNION ALL - мне кажется, что тут без разницы...


Это тебе только кажется:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
SQL> explain plan for select 1 x from dual union all select 2 from dual;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3964740403

-----------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     2 |     4   (0)| 00:00:01 |
|   1 |  UNION-ALL       |      |       |            |          |
|   2 |   FAST DUAL      |      |     1 |     2   (0)| 00:00:01 |
|   3 |   FAST DUAL      |      |     1 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------

10 rows selected.

SQL> explain plan for select 1 x from dual union select 2 from dual;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 4080566713

-----------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     2 |     6  (34)| 00:00:01 |
|   1 |  SORT UNIQUE     |      |     2 |     6  (34)| 00:00:01 |
|   2 |   UNION-ALL      |      |       |            |          |
|   3 |    FAST DUAL     |      |     1 |     2   (0)| 00:00:01 |
|   4 |    FAST DUAL     |      |     1 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------

11 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
04.08.2021, 17:49
    #40088705
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавить строку в вывод select, если её нет в таблице
amadis
Stax,

UNION, UNION ALL - мне кажется, что тут без разницы...


если две/одна строка то да
но
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with a as (
    select 'A' col1,1 col2 from dual union all
    select 'A' col1,1 col2 from dual union all
    select 'C' col1,5 col2 from dual 
)
, b as (select 'B' col1,0 /*null*/ col2 from dual)
select 
  col1,
  sum(col2) s
from (
    select * from a
    union --all
    select * from b
)
group by col1



....
stax
...
Рейтинг: 0 / 0
05.08.2021, 09:46
    #40088776
amadis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавить строку в вывод select, если её нет в таблице
SY, спасибо за объяснение.
Таким образом сейчас запрос стал

Код: plsql
1.
2.
3.
4.
5.
select col1, sum(col2) B from (
        SELECT col1, col2 FROM T
         UNION ALL
        SELECT 'B' col1, 0 col2 FROM dual;
) group by col1



А ещё в более "красивый" вид его нельзя переписать? Три селекта с union - чтобы добавить одну строку - неужели это оптимальный способ?
...
Рейтинг: 0 / 0
05.08.2021, 10:45
    #40088796
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавить строку в вывод select, если её нет в таблице
amadis

А ещё в более "красивый" вид его нельзя переписать?

создаёшь справочник, где перечисляешь все нужные значения
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table dict as 
SELECT 'A' col1 FROM dual
UNION ALL
SELECT 'B' col1 FROM dual;

select d.col1, sum(coalesce(T.col2,0))
from dict d 
left join T on T.col1 = d.col1
group by d.col1


Это если проектировать.

Если нельзя таблицы создавать, то используешь аналогичный СТЕ
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with dict as 
(SELECT 'A' col1 FROM dual
UNION ALL
SELECT 'B' col1 FROM dual)
select d.col1, sum(coalesce(T.col2,0))
from dict d 
left join T on T.col1 = d.col1
group by d.col1
...
Рейтинг: 0 / 0
05.08.2021, 14:01
    #40088888
qlost
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавить строку в вывод select, если её нет в таблице
Добавить во 2й селект
Код: plsql
1.
where not exists (select * from t where col1='B')

не очень нравится?
И избавиться от ненужного group
...
Рейтинг: 0 / 0
06.08.2021, 09:16
    #40089071
amadis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавить строку в вывод select, если её нет в таблице
Спасибо всем откликнувшимся!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / добавить строку в вывод select, если её нет в таблице / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]