Sql 从两个表中选择常用项
给定两个Sqlite数据库: db1和db2的函数表具有近10k个条目 有一列fcn_名称将被调整 两个表有90%的相似条目。 我需要从两个具有相同名称的表中选择name和column2,预期输出为10k的90%,但结果是我得到了超过10k个条目。简言之,我只需要名称列的交集,但结果选择名称和列2 我尝试了以下sql语句: 从main.f、other.d函数中选择count*,其中f.name=d.name 从main.functions f和other.functions d中选择不同的f.name,其中f.name=d.nameSql 从两个表中选择常用项,sql,sqlite,Sql,Sqlite,给定两个Sqlite数据库: db1和db2的函数表具有近10k个条目 有一列fcn_名称将被调整 两个表有90%的相似条目。 我需要从两个具有相同名称的表中选择name和column2,预期输出为10k的90%,但结果是我得到了超过10k个条目。简言之,我只需要名称列的交集,但结果选择名称和列2 我尝试了以下sql语句: 从main.f、other.d函数中选择count*,其中f.name=d.name 从main.functions f和other.functions d中选择不同的f.n
两者都不起作用。尽管使用distinct关键字,它返回的条目较少,但仍然超过10k。为什么会有更多的条目?要根据某些匹配条件选择两个表中存在的行,我们通常会使用内部联接,例如
SELECT COUNT(*)
FROM main.functions f1
INNER JOIN other.functions f1
ON f1.name = f2.name
我不熟悉Sqlite,但这通常是大多数DB的方法。您的问题可能是由两个表中的重复项引起的。使用不同的名称连接两个表 例如:
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
我认为您需要一个表中的所有行,其中名称位于另一个表中。为此,我建议:
select f.*
from main.functions f
where exists (select 1
from other.functions o
where o.name = f.name
);
这不会检查行是否相同,只检查两个表中是否存在名称。如果两个表中有多行名称相同,它也不会复制行。我尝试过内部联接,但它返回类似于WHERE的结果。不知何故,结果是一样的。你是说从main.functions中选择distinct f.name返回的行数比第二个查询少吗?从main.functions f1返回10k中选择countf1.name,从其他函数中选择countf2.name,从main.functions f1返回10k中选择countf2.name,但从main.functions f1中选择countdistinct f1.name,其他.f2函数,其中f1.name=f2.name返回10.1k。但是,如果没有明显的键,它返回10.4k。预期输出约为9k。如果名称字段不唯一,则为所有副本生成一个Carthian产品。那样的话,你总共会得到更多的条目。我迷路了。如果90%的行有共同的名称,那么选择所有具有共同名称的行将是18000行,而不是9000行。对,此SQL语句给出了正确的共同行数。但是,在获得公共行之后,如何扩展它以选择其他列呢?例如,我有另一个列abc,我想从两个同名行中选择abc值。对于要选择的所有其他字段,必须使用聚合函数(如COUNT、MAX、MIN、SUM、AVG)接受限制。谢谢,它解决了问题。这正是我要查找的,但我需要两个表中的行。我需要类似于从main.functions f1中选择f1.name、f1.column2、f2.name、f2.column的内容,如果存在其他.functions f2,请从其他.functions f2中选择1,其中f1.name=f2.name