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 |

sqlite数据库具有以下两个表:

 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通常更好。