помогите с запросом...

Tantor
Дата: 16.09.2004 21:13:40
Доброго времени суток.
Есть две таблицы.
В каждой таблице есть поле a.

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

например:
имеется:
a1.a  a2.a
-----------
a a
b d
c
на выходе:

val t1 t2
----------
a a1
b a1
d a2
c a1

Спасибо.

P.S. может кому понадобится :)
create table a1 (a varchar2(10));
create table a2 (a varchar2(10));
insert into a1(a)values('a');
insert into a1(a)values('b');
insert into a1(a)values('c');
insert into a2(a)values('a');
insert into a2(a)values('d');
Andrew Max
Дата: 16.09.2004 21:42:57
Tantor
Доброго времени суток.
Есть две таблицы.
В каждой таблице есть поле a.

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

например:
имеется:
a1.a  a2.a
-----------
a a
b d
c
на выходе:

val t1 t2
----------
a a1
b a1
d a2
c a1

Спасибо.

P.S. может кому понадобится :)
create table a1 (a varchar2(10));
create table a2 (a varchar2(10));
insert into a1(a)values('a');
insert into a1(a)values('b');
insert into a1(a)values('c');
insert into a2(a)values('a');
insert into a2(a)values('d');


Приветствую.

Попробуйте вот это:

select a1a2.a as val, 
 (case when a1a2.a in (select a from a1) then 'a1' else null end) as t1,
 (case when a1a2.a in (select a from a2) then 'a2' else null end) as t2
 from (select * from a1 union select * from a2) a1a2;

Только имейте в виду, результат получается таким:

VAL        T1 T2
---------- -- --
a          a1 a2
b          a1 
c          a1 
d             a2

У Вас же в первой строке предполагаемого результат значится:

val t1  t2
----------
a   a1

Но ведь значение a есть и в таблице a1, и в a2? Тут не совсем понятно, что нужно делать. Запрос, который я привел, выдает ссылку и на a1, и на a2.
B
Дата: 17.09.2004 02:00:28
Andrew Max
Tantor
Доброго времени суток.
Есть две таблицы.
В каждой таблице есть поле a.

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

например:
имеется:
a1.a  a2.a
-----------
a a
b d
c
на выходе:

val t1 t2
----------
a a1
b a1
d a2
c a1

Спасибо.

P.S. может кому понадобится :)
create table a1 (a varchar2(10));
create table a2 (a varchar2(10));
insert into a1(a)values('a');
insert into a1(a)values('b');
insert into a1(a)values('c');
insert into a2(a)values('a');
insert into a2(a)values('d');


Приветствую.

Попробуйте вот это:

select a1a2.a as val, 
 (case when a1a2.a in (select a from a1) then 'a1' else null end) as t1,
 (case when a1a2.a in (select a from a2) then 'a2' else null end) as t2
 from (select * from a1 union select * from a2) a1a2;

Только имейте в виду, результат получается таким:

VAL        T1 T2
---------- -- --
a          a1 a2
b          a1 
c          a1 
d             a2

У Вас же в первой строке предполагаемого результат значится:

val t1  t2
----------
a   a1

Но ведь значение a есть и в таблице a1, и в a2? Тут не совсем понятно, что нужно делать. Запрос, который я привел, выдает ссылку и на a1, и на a2.


No mozhno zdes' u vas koe-chto nemnogo dobavit' i tigda vse poluchitsa:

SQL> select val, (case when tbl1 is not null and tbl2 is not null then tbl1
2 end) tbl1,
3 (case when tbl1 is null and tbl2 is not null then tbl2 end) tbl2
4 from (
5 select a val, max(decode(tbl,'a1', tbl)) tbl1,
6 max(decode(tbl,'a1',' ', 'a2', 'a2')) tbl2 from (
7 select distinct a, tbl from (
8 select a a, 'a1' tbl from a1
9 union
10 select a a, 'a2' tbl from a2))vst
11 group by a);

VAL TB1 TB2
---------- -- --
a a1
b a1
c a1
d a2

No vse eto mozhno sdelat' s Analytic functions o kotorih v kontse rabochego dna mne dumat' ne hotsa.
Stax
Дата: 17.09.2004 09:57:11
  1  select a val
  2   ,decode(min(w),1,'a1') t1
  3   ,decode(min(w),2,'a2') t2
  4  from (
  5   select a,1 w from a1
  6   union all
  7   select a,2 from a2) t
  8* group by a
SQL> /

VAL        T1 T2
---------- -- --
a          a1
b          a1
c          a1
d             a2

SQL> 

Или что-то упустил?

Tantor
Дата: 17.09.2004 11:24:09
Всем большое спасибо. Осталось сделать правильный выбор.

А что быстрее будет срабатывать decode или case?
Вячеслав Любомудров
Дата: 17.09.2004 11:36:51
Вроде как здесь уже приводились сравнения (осталось только поискать) - результат - монопенисно
Мой коллега считает, что CASE быстрее, т.к. не вычисляются остальные варианты (а они могут быть достаточно ресурсоемкими), если подходит, например, первый.
А DECODE вроде как вызов функции и поэтому нужно вычислить сначала все параметры (варианты), а только потом можно вызывать функцию
Я пытался тестировать на 9-ке - у меня все получилось одинаково в пределах погрешностей.
Либо я что-то намутил, либо SQL считает DECODE не за функцию, а за предопределенное выражение и вычисляет аргументы в процессе.
В любом случае был бы благодарен, если б кто провел более детальное исследование.
Сам, к сожалению, не хочу (тяпница)
Elic
Дата: 17.09.2004 12:18:36
Вячеслав Любомудров
А DECODE вроде как вызов функции и поэтому нужно вычислить сначала все параметры (варианты), а только потом можно вызывать функцию
До 9-ки DECODE описывалось как выражение, и было вполне логично, что:
SQL Reference
Oracle evaluates each search value only before comparing it to expr, rather than
evaluating all search values before comparing any of them with expr.
Consequently, Oracle never evaluates a search if a previous search is equal to expr.
В 9-ке DECODE почему-то описали как функцию, спровоцировав подобное неоднозначное понимание. Но тем не менее, механизм работы DECODE не изменился - выражения внутри DECODE вычисляются по мере надобности. Простейший пример:
select decode(0,0,1,to_number('bla-bla')) from dual;
P.S. А вот CASE как был выражением, так им и остался.
Вячеслав Любомудров
Дата: 17.09.2004 12:31:16
Спасибо!
Но товарищ проводил свои испытания и у него почему-то получилась разница почти на порядок. Я думаю, он где-то лоханулся. В любом случае, спасибо за ссылки на доку
Вячеслав Любомудров
Дата: 17.09.2004 12:32:15
И кстати, неплохой тест (отличный - простенько и со вкусом)
Tantor
Дата: 17.09.2004 13:37:44
Спасибо за разьяснения.