Команда union

Example — Different Field Names

It is not necessary that the corresponding columns in each SELECT statement have the same name, but they do need to be the same corresponding data types.


When you don’t have the same column names between the SELECT statements, it gets a bit tricky, especially when you want to order the results of the query using the ORDER BY clause.

Let’s look at how to use the UNION operator with different column names and order the query results.

For example:

SELECT supplier_id, supplier_name
FROM suppliers
WHERE supplier_id > 2000
UNION
SELECT company_id, company_name
FROM companies
WHERE company_id > 1000
ORDER BY 1;

In this SQL UNION example, since the column names are different between the two SELECT statements, it is more advantageous to reference the columns in the ORDER BY clause by their position in the result set. In this example, we’ve sorted the results by supplier_id / company_id in ascending order, as denoted by the . The supplier_id / company_id fields are in position #1 in the result set.

Now, let’s explore this example further with data.

If you had the suppliers table populated with the following records:

supplier_id supplier_name
1000 Microsoft
2000 Oracle
3000 Apple
4000 Samsung

And the companies table populated with the following records:

company_id company_name
1000 Microsoft
3000 Apple
7000 Sony
8000 IBM

And you executed the following UNION statement:

SELECT supplier_id, supplier_name
FROM suppliers
WHERE supplier_id > 2000
UNION
SELECT company_id, company_name
FROM companies
WHERE company_id > 1000
ORDER BY 1;

You would get the following results:

supplier_id supplier_name
3000 Apple
4000 Samsung
7000 Sony
8000 IBM

First, notice that the record with supplier_id of 3000 only appears once in the result set because the UNION query removed duplicate entries.

Second, notice that the column headings in the result set are called supplier_id and supplier_name. This is because these were the column names used in the first SELECT statement in the UNION.

If you had wanted to, you could have aliased the columns as follows:

SELECT supplier_id AS ID_Value, supplier_name AS Name_Value
FROM suppliers
WHERE supplier_id > 2000
UNION
SELECT company_id AS ID_Value, company_name AS Name_Value
FROM companies
WHERE company_id > 1000
ORDER BY 1;

Now the column headings in the result will be aliased as ID_Value for the first column and Name_Value for the second column.

SQL Union Operator Overview

In the relational database, we stored data into SQL tables. Sometimes we need to Select data from multiple tables and combine result set of all Select statements. We use the SQL Union operator to combine two or more Select statement result set.

The syntax for the SQL Union operator

1 2 3

SELECTcolumn1,Column2…Column(N)FROMtableA

UNION

SELECTcolumn1,Column2…Column(N)FROMtableB;

We need to take care of following points to write a query with the SQL Union Operator.

  • Both the Select statement must have the same number of columns
  • Columns in both the Select statement must have compatible data types
  • Column Order must also match in both the Select statement
  • We can define Group By and Having clause with each Select statement. It is not possible to use them with the result set
  • We cannot use Order By clause with individual Select statement. We can use it with result set generated from the Union of both Select statements

In the following screenshot, we can understand the SQL UNION operator using a Venn diagram.

  • Table A having values 1,2,3,4

1 2 3 4 5 6

CREATETABLETableA(

IDINT

);

Go

INSERTINTOTableA

VALUES(1),(2),(3),(4);

Table B having values 3,4,5,6

1 2 3 4 5 6

CREATETABLETableB(

IDINT

);

Go

INSERTINTOTableB

VALUES(3),(4),(5),(6);

If we use SQL Union operator between these two tables, we get the following output.

1 2 3 4 5

SELECTID

FROMTableA

UNION

SELECTID

FROMTableB;

Output: 1, 2, 3,4,5,6

In my example, TableA and TableB both contain value 3 and 4. In the output, we do not get duplicate values. We get only one row for each duplicate value. It performs a DISTINCT operation across all columns in the result set.

Let look at this with another example. For this example, I created two tables Employee_F and Employee_M in sample database AdventureWorks2017 database.

Execute following script for Employee_F table

1 2 3 4 5 6 7 8 9

SELECTTOP5NationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

