【问题标题】:SQL query of relationship between two items from the same tableSQL查询同一张表中两个项目之间的关系
【发布时间】:2012-10-21 06:42:14
【问题描述】:

我在 sqlite 中有 3 个表,第一个是关于我称之为 bar 的实体:

bar
    *id
    -name

另一个保持两个bar之间的关系,我称这种关系为foo:

foo
    *id
    -bar_one (fk->bar)
    -bar_two (fk->bar)
    -baz (fk->baz)

baz 拥有一个属性来限定 foo 所代表的 KIND 关系:

baz
    *id
    -description

我需要显示一个 foo 查询,它将外键替换为 bar 和 baz 的值,例如:

id    bar_one    bar_two    baz
1     bar1       bar2       siblings
2     bar2       bar3       acquaintances
3     bar3       bar4       enemies

如您所见,我不是数据库专家,我尝试过使用 join,它适用于 foo 和 baz。

SELECT foo.id, baz.description FROM foo, baz WHERE foo.baz = baz.id;

但是以这种方式展示bar的两个成员对我来说很难。有什么建议吗?

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    假设表foo:bar_one (fk->bar),bar_two (fk->bar),baz的列是非空列,你可以使用INNER JOIN来合并两个表,但是如果他们可以为空,请改用LEFT JOIN

    SELECT  a.ID,
            b.name as bar_one,
            c.name AS bar_two,
            d.description
    FROM    foo a
            INNER JOIN bar b
                ON a.bar_one = b.id
            INNER JOIN bar c
                ON a.bar_two = c.id
            INNER JOIN baz d
                ON a.baz = c.id
    

    基本上,INNER JOIN 只显示记录在每个表定义上至少有一个匹配的行,而LEFT JOIN 显示在左侧定义的所有行,无论是否匹配.

    【讨论】:

    • 谢谢,这正是我一直在寻找的,现在我正在阅读有关内连接、左连接和右连接的内容,我只记得我去年在大学里教过这个。
    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多