我有一项任务,我必须创建两个名为客户和地址的表格。这些表位于名为HandsOnOne的数据库中。
客户的标题为:
CustomerID
,CustomerName
,CustomerAddressID
地址的标题为:
AddressID
,Street
,City
,State
,ZipCode
存在外键关系,其中地址表中的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个项目。
下一个问题要求我列出所有地址的Street
,City
,State
和ZipCode
,而不会与客户相关联。
此查询应返回 320 21st St Billings , MT 59101 的地址,因为其AddressID
值 2 并且没有{{1 地址表中 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)