INTOAdventureWorks2017.HumanResources.Employee_F

FROMAdventureWorks2017.HumanResources.Employee

WHEREMaritalStatus=’S’;

Execute following script for Employee_M table

1 2 3 4 5 6 7 8 9

SELECTTOP5NationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

INTOAdventureWorks2017.HumanResources.Employee_M

FROMAdventureWorks2017.HumanResources.Employee

WHEREMaritalStatus=’M’;

Both the tables do not contains any duplicate rows in each other tables. Let us execute following UNION statement.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

SELECTNationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

FROMAdventureWorks2017.HumanResources.Employee_M

UNION

SELECTNationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

FROMAdventureWorks2017.HumanResources.Employee_F;UNION

SELECTNationalIDNumber

,LoginID

,JobTitle

,BirthDate

,MaritalStatus

,Gender

FROMAdventureWorks2017.HumanResources.Employee_Temp

Both the tables do not have duplicate rows. Therefore, we get all records from both tables in the output of SQL Union operator. It contains ten records in the output.

Let us create another table that contains duplicate rows from both the tables.

1 2 3 4 5 6 7 8 9

SELECTTOP5NationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

INTOAdventureWorks2017.HumanResources.Employee_All

FROMAdventureWorks2017.HumanResources.Employee;

 

Now, we will use the SQL UNION operator between three tables. We should still get ten records because contains records that already exist in Employee_M and Employee_F table.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

SELECTNationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

FROMAdventureWorks2017.HumanResources.Employee_M

UNION

SELECTNationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

FROMAdventureWorks2017.HumanResources.Employee_F

UNION

SELECTNationalIDNumber,

LoginID,

JobTitle,

BirthDate,

MaritalStatus,

Gender

FROM


AdventureWorks2017.HumanResources.Employee_All

In the following image, you can see a UNION of these three tables do not contain any duplicate values.

Пример — разные имена полей

Нет необходимости, чтобы соответствующие столбцы в каждом операторе SELECT имели одинаковые имена, но они должны быть с одинаковыми, соответствующими типами данных. Если у вас нет одинаковых имен столбцов между операторами SELECT, это становится немного сложнее, особенно если вы хотите упорядочить результаты запроса, используя оператор ORDER BY. Давайте посмотрим, как использовать оператор UNION с разными именами столбцов и упорядочиванием результатов запроса. Например.

PgSQL

SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id > 2000 UNION SELECT company_id, company_name FROM companies WHERE company_id > 1000 ORDER BY 1;

1 2 3 4 5 6 7 8 9 10

SELECTsupplier_id,

supplier_name

FROMsuppliers

WHEREsupplier_id>2000

UNION

SELECTcompany_id,

company_name

FROMcompanies

WHEREcompany_id>1000

ORDERBY1;

В этом SQL примере UNION, поскольку имена столбцов в двух операторах SELECT различаются, более выгодно ссылаться на столбцы в ORDER BY по их положению в наборе результатов. В этом примере мы отсортировали результаты по supplier_id / company_id в порядке возрастания, как обозначено . Поля supplier_id / company_id находятся в позиции № 1 в наборе результатов.

Теперь давайте рассмотрим этот пример подробнее с данными. Если у вас была таблица suppliers, заполненная следующими записями.

supplier_id supplier_name
1000 Microsoft
2000 Oracle
3000 Apple
4000 Samsung

И таблица companies заполнилась следующими записями.

company_id company_name
1000 Microsoft
3000 Apple
7000 Sony
8000 IBM

И вы выполнили следующий оператор UNION.

PgSQL

SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id > 2000 UNION SELECT company_id, company_name FROM companies WHERE company_id > 1000 ORDER BY 1;

1 2 3 4 5 6 7 8 9

SELECTsupplier_id,

supplier_name

FROMsuppliers

WHEREsupplier_id>2000

UNION

SELECTcompany_id,company_name

FROMcompanies

WHEREcompany_id>1000

ORDERBY1;

Вы получите следующие результаты.

supplier_id supplier_name
3000 Apple
4000 Samsung
7000 Sony
8000 IBM

