Udostępnij za pośrednictwem


Unia języka Transact-SQL)

Łączy wyniki dwóch lub więcej kwerend w jednym zestaw wyników zawierające wiersze, które należą do wszystkich kwerend w Unii.Operacja UNION różni się od za pomocą sprzężeń, które łączą w sobie kolumn z dwóch tabel.

Łączenie zestawów wyników dwie kwerendy przy użyciu Unii podstawowe zasady są następujące:

  • Numer i kolejność kolumn muszą być takie same we wszystkich kwerend.

  • Typy danych muszą być zgodne.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

    { <query_specification> | ( <query_expression> ) } 
  UNION [ ALL ] 
  <query_specification | ( <query_expression> ) 
 [ UNION [ ALL ] <query_specification> | ( <query_expression> ) 
    [ ...n ] ] 

Argumenty

  • <query_specification> | ( <query_expression> )
    Jest specyfikacja kwerendy lub kwerendy wyrażenie , które zwraca dane połączone z danymi z innej kwerendy specyfikacji kwerendy lub wyrażenie.Definicje kolumn, które są częścią operacji UNION nie muszą być takie same, ale muszą być zgodne poprzez niejawna konwersja.Gdy są różne typy danych, wynikowy typ danych jest określany na podstawie reguł dla Typ danych pierwszeństwo przed.Gdy typy są takie same, ale różnią się precyzja, skala lub długość, wynik jest określana na podstawie tych samych reguł, do łączenia wyrażeń.Aby uzyskać więcej informacji, zobacz Precyzja, skala i długość (Transact-SQL).

    Kolumny z xml Typ danych muszą być równoważne.Wszystkie kolumny muszą wpisane do schematu XML lub bez typu.Jeśli wpisany, muszą być wpisywane do tego samego schematu XML kolekcja.

  • UNIA
    Określa, że wiele zestawów wyników są łączone i zwracane jako pojedynczy zestaw wyników.

  • ALL
    Dołącza wszystkie wiersze do wyniki.Zawiera duplikaty.Jeśli nie jest określony, zduplikowane wiersze są usuwane.

Przykłady

A.Za pomocą prostego Unii

W poniższym przykładzie zestaw wyników zawiera zawartość ProductModelID i Name kolumny obu ProductModel i Gloves tabele.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO

-- Here is the simple union.
USE AdventureWorks2008R2;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO

B.Przy użyciu Unii SELECT INTO

W poniższym przykładzie INTO klauzula w drugim SELECT instrukcja Określa, że tabela o nazwie ProductResults przechowuje końcowe zestaw wyników Unii w kolumnach wyznaczonych ProductModel i Gloves tabele.Należy zauważyć, że Gloves tabela jest tworzona w pierwszym SELECT instrukcja.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.ProductResults', 'U') IS NOT NULL
DROP TABLE dbo.ProductResults;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO

USE AdventureWorks2008R2;
GO
SELECT ProductModelID, Name
INTO dbo.ProductResults
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO

SELECT * 
FROM dbo.ProductResults;

C.Przy użyciu Unii dwóch instrukcji SELECT ORDER BY

Kolejność pewne parametry używane w Unii klauzula jest ważna.W poniższym przykładzie przedstawiono nieprawidłowe i właściwego stosowania UNION w dwóch SELECT sprawozdania, w których kolumna jest zmieniona w danych wyjściowych.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO

/* INCORRECT */
USE AdventureWorks2008R2;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
ORDER BY Name
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO

/* CORRECT */
USE AdventureWorks2008R2;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO

D.Pokaż wszystkie efekty i nawiasy za pomocą Unii trzech instrukcji SELECT

W następujących przykładach użyto UNION połączyć wyniki trzech tabelach wszystkie mają ten sam 5 wierszy danych.W pierwszym przykładzie użyto UNION ALL Aby wyświetlić zduplikowane rekordy, a następnie zwraca wszystkie wiersze 15.W drugim przykładzie użyto UNION bez ALL wyeliminowanie zduplikowanych wierszy z otrzymanych wyniki trzech SELECT instrukcji i zwraca 5 wierszy.

W trzecim przykładzie użyto ALL z pierwszym UNION i drugi otaczają nawiasy UNION nie korzystający z ALL.Drugi UNION jest przetwarzane jako pierwsze, ponieważ jest w nawiasach i zwraca 5 wierszy, ponieważ ALL nie jest używana opcja i usuwane są duplikaty.Te 5 wierszy są łączone z wyniki pierwszego SELECT za pomocą UNION ALL słowa kluczowe.Nie usuwa duplikaty pomiędzy dwoma zestawami 5 wierszy.Ostateczny wynik ma 10 wierszy.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.EmployeeOne', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeOne;
GO
IF OBJECT_ID ('dbo.EmployeeTwo', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeTwo;
GO
IF OBJECT_ID ('dbo.EmployeeThree', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeThree;
GO

SELECT pp.LastName, pp.FirstName, e.JobTitle 
INTO dbo.EmployeeOne
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle 
INTO dbo.EmployeeTwo
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle 
INTO dbo.EmployeeThree
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
-- Union ALL
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeOne
UNION ALL
SELECT LastName, FirstName ,JobTitle
FROM dbo.EmployeeTwo
UNION ALL
SELECT LastName, FirstName,JobTitle 
FROM dbo.EmployeeThree;
GO

SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeOne
UNION 
SELECT LastName, FirstName, JobTitle 
FROM dbo.EmployeeTwo
UNION 
SELECT LastName, FirstName, JobTitle 
FROM dbo.EmployeeThree;
GO

SELECT LastName, FirstName,JobTitle 
FROM dbo.EmployeeOne
UNION ALL
(
SELECT LastName, FirstName, JobTitle 
FROM dbo.EmployeeTwo
UNION
SELECT LastName, FirstName, JobTitle 
FROM dbo.EmployeeThree
);
GO