如何在单个表上执行UNION?

时间:2012-08-19 12:42:02

标签: sql sql-server-2008 union

我需要显示所有居住在“彼得斯”或“乌鸦”大道的客户的姓名,地址和DOB。

这很好,我这样做了:

SELECT Customers.FirstName, Customers.Surname,
       Customers.CustomerAddress, Customers.DOB
FROM Customers
WHERE 
(  Customers.CustomerAddress LIKE '%'+ 'Peters' + '%' 
or Customers.CustomerAddress LIKE '%'+ 'Crows'+ '%')

然后我读得更难了,它说:

  

使用UNION查询生成结果。

所以我在UNION上读了一下,但大多数时候我发现 SELECT 查询的返回值必须是相同的长度,通常的例子是使用2个不同的表?

所以我需要在同一张桌子上执行UNION,这样就会显示所有在其地址中带有 Peters Crows 字样的客户。我试过了:

SELECT Customers.CustomerAddress
FROM Customers
WHERE 
(  Customers.CustomerAddress LIKE '%'+ 'Peters' + '%'
or Customers.CustomerAddress LIKE '%'+ 'Crows'+ '%')
UNION
SELECT Customers.FirstName, Customers.Surname,
       Customers.CustomerAddress, Customers.DOB
FROM Customers

但我收到错误:

  

使用UNION,INTERSECT或EXCEPT运算符组合的所有查询都必须   在目标列表中有相同数量的表达式。

这是可以理解的,因为我的第一个 SELECT 只返回3个结果(即我正在寻找的结果),而另一个返回所有被寻址的(包括我需要的)。

所以我的确切问题是,我如何在同一张桌子上执行UNION(客户共有10条记录),以便所有客户都使用 Peters 和< em> Crows 在他们的地址中显示? (其中3个记录与其他7个记录不匹配)

3 个答案:

答案 0 :(得分:6)

SELECT Customers.FirstName, Customers.Surname,  Customers.DOB, Customers.CustomerAddress
FROM Customers
WHERE Customers.CustomerAddress LIKE '%'+ 'Main' + '%'  
UNION
SELECT Customers.FirstName, Customers.Surname,  Customers.DOB, Customers.CustomerAddress
FROM Customers
WHERE Customers.CustomerAddress LIKE '%'+ 'Gladys'+ '%'

在联盟中,2个或更多查询应始终在SELECT语句中具有相同数量的字段。 WHERE子句似乎是您的Union查询中的问题

答案 1 :(得分:1)

如果您希望能够合并这两个集,则需要两个返回的集具有相同的格式。第一组仅返回客户地址,例如:

123 Main St

但是从第二个查询返回的集合返回三列:名字,姓氏,dob。例如:

John, Doe, 1970-12-31

因此,让两个查询都返回相同的列集,以便它们可以合并。例如,包括所有4列:

Jane, Smith, 1975-11-22, 123 Main St

John, Doe, 1970-12-31,  89 Elm St

使用相同数量的列,顺序相同,类型相同,这两个集合可以与UNION合并。

Jane, Smith, 1975-11-22, 123 Main St
John, Doe, 1970-12-31,  89 Elm St

另外请务必阅读并区分UNION和UNION ALL。

答案 2 :(得分:0)

我认为问题本身不完全是where子句,而是您试图对需要不同数据集的两个查询的结果执行UNION的事实。我可能错了,但据我了解,UNION所做的是垂直粘贴两个表,因此如果您要正常工作,它们必须具有相同的形状。

查询的第一部分仅返回符合条件的CustomerAddress个客户:

SELECT Customers.CustomerAddress
FROM Customers
WHERE 
(  Customers.CustomerAddress LIKE '%'+ 'Peters' + '%'
or Customers.CustomerAddress LIKE '%'+ 'Crows'+ '%') 

此查询:

SELECT Customers.FirstName, Customers.Surname,
       Customers.CustomerAddress, Customers.DOB
FROM Customers

返回四个不同的列并且没有限制,这不会阻止联合的发生,因为您的第一个查询也有四个列,但是不会显示您要查找的内容