Во-первых, обратите внимание, что запись с supplier_id, равной 3000, появляется только один раз в наборе результатов, поскольку запрос UNION удалил повторяющиеся записи. Во-вторых, обратите внимание, что заголовки столбцов в наборе результатов называются supplier_id и supplier_name

Это потому, что это были имена столбцов, использованных в первом операторе SELECT в UNION. Если бы вы хотели, вы могли бы присвоить псевдонимы столбцам следующим образом.

PgSQL

SELECT supplier_id AS ID_Value, supplier_name AS Name_Value FROM suppliers WHERE supplier_id > 2000 UNION SELECT company_id AS ID_Value, company_name AS Name_Value FROM companies WHERE company_id > 1000 ORDER BY 1;

1 2 3 4 5 6 7 8 9 10

SELECTsupplier_idASID_Value,

supplier_nameASName_Value

FROMsuppliers

WHEREsupplier_id>2000

UNION

SELECTcompany_idASID_Value,

company_nameASName_Value

FROMcompanies

WHEREcompany_id>1000

ORDERBY1;

Теперь заголовки столбцов в результате будут иметь псевдоним как ID_Value для первого столбца и Name_Value для второго столбца.

ID_Value Name_Value
3000 Apple
4000 Samsung
7000 Sony
8000 IBM

Примеры

Использование UNION при выборке из двух таблиц

Даны две таблицы:

sales2005
person amount
Иван 1000
Алексей 2000
Сергей 5000
sales2006
person amount
Иван 2000
Алексей 2000
Петр 35000

При выполнении следующего запроса:

(SELECT * FROM sales2005)
UNION
(SELECT * FROM sales2006);

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

person amount
Иван 1000
Алексей 2000
Иван 2000
Сергей 5000
Петр 35000

В результате отобразятся две строки с Иваном, так как эти строки различаются значениями в столбцах. Но при этом в результате присутствует лишь одна строка с Алексеем, поскольку значения в столбцах полностью совпадают.

Использование UNION ALL при выборке из двух таблиц

Применение дает другой результат, так как дубликаты не скрываются. Выполнение запроса:

(SELECT * FROM sales2005)
UNION ALL
(SELECT * FROM sales2006);

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

person amount
Иван 1000
Иван 2000
Алексей 2000
Алексей 2000
Сергей 5000
Петр 35000

Использование UNION при выборке из одной таблицы

Аналогичным образом можно объединять два разных запроса из одной и той же таблицы (хотя вместо этого, как правило, необходимые параметры комбинируют в одном запросе при помощи ключевых слов AND и OR в условии WHERE):

(SELECT person, amount FROM sales2005 WHERE amount=1000)
UNION
(SELECT person, amount FROM sales2005 WHERE person like 'Сергей');

В результате получится:

person amount
Иван 1000
Сергей 5000

Использование UNION как внешнее объединение

При помощи можно создавать также (иногда используется в случае отсутствия встроенной прямой поддержки внешних объединений):

(SELECT *
FROM   employee 
       LEFT JOIN department 
          ON employee.DepartmentID = department.DepartmentID)
UNION
(SELECT *
FROM   employee
       RIGHT JOIN department
          ON employee.DepartmentID = department.DepartmentID);

Но при этом необходимо помнить, что это все же не одно и то же, что и оператор .

SQL Учебник

SQL ГлавнаяSQL ВведениеSQL СинтаксисSQL SELECTSQL SELECT DISTINCTSQL WHERESQL AND, OR, NOTSQL ORDER BYSQL INSERT INTOSQL Значение NullSQL Инструкция UPDATESQL Инструкция DELETESQL SELECT TOPSQL MIN() и MAX()SQL COUNT(), AVG() и …SQL Оператор LIKESQL ПодстановочныйSQL Оператор INSQL Оператор BETWEENSQL ПсевдонимыSQL JOINSQL JOIN ВнутриSQL JOIN СлеваSQL JOIN СправаSQL JOIN ПолноеSQL JOIN СамSQL Оператор UNIONSQL GROUP BYSQL HAVINGSQL Оператор ExistsSQL Операторы Any, AllSQL SELECT INTOSQL INSERT INTO SELECTSQL Инструкция CASESQL Функции NULLSQL ХранимаяSQL Комментарии

