sql создают представление в одном многим отношение

Я хочу создать представление в one-many отношении. Вот мои отношения:

(a -* b)
(a -* c)

Я хочу создать представление, чтобы иметь эти данные:

  • a1 - (весь b's, связанный с a1 + весь c's, связанный с a1)

Я не хочу что-то как (a1, b1, c1 - a1, b1, c2...). Я хочу, чтобы данные были:

(ИДЕНТИФИКАТОР, DESCRIPTION1, DESCRIPTION2, DESCRIPTION3)

в одной записи.

Например, если в таблице a у меня есть данные: (1,2,3)

и в таблице b я имею (10,11,12 с fk к 1 в a и 20,21,22 с fk к 2 в a)

и в таблице c я имею (100,101,102 с fk к 1 в a)

Я хочу результат как это в одной строке:

1 10 11 12 100 101 102 для 1

и что-то вроде этого для 2, 3...

я думаю, что мне нужен "пример подзапроса одной строки", но я не могу найти пример, можно ли помочь мне?

Как я могу создать это представление?

5
задан new to sql 5 April 2010 в 06:52
поделиться

1 ответ

Как отмечалось в моем комментарии, обозначения, используемые для описания отношений, нестандартны.

Я думаю, это означает, что у вас есть отношение A, которое имеет отношение «один ко многим» со строками в отношении B, а также имеет отдельное отношение «один ко многим» со строками в отношении C.

Результат отношение (представление) в идеале должно иметь одну строку для каждого элемента в A, вместе с соответствующими строками из B и соответствующими строками из C, но не должно быть декартова произведения строк в B и C относительно строки в A.

Я предполагаю, что ваши отношения следующие:

A(A1, A2, A3) - Primary Key (A1)
B(B1, B2, B3) - Foreign Key (B1) References A(A1)
C(C1, C2, C3) - Foreign Key (C1) References A(A1)

Если вы следите за представлениями CJ Date, вам нужно представление с парой RVA - атрибутов со значением отношения. То есть у вас будет структура таблицы, аналогичная

+------+------+------+------------------+-----------------+
|      |      |      |  +------+------+ | +------+------+ |
|  A1  |  A2  |  A3  |  |  B2  |  B3  | | |  C2  |  C3  | |
|      |      |      |  +------+------+ | +------+------+ |
+------+------+------+------------------+-----------------+
|      |      |      |  +------+------+ | +------+------+ |
|      |      |      |  |  b21 |  b31 | | |  c42 |  c13 | |
|  a11 |  a21 |  a31 |  |  b22 |  b32 | | |  c52 |  c23 | |
|      |      |      |  |  b23 |  b33 | | |  c62 |  c13 | |
|      |      |      |  |      |      | | |  c72 |  c23 | |
|      |      |      |  +------+------+ | +------+------+ |
+------+------+------+------------------+-----------------+

. Это очень удобный способ представить, что вам нужно. К сожалению, AFAIK, SQL не поддерживает эту нотацию.Ближайшим подходом, вероятно, будет два независимых внешних соединения, которые, как правило, генерируют много строк (12 в примере):

SELECT A.A1, A.A2, A.A3, B.B2, B.B3, C.C2, C.C3
  FROM A LEFT OUTER JOIN B ON A.A1 = B.B1
         LEFT OUTER JOIN C ON A.A1 = C.C1

Вы говорите:

Я хочу, чтобы данные были:

(ID, DESCRIPTION1, DESCRIPTION2, DESCRIPTION3)

в одной записи.

Например, если в таблице a у меня есть данные: (1,2,3)

и в таблице b у меня есть (10,11,12 с fk до 1 в a и 20,21,22 с fk до 2 в a)

и в таблице c у меня есть (100,101,102 с fk до 1 в a)

Я хочу получить такой результат в одной строке:

1,10,11,12,100,101,102 для 1

Вам нужно представление с 4 столбцами в соответствии с утверждением «Я хочу, чтобы данные были», но в отображаемом вами результате отображается 7 значений, потому что в B есть три записи, соответствующие записи с идентификатором 1 в A, и аналогично, потому что в C тоже есть три записи. Непонятно, какое значение было в Description1 от A - похоже, оно отсутствует. Сколько столбцов вы хотели бы, если бы было 6 строк в B и 10 в C, которые соответствовали строке 1 в A? И как это соотносится с количеством столбцов для записи с ID 2 в A (с 4 строками в B и 3 строками в C, которые совпадают)?

Если вы запросили результат вроде:

 1,Note1,{10,11,12},{100,101,102}

где фигурные скобки окружают какой-то список, тогда ваш результат действительно имеет четыре столбца. Кроме того, если ваша СУБД поддерживает операцию GROUP_CONCAT, вы даже можете написать запрос, который выдаст результат.

Вы узнаете, что, если вы не выразите точно требования вашего запроса, вы получите квазислучайные результаты - или результаты, отличные от того, что вы действительно хотели, во всяком случае.Когда вы четко сформулируете требования к запросу, весь процесс станет намного проще.

В системах, поддерживающих GROUP_CONCAT, вы можете получить один список, используя:

SELECT B.ID, GROUP_CONCAT(B.Description2) AS Description2
  FROM B
 GROUP BY B.ID

Затем вы пишете общий запрос, соединяющий два из этих выражений с A:

SELECT A1.ID, A1.Description AS Description1,
       B2.Description2, C3.Description3
  FROM A AS A1 LEFT OUTER JOIN
       (SELECT B.ID, GROUP_CONCAT(B.Description) AS Description2
          FROM B
         GROUP BY B.ID) AS B2 ON A1.ID = B2.ID
         LEFT OUTER JOIN
       (SELECT C.ID, GROUP_CONCAT(C.Description) AS Description3
          FROM C
         GROUP BY C.ID) AS C3 ON A1.ID = C3.ID

Чтобы превратить это в представление, примените соответствующий 'CREATE VIEW ' приставка.

3
ответ дан 15 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: