Специальный запрос перекрестного соединения - PullRequest
0 голосов
/ 28 марта 2012

Получил таблицы A, B и C. Все таблицы имеют первичные ключи.Обе таблицы B и C имеют поле id_a, которое является ссылкой на ключ таблицы A. Я хочу написать оператор выбора, который бы выбирал все строки из таблицы A, один столбец из таблицы C и один из B. Но они должны быть соединены как2 независимых столбца.Таким образом, для одного ключа из таблицы A должно быть максимум (B, C) строк, которые содержат все данные из A плюс эти два столбца, например:

------------------
a11....a1n|b11|c11
a11....a1n|b12|c12
a11....a1n|b13|null
a11....a1n|b14|null
a21....a2n|b21|c21
a21....a2n|b22|c22
a21....a2n|null|c23
a21....a2n|null|c24
a21....a2n|null|c25

{bXY} означает, что этозначение из B, связанное со значением X из a, а Y - просто перечисление

Конечно, для всех значений из таблиц B и C должно соответствовать таблица A по их полю id_a.

Структура таблицы:

Table A:
id int autoincrement
name varchar 

Table B:
id int autoincrement
id_a int 
value_b float

Table C:
id int autoincrement
id_a int
value_c int

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Это возможно, если вы генерируете пустые строки для таблицы, содержащей меньше строк. Каждой строке из B и C присваивается номер. Полное внешнее соединение добавляет недостающие строки.

select a.*, value_b, value_c
from TableA a
left join
(
   select nvl(b.id_a, c.id_a) AS id_a, b.value_b, c.value_c
     from 
     (
        select b.id_a, b.value_b,
               row_number() over (partition by b.id_a order by b.id) rn
          from TableB b
     ) b
     full outer join
     (
        select c.id_a, c.value_c,
               row_number() over (partition by c.id_a order by c.id) rn
          from TableC c
     ) c
       on b.id_a = c.id_a
      and b.rn = c.rn
) maxRows
  on a.id = maxRows.id_a

Вы можете проверить это на Sql Fiddle

0 голосов
/ 28 марта 2012

Для начала вы можете попробовать следующее: (на основе SQLServer, а не Oracle)

declare @AValues varchar(max)
select @AValues = ISNULL(@AValues,'')+ a.A_column + ',' from tableA a

select A_PrimaryKey, @AValues, b.B_column, c.C_column from
(
  select b.id_a A_PrimaryKey from tableB b
  union
  select c.id_a A_PrimaryKey from tableC c
) x
left join tableB b on b.id_a = x.A_PrimaryKey
left join tableC c on c.id_a = x.A_PrimaryKey

Для дальнейшего улучшения вы можете заменить переменную @AValues ​​на подзапрос SQL, который будет возвращать все строки из TableA в виде списка, разделенного запятыми.

Объединение между TableB и TableC даст вам все значения первичного ключа TableA, которые вас интересуют, по сути, максимальное количество строк в TableB и TableC. При левом соединении вы получите значения из TableB или TableC.

Надеюсь, это поможет в некоторой степени!

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