【问题标题】:SQL help selecting customer information from two tablesSQL帮助从两个表中选择客户信息
【发布时间】:2016-09-29 01:46:08
【问题描述】:

我有一个任务,我必须创建两个名为 CustomerAddress 的表。这些表位于名为 HandsOnOne 的数据库中。

客户 的列标题为: CustomerIDCustomerNameCustomerAddressID

Address 的列标题为: AddressIDStreetCityStateZipCode

存在外键关系,其中Address表中的AddressID是主键,Customer表中的CustomerAddressID是外键。

我使用以下代码将值插入到每个表中:

USE HandsOnOne;

INSERT INTO Address (AddressID, Street, City, State, ZipCode)    
VALUES (1, '2400 Broadway Drive', 'Missoula', 'MT', '59802'),
(2, '320 21st Street', 'Billings', 'MT', '59101'),    
(3, '439 Skyline Blvd', 'Denver', 'CO', '80002'),    
(4, '56 Park Avenue', 'New York', 'NY', '10001');

USE HandsOnOne;

INSERT INTO Customer (CustomerID, CustomerName, CustomerAddressID)
VALUES (1, 'Western Supply Company', 1),    
(2, 'Nick Harper', 3),
(3, 'Alice Harper', 3),
(4, 'Abacus Consulting', 4);

从那里,我必须根据某些规范进行排序。第一个规范是列出所有城市和州的客户,按ZipCode 升序排列,然后按CustomerName 升序排列。

这是我用于这部分的代码:

USE HandsOnOne;

SELECT CustomerName, City, State    
FROM Customer, Address
ORDER BY ZipCode ASC, CustomerName ASC;

当我执行此代码时,我的回报是 16 件商品,而不是 4 件。不知何故,每个客户都被分配了每个地址,每个地址给了我 4 件商品。

下一个问题要求我列出没有客户关联的所有地址的StreetCityStateZipCode
此查询应返回320 的地址21st St BillingsMT 59101,因为它的 AddressID 值是 2 并且在 2 中没有 CustomerAddressID地址表。但是,当我执行此查询时,我没有收到任何结果。

我已验证存在外键关系。我做错了什么?

【问题讨论】:

标签: sql sql-server


【解决方案1】:

您没有限制您的加入。此外,大多数 DBMS(尤其是最新版本的 SQL 服务器)不再支持隐式连接,因此最好使用显式 Inner Join

试试这个:

select CustomerName, City, State
from Customer 
inner join Address 
    on AddressID = CustomerAddressID -- I assume this is the foreign key
order by ZipCode asc, CustomerName asc

啊,第 2 题(由于格式问题错过了)

select A1.*
from Address A1
left join Customer C2
    on A1.AddressID = C2.CustomerAddressID
where C2.CustomerAddressID is null

【讨论】:

  • 成功了,谢谢!连接需要明确说明。
【解决方案2】:

对于您的第二个问题:使用NOT EXISTS 获取没有客户的所有地址。见下文:

SELECT *
FROM   Address A
WHERE NOT EXISTS (SELECT 1
                  FROM   Customer C
                  WHERE  C.CustomerAddressID = A.AddressID)

【讨论】:

  • 我有一种感觉,任务是学习joins...但这绝对是第二个问题的正确解决方案,只是可能不是您需要的答案。
  • 我在第二个问题中没有发现解决方案必须使用连接的提示。
  • 是的,但请看上下文。 Q1 是关于内部连接,Q2 可以通过连接解决。嘿,我不是说你错了。您的解决方案是最有效的。我只是说使用连接更有可能是作业的答案(我自己写了一些)。
  • 大家好,感谢您的帮助!我的班级都可以接受这两个答案,因为这两种方法都在本课中介绍过
  • 如果您喜欢这些答案,请不要犹豫:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多