SQL帮助从两个表中选择客户信息

时间:2016-09-28 14:54:30

标签: sql sql-server

我有一项任务,我必须创建两个名为客户地址的表格。这些表位于名为HandsOnOne的数据库中。

客户的标题为: CustomerIDCustomerNameCustomerAddressID

地址的标题为: AddressIDStreetCityStateZipCode

存在外键关系,其中地址表中的AddressID是主键,而客户表中的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 Billings MT 59101 的地址,因为其AddressID 2 并且没有{{1 地址表中 2 的值。但是,执行此查询时,我没有收到任何结果。

我已经确认存在外键关系。我做错了什么?

2 个答案:

答案 0 :(得分:5)

您不能限制加入。此外,大多数DBMS(尤其是最新版本的SQL Server)不再支持隐式连接,因此最好使用显式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

答案 1 :(得分:0)

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

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