11

我只需要显示居住在“Peters”或“Crows”大道的所有客户的姓名和地址以及出生日期。

这很好,我是这样做的:

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

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

使用 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

但我得到错误:

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

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

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

4

3 回答 3

10
 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'+ '%'

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

于 2012-08-19T12:51:04.193 回答
2

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

123 Main St

但是从第二个查询返回的集合返回三列:名字、姓氏、出生日期。例如:

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。

于 2012-08-19T12:50:00.673 回答
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

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

于 2020-01-22T20:04:59.217 回答