来自 table 的 Select 个字段满足另一个 table 中的条件
Select fields from a table which satisfy condition in another table
一个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
现在我想 select 表 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 程序访问的,其中限制查询的常量作为参数传递。使用我正在使用的代码,我必须使元组大两倍,后半部分等于第一部分,我想这会更容易出错,特别是当查询有点复杂时。它正在工作,但我想改进......我不包括任何python 代码因为我不认为它真的相关,但我也可以这样做。)
如果f1
、f2
的组合在table1
中是唯一的,可以join表,GROUP BY f1, f2
并在[=15=中设置条件] 条款:
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。
一个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
现在我想 select 表 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 程序访问的,其中限制查询的常量作为参数传递。使用我正在使用的代码,我必须使元组大两倍,后半部分等于第一部分,我想这会更容易出错,特别是当查询有点复杂时。它正在工作,但我想改进......我不包括任何python 代码因为我不认为它真的相关,但我也可以这样做。)
如果f1
、f2
的组合在table1
中是唯一的,可以join表,GROUP BY f1, f2
并在[=15=中设置条件] 条款:
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。