SQL Справочник

SQL Ключевые слова ADD ADD CONSTRAINT ALTER ALTER COLUMN ALTER TABLE ALL AND ANY AS ASC BACKUP DATABASE BETWEEN CASE CHECK COLUMN CONSTRAINT CREATE CREATE DATABASE CREATE INDEX CREATE OR REPLACE VIEW CREATE TABLE CREATE PROCEDURE CREATE UNIQUE INDEX CREATE VIEW DATABASE DEFAULT DELETE DESC DISTINCT DROP DROP COLUMN DROP CONSTRAINT DROP DATABASE DROP DEFAULT DROP INDEX DROP TABLE DROP VIEW EXEC EXISTS FOREIGN KEY FROM FULL OUTER JOIN GROUP BY HAVING IN INDEX INNER JOIN INSERT INTO INSERT INTO SELECT IS NULL IS NOT NULL JOIN LEFT JOIN LIKE LIMIT NOT NOT NULL OR ORDER BY OUTER JOIN PRIMARY KEY PROCEDURE RIGHT JOIN ROWNUM SELECT SELECT DISTINCT SELECT INTO SELECT TOP SET TABLE TOP TRUNCATE TABLE UNION UNION ALL UNIQUE UPDATE VALUES VIEW WHERE

MySQL Функции Функции строк ASCII CHAR_LENGTH CHARACTER_LENGTH CONCAT CONCAT_WS FIELD FIND_IN_SET FORMAT INSERT INSTR LCASE LEFT LENGTH LOCATE LOWER LPAD LTRIM MID POSITION REPEAT REPLACE REVERSE RIGHT RPAD RTRIM SPACE STRCMP SUBSTR SUBSTRING SUBSTRING_INDEX TRIM UCASE UPPER Функции чисел ABS ACOS ASIN ATAN ATAN2 AVG CEIL CEILING COS COT COUNT DEGREES DIV EXP FLOOR GREATEST LEAST LN LOG LOG10 LOG2 MAX MIN MOD PI POW POWER RADIANS RAND ROUND SIGN SIN SQRT SUM TAN TRUNCATE Функции дат ADDDATE ADDTIME CURDATE CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURTIME DATE DATEDIFF DATE_ADD DATE_FORMAT DATE_SUB DAY DAYNAME DAYOFMONTH DAYOFWEEK DAYOFYEAR EXTRACT FROM_DAYS HOUR LAST_DAY LOCALTIME LOCALTIMESTAMP MAKEDATE MAKETIME MICROSECOND MINUTE MONTH MONTHNAME NOW PERIOD_ADD PERIOD_DIFF QUARTER SECOND SEC_TO_TIME STR_TO_DATE SUBDATE SUBTIME SYSDATE TIME TIME_FORMAT TIME_TO_SEC TIMEDIFF TIMESTAMP TO_DAYS WEEK WEEKDAY WEEKOFYEAR YEAR YEARWEEK Функции расширений BIN BINARY CASE CAST COALESCE CONNECTION_ID CONV CONVERT CURRENT_USER DATABASE IF IFNULL ISNULL LAST_INSERT_ID NULLIF SESSION_USER SYSTEM_USER USER VERSION

SQL Server функции Функции строк ASCII CHAR CHARINDEX CONCAT Concat with + CONCAT_WS DATALENGTH DIFFERENCE FORMAT LEFT LEN LOWER LTRIM NCHAR PATINDEX QUOTENAME REPLACE REPLICATE REVERSE RIGHT RTRIM SOUNDEX SPACE STR STUFF SUBSTRING TRANSLATE TRIM UNICODE UPPER Функции чисел ABS ACOS ASIN ATAN ATN2 AVG CEILING COUNT COS COT DEGREES EXP FLOOR LOG LOG10 MAX MIN PI POWER RADIANS RAND ROUND SIGN SIN SQRT SQUARE SUM TAN Функции дат CURRENT_TIMESTAMP DATEADD DATEDIFF DATEFROMPARTS DATENAME DATEPART DAY GETDATE GETUTCDATE ISDATE MONTH SYSDATETIME YEAR Функции расширений CAST COALESCE CONVERT CURRENT_USER IIF ISNULL ISNUMERIC NULLIF SESSION_USER SESSIONPROPERTY SYSTEM_USER USER_NAME

