(?) SQL - взаимосвязанные объединения (как построить цепочку между двумя таблицами?) - PullRequest
0 голосов
/ 10 апреля 2020

Прежде всего, это не мой стол. У меня есть проект с такими таблицами ...

two tables with multiple switches

Мне нужна идея, чтобы получить все связанные страницы / вопросы в очереди / списке в заданный порядок.

Идеальным решением было бы:

enter image description here

Вы знаете способ получить это в одном утверждении (через внутренний соединения)? Мои проблемы - это порядок, а также сочетание двух таблиц, объединенных в одну. Это также нормально, если есть 2 поля идентификатора (по одному для каждого типа), поэтому мы также можем go без типа (для текущего элемента).

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Вы можете использовать пару CTE с, чтобы сначала UNION таблицы вместе, а затем проследовать по списку, начиная с firstPage, используя номер строки, чтобы гарантировать порядок результатов:

WITH allpq AS (
  SELECT name, 'page' AS type, next, next_type
  FROM page
  UNION ALL 
  SELECT name, 'question', next, next_type
  FROM question
),
list AS (
  SELECT type, name, next, next_type, 1 as rn
  FROM allpq
  WHERE name = 'firstPage'
  UNION ALL
  SELECT a.type, a.name, a.next, a.next_type, list.rn + 1
  FROM allpq a
  JOIN list ON a.name = list.next AND a.type = list.next_type
)
SELECT type, name, next, next_type
FROM list
ORDER BY rn

Вывод:

type        name            next            next_type
page        firstPage       secondPage      page
page        secondPage      firstQuestion   question
question    firstQuestion   secondQuestion  question
question    secondQuestion  thirdPage       page
page        thirdPage       fourthPage      page
page        fourthPage      fourthQuestion  question
question    fourthQuestion  fifthPage       page
page        fifthPage       fifthQuestion   question
question    fifthQuestion   sixthPage       page
page        sixthPage       seventhPage     page
page        seventhPage     eighthPage      page
page        eighthPage      

Демонстрация на dbfiddle

0 голосов
/ 10 апреля 2020

Я использую оператор union all для создания комбинированной таблицы, а затем присоединяю ее к себе:

SELECT id, 'page' AS type, name, next, next_type
FROM   page
UNION ALL
SELECT id, 'question', name, next, next_type
FROM question
...