Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL帮助从两个表中选择客户信息_Sql_Sql Server - Fatal编程技术网

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

SQL帮助从两个表中选择客户信息,sql,sql-server,Sql,Sql Server,我有一个任务,我必须创建两个名为Customer和Address的表。这些表位于名为HandsOnOne的数据库中 客户拥有标题为: CustomerID、CustomerName、CustomerAddressID 地址中有标题为: 地址ID,街道,城市,州,邮编 存在一种外键关系,其中地址表中的AddressID是主键,Customer表中的CustomerAddressID是外键 我使用以下代码在每个表中插入值: USE HandsOnOne; INSERT INTO Address (

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

客户拥有标题为: CustomerID、CustomerName、CustomerAddressID

地址中有标题为: 地址ID,街道,城市,州,邮编

存在一种外键关系,其中地址表中的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个项目

下一个问题要求我列出所有地址的街道、城市、州和邮政编码,而没有与之关联的客户。此查询应返回320 21 St Billings,MT 59101的地址,因为其AddressID值为2,并且地址表中没有CustomerAddressID值2。但是,在执行此查询时,我没有收到任何结果


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

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

试试这个:

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

你没有限制你的加入。此外,大多数DBMS(尤其是SQL server的最新版本)不再支持隐式连接,因此最好使用显式内部连接

试试这个:

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

对于您的第二个问题:使用“不存在”获取没有客户的所有地址。见下文:

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

对于您的第二个问题:使用“不存在”获取没有客户的所有地址。见下文:

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


既然约翰霍克已经给出了答案,我要补充一点:当我开始使用连接时,下面的图表帮助了我很多:@DenStudent我的墙上有一个类似的图表——20多年前,在ANSI-92 SQL标准中,旧样式的逗号分隔表样式被正确的ANSI连接语法所取代,它的使用是不鼓励的。这看起来很熟悉……因为约翰霍克已经给出了答案,,我要补充一点:当我开始使用联接时,下图帮助了我很多:@DenStudent我的墙上有一个类似的图表-20多年前,在ANSI-92 SQL标准中,旧样式的逗号分隔表样式被正确的ANSI联接语法所取代,它的使用是不鼓励的。这看起来很熟悉……这很有效,谢谢连接需要明确说明。这很有效,谢谢!连接需要明确说明。我感觉任务是学习连接。。。但对于第二个问题,这绝对是正确的解决方案,只是可能不是你需要的答案。我在第二个问题中没有发现解决方案必须使用连接的暗示。是的,但请看上下文。Q1是关于一个内部连接,Q2是通过一个连接可解的。嘿,我不是说你错了。你的是最有效的解决方案。我只是说,我自己写了一些,使用连接更可能是任务的答案。大家好,谢谢你们的帮助!这两个答案对我的班级来说都是可以接受的,因为这两种方法都包含在本课中。如果你喜欢这些答案,请不要犹豫,投赞成票:-我有一种感觉,这项作业是为了学习连接。。。但对于第二个问题,这绝对是正确的解决方案,只是可能不是你需要的答案。我在第二个问题中没有发现解决方案必须使用连接的暗示。是的,但请看上下文。Q1是关于一个内部连接,Q2是通过一个连接可解的。嘿,我不是说你错了。你的是最有效的解决方案。我只是说,我自己写了一些,使用连接更可能是任务的答案。大家好,谢谢你们的帮助!这两个答案对我的班级来说都是可以接受的,因为这两种方法都包含在本课中。如果你喜欢这些答案,请毫不犹豫地投票:-