从两个表中选择公共项目

时间:2021-04-16 07:55:36

标签: sql sqlite

给定两个 Sqlite 数据库:

  1. db1 和 db2 具有包含近 10k 个条目的“函数”表
  2. 有一列“fcn_name”将被条件化
  3. 两个表都有 90% 的相似条目。

我需要从两个具有相同名称的表中选择 name and column2,预期输出是 10k 的 90%,但结果我得到了超过 10k 个条目。简而言之,我只需要 name 列的交集,但结果选择 name 和 column2。

我试过下面的sql语句:

select count(*) from main.functions f, other.functions d where f.name=d.name

select distinct f.name from main.functions f, other.functions d where f.name=d.name

两者都不起作用。尽管使用“distinct”关键字,它返回的条目较少,但仍超过 10k。为什么有更多条目?

3 个答案:

答案 0 :(得分:0)

要根据某些匹配条件选择两个表中都存在的行,我们通常会使用 INNER JOIN,例如

SELECT COUNT(*) 
FROM main.functions f1 
INNER JOIN other.functions f1 
ON f1.name = f2.name

我不熟悉 Sqlite,但通常是大多数数据库的方法。

答案 1 :(得分:0)

您的问题可能是由两个表中的重复项引起的。使用 DISTINCT 名称连接两个表。

例如:

SELECT COUNT(*) 
FROM (SELECT DISTINCT name FROM main.functions) f1 
INNER JOIN (SELECT DISTINCT name FROM other.functions) f2 
ON f1.name = f2.name

也许这就是解决方案。

参考您的评论:

如果您的表有主键(例如 ID)。因此,以下应该在 sqllite 下提供所需的结果:

SELECT f1.name, f1.yourField1, f1.yourField2, f1.yourField3 
FROM (SELECT name, yourField1, yourField2, yourField3
      FROM main.functions
      GROUP BY name
      HAVING id = MIN(id)
      ORDER BY id) f1 
INNER JOIN (SELECT DISTINCT name FROM other.functions) f2 
ON f1.name = f2.name

答案 2 :(得分:0)

我认为您需要一个表中名称在另一表中的所有行。为此,我建议:

select f.*
from main.functions f
where exists (select 1
              from other.functions o
              where o.name = f.name
             );

检查行是否相同,仅检查名称是否存在于两个表中。如果两个表中有多个同名的行,它也不会重复行。