如何在单个表上执行UNION?

Dav*_*amp 9 sql union sql-server-2008

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

这很好,我这样做:

SELECT Customers.FirstName, Customers.Surname,
       Customers.CustomerAddress, Customers.DOB
FROM Customers
WHERE 
(  Customers.CustomerAddress LIKE '%'+ 'Peters' + '%' 
or Customers.CustomerAddress LIKE '%'+ 'Crows'+ '%')
Run Code Online (Sandbox Code Playgroud)

但后来我读得更难了,它说:

使用UNION查询生成结果.

所以我在UNIONs 上读了一下,但大多数情况下我看到两个SELECT查询的返回值必须是相同的长度,并且通常示例使用2个不同的表?

所以我需要UNION在同一张桌子上执行一个表示所有在其地址中带有PetersCrows字样的客户.我试过了:

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
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

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

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

所以我的确切问题是,如何UNION在同一张桌子上执行a (客户共10条记录),以便显示所有在其地址中包含PetersCrows字样的客户?(其中3个记录与其他7个记录不匹配)

Con*_*otz 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'+ '%'
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个很好的答案,但如果您使用UNION ALL而不是UNION,那将会更好.UNION有额外的步骤来删除重复项,这会产生性能成本.此查询的结构方式没有重复. (2认同)