MS Access функции Функции строк Asc Chr Concat with & CurDir Format InStr InstrRev LCase Left Len LTrim Mid Replace Right RTrim Space Split Str StrComp StrConv StrReverse Trim UCase Функции чисел Abs Atn Avg Cos Count Exp Fix Format Int Max Min Randomize Rnd Round Sgn Sqr Sum Val Функции дат Date DateAdd DateDiff DatePart DateSerial DateValue Day Format Hour Minute Month MonthName Now Second Time TimeSerial TimeValue Weekday WeekdayName Year Другие функции CurrentUser Environ IsDate IsNull IsNumeric

SQL ОператорыSQL Типы данныхSQL Краткий справочник

Examples:

  1. How to use simple SQL Union clause in select statement

    In this example, the result set includes a distinct set of rows from the first set and second set.The following example is based on the rule 1, 3 & 5.

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

    SELECT*

    FROM (


    (

    SELECT1A

    UNION

    SELECT2

    UNION

    SELECT3

    )

    UNION

    (

    SELECT3B

    UNION

    SELECT4

    UNION

    SELECT5

    )

    UNIONALL

    (

    SELECT8c

    UNION

    SELECT9

    UNION

    SELECT1

    )

    )T;

    The output is a combination of Union and Union All operators using parenthesis.

  2. How to use SQL Union with the queries that have the WHERE clause

    The following example shows the use of Union in two SELECT statements with a WHERE clause and ORDER BY clause.

    The following example is based on the rule 1,2 and 3

    1 2 3 4 5 6 7 8 9 10

    SELECTP1.ProductModelID,

    P1.Name

    FROMProduction.ProductModelP1

    WHEREProductModelIDIN(3,4)

    UNION

    SELECTP2.ProductModelID,

    P2.Name

    FROMProduction.ProductModelP2

    WHEREP2.ProductModelIDIN(3,4)

    ORDERBYP1.Name;

  3. How to use SELECT INTO clause with SQL Union

    The following example creates a new dbo.dummy table using the INTO clause in the first SELECT statement which holds the final result set of the Union of the columns ProductModel and name from two different result sets. In this case, it is derived from the same table but in a real-world situation, this can also be two different tables. The following example is based on the rule 1 , 2 and 4.

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

    DROPTABLEIFEXISTSdbo.dummy;

    SELECTP1.ProductModelID,

    P1.Name

    INTOdummy

    FROMProduction.ProductModelP1

    WHEREProductModelIDIN(3,4)

    UNION

    SELECTP2.ProductModelID,

    P2.Name

    FROMProduction.ProductModelP2

    WHEREP2.ProductModelIDIN(3,4)

    ORDERBYP1.Name;

    GO

    SELECT*

    FROMdbo.Dummy;

  4. How to use SQL Union with the queries that have a WHERE clause and ORDER BY clause

    This is only possible when we use TOP or aggregate functions in every select statement of the Union operator. In this case, top 10 rows are listed from each result set and combined the rows using Union clause to get a final result. You also see that the order by clause is placed in all the select statement.

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

    SELECTa.ModelID,

    a.Name

    FROM (

    SELECTTOP10ProductModelIDModelID,

    Name

    FROMProduction.ProductModel

    WHEREProductModelIDNOTIN(3,4)

    ORDERBYNameDESC

    )a

    UNION

    SELECTb.ProductModelID,

    b.Name

    FROM (

    SELECTTOP10ProductModelID,

    Name

    FROMProduction.ProductModel

    WHEREProductModelIDIN(5,6)

    ORDERBYNameDESC

    )b;

  5. How to use of SQL Union and SQL Pivot

    In the following example, we’re trying to combine more than one set of results. In a real-world situation, you may have financial numbers from various regions or departments and the tables might have the same columns and data types, but you want to put them in one set of rows and in a single report. In such a scenario, you would use the Union clause and it is very easy to combine results and transform the data into a more meaningful report.

    In this example, the ProductModel is categorized into Top10, Top100, Top 100 and transforming the rows as an aggregated set of the values into the respective columns. The following example is based on the rule 2.

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

    SELECTMAX(Top10)Top10,

    MAX(Top100)Top100,

    MAX(Top1000)Top100

    FROM (

    SELECTCOUNT(*)Top10,

    Top100,

    Top1000

    FROMProduction.ProductModel

    WHEREProductModelID<10

    UNION

    SELECT,

    COUNT(*),

    FROMProduction.ProductModel

    WHEREProductModelID>11

    ANDProductModelID<100

    UNION

    SELECT,

    ,

    COUNT(*)

    FROMProduction.ProductModel

    WHEREProductModelID>101

    )T;

    NULL values are very important with the Set Operators and are treated as second-class database citizens. Because NULLs are considered unique and if two rows have a NULL in the same column, then they would be considered identical, so in that case, you are actually comparing a NULL to a NULL and getting equality. In the following example, you see the use of NULL values. In this case, it is operated with the aggregate function, max.

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

    SELECTMAX(Top10)Top10,

    MAX(Top100)Top100,

    MAX(Top1000)Top100

    FROM (

    SELECTCOUNT(*)Top10,

    NULLTop100,

    NULLTop1000

    FROMProduction.ProductModel

    WHEREProductModelID<10

    UNION

    SELECTNULL,

    COUNT(*),

    NULL

    FROMProduction.ProductModel

    WHEREProductModelID>11

    ANDProductModelID<100

    UNION

    SELECTNULL,

    NULL,

    COUNT(*)

    FROMProduction.ProductModel

    WHEREProductModelID>101

    )T;

