Я хочу создать представление в one-many отношении. Вот мои отношения:
(a -* b)
(a -* c)
Я хочу создать представление, чтобы иметь эти данные:
Я не хочу что-то как (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...
я думаю, что мне нужен "пример подзапроса одной строки", но я не могу найти пример, можно ли помочь мне?
Как я могу создать это представление?
Как отмечалось в моем комментарии, обозначения, используемые для описания отношений, нестандартны.
Я думаю, это означает, что у вас есть отношение 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 ' приставка.