SQL - получение данных из трех несвязанных таблиц в одном запросе - PullRequest
1 голос
/ 04 августа 2011

Попытка понять девятую подсказку в http://www.orafaq.com/papers/sqltiptr.pdf

Объединение трех отдельных запросов в один:

select name from emp where emp_no=1234;
select name from dpt where dot_no=10;
select name from cat where emp_no='RD';


select e.name, d.name, c.name
from cat c, dpt d, emp e, dual x
where NVL('x',X.DUMMY)=NVL('X', E.ROWId (+))
and NVL('x',X.DUMMY)=NVL('X', D.ROWId (+))
and NVL('x',X.DUMMY)=NVL('X', C.ROWId (+))
and e.emp_no(+)=1234
and d.dept_no(+)=10
and c.cat_type(+)='RD'

Зачем нам нужно сравнение нулевых значений в запросе?

 NVL('x',X.DUMMY)=NVL('X', E.ROWId (+))
and NVL('x',X.DUMMY)=NVL('X', D.ROWId (+))
and NVL('x',X.DUMMY)=NVL('X', C.ROWId (+))

Ответы [ 2 ]

3 голосов
/ 04 августа 2011
select name from emp where emp_no=1234
UNION ALL
select name from dpt where dot_no=10
UNION ALL
select name from cat where emp_no='RD'

или, если вы хотите, чтобы все они были в одном ряду:

SELECT (select name from emp where emp_no=1234) a,
       (select name from dpt where dot_no=10) b,
       (select name from cat where emp_no='RD') c
  FROM DUAL
2 голосов
/ 04 августа 2011

Это довольно эзотерический трюк - таблица DUAL содержит одну строку, а ROWID в ваших реальных таблицах также уникальны, поэтому использование NVL («X» ... это способ обмануть JOIN в «связывании»).несвязанные записи. Тогда в остальной части вашего предложения WHERE будут применены фактические ограничения, к которым вы стремитесь.

Я думаю, что подход zerkms более прост, но так как вы спрашивали именно об этом совете ... HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...