Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Узнать имя схемы из объединенного запроса по нескольким схемам / 9 сообщений из 9, страница 1 из 1
20.02.2022, 16:07
    #40135381
dxdy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать имя схемы из объединенного запроса по нескольким схемам
Доброго времени суток, есть ли способ узнать имя схемы из запроса вида:
SELECT * FROM (
SELECT * FROM schema1.table union
SELECT * FROM schema2.table )

??? Результат возвращается, только не понятно из какой схемы.
...
Рейтинг: 0 / 0
20.02.2022, 16:29
    #40135384
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать имя схемы из объединенного запроса по нескольким схемам
dxdy
Доброго времени суток, есть ли способ узнать имя схемы из запроса вида:
Код: plsql
1.
2.
3.
SELECT * FROM (
SELECT * FROM schema1.table union
SELECT * FROM schema2.table )


??? Результат возвращается, только не понятно из какой схемы.


Узнать то можно, вот только мне кажется постановка задачи какая-то кривая.
Зачем сначала все валить в кучу, а потом разбираться что откуда?
Задача-то какая?

Тем более используется UNION, где результат не детерминирован, какая из одинаковых записей разных таблиц будет использоваться в выводе.

Так-то, rowid - имеет адрес блока, зная его можно найти объект которому принадлежит эта запись.
но это лечение гланд через очень неожиданное отверстие.

памятка:
HOWTO :: Как правильно задавать вопросы
Как мне оформить свое сообщение?
Студентам, желающим помощи

1) Полная постановка задачи (без сокращений)

2) Подготовьте тестовые данные, лучше в виде with
пример (не ваш случай) в конце

3) Покажите что сделали, что получили, без сокращений. ( лучше не в виде screenshot)

4) используйте Тэги, читать код без них неудобно, правильно оформляйте сообщение

