Программирование >>  Программирование баз данных 

1 ... 30 31 32 [ 33 ] 34 35 36 ... 346


в неизменном виде. Иными словами, ничего не нужно включать в конструкцию WHERE в форме ТаЫеА. ColuranA = ТаЫеВ. ColumnA.

Итак, в качестве чрезвычайно простого примера рассмотрим первый вариант оператора из раздела, посвященного описанию синтаксиса CROSS JOIN, который находится выше в данной главе. Оператор, соответствующий синтаксису ANSI, выглядит следующим образом:

SELECT *

FROM Film f

CROSS JOIN Actors a;

Чтобы преобразовать его в оператор с альтернативным синтаксисом, достаточно удалить ключевое слово CROSS JOIN и ввести запятую:

SELECT *

FROM Film f. Actors a;

Как и при выполнении других примеров данного раздела, будут получены те же результаты, как и с помощью операторов с синтаксисом ANSI.

Итак, теперь описаны конструкции и варианты синтаксиса, применяемые в большинстве систем управления базами данных.

Конструкция union

На этом сравнение нового и альтернативного синтаксиса операторов соединения заканчивается. Перейдем к описанию операции UNION, которая всегда имеет одинаковую форму, независимо от того, какова в остальном синтаксическая форма оператора соединения. UNION- это специальная операция (операция объединения), с помощью которой можно создавать общий результирующий набор, используя данные, полученные с помощью двух или нескольких запросов.

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

Анализируя запросы, содержащие ключевое слово UNION, или формируя такие запросы, достаточно учитывать лишь несколько описанных ниже основных соображений.

Все запросы, результаты которых объединяются с помощью конструкции UNION, должны иметь одинаковое количество столбцов в списке выборки. Если количество столбцов в списке выборки первого запроса равно трем, то второй запрос (а также все последующие запросы, соединяемые операцией UNION) также должен иметь в списке выборки три столбца. А если в первом списке выборки предусмотрено пять столбцов, то и во втором их должно быть пять. В каждом из последующих запросов всегда должно быть такое же количество столбцов, как в первом.



Select СоИ FROM Table 1

Row1

Row2

RowS

Row4

Rows

Row6

Select Col5 FROM Table2

RowA

RowB

RowC

RowD

RowE

RowF

Select Com from

Table 1

union Select Col5 from

Table2


Row1

Row2

RowS

Row4

Rows

Row6

RowA

RowB

RowC

RowD

RowE

RowF

Puc. 3.2. Принцип формирования объединения

Заголовки для столбцов комбинированного результирующего набора берутся только из формулировки первого запроса. Если первый запрос имеет список выборки, который выглядит, допустим, как SELECT Coll, Со12 AS Second, Со 13 FROM. . ., то независимо от имен или псевдонимов столбцов в последующих запросах заголовками столбцов, возвращенньгх оператором с конструкцией UNION, будут соответственно Coll, Second и Со13.

Типы данных каждого столбца, указанного в любом запросе, должны быть неявно совместимыми с типами данных столбцов, занимающих такое же относительное положение в списках выборки других запросов. Обратите внимание на то, что речь не идет о наличии в соответствующих столбцах данных одинаковых типов; достаточно лишь того, чтобы используемые данные допускали неявное преобразование типов (таблица преобразований, в которой показаны явные и неявные преобразования, приведена в главе 1). Если второй столбец в первом запросе относится к типу char (20), то вполне допустимо, чтобы второй столбец во втором запросе имел тип varchar (50). Тем не менее



за основу берется первый запрос, поэтому при обработке данных из второго результирующего набора все строковые значения, превышающие по длине 20 символов, будут усечены справа.

В запросах с конструкцией UNION в отличие от тех запросов, в которых не применяется эта конструкция, по умолчанию принято использование опции DISTINCT, а не ALL. Из-за этого на первых порах при освоении запросов такого типа может возникать значительная путаница. Дело в том, что в других запросах происходит возврат всех строк, независимо от того, являются ли они дубликатами по отношению к другой строке или нет, но конструкция UNION действует иначе. Если в запросе с этой конструкцией не используется ключевое слово ALL, то происходит возврат только одной из повторяющихся строк.

И в этом случае проиллюстрируем сказанное на примере.

В данном примере создаются две таблицы, из которых должна осуществляться выборка данных. После этого происходит вставка, по три строки в каждую таблицу, причем одна строка повторяется в обеих таблицах. Если бы в выполняемом запросе было задано ключевое слово ALL, то в результат вошли бы все строки (в данном случае шесть). А если запрос выполняется с ключевым словом DISTINCT, то количество возвращаемых строк должно составлять только пять (поскольку одна дублирующаяся строка отбрасывается):

CREATE TABLE UnionTestl (

idcol int IDENTITY,

col2 char(3),

CREATE TABLE UnionTest2 (

idcol int IDENTITY,

col4 char(3),

INSERT INTO UnionTestl VALUES

(AAA); INSERT INTO UnionTestl VALUES

(BBB); INSERT INTO UnionTestl VALUES

(CCC);

SELECT *

FROM UnionTestl;

INSERT INTO UnionTest2 VALUES

(CCC); INSERT INTO UnionTest2 VALUES

(DDD); INSERT INTO UnionTest2 VALUES

(EEE);

PRINT Regular UNION-SELECT col2



1 ... 30 31 32 [ 33 ] 34 35 36 ... 346

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика