【问题标题】:SQLite table referring to itself引用自身的 SQLite 表
【发布时间】:2013-01-05 13:20:23
【问题描述】:

我在 SQLite 中有一个表(联系人)和一个表(连接),它们非常不言自明:

contacts 表包含 id、firstname、secondname 等信息。 连接表在一列中保存联系人的 id,在另一列中保存与之连接的联系人的 id。

contacts

id | firstname | secondname
1  | test      | test
2  | asdf      | asdf
3  | qwer      | qwer

connection

id | contact_id | connection_to_id
1  | 1          | 2
2  | 1          | 3

如何进行查询以获取与一位联系人相关联的姓名? 我试过了,但它只给了我一个名字,即使有更多的连接:

SELECT
    c.firstname, c.secondname
FROM contacts c
WHERE
    c.id =
    (SELECT
        scon.connection_to_id
    FROM connection scon
    WHERE
        scon.contact_id = 1)

我只得到:

adsf asdf

但我想要:

adsf asdf
qwer qwer

我希望你能理解我的问题并帮助我解决这个问题:)

【问题讨论】:

  • 这是 SQLite 还是 MySQL?子查询应该返回多行,所以你应该使用WHERE c.id IN (SELECT....)

标签: mysql sql sqlite subquery


【解决方案1】:

最简单的只需要小改动,将c.id =改成c.id IN

SELECT
    c.firstname, c.secondname
FROM contacts c
WHERE
    c.id IN
    (SELECT
        scon.connection_to_id
    FROM connection scon
    WHERE
        scon.contact_id = 1) ;

您还可以使用EXISTS 相关子查询编写:

SELECT
    c.firstname, c.secondname
FROM contacts c
WHERE
    EXISTS
    (SELECT 1
    FROM connection scon
    WHERE
        scon.contact_id = 1
      AND 
        scon.connection_to_id = c.id) ;

或使用JOIN(只要您在connection 表中没有重复的行):

SELECT
    c.firstname, c.secondname
FROM contacts c
  JOIN connection scon
    ON scon.connection_to_id = c.id
WHERE
    scon.contact_id = 1 ;

【讨论】:

    【解决方案2】:

    使用WHERE c.id IN (SELECT ...),即IN代替=。

    【讨论】:

      猜你喜欢
      • 2021-12-04
      • 2021-08-07
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 2013-02-17
      • 1970-01-01
      • 2014-01-21
      相关资源
      最近更新 更多