Можно ли написать представление базы данных, которое охватывает отношения один ко многим? - PullRequest
3 голосов
/ 16 июня 2010

Так что я не обязательно говорю, что это даже хорошая идея, если бы это было возможно, поскольку схема представления была бы чрезвычайно изменчивой, но есть ли способ представить отношение «есть-много» в одном представлении?

Например, допустим, у меня есть клиент, который может иметь любое количество адресов в базе данных.Есть ли какой-нибудь способ перечислить каждый столбец каждого адреса с возможно числом как часть псевдонима (например, столбцы как Идентификатор клиента, Имя, Address_Street_1, Address_Street_2 и т.д.)?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 16 июня 2010

Проще говоря, нет.Не без динамического воссоздания представления каждый раз, когда вы хотите использовать его, по крайней мере, то есть.

Но то, что вы можете сделать, это предопределить, скажем, 4 адресных столбца в вашем представлении, затемзаполните первые четыре результата вашего отношения «один ко многим» в эти столбцы.Это не совсем тот динамический вид, который вам нужен, но, на мой взгляд, он намного более стабилен / пригоден для использования.

3 голосов
/ 16 июня 2010

Не совсем - вы действительно делаете динамический разворот.Можно использовать OPENROWSET, чтобы получить динамически сгенерированный запрос, но если это целесообразно, трудно сказать, не видя больше о бизнес-случае.

Сначала создает хранимый процесс, который выполняет динамический поворот , как я делал в Проводнике данных StackExchange.

По сути, вы генерируете динамический SQL, который строит список столбцов.Это действительно может быть сделано только в хранимой процедуре.Что хорошо для вызовов приложений.

Но что если вы захотите повторно использовать это во множестве различных объединений или специальных запросов?

Затем взгляните на эта статья : «Использование серверов SQL OPENROWSET для нарушения правил»

Теперь вы можете вызвать сохраненный процесс, вернувшись обратно на сервер, а затем получив результаты в наборе строк - это может быть в представлении!

У покойного Кена Хендерсона есть несколько хороших примеров этого в его превосходной книге : «Руководство гуру по хранимым процедурам SQL Server, XML и HTML» (вам нужно любить маленькое«Обложки .NET!» На обложке, которая хорошо отражает дух времени за 2002 год!).

Он охватывает только петлевую часть (с представлениями и пользовательскими функциями), менее подробный синтаксис PIVOT был недоступен, пока2005, но PIVOT также могут быть сгенерированы с помощью оператора CASE как характеристическая функция .

Очевидно, что у этого метода есть предостережения (я даже не могу сделать это на нашем производственном сервере)э).

3 голосов
/ 16 июня 2010

Да - используйте:

CREATE VIEW customer_addresses AS
    SELECT t.customer_id,
           t.customer_name,
           a1.street AS address_street_1,
           a2.street AS address_street_2
      FROM CUSTOMER t
 LEFT JOIN ADDRESS a1 ON a1.customer_id = t.customer_id
 LEFT JOIN ADDRESS a2 ON a2.customer_id = t.customer_id

Если бы вы предоставили больше информации, было бы легче дать вам лучший ответ. Возможно, вы ищете сводные данные (превратить строки в столбцы).

...