在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名称的字符串列表。
我想通过匹配名称来查询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”。
答案 0 :(得分:1)
问题在于,_Person_Names
内是否有两行包含John
列中的值Smith
和Name
,并且在{{1}列中具有相同的值}}。
这与表Owner
无关。
如果可以找到2个这样的行,则列Person
中的值就是表Owner
中的Id
。对?
检查此代码:
Person
答案 1 :(得分:0)
在WHERE子句中使用AND运算符无法检索正确的结果。您应该使用OR运算符
编辑部分从此处开始
select Person.ID, Dusra_table.name
from person, dusra_table
where Person.ID = Dusra_Table.Owner
and (Dusra_Table.Name = 'John'
OR Dusra_Table.Name = 'Smith'
)
and Person.ID = ANY(Select Dusra_Table.Owner from Dusra_table where Name = 'John');
Dusra_Table是_Person_Names表
答案 2 :(得分:0)
由于名字,中间名和姓氏都在同一列中,因此您也可以尝试将WHERE子句修改为:
WHERE Name LIKE 'John % Smith'
与forpas和Namandeep_Kaur方法的结果相同,只是体积较小