Sqlite 从满足另一个表中条件的表中选择字段
sqlite数据库具有以下两个表:Sqlite 从满足另一个表中条件的表中选择字段,sqlite,join,sql-in,Sqlite,Join,Sql In,sqlite数据库具有以下两个表: table1 table2 --------- --------- f1 | f2 e | f --------- --------- 0 | 1 0 | 1 2 | 3 0 | 2 1 | 4 0 | 3 2 | 1 1 |
table1 table2
--------- ---------
f1 | f2 e | f
--------- ---------
0 | 1 0 | 1
2 | 3 0 | 2
1 | 4 0 | 3
2 | 1 1 | 4
0 | 2 1 | 0
3 | 0 1 | 3
现在我想从表1中选择那些元素对(f1,f2)
,其中f1
和f2
都在表2中的f
中,其中e=0
这可以通过以下方式实现:
SELECT f1, f2 FROM table1
WHERE f1 IN (SELECT f FROM table2 WHERE e=0)
AND f2 IN (SELECT f FROM table2 WHERE e=0)
结果正如预期的那样
2 3
2 1
但在上面的问题中有一个重复,我认为可以通过
SELECT f1, f2 FROM table1
WHERE f1, f2 IN (SELECT f FROM table2 WHERE e=0)
但这给了我一个语法错误
SELECT f1, f2 FROM table1
WHERE f1 AND f2 IN (SELECT f FROM table2 WHERE e=0)
什么都不给
有没有一种不重复的方法
(我的动机是,这是从一个python程序中访问的,其中约束查询的常量作为参数传递。在我使用的代码中,我必须使元组变大两倍,后半部分等于前半部分,我猜这将更容易出错,特别是当查询稍微复杂时。它正在工作,但是t我想改进……我不包括任何python代码,因为我认为它不是真正相关的,但我也可以这样做。)如果
f1
,f2
的组合在表1
中是唯一的,您可以加入表,按f1、f2
分组,并在HAVING
子句中设置条件:
SELECT t1.f1, t1.f2
FROM table1 t1 INNER JOIN table2 t2
ON t2.f IN (t1.f1, t1.f2)
WHERE t2.e = 0
GROUP BY t1.f1, t1.f2
HAVING COUNT(*) = 2
参见。计数(*)等于2是否意味着只得到前两个结果?好的,这当然有效。我不明白,但这只是意味着我必须更好地研究一些功能。我的组合
(f1,f2)
不一定是唯一的,但它们在我给出的示例中是“我的坏”。所以我会接受这一点,然后我会尝试提出一些问题或其他问题。谢谢!@amrsa有COUNT(*)=2
表示f1和f2在表2中都有匹配项,而不仅仅是其中的一个。不幸的是,如果我在表1中添加一行,其中f1=2和f2=3(重复),结果只会是另一对,(2,1)
。我必须考虑一下,或者再问一次。再次感谢!@amrsa在这种情况下,请检查以下内容:就性能而言,EXISTS通常更好。