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

есть таблица 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
добавить строку в вывод select, если её нет в таблице
    #40088679
amadis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой, простите,
Код: 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
добавить строку в вывод select, если её нет в таблице
    #40088684
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amadis
Ой, простите,
конечно же

UNION ALL

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

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

UNION, UNION ALL - мне кажется, что тут без разницы...
...
Рейтинг: 0 / 0
добавить строку в вывод select, если её нет в таблице
    #40088688
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
добавить строку в вывод select, если её нет в таблице
    #40088705
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
добавить строку в вывод select, если её нет в таблице
    #40088776
amadis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
добавить строку в вывод select, если её нет в таблице
    #40088796
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
добавить строку в вывод select, если её нет в таблице
    #40088888
qlost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавить во 2й селект
Код: plsql
1.
where not exists (select * from t where col1='B')

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


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