sqlite 如何对两个表的两列求交集并得到整行?

ve7v8dk2  于 2023-02-09  发布在  SQLite
关注(0)|答案(2)|浏览(155)

我有一个SQLite表,我们称之为people
| 姓名|年龄|
| - ------|- ------|
| 简|五十|
| 约翰|八十|
| 爱丽丝|四十六|
| 马克|二十五|
| 哈里|三十三|
我还有一张tablework
| 姓名|工作标识|
| - ------|- ------|
| 简|1个|
| 阿曼达|第二章|
| 菲利普|三个|
| 爱丽丝|四个|
| 杰克|五个|
| 哈里|六个|
我想获取名称同时存在于peoplework中的所有行。但我不仅仅需要名称。事实上,我根本不关心名称。我只需要它们来查找匹配的条目。我需要匹配行的work.work_idpeople.age列。结果应如下所示:
| 工作标识|年龄|
| - ------|- ------|
| 1个|五十|
| 四个|四十六|
| 六个|三十三|
两个表都可以有数百到数千个条目。
我还需要两者的区别,即work中的行的名称不在people中,但这应该可以用我下面列出的第二个解决方案来解决。
我在Python3中使用内置的sqlite3模块来完成这个任务,但是这应该是一个独立于SQL客户端的纯SQL问题。
∮我所尝试的∮
显而易见的选择是执行INTERSECT

SELECT Name FROM people INTERSECT SELECT Name FROM work_id

如前所述,我需要Name列来查找表的交集,但我需要行本身来获得我真正想要的东西,people.agework.work_id,而不是Name
互联网把我引向子查询。

SELECT Name, Age FROM people where Name IN (SELECT Name FROM work)

这是一个非常强大的技术,但是我还需要workwork_id列,所以这不是一个解决方案。
这是比较people中的每一行和work中的所有行吗?比较的次数是SELECT Count(*) FROM people × SELECT Count(*) FROM work还是某种优化?

eqqqjvef

eqqqjvef1#

您希望从两个表中选择列,这意味着您需要一个INNER JOIN

SELECT w.work_id,
       p.Age
FROM work AS w INNER JOIN people AS p
ON p.Name = w.Name;

对于名称不在people中的工作行,请使用NOT IN

SELECT *
FROM work
WHERE Name NOT IN (SELECT Name FROM people);

参见demo

xn1cxnb4

xn1cxnb42#

SELECT work_id, Age
FROM people AS p
JOIN work AS w ON p.Name = w.Name;

SELECT name, work_id
FROM work
EXCEPT 
SELECT name
FROM people

相关问题