【问题标题】:SQLite Select with join from the same parentSQLite 选择与来自同一父级的连接
【发布时间】:2017-05-26 22:07:33
【问题描述】:

我有两个简单的表格:

姓名:

+----+-------------+
| id | Name        |
+----+-------------+
|  1 | John Smith  |
|  2 | Joe Doe     |
+----+-------------+

关系:

+----+----------+---------+
| id | ParentID | ChildID |
+----+----------+---------+
|  1 |        1 |       2 |
+----+----------+---------+

表关系,Parent 是 Names 的外键,Child 是 Names 的外键。

有没有办法在数字与 Names.id 匹配的情况下选择并用 Names 中的 Name 替换 ParentID 和 ChildID?

【问题讨论】:

  • 请提供来自 SQLite 命令行工具的.dump 以获得合适的玩具数据库。
  • CREATE TABLE Names ( id INTEGER PRIMARY KEY ASC AUTOINCREMENT UNIQUE NOT NULL, Name VARCHAR (255) COLLATE NOCASE NOT NULL UNIQUE ); CREATE TABLE Relations ( id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, Parent INTEGER NOT NULL REFERENCES Names (id), Child INTEGER REFERENCES Names (id) NOT NULL );
  • 我看到存在差异,我在问题中写的内容与 DB = Relations[id, Parent, Child] 而不是 Relations[ id, ParentID, ChildID] 但问题还是一样 ;)

标签: sqlite foreign-keys foreign-key-relationship


【解决方案1】:

你可以多次加入同一个表,只要你给每个实例一个唯一的名字:

SELECT Parent.Name,
       Child.Name
FROM Relations
JOIN Names AS Parent ON Relations.ParentID = Parent.ID
JOIN Names AS Child  ON Relations.ChildID  = Child.ID;

或者,只需使用子查询:

SELECT (SELECT Name FROM Names WHERE id = Relations.ParentID) AS ParentName,
       (SELECT Name FROM Names WHERE id = Relations.ChildID ) AS ChildName
FROM Relations;

【讨论】:

  • 干杯 CL,第二个选项奏效了。我刚刚尝试了另一种方式(来自 MySQL InnoDB):CREATE TABLE TestTable (id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, ParentId INTEGER, ParentName VARCHAR (255), ChildId INTEGER, ChildName VARCHAR (255), FOREIGN KEY (ParentId, ParentName) REFERENCES Names (id, Name) ON UPDATE CASCADE, FOREIGN KEY (ChildId, ChildName) REFERENCES Names (id, Name) ON UPDATE CASCADE); 但是当我尝试插入时:INSERT INTO TestTable(ParentID, ParentName, ChildId, ChildName) values (1, "John Smith", 2, "Joe Doe") 我有一个错误:foreign key mismatch
  • 要提出问题,请使用“”按钮。请拨打tour
猜你喜欢
  • 2015-03-31
  • 1970-01-01
  • 2014-04-08
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多