SQL查询与``列表''表连接的表内部的ID

时间:2018-11-15 21:45:33

标签: sql sqlite

在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”。

3 个答案:

答案 0 :(得分:1)

问题在于,_Person_Names内是否有两行包含John列中的值SmithName,并且在{{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方法的结果相同,只是体积较小