我的SQLite数据库中有两个表(虚拟名称):
表1: FileID F_Property1 F_Property2 ...
表2: PointID ForeignKey(fileid)P_Property1 P_Property2 ...
Table2中的条目都有一个引用Table1
中的条目的外键列。
我现在想要从Table2
中选择条目,例如F_Property1
中引用文件的Table1
具有特定值。
我尝试了一些天真的东西:
select * from Table2 where fileid=(select FileID from Table1 where F_Property1 > 1)
现在这实际上是有效的。它从Table1
中选择正确的文件ID,并使用此ID返回Table2
的条目。但它只使用第一个返回的ID。我需要做的是基本上通过OR
连接内部选择的返回ID,以便返回所有ID的数据。
我该怎么做?我认为它是某种类似的交叉表查询,就像这里提到的那样What is the proper syntax for a cross-table SQL query?但是这些答案不包含他们实际所做的内容的解释,因此我对任何实现都很感兴趣。
他们正在使用JOIN
语句,但这不会将Table1和Table2中的条目混合在一起,而只检查两个表中的匹配ID吗?至少这是我理解这个http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
正如你可能已经从风格中注意到的那样,我对使用数据库非常陌生,所以请原谅我,如果没有一切都清楚我想要什么。请留下评论,如果有必要,我会尝试改进这个问题。
答案 0 :(得分:3)
加入工作的方式不是"混合"数据,但基于密钥组合它们。 在您的情况下(我假设表1中的关键字段是唯一的),如果您在主键字段上加入这两个表,您将最终得到table2中的所有条目以及table1中的所有相应字段。如果你这样做:
select * from table1, table2 where table1.fieldID=table2.foreignkey;
然后,如果您的关键字段设置正确,您将得到以下结果:
PointID ForeignKey(fileid) P_Property1 P_Property2 FileID F_Property1 F_Property2
table1的字段值来自匹配的行。
现在,如果你这样做:
select table1.* from table 1, table2 where
table1.fieldID=table2.foreignkey and F_Property1>1;
基本上会获得相同的记录集,但只显示第二个表中的列,并且只显示满足第一个表的where条件的列。 希望这会有所帮助:)
答案 1 :(得分:3)
=
运算符将单个值与另一个值进行比较,因此假定子查询只返回一行。
要检查(列)值是否在一组值中,请使用IN:
SELECT *
FROM Table2
WHERE fileid IN (SELECT FileID
FROM Table1
WHERE F_Property1 > 1)
答案 2 :(得分:1)
如果我理解你的问题,这将完成工作。
Select t2.*
from table1 t1
inner join table2 t2 on t2.id = t1.id
where t1.Prop = 'SomeValue'