0

我真的被困在这个问题上。我需要创建一个查询,其中有一个包含 CustomerID 和 PurchaseID 编号的表。在另一个表中,我有 CustomerID 以及客户的 FirstName 和 LastName。我需要做的是只获取记录 PurchaseID 为 1 或 2 或 7 的客户的名字和姓氏。当我尝试我的代码时,我从我的第二个表中获取所有客户(其中包含名字、姓氏、和 CustomerID),这是不正确的。

这是我的代码:

SELECT FirstName, LastName
  FROM Customer, Purchase
 WHERE Purchase.PurchaseID = '1'
    OR Purchase.PurchaseID = '2' 
    OR Purchase.PurchaseID = '7'
 GROUP BY FirstName, LastName;

我对 SQL 很陌生,非常感谢这里的帮助。

4

5 回答 5

2
SELECT DISTINCT c.FirstName, c.LastName
FROM Customer c
JOIN Purchase p ON p.CustomerID = c.CustomerID
WHERE p.PurchaseID IN ('1', '2', '7')
ORDER BY  c.LastName, c.FirstName

更新:作为对@David Aldridge 评论的回应,我刚刚在带有最新服务包的 SQL SERVER 2008 R2 上测试了两种形式(他的和我的)。他们生成相同的成本执行计划。事实上,我的连接表单执行的逻辑读取次数略少(当然,这可能会因实际选择的 ID 而异)

我对 SQL Server 示例数据库 AdventureWorksDW2008 运行了这两个查询(因为 David 提到“我从事过数据仓库工作”):

select distinct c.FirstName, c.LastName
from dbo.FactInternetSales s 
join dbo.DimCustomer c on c.CustomerKey = s.CustomerKey 
where s.ProductKey IN (328, 333, 472)

SELECT FirstName,
       LastName
FROM   dbo.DimCustomer c
where  exists (
       select null
       from   dbo.FactInternetSales s
       WHERE  s.CustomerKey = c.CustomerKey and
              s.ProductKey in (328, 333, 472))
于 2013-05-06T07:13:56.970 回答
1

试试这个查询:

SELECT C.FirstName, C.LastName
  FROM Customer C
  JOIN Purchase P ON P.CustomerID = C.CustomerID
 WHERE P.PurchaseID IN ('1','2','7')
 GROUP BY C.FirstName, C.LastName

检查此SQL Fiddle 测试代码以防万一以确保其正常工作。添加了同一客户的多次购买,以确保不会重复结果。感谢大卫奥尔德里奇指出这一点。

还有另一种选择,EXISTS在大卫提出的答案中使用 as 。如果您有大表可以使用,那么它应该会更有效。使用该选项检查其他SQL Fiddle 测试代码。

避免使用旧的 ANSI-89 JOIN 语法,使用 JOIN 以获得更好的可读性:

 FROM Customer, Purchase
WHERE Purchase.PurchaseID = '1'

查看Aaron Bertrands 博客了解更多信息

于 2013-05-06T07:18:50.090 回答
0

哟必须基本上做 Join 。您尝试做的是旧的 ANSI SQL-89 JOIN 语法。但这不推荐。

SELECT FirstName, LastName
FROM Customer, Purchase
WHERE Customer.CustomerID = Purchase.CustomerID
AND ( Purchase.PurchaseID = '1' OR Purchase.PurchaseID = '2' 
OR Purchase.PurchaseID = '7' )

正确的做法如 Mitchwheat 回答中所述

于 2013-05-06T07:18:02.560 回答
0

如果要检查是否存在为客户购买的各种产品,请使用:

SELECT FirstName,
       LastName
FROM   Customer
where  exists (
       select null
       from   Purchase
       WHERE  Purchase.customerID = customer.customerid and
              Purchase.PurchaseID in ('1','2','7'))

优化器只需要在购买表中找到一行就知道要包括客户。

于 2013-05-06T07:20:33.847 回答
-1

另一种方法,不用IN

SELECT DISTINCT c.FirstName, c.LastName
FROM Customer c
JOIN Purchase p ON p.CustomerID = c.CustomerID
WHERE
p.PurchaseID = '1' OR p.PurchaseID = '2' 
OR p.PurchaseID = '7'
ORDER BY  c.LastName, c.FirstName
于 2013-05-06T07:17:16.570 回答