Пример подготовленных данных, запроса и вывода.
Код: 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.
-- table 1 with column list
with user_tab(user_id,user_name,registry_date) as (
select 1,'Bob',to_date('11.02.1921 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual union all
select 2,'Max',to_date('11.02.1922 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual union all
select 3,'Jon',to_date('11.02.1923 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual
)
-- table 2 with column list
,user_post(post_id,user_id,parent_post_id,post_date,message) as (
select 100,1,null,to_date('11.02.1923 23:04:00','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 101,2,100,to_date('11.02.1923 23:05:23','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 102,3,100,to_date('11.02.1923 23:05:35','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 103,1,102,to_date('11.02.1923 23:06:00','DD.MM.YYYY HH24:MI:SS'),'How are you' from dual union all
select 104,2,102,to_date('11.02.1923 23:07:05','DD.MM.YYYY HH24:MI:SS'),'All right!' from dual union all
select 105,1,101,to_date('11.02.1923 23:06:21','DD.MM.YYYY HH24:MI:SS'),'Bye' from dual union all
select 106,1,104,to_date('11.02.1923 23:04:37','DD.MM.YYYY HH24:MI:SS'),'Bye' from dual union all
select 107,2,null,to_date('11.02.1923 23:08:56','DD.MM.YYYY HH24:MI:SS'),'Hmm' from dual
)
select
rpad(to_char(p.post_date,'YYYY-MM-DD HH24:MI:SS  '),20+level*2,' ')||u.user_name||': '||p.message as txt
from 
 user_post p
 join user_tab  u on ( p.user_id = u.user_id)
where p.post_date >= u.registry_date
start with p.parent_post_id is null 
connect by prior p.post_id=p.parent_post_id 
;

TXT
--------------------------------------------------------------------------------
1923-02-11 23:04:00   Bob: Hi
1923-02-11 23:05:23     Max: Hi
1923-02-11 23:06:21       Bob: Bye
1923-02-11 23:05:35     Jon: Hi
1923-02-11 23:06:00       Bob: How are you
1923-02-11 23:07:05       Max: All right!
1923-02-11 23:04:37         Bob: Bye
1923-02-11 23:08:56   Max: Hmm

8 rows selected.
...
Рейтинг: 0 / 0
20.02.2022, 16:37
    #40135385
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать имя схемы из объединенного запроса по нескольким схемам
Только заменив UNION на GROUP BY + LISTAGG.

SY.
...
Рейтинг: 0 / 0
20.02.2022, 16:48
    #40135388
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать имя схемы из объединенного запроса по нескольким схемам
Код: 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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
DROP TABLE T1 PURGE
/
DROP TABLE T2 PURGE
/
CREATE TABLE T1 AS SELECT EMPNO,ENAME,SAL FROM EMP WHERE DEPTNO != 10
/
CREATE TABLE T2 AS SELECT EMPNO,ENAME,SAL FROM EMP WHERE DEPTNO != 20
/
WITH TBL1 AS (
              SELECT  T1.*,
                      'T1' SOURCE
                FROM  T1
             ),
     TBL2 AS (
              SELECT  T2.*,
                      'T2' SOURCE
                FROM  T2
             ),
     TBL3 AS (
               SELECT * FROM TBL1
              UNION ALL
               SELECT * FROM TBL2
             )
SELECT  EMPNO,
        ENAME,
        SAL,
        LISTAGG(SOURCE,',') WITHIN GROUP(ORDER BY SOURCE) SOURCE
  FROM  TBL3
  GROUP BY EMPNO,
           ENAME,
           SAL
  ORDER BY EMPNO,
           ENAME,
           SAL
/

     EMPNO ENAME             SAL SOURCE
---------- ---------- ---------- ----------
      7369 SMITH             800 T1
      7499 ALLEN            1600 T1,T2
      7521 WARD             1250 T1,T2
      7566 JONES            2975 T1
      7654 MARTIN           1250 T1,T2
      7698 BLAKE            2850 T1,T2
      7782 CLARK            2450 T2
      7788 SCOTT            3000 T1
      7839 KING             5000 T2
      7844 TURNER           1500 T1,T2
      7876 ADAMS            1100 T1
      7900 JAMES             950 T1,T2
      7902 FORD             3000 T1
      7934 MILLER           1300 T2

14 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
20.02.2022, 18:57
    #40135400
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать имя схемы из объединенного запроса по нескольким схемам
SY,

TBL1 и TBL2 визуально загромождают запись.
Тег источника вполне сразу прописывается в Union All.

Ну и, в данном случае, ListAgg вполне может быть заменено на Sum().
если вместо 'T1' SOURCE в соответствующей ветке написать 1 as Source,
а вместо 'T2' SOURCE - 2 as Source, тогда значениями Sum(source) as Source будут 1,2, или 3
...
Рейтинг: 0 / 0
20.02.2022, 20:01
    #40135407
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать имя схемы из объединенного запроса по нескольким схемам
booby
SY,

TBL1 и TBL2 визуально загромождают запись.
Тег источника вполне сразу прописывается в Union All.

Ну и, в данном случае, ListAgg вполне может быть заменено на Sum().
если вместо 'T1' SOURCE в соответствующей ветке написать 1 as Source,
а вместо 'T2' SOURCE - 2 as Source, тогда значениями Sum(source) as Source будут 1,2, или 3


TBL1 & TBL2 нужны. Я просто cut & paste не оттуда. Taм должен быть DISTINCT:

Код: 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.
45.
46.
47.
48.
49.
DROP TABLE T1 PURGE
/
DROP TABLE T2 PURGE
/
CREATE TABLE T1 AS SELECT EMPNO,ENAME,SAL FROM EMP WHERE DEPTNO != 10
/
CREATE TABLE T2 AS SELECT EMPNO,ENAME,SAL FROM EMP WHERE DEPTNO != 20
/
SELECT  *
  FROM  T1
/
SELECT  *
  FROM  T2
/
 SELECT  *
   FROM  T1
UNION
  SELECT  *
   FROM  T2
/
WITH TBL1 AS (
              SELECT  DISTINCT
                      T1.*,
                      'T1' SOURCE
                FROM  T1
             ),
     TBL2 AS (
              SELECT  DISTINCT
                      T2.*,
                      'T2' SOURCE
                FROM  T2
             ),
     TBL3 AS (
               SELECT * FROM TBL1
              UNION ALL
               SELECT * FROM TBL2
             )
SELECT  EMPNO,
        ENAME,
        SAL,
        LISTAGG(SOURCE,',') WITHIN GROUP(ORDER BY SOURCE) SOURCE
  FROM  TBL3
  GROUP BY EMPNO,
           ENAME,
           SAL
  ORDER BY EMPNO,
           ENAME,
           SAL
/



Иначе LISTAGG может вылететь с ORA-01489 а SUM ещё хуже - показывать 2 или 3 хотя строки из одной таблица. Но SOURCE можно перенести в 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.
WITH TBL1 AS (
               SELECT * FROM T1
              INTERSECT
               SELECT * FROM T2
             ),
     TBL2 AS (
               SELECT * FROM T1
              MINUS
               SELECT * FROM T2
             ),
     TBL3 AS (
               SELECT * FROM T2
              MINUS
               SELECT * FROM T1
             )
 SELECT TBL1.*,'T1,T2' SOURCE FROM TBL1
UNION ALL
 SELECT TBL2.*,'T1' SOURCE FROM TBL2
UNION ALL
 SELECT TBL3.*,'T2' SOURCE FROM TBL3
/

     EMPNO ENAME             SAL SOURCE
---------- ---------- ---------- ----------
      7499 ALLEN            1600 T1,T2
      7521 WARD             1250 T1,T2
      7654 MARTIN           1250 T1,T2
      7698 BLAKE            2850 T1,T2
      7844 TURNER           1500 T1,T2
      7900 JAMES             950 T1,T2
      7369 SMITH             800 T1
      7566 JONES            2975 T1
      7788 SCOTT            3000 T1
      7876 ADAMS            1100 T1
      7902 FORD             3000 T1
      7782 CLARK            2450 T2
      7839 KING             5000 T2
      7934 MILLER           1300 T2

14 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
20.02.2022, 20:11
    #40135408
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать имя схемы из объединенного запроса по нескольким схемам
Такое подозрение, что у автора стоит задача обрабатывать данные разных удалённых подразделений в некоей куче. Вот и сливают их как-то на один сервер в разные схемы, а потом в общей аналитике нужно как-то их различать.
...
Рейтинг: 0 / 0
20.02.2022, 21:06
    #40135416
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать имя схемы из объединенного запроса по нескольким схемам
SY

Taм должен быть DISTINCT:
...а SUM ещё хуже ...

ok, ok...
В свежих версиях под это появились агрегатные функции, возвращающие raw.

Ответ предполагает, что спрашивающий точно понимает смысл слов, которые произносит, в частности, что такое union.
На что ни малейшего намека нет.

PS
Вот эта тема точно схожего рода задачей рождалась.
https://www.sql.ru/forum/1329204/msb-most-significant-bit-na-pl-sql-est-gotovyy
...
Рейтинг: 0 / 0
21.02.2022, 10:27
    #40135523
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать имя схемы из объединенного запроса по нескольким схемам
SY

SUM ещё хуже


Код: 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.
  1  with t1 (id_ref) as (
  2   select 1 from dual union all
  3   select 1 from dual union all
  4   select 2 from dual union all
  5   select 2 from dual union all
  6   select 3 from dual)
  7  , t2 (id_ref) as (
  8   select 1 from dual union all
  9   select 2 from dual union all
 10   select 3 from dual union all
 11   select 4 from dual union all
 12   select 4 from dual union all
 13   select 4 from dual)
 14  , t3 (id_ref) as (
 15   select 1 from dual union all
 16   select 5 from dual union all
 17   select 5 from dual)
 18  select id_ref,sum(distinct source) source from (
 19    select id_ref,1 source from t1
 20    union all
 21    select id_ref,10 source from t2
 22    union all
 23    select id_ref,100 source from t3
 24  )
 25  group by id_ref
 26* order by 1
SQL> /

    ID_REF     SOURCE
---------- ----------
         1        111
         2         11
         3         11
         4         10
         5        100

SQL>


или
битовую маску

....
stax
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Узнать имя схемы из объединенного запроса по нескольким схемам / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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