我有一个SQLite表,我们称之为people
。
| 姓名|年龄|
| - ------|- ------|
| 简|五十|
| 约翰|八十|
| 爱丽丝|四十六|
| 马克|二十五|
| 哈里|三十三|
我还有一张tablework
。
| 姓名|工作标识|
| - ------|- ------|
| 简|1个|
| 阿曼达|第二章|
| 菲利普|三个|
| 爱丽丝|四个|
| 杰克|五个|
| 哈里|六个|
我想获取名称同时存在于people
和work
中的所有行。但我不仅仅需要名称。事实上,我根本不关心名称。我只需要它们来查找匹配的条目。我需要匹配行的work.work_id
和people.age
列。结果应如下所示:
| 工作标识|年龄|
| - ------|- ------|
| 1个|五十|
| 四个|四十六|
| 六个|三十三|
两个表都可以有数百到数千个条目。
我还需要两者的区别,即work
中的行的名称不在people
中,但这应该可以用我下面列出的第二个解决方案来解决。
我在Python3中使用内置的sqlite3
模块来完成这个任务,但是这应该是一个独立于SQL客户端的纯SQL问题。
∮我所尝试的∮
显而易见的选择是执行INTERSECT
:
SELECT Name FROM people INTERSECT SELECT Name FROM work_id
如前所述,我需要Name
列来查找表的交集,但我需要行本身来获得我真正想要的东西,people.age
和work.work_id
,而不是Name
。
互联网把我引向子查询。
SELECT Name, Age FROM people where Name IN (SELECT Name FROM work)
这是一个非常强大的技术,但是我还需要work
的work_id
列,所以这不是一个解决方案。
这是比较people
中的每一行和work
中的所有行吗?比较的次数是SELECT Count(*) FROM people
× SELECT Count(*) FROM work
还是某种优化?
2条答案
按热度按时间eqqqjvef1#
您希望从两个表中选择列,这意味着您需要一个
INNER JOIN
:对于名称不在people中的工作行,请使用
NOT IN
:参见demo。
xn1cxnb42#