SQL ANY и ALL

Операторы ANY и ALL используются с предложением WHERE или HAVING.

Оператор ANY возвращает true, если какое-либо из значений подзапроса удовлетворяет условию.

Оператор ALL возвращает true, если все значения подзапроса удовлетворяют условию.

Синтаксис ANY

SELECT column_name(s) FROM table_name WHERE column_name operator ANY(SELECT column_name FROM table_name WHERE condition);

Синтаксис ALL

SELECT column_name(s) FROM table_namecolumn_name operator ALL(SELECT column_name FROM table_name WHERE condition);

Примечание: Оператор должен быть стандартным оператором сравнения (=, <>, !=, >, >=, <, or <=).

Пример PRAGMA UDF

В ряде презентаций, предшествовавших официальному выпуску 12c, выступавшие упоминали PRAGMA UDF(User Defined Function), которая предположительно дает вам преимущества производительности встроенного PL/SQL, в то же время позволяя вам определять объект PL/SQL вне оператора SQL. Следующий код переопределяет предыдущую обычную функцию для использования этой прагмы.

Oracle PL/SQL

CREATE OR REPLACE FUNCTION normal_function(p_id IN NUMBER) RETURN NUMBER IS PRAGMA UDF; BEGIN RETURN p_id; END;

1 2 3 4 5

CREATEORREPLACEFUNCTIONnormal_function(p_idINNUMBER)RETURNNUMBERIS

PRAGMAUDF; BEGIN

RETURNp_id;

END;

Как только функция скомпилирована, выполнение теста из предыдущего раздела для этой функции дает довольно интересные результаты.

Oracle PL/SQL

SET SERVEROUTPUT ON DECLARE l_time PLS_INTEGER; l_cpu PLS_INTEGER; l_sql VARCHAR2(32767); l_cursor SYS_REFCURSOR; TYPE t_tab IS TABLE OF NUMBER; l_tab t_tab; BEGIN l_time := DBMS_UTILITY.get_time; l_cpu := DBMS_UTILITY.get_cpu_time;

