【问题标题】:SQL: List all entries for a foreign key, acquired in same querySQL:列出在同一查询中获取的外键的所有条目
【发布时间】:2014-09-13 13:17:29
【问题描述】:

我需要在一个 android 应用程序中创建一个非常简单的数据库(我正在使用 SQLite)并且不知道如何进行此查询。

假设我有这两个表,并与第一个表中的 locationid 链接在一起:

CREATE TABLE locations
(
  locationid INTEGER PRIMARY KEY AUTO_INCREMENT, 
  floor INTEGER,
  room INTEGER
);

CREATE TABLE entries
(
  entryid INTEGER PRIMARY KEY AUTO_INCREMENT,
  title TEXT,
  summary TEXT,
  date DATE,
  FOREIGN KEY(location) REFERENCES locations(locationid)
);

如何构造以下查询:从表“条目”中获取 3 楼 308 室的所有行?

【问题讨论】:

  • 这是一个非常基本的 SQL 查询,它涉及一个 join 和一个 where 子句。如果您要有效地使用 SQL,您应该花一些时间来学习和练习基础知识。
  • create table entries (... 无效,因为它没有定义列 location,但它试图使该列成为外键。

标签: sql sqlite foreign-keys


【解决方案1】:
SELECT *
FROM entries
WHERE locations = (SELECT locationid
                   FROM locations
                   WHERE room=308
                     AND floor=3)

或者:

SELECT e.*
FROM entries e
JOIN locations l ON e.locations = l.locationid
WHERE l.room = 308
  AND l.floor = 3

【讨论】:

  • 第二个错误(如果位置中存在多个对 locationid 的引用,将产生多个元组)
  • 部分同意@wildplasser。我假设该表将没有重复条目。
  • 如果有多个room = 308 and floor = 3的位置,第一个将失败
【解决方案2】:
SELECT e.*
FROM locations l INNER JOIN entries e
ON l.locationid = e.location
WHERE l.floor = 3
 AND  l.room  = 308

【讨论】:

    【解决方案3】:

    这是一个简单的 JOIN 语句:

     select
        locations.*,      -- suppress this if only entries table are needed
        entries.*         -- you can select only date and title instead of everything
     from locations
     join entries
        on entries.location=locations.locationid      -- using your foreign key
     where
        locations.room=308                            -- first condition
        and locations.floor=3                         -- second condition
     ;
    

    如果您想检索房间的信息(例如),即使条目表中没有链接数据,您也可以使用 LEFT JOIN 而不是 JOIN。

    最后一句话:我很确定答案已经在 stackoverflow 和网络上。

    【讨论】:

      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 2011-01-26
      相关资源
      最近更新 更多