我需要显示所有居住在“彼得斯”或“乌鸦”大道的客户的姓名,地址和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个记录不匹配)
答案 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
返回四个不同的列并且没有限制,这不会阻止联合的发生,因为您的第一个查询也有四个列,但是不会显示您要查找的内容