【发布时间】:2018-11-15 21:45:33
【问题描述】:
在 Sqlite 中,我有以下表格:
CREATE TABLE "Person" (Id INTEGER PRIMARY KEY,
"Age" INTEGER, "Email" TEXT)
CREATE TABLE "_Person_Name" (Id INTEGER PRIMARY KEY,
Owner INTEGER NOT NULL, Name TEXT,
FOREIGN KEY(Owner) REFERENCES Person(Id))
其中第二个表代表一个人名的字符串列表。
我想通过匹配名称来查询 Person.Id,这样多个条件可能会在同一行中匹配或在_Person_Name.Name 的不同行中。例如,假设 Person.Id 1 有 2 个关联的行 _Person_Name.Name "John" 和 "Smith",它们的 _Person_Name.Owner=1。然后我想要一个基于搜索“John”和“Smith”的查询,准确返回这个 Person.Id 1。不应返回“John Wilson”或“Jonas Smith”,但应返回“John Theodore Smith”。
我尝试了以下方法:
SELECT Person.Id FROM Person
INNER JOIN _Person_Name ON Person.Id = _Person_Name.Owner
WHERE (Name LIKE 'John') AND (Name LIKE 'Smith');
但这不起作用。它分别找到具有每个条件的人,但两者的合取似乎只适用于同一行,因此不返回任何内容。
如何同时搜索这两个条件,以使它们都适用于相同的人员 ID,但可以在列表的不同行中匹配?
编辑:这是一个带有数据的架构示例。这只是一个示例,用于处理任意模式和关联的“列表”表的自动化工具。
Table Person
Id Age Email
==================
1 30 john@test.com
2 28 lucie@gmail.com
3 47 bob@gmail.com
Table _Person_Names
Id Name Owner (Foreign Key references Person.Id)
1 John 1
2 C. 1
3 Smith 1
4 Lucie 2
5 Smith 2
6 Bob 3
7 Smith 3
查询应该只返回 ID 1,因为只有 Person.Id 1 在 _Person_Names 表中同时具有“John”和“Smith”。
【问题讨论】: