Обработка баз данных на Visual Basic®.NET
Шрифт:
Использование конструктора представлений для создания объединений
Поскольку создание объединений может составлять самую сложную часть запросов, особенно когда задействовано более двух таблиц, неплохо было бы при создании таких запросов иметь некоторое подспорье. К счастью, в Visual Basic предусмотрен конструктор представлений (View Designer), благодаря которому создание запроса с объединением нескольких таблиц значительно упрощается. При использовании конструктора представлений нет необходимости запоминать сложный синтаксис объединения в SQL. Вместо этого можно создать объединение графическим путем, выполнив приведенные ниже действия.
1. В окне Server Explorer создайте новое представление для базы данных Novelty.
2. После этого появится диалоговое окно Add Table (Создать таблицу), в котором следует указать
РИС. 2.5. Создание объединения двух таблиц в окне конструктора представлений
Обратите внимание на то, что конструктор представлений автоматически создает объединение между двумя таблицами на основе известного ключевого поля ID в таблице tblCustomer и явно заданного ранее отношения с полем CustomerID в таблице tblOrder.
После выполнения запроса на основе объединения двух таблиц в окне конструктора представлений будут отображены извлеченные данные, как показано на рис. 2.6.
Использование внешних объединений
Обычное (внутреннее) объединение (inner join) возвращает записи из двух таблиц, если значение первичного ключа первой таблицы соответствует значению внешнего ключа второй таблицы, связанной с первой. Предположим, необходимо получить все записи из одной таблицы, участвующей в объединении, вне зависимости от того, существуют ли связанные записи в другой таблице. В этом случае необходимо использовать внешнее объединение (outer join).
Например, для извлечения списка клиентов и заказов, в который включены также клиенты, не имеющие неоплаченных заказов, можно использовать приведенный ниже запрос.
Обратите внимание, что в предложении LEFT JOIN используется синтаксис имя_таблицы.имя_поля. Более длинное имя позволяет избежать неоднозначности при использовании полей с одинаковыми именами, поскольку поле ID существует как в так и в tblOrder. Фактически предложение LEFT OUTER JOIN означает, что будут отображены все данные таблицы tblCustomer, которая находится в левой стороне выражения tblCustomer.ID = tblOrder.CustomerID.
РИС. 2.6. Выполнение запроса на основе объединения двух таблиц в окне конструктора представлений
Этот запрос возвращает приведенный ниже набор записей.
FirstName | LastName | OrderDate |
---|---|---|
John | Smith | 1/4/2001 |
John | Smith | 1/9/2001 |
Jill | Azalia | 1/14/2001 |
Brad | Jones | <NULL> |
Daisy | Klein | 2/18/2001 |
Daisy | Klein | 3/21/2001 |
Daisy | Klein | 4/4/2001 |
Dave | Martin | 6/5/2001 |
Betty | Klein | <NULL> |
Thurston | Ryan | 7/2/2001 |
Jane | Winters | 8/16/2001 |
Jane | Winters | 9/10/2001 |
В
Правое внешнее объединение (right join) аналогично левому внешнему объединению (left join), за исключением того, что оно возвращает все записи из второй таблицы, участвующей в объединении (имеется в виду таблица с правой стороны), независимо от того, есть ли соответствующие им записи в первой таблице (расположенной с левой стороны). (Левое и правое объединения являются разновидностями внешнего объединения и в определенных обстоятельствах могут возвращать идентичные результаты.)
Выполнение вычислений в запросах
В строках запроса допускается выполнение вычислений. Для этого нужно просто заменить имя поля в предложении SELECT именем арифметического выражения. Допустим, вам нужно создать запрос для вычисления налога с продаж для складских запасов (сведения о которых хранятся в таблице tblItem). В приведенном ниже запросе SQL вычисляется налог с продаж с учетной ставкой 7,5% для каждого товара.
После выполнения этого запроса будут получен показанный ниже результат.
ID | Name | Price | SalesTax |
---|---|---|---|
1 | Rubber Chicken | 5.99 | 0.44925 |
2 | Hand Buzzer | 1.39 | 0.10425 |
3 | Stink Bomb | 1.29 | 0.09675 |
4 | Disappearing Penny Magic Trick | 3.99 | 0.29925 |
5 | Invisible Ink | 2.29 | 0.17175 |
6 | Loaded Dice | 3.49 | 0.26175 |
7 | Whoopee Cushion | 5.99 | 0.44925 |
Поскольку в этих вычислениях фигурируют деньги, конечный результат нужно округлить до двух десятичных знаков. К счастью, в SQL Server для этого предусмотрена специальная функция ROUND, которая позволяет очень легко выполнить это. Обычно ее используют с указанием двух параметров: собственно десятичного числа и точности, выраженной в виде количества знаков после запятой. Вот как выглядит запрос с функцией ROUND:
Результат выполнения этого запроса приведен ниже.
Name | Retail Price | PriceWithTax |
---|---|---|
Rubber Chicken | 5.99 | 6.44 |
Hand Buzzer | 1.39 | 1.49 |
Stink Bomb | 1.29 | 1.39 |
Disappearing Penny Magic Trick | 3.99 | 4.29 |
Invisible Ink | 2.29 | 2.46 |
Loaded Dice | 3.49 | 3.75 |
Whoopee Cushion | 5.99 | 6.44 |