1

这是架构:

customers (customerID: integer, fName: string, lName: string)
items (itemID: integer, description: string, price: float)
orders (orderID: integer, itemID: integer, aID: integer, customerID: integer, date: date)
addresses (aID: integer, housenum: integer, streetName: string, town:string, state: string, zip:integer)

您如何列出将物品运送到与另一位客户相同的城镇的任何客户的城镇、名字和姓氏。

当我尝试使用GROUP BYtown时,输出只能显示组中的第一个客户,而不是所有满足的。

4

1 回答 1

0

想想你会如何回答这个问题。任何这样的城镇至少有两个客户向它下订单。您可以使用带有having子句的聚合查询来获取此列表:

           select town
           from orders o join
                addresses a
                on o.Aid = a.Aid
           group by town
           having count(distinct c.customerId) > 1

现在唯一的问题是哪些客户向这些城镇下订单:

select distinct a.town, c.fname, c.lname
from customer c join
     orders o
     on c.customerID = o.customerID join
     Addresses a
     on o.Aid = a.Aid
where town in (select town
               from orders o join
                    addresses a
                    on o.Aid = a.Aid
               group by town
               having count(distinct c.customerId) > 1
              )

distinct一个选择是因为每个这样的客户可能有多个记录。

尽管这回答了您的问题,但它并不能真正回答真正的业务需求。例如,大多数州都有一个名为“斯普林菲尔德”的地方。你真的需要考虑到状态。或者也许改用邮政编码。如果这是一个真正的商业问题,客户会说纽约市(假设“城镇”字段具有一致的值。

于 2013-03-03T20:57:13.877 回答