Oracle выбирает звездочку, подключается с помощью комбинации соединений sql-92

Следующий запрос показывает, что select * в сочетании с connect by и left join возвращает не все столбцы, а только столбцы, используемые в этих условиях. Это поведение было полезным для меня, учитывая, что select * не следует использовать в выпуске, это полезно для запроса данных.

with t1 as (
  select 1 id, 0 parent, 'ROOT' name from dual
  union all
  select 2 id, 1 parent, 'CHILD-1' name from dual
  union all
  select 3 id, 1 parent, 'CHILD-2' name from dual
), t2 as (
  select 1 t1id, 'node' special from dual
)
  select * from t1
  left join t2 on t2.t1id=t1.id
  start with id = 2
  connect by prior parent = id;

тогда как другие запросы возвращают все столбцы

  select * from t1
  start with id = 2
  connect by prior parent = id;

  select * from t1
  left join t2 on t2.t1id=t1.id;

Я не смог найти документацию по этой функции, есть ли она?


person Nahuel Fouilleul    schedule 11.02.2016    source источник
comment
SELECT t1.*, t2.* работает. Понятия не имею, почему SELECT * этого не делает.   -  person MT0    schedule 11.02.2016
comment
и добавление WHERE name IS NOT NULL AND ( special IS NULL OR special IS NOT NULL ) будет означать, что эти столбцы появятся в SELECT *.   -  person MT0    schedule 11.02.2016


Ответы (2)


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

Самая актуальная часть:

Oracle обрабатывает иерархические запросы следующим образом:

  • Соединение, если оно присутствует, оценивается первым, независимо от того, указано ли оно в предложении FROM или с помощью предикатов предложения WHERE.

  • Условие CONNECT BY оценивается.

  • Оцениваются все оставшиеся предикаты предложения WHERE.

Затем Oracle использует информацию из этих оценок для формирования иерархии, используя следующие шаги:

  1. Oracle выбирает корневую строку (строки) иерархии — те строки, которые удовлетворяют условию START WITH.

  2. Oracle выбирает дочерние строки каждой корневой строки. Каждая дочерняя строка должна удовлетворять условию CONNECT BY относительно одной из корневых строк.

  3. Oracle выбирает последовательные поколения дочерних строк. Oracle сначала выбирает дочерние элементы строк, возвращенных на шаге 2, затем дочерние элементы этих дочерних элементов и так далее. Oracle всегда выбирает потомков, оценивая условие CONNECT BY по отношению к текущей родительской строке.

  4. Если запрос содержит предложение WHERE без соединения, Oracle удаляет из иерархии все строки, которые не удовлетворяют условию предложения WHERE. Oracle оценивает это условие для каждой строки отдельно, а не удаляет все дочерние элементы строки, которая не удовлетворяет условию.

  5. Oracle возвращает строки в порядке, показанном на рис. 9-1. На диаграмме дети появляются ниже своих родителей. Для объяснения иерархических деревьев см. Рисунок 3-1, «Иерархическое дерево».

person Sean Branchaw    schedule 17.05.2016

Не SQL-92, но выполнить SELECT * + CONNECT BY + LEFT JOIN

WITH t1 AS (
  SELECT 1 ID, 0 PARENT, 'ROOT' NAME FROM dual
  UNION ALL
  SELECT 2 ID, 1 PARENT, 'CHILD-1' NAME FROM dual
  UNION ALL
  SELECT 3 ID, 1 PARENT, 'CHILD-2' NAME FROM dual
), t2 AS (
  SELECT 1 t1id, 'node' special FROM dual
) 
SELECT     *
FROM       t1, t2
WHERE  t2.t1id(+) = t1.ID
START WITH ID = 2
CONNECT BY PRIOR PARENT = ID
;
person abrittaf    schedule 30.06.2016