从表中选择满足另一个表中条件的字段

时间:2021-03-21 12:02:06

标签: 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  |  4
  0 | 2              1  |  0
  3 | 0              1  |  3

现在我想从 table1 中选择那些元素对 (f1,f2),其中 f1f2 都在 table2 中的那些 f 中,{{1} }.

这可以通过

来实现
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)

但是上面的查询有重复,我认为可以通过 make 来消除

2   3
2   1

但这给了我一个语法错误,并且

SELECT f1, f2 FROM table1
WHERE f1, f2 IN (SELECT f FROM table2 WHERE e=0)

什么都不给。

有没有不重复的方法?

(我的动机是要从 python 程序访问它,其中约束查询的常量作为参数传递。使用我正在使用的代码,我必须使元组大两倍,后半部分等于第一个,我想这会更容易出错,特别是当查询有点复杂时。它正在工作,但我想改进......我不包括任何 python 代码,因为我不认为这并不重要,但我也可以这样做。)

1 个答案:

答案 0 :(得分:1)

如果f1f2的组合在table1中是唯一的,可以加入表GROUP BY 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

参见demo

相关问题