Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008_Multiple Columns - Fatal编程技术网

Sql 列在各种表中都有其外键

Sql 列在各种表中都有其外键,sql,sql-server-2008,multiple-columns,Sql,Sql Server 2008,Multiple Columns,我在SQL Server 2008中有以下表格: Academic, Experience, Seeker, Employee, Job, Company, City 所有这些表都有一个LocationId列,该列是使用的外键,它引用CityId,CityId是City表的一列 如何通过引用cityid,检索每个表的城市名称 假设我想同时知道,求职者所在的城市,他获得学位的城市,他获得经验的组织所在的城市,职位空缺被宣布的工作所在的城市。尝试以下方式: SELECT Academic.Fiel

我在SQL Server 2008中有以下表格:

Academic, Experience, Seeker, Employee, Job, Company, City
所有这些表都有一个
LocationId
列,该列是使用的外键,它引用
CityId
CityId
City
表的一列

如何通过引用
cityid
,检索每个表的城市名称


假设我想同时知道,求职者所在的城市,他获得学位的城市,他获得经验的组织所在的城市,职位空缺被宣布的工作所在的城市。

尝试以下方式:

SELECT Academic.FieldName, City.CityName
FROM Academic
JOIN City ON City.CityID = Academic.LocationID
我希望这有帮助

更新

基于我们可以将Academic.AcademicID与Seeker.SeekerID联系起来以跟随同一个人的想法,这里有另一种方法:

SELECT a.FieldName, 
ac.CityName AS AcademicCity,
sc.CityName AS SeekerCity
FROM Academic a
INNER JOIN City ac 
ON ac.CityID = a.LocationID
LEFT JOIN Seeker s
ON s.SeekerID = a.AcademicID
LEFT JOIN City sc 
ON sc.CityID = s.LocationID
这里我展示了内部连接和左连接。(对于内部联接,您应该避免使用老式的“逗号”语法,如“来自表1,表2”,因为这有时是不明确或不正确的。)

内部连接假设我们可以在学术表和城市表中找到匹配的记录;如果没有匹配项,则不会返回任何记录

但我想返回学术城,即使在搜索者列表中没有对手。这就是为什么我在那里使用了左路连接,对于探索者城市也是如此。如果没有匹配,原始记录仍会返回,但搜索者城市将返回空值

因此,左联接允许在左联接的表中使用null。请注意,我们仍然必须从学术表格中的记录开始。你应该仔细选择你想要开始的表格。它不一定是学术桌。您可以从Seeker表开始,然后左键连接到Academic表:

FROM Seeker s
LEFT JOIN Academic a
ON a.AcademicID = s.SeekerID
这将根据每个表中的记录返回不同的结果。在决定从哪个表开始以及何时使用内部联接和左联接时,必须小心。这取决于您试图做什么,并且您必须清楚地了解您想要向数据库询问的问题

这些表还有一个单独的问题。通常认为,Academic.AcademicID与Seeker.SeekerID匹配的表结构是糟糕的数据库设计。每个表都应该有自己的主键(PK),它不依赖于任何其他表。表还可以具有指向其他表的PK的外键(FK)。因此,这里正确的规范化的结构将从一个PersonID PK的Person表开始。学术表将有自己的AcademicID PK,但它也将有一个PersonID FK指向Person表。等等


顺便说一下,对于许多表来说,将FK指向单个表是非常好的规范化数据库设计。因此,许多表(学术表、搜索表等)都指向City.CityID并不是问题。通常,您会看到FK的名称与PK相同,例如,academical.CityID而不是academical.LocationID,但也可以将其命名为LocationID。

bro我可以这样做,但同时如果我还想在同一查询中知道搜索者的城市名称,那么我该怎么做?我的意思是检索seeker的cityName和他获得学位的组织的cityName,而academic和seeker都拥有locationId,该ID引用city表中的同一Cityid列。@RanjhaniSaddam是什么告诉您学术表中的条目和seeker表中的条目引用同一个人的?是否有类似于Person表的内容,其中包含Person.PersonID主键,而其他表包含诸如academical.PersonID和seek.PersonID之类的外键?我们知道如何进入City表,但这并没有告诉我们Academic和Seeker是如何关联的。在dbo.Seeker.LocationId=S.CityId上,从Seeker内部连接城市S中选择S.CityName作为SeekerCity,选择A.CityName作为AcademicCity,在dbo.Academic.LocationId=A.CityId上加入城市A,其中Seeker.SeekerId=1和Academic.AcademicId=1