2017-05-26 154 views
0

加入我有两个简单的表:SQLite的选择与同一母公司

名称:

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

关系:

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

表关系,家长是外键的名称和孩子是外国人的名字。

有没有一种方法来选择和替换ParentID和ChildID与姓名的名称,其中数字匹配Names.id?

+0

请提供'使用.dump '从SQLite命令行工具中获取合适的玩具数据库。 – Yunnosch

+0

'CREATE TABLE名称( ID INTEGER PRIMARY KEY ASC AUTOINCREMENT UNIQUE NOT NULL, 名称VARCHAR(255)COLLATE NOCASE NOT NULL UNIQUE );' 'CREATE TABLE关系( ID INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, 父INTEGER NOT NULL 参考名称(id), 子INTEGER参考名称(id) NOT NULL ); ' – adiDX

+0

我看到有一个差异,我在问题中写了什么,以及** DB = Relations [id,Parent,Child] **中的实际是什么**而不是_Relations [id,ParentID,ChildID] _但问题是仍然一样;) – adiDX

回答

0

您可以用同一个表多次加入,只要你给一个惟一的名称:

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; 
+0

干杯CL,第二选择工作的治疗。我尝试了另一种方式(从MySQL InnoDB): CREATE TABLE TestTable(INT INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,ParentId INTEGER,ParentName VARCHAR(255),ChildId INTEGER,ChildName VARCHAR(255),FOREIGN KEY(ParentId,ParentName )参考名称(id,Name)ON UPDATE CASCADE,FOREIGN KEY(ChildId,ChildName)参考名称(id,Name)ON UPDATE CASCADE);' 但是当我尝试插入时: INSERT INTO TestTable(ParentID,ParentName, ChildId,ChildName)值(1,“John Smith”,2,“Joe Doe”)' 我有一个错误:'外键不匹配' – adiDX

+0

要问一个问题,请使用“Ask Question”按钮。请参阅[游览](https://stackoverflow.com/tour)。 –