l_sql := ‘WITH FUNCTION with_function(p_id IN NUMBER) RETURN NUMBER IS BEGIN RETURN p_id; END; SELECT with_function(id) FROM t1’; OPEN l_cursor FOR l_sql; FETCH l_cursor BULK COLLECT INTO l_tab; CLOSE l_cursor; DBMS_OUTPUT.put_line(‘WITH_FUNCTION : ‘ || ‘Time=’ || TO_CHAR(DBMS_UTILITY.get_time — l_time) || ‘ hsecs ‘ || ‘CPU Time=’ || (DBMS_UTILITY.get_cpu_time — l_cpu) || ‘ hsecs ‘);

l_time := DBMS_UTILITY.get_time; l_cpu := DBMS_UTILITY.get_cpu_time;

l_sql := ‘SELECT normal_function(id) FROM t1’; OPEN l_cursor FOR l_sql; FETCH l_cursor BULK COLLECT INTO l_tab; CLOSE l_cursor; DBMS_OUTPUT.put_line(‘NORMAL_FUNCTION: ‘ || ‘Time=’ || TO_CHAR(DBMS_UTILITY.get_time — l_time) || ‘ hsecs ‘ || ‘CPU Time=’ || (DBMS_UTILITY.get_cpu_time — l_cpu) || ‘ hsecs ‘); END;

WITH_FUNCTION : Time=44 hsecs CPU Time=40 hsecs NORMAL_FUNCTION: Time=33 hsecs CPU Time=29 hsecs

PL/SQL procedure successfully completed.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

SETSERVEROUTPUTON


DECLARE

l_timePLS_INTEGER;

l_cpuPLS_INTEGER;

l_sqlVARCHAR2(32767);

l_cursorSYS_REFCURSOR;

TYPEt_tabISTABLEOFNUMBER;

l_tabt_tab; BEGIN

l_time:=DBMS_UTILITY.get_time;

l_cpu:=DBMS_UTILITY.get_cpu_time;  

l_sql:=’WITH

              FUNCTION with_function(p_id IN NUMBER) RETURN NUMBER IS               BEGIN                 RETURN p_id;               END;             SELECT with_function(id)

            FROM   t1′;

OPENl_cursorFORl_sql;

FETCHl_cursor

BULKCOLLECTINTOl_tab;

CLOSEl_cursor;

DBMS_OUTPUT.put_line(‘WITH_FUNCTION  : ‘||

‘Time=’||TO_CHAR(DBMS_UTILITY.get_time-l_time)||’ hsecs ‘||

‘CPU Time=’||(DBMS_UTILITY.get_cpu_time-l_cpu)||’ hsecs ‘);  

l_time:=DBMS_UTILITY.get_time;

l_cpu:=DBMS_UTILITY.get_cpu_time;  

l_sql:=’SELECT normal_function(id)

            FROM   t1′;

OPENl_cursorFORl_sql;

FETCHl_cursor

BULKCOLLECTINTOl_tab;

CLOSEl_cursor;

DBMS_OUTPUT.put_line(‘NORMAL_FUNCTION: ‘||

‘Time=’||TO_CHAR(DBMS_UTILITY.get_time-l_time)||’ hsecs ‘||

‘CPU Time=’||(DBMS_UTILITY.get_cpu_time-l_cpu)||’ hsecs ‘);

END;   WITH_FUNCTION:Time=44hsecsCPUTime=40hsecs NORMAL_FUNCTION:Time=33hsecsCPUTime=29hsecs   PLSQLproceduresuccessfullycompleted.

Кажется, что автономная функция, использующая PRAGMA UDF, последовательно выполняет встроенную функцию.

У меня сложилось впечатление, что вызов функции, определенной с помощью PRAGMA UDF напрямую из PL / SQL, не удастся. Это не похоже на случайность.

Oracle PL/SQL

DECLARE l_number NUMBER; BEGIN l_number := normal_function(1); END;

PL/SQL procedure successfully completed.

1 2 3 4 5 6 7

DECLARE

l_numberNUMBER; BEGIN

l_number:=normal_function(1);

END;   PLSQLproceduresuccessfullycompleted.

SQL Server

Платформа SQL Server поддерживает ключевые слова UNION и UNION ALL стандартного синтаксиса ANSI.

инструкция SELECT 1 UNION

инструкция SELECT 2 UNION

SQL Server не поддерживает предложение CORRESPONDING. Предложение UNION DISTINCT не поддерживается, но функциональным эквивалентом является предложение UNION.

С предложениями UNION и UNION ALL вы можете использовать инструкцию SELECT…INTO, но ключевое слово INTO должно находиться в первом запросе оператора объединения. Специальные ключевые слова, такие, как SELECT ТОР и GROUP BY…WITH CUBE, можно использовать во всех запросах объединения. Однако обязательно включайте эти предложения во все запросы объединения. Если вы используете предложения SELECT ТОР или GROUP BY… WITH CUBE в одном запросе, операция выполнена не будет.

Все запросы в объединении должны содержать одно и то же количество столбцов. Типы данных столбцов не обязательно должны быть идентичны, но они должны быть неявным образом приводимы друг к другу. Например, совместное применение столбцов CHAR и VARCHAR допускается. При выводе данных SQL Server при определении размера типа данных для столбца результирующего набора использует размер наибольшего столбца. Таким образом, если в инструкции SELECT… UNION используются столбцы CHAR(5) и CHAR(IO), то данные обоих столбцов будут выводиться в столбце CHAR(IO). Числовые типы данных приводятся и отображаются в виде типа с наибольшей точностью.

Например, в следующем запросе объединяются результаты двух независимых запросов, использующих предложение GROUP BY…WITH CUBE.

На уроке будет рассмотрена тема использования операций объединения, пересечения и разности запросов. Разобраны примеры того, как используется SQL запрос Union, Exists, а также использование ключевых слов SOME, ANY и All. Рассмотрены строковые функции

Над множеством можно выполнять операции объединения, разности и декартова произведения. Те же операции можно использовать и в sql запросах (выполнять операции с запросами).

Использование оператора UNION требует выполнения нескольких условий:

  1. количество выходных столбцов каждого из запросов должно быть одинаковым;
  2. выходные столбцы каждого из запросов должны быть сравнимы между собой по типам данных (в порядке их очередности);
  3. в итоговом наборе используются имена столбцов, заданные в первом запросе;
  4. ORDER BY может быть использовано только в конце составного запроса, так как оно применяетя к результату объединения.

Пример: Вывести цены на компьютеры и ноутбуки, а также их номера (т.е. произвести выгрузку из двух разных таблиц в одном запросе)

Решение:

1 2 3 4 5 6

SELECT `Номер` , `Цена`

FROM pc UNION

SELECT `Номер` , `Цена`

FROM notebook ORDER BY `Цена`

SELECT `Номер` , `Цена` FROM pc UNION SELECT `Номер` , `Цена` FROM notebook ORDER BY `Цена`

Результат:

Рассмотрим более сложный пример с объединением inner join:

Пример: Найти тип продукции, номер и цену компьютеров и ноутбуков

Решение:

1 2 3 4 5 6 7 8

SELECT product. `Тип` , pc. `Номер` , `Цена`

FROM pc INNER JOIN product ON pc. `Номер` = product. `Номер`

UNION

SELECT product. `Тип` , notebook. `Номер` , `Цена`

FROM notebook INNER JOIN product ON notebook. `Номер` = product. `Номер`

ORDER BY `Цена`

SELECT product.`Тип` , pc.`Номер` , `Цена` FROM pc INNER JOIN product ON pc.`Номер` = product.`Номер` UNION SELECT product.`Тип` , notebook.`Номер` , `Цена` FROM notebook INNER JOIN product ON notebook.`Номер` = product.`Номер` ORDER BY `Цена`

Результат:

SQL Union 1. Найти производителя, номер и цену всех ноутбуков и принтеров

SQL Union 2. Найти номера и цены всех продуктов, выпущенных производителем Россия


С этим читают