列在各种表中都有其外键

时间:2013-05-07 14:55:15

标签: sql sql-server-2008 multiple-columns

我有以下表格

Academic, Experience, Seeker, Employee, Job, Company, City

所有这些表都有LocationId列,它是使用的外键,它引用CityId,而cityIdCity表的列。

任何人都可以通过引用cityid告诉我如何检索每个表的城市名称?

我想同时知道,寻求者的城市,他获得学位的城市,他从中获得经验的组织城市,宣布职位空缺的城市。

请紧急帮助......我该如何在SQL Server 2008中实现它

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

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

这里我展示了内连接和左连接。 (你应该避免内部联接的老式“逗号”语法,比如“FROM table1,table2”,因为这有时是模棱两可或不正确的。)

内连接假设我们可以在Academic表和City表中找到匹配的记录;如果没有匹配,则不返回任何记录。

但即使搜索者表中没有匹配项,我也希望返回学术城市。这就是我在那里使用左连接以及搜索者城市的原因。如果没有匹配,则仍会返回原始记录,但搜索者城市将返回NULL。

因此,左连接允许在表中保留连接的NULL。请注意,我们仍然必须从Academic表中的记录开始。您应该仔细选择要开始的表。它不一定是学术表。您可以从搜索者表开始,然后离开加入学术表:

FROM Seeker s
LEFT JOIN Academic a
ON a.AcademicID = s.SeekerID

根据每个表中的记录,这将返回不同的结果。当您决定从哪个表开始,以及何时使用内部联接和左联接时,您必须要小心。这取决于你想要做什么,你必须清楚地理解你想要问数据库的问题。

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

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