Вход/Регистрация
Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
вернуться

Борри Хелен

Шрифт:

SELECT

AL.COL1,

A1.COL2,

A1. TRANSACTION_DATE

FROM ATABLE A1

WHERE AL.TRANSACTION_DATE = (SELECT MAX(A2.TRANSACTION_DATE) FROM ATABLE A2);

Добавление данных с использованием подзапроса с соединениями

В главе 20 мы рассматривали встроенный метод выборки для передачи данных в оператор INSERT, например,

INSERT INTO ATABLE (

COLUMN2, COLUMN3, COLUMN4)

SELECT BCOLUMN, CCOLUMN, DCOLUMN

FROM BTABLE WHERE

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

INSERT INTO EXTABLE (

TRANDATE, INVOICE_NUMBER, EXT_CUST_CODE, VALUE)

SELECT

INV. TRANSACTION_DATE,

INV. INVOICE_NUMBER,

CUS.EXT_CUS_CODE,

SUM (INVD. PRICE * INVD.NO_ITEMS)

FROM INVOICE INV

JOIN CUSTOMER CUS

ON INV.CUST_ID = CUS.CUST_ID

JOIN INVOICE_DETAIL INVD

ON INVD.INVOICE_ID = INV.INVOICE_ID

WHERE ...

GROUP BY . . .;

Оператор UNION

Оператор UNION может быть использован для объединения результатов двух или более операторов SELECT и создания единого набора только для чтения, состоящего из строк, полученных из разных таблиц или из разных наборов, запрошенных из той же таблицы. Множество запросов объединяются, каждое подмножество спецификаций связывается со следующим с помощью ключевого слова UNION. Данные должны быть выбраны так, а запрос сконструирован таким образом, чтобы все участвующие входные наборы были совместимы для объединения.

Наборы, совместимые для объединения

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

CREATE TABLE CURRENT_TITLES (

ID INTEGER NOT NULL,

TITLE VARCHAR(60) NOT NULL,

AUTHOR_LAST_NAME VARCHAR (40),

AUTHOR_FIRST_NAMES VARCHAR(60),

EDITION VARCHAR(10) ,

PUBLICATION_DATE DATE,

PUBLISHER_ID INTEGER,

ISBN VARCHAR(15) ,

LIST_PRICE DECIMAL(9,2));

/**/

CREATE TABLE PERIODICALS (

PID INTEGER NOT NULL,

PTITLE VARCHAR(60) NOT NULL,

EDITOR_LAST_NAME VARCHAR(40),

EDITOR_FIRST_NAMES VARCHAR (60),

ISSUE_NUMBER VARCHAR (10),

PUBLICATION_DATE DATE,

PUBLISHER_ID INTEGER,

LIST_PRICE DECIMAL (9, 2) ) ;

Эти таблицы совместимы для объединения, потому что мы можем создать запрос для получения наборов с соответствующей "геометрией":

SELECT ID,

TITLE,

AUTHOR_LAST_NAME,

AUTHOR_FIRST_NAMES,

EDITION VARCHAR (10),

LIST_PRICE

FROM CURRENT_TITLES

UNION SELECT

ID,

TITLE,

EDITOR_LAST_NAME,

EDITOR_FIRST_NAMES,

ISSUE_NUMBER,

LIST_PRICE

FROM PERIODICALS;

UNION, содержащий SELECT * FROM таблица, не будет работать, поскольку структуры таблиц различны - вторая таблица не содержит колонки ISBN.

Использование столбцов времени выполнения в объединениях

Идентификаторы столбцов выходного набора данных задаются в первой спецификации SELECT. Если вы хотите использовать альтернативные имена столбцов, алиасы столбцов могут быть использованы в выходном списке первой спецификации SELECT. Дополнительно, если необходимо, поля, полученные из констант или переменных, могут быть включены в предложение SELECT каждого объединяемого потока. Следующий запрос содержит наиболее удобный список публикаций из наших двух таблиц:

SELECT

ID,

TITLE as PUBLICATION,

'BOOK ' AS PUBLICATION_TYPE,

CAST (AUTHOR_LAST_NAME || ' ' || AUTHOR_FIRST_NAMES AS VARCHAR (50) )

AS AUTHOR_EDITOR,

EDITION AS EDITION_OR_ISSUE,

PUBLICATION_DATE DATE,

PUBLISHER_ID,

CAST(ISBN AS VARCHAR(14)) AS ISBN,

LIST_PRICE

FROM CURRENT_TITLES

WHERE ...

UNION SELECT

ID,

TITLE,

'PERIODICAL',

EDITOR_LAST_NAME || ' , ' || EDITOR_FIRST_NAMES AS AUTHOR_EDITOR,

  • Читать дальше
  • 1
  • ...
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: