【问题标题】:SELECT value from a second level foreign key table从二级外键表中选择值
【发布时间】:2014-07-01 07:34:01
【问题描述】:

问候地球人,

我有问题。让我从布置表结构开始:

    CREATE TABLE Person
    (
        id varchar(50) NOT NULL PRIMARY KEY,
        name varchar(50) NOT NULL,
        adress varchar(50) NOT NULL references Adress(id)
    )

    CREATE TABLE Adress
    (
        id varchar(50) NOT NULL PRIMARY KEY,
        addressName varchar(50),
        city varchar(50),
        aState varchar(50),
        linkToCountry varchar(50) references Country(id)
    )

    CREATE TABLE Country
    (
        id varchar(50) NOT NULL PRIMARY KEY,
        countryName varchar(50)
    )

我想要实现的是:选择一个人的“姓名”以及他们的“地址名称”和他们来自的“国家/地区名称”。 我知道这是一个与加入相关的问题,但我似乎无法弄清楚这一点。

那么精通 SQL 的人有什么帮助吗?

非常感谢任何人提供高级 sql 连接的链接,以便我熟悉它。

【问题讨论】:

  • 对不起,如果这听起来不礼貌,但是......你已经知道这是关于连接的,但你不知道如何解决这个问题???这是非常非常基本的内部连接。关于你学到的第一件事。你有没有开始尝试自己解决这个问题?
  • 是的,我有。我的 SQL 知识非常初级。所以是的,你的评论确实很不礼貌。我问是因为我想不通。
  • 但是您承认解决方案很简单,不是吗? :-) 下次您应该显示您尝试过的查询,以便我们看到您的努力,甚至可以对其发表评论。
  • 会这样做@ThorstenKettner

标签: sql sql-server database select join


【解决方案1】:

您可以使用下面的简单连接获得结果。这将返回带有地址名称和国家名称的人名。然而,它只返回那些在地址表中具有地址记录和在国家表中具有国家记录的人名。如果你想检索所有的人,不管地址/国家是否存在,你需要使用左连接。

SELECT Person.Name, Address.addressname,Country.countryName
FROM Person 
     JOIN Address on Person.address = Address.Id
     JOIN Country ON Address.linkToCountry = Country.id

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT p.name, a.addressName, c.countryName
    FROM Person p 
    INNER JOIN Adress a ON p.adress = a.id 
    LEFT OUTER JOIN Country c ON a.linkToCountry = c.id
    

    【讨论】:

    • 可以内联表地址。 Person.adress 不可为空。
    • 完美运行! T-h-a-n-k 你!
    • 所以现在它是两个内连接而不是两个外连接 :-) 表 Country 上的左连接实际上是有意义的,因为 Adress.linkToCountry 可以为空。 @TheComplexOne:不同之处在于您仍然会得到结果,即使地址不包含国家/地区(那时 c.countryName 将为空)。
    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多