sql - SQLite:使用ID和哈希值合并两个表,其中得到的ID来自所选表

标签 sql database sqlite join merge

背景:

有两个已定义的数据库-X和Y。它们看起来完全相同,但是包含不同的数据,最重要的是,数据库X中的ID从0到1000,数据库Y中的ID值从10000到10500。不能更改。 !

数据库中的表布局(列)(两者相同)如下所示:

+--------+-------+--------------------------------------+
| id     | hash  | more stuff ...                       |
+--------+-------+--------------------------------------+


ID是唯一的(主键),并且hash列包含从其他列计算得出的值。不同条目之间的哈希值可以相同。

问题

需要合并数据库中的表,以便只有一个具有特定哈希的条目,没有重复项。但棘手的部分是,如果存在重复项,其中数据库X中的条目A具有与数据库Y中的条目B相同的哈希值,则查询应始终采用数据库Y中的条目(如果更优选,则使用X,但是SQL查询应该能够选择哪个优先。

例:

这是两个带有条目的表的外观以及结果应如何的示例。在此示例中,我们对表Y进行优先级排序。

数据库X表:

+--------+-------+--------------------------------------+
| id     | hash  | more stuff ...                       |
+--------+-------+--------------------------------------+
| 1      | 100   | ...                                  |
| 2      | 101   | ...                                  |
| 3      | 102   | ...                                  |
+--------+---------+------------------------------------+


数据库Y表:

+--------+-------+--------------------------------------+
| id     | hash  | more stuff ...                       |
+--------+-------+--------------------------------------+
| 10000  | 200   | ...                                  |
| 10001  | 201   | ...                                  |
| 10002  | 100   | ...                                  |
+--------+---------+------------------------------------+


请注意,两个表中都存在哈希值100! Y具有优先级,因此在合并中应存在id = 10002的条目,而不是id =1。因此,查询应导致以下合并:

+--------+-------+--------------------------------------+
| id     | hash  | more stuff ...                       |
+--------+-------+--------------------------------------+
| 2      | 101   | ...                                  |
| 3      | 102   | ...                                  |
| 10000  | 200   | ...                                  |
| 10001  | 201   | ...                                  |
| 10002  | 100   | ...                                  |
+--------+---------+------------------------------------+


解决方案的想法:

我在测试过程中提出了以下查询(并非仅仅为了获得正确的结果而进行优化):

attach database 'X.db' as d1;
attach database 'Y.db' as d2;

SELECT * FROM 
(
   SELECT * FROM 
   (
      SELECT *
            FROM d1.table AS c1
      UNION
      SELECT *
            FROM d2.table AS c2
   ) ORDER BY entryId DESC
) GROUP BY hashNum


这实际上将返回我想要的结果,但是它不可靠。结果是正确的,因为GROUP BY实现似乎选择了最后为结果排序的条目。如果ID为10002的条目的哈希值为100,而ID为1的条目的哈希值为100,那么GROUP BY语法将根据ORDER BY语句给出ID 10002或1存在的结果(DESC给出ID为1的条目,ASC给出ID 10002)。

但是,这取决于GROUP BY的实现。 SQL语句实际上不使用任何语法来说明结果最好来自哪个数据库。

有没有更好的方法来进行此查询? SQLite不支持RIGHT和FULL OUTER JOIN。

最佳答案

您需要表Y中的所有记录,以及表X中在Y中没有哈希的记录:

SELECT * FROM X WHERE hash NOT IN (SELECT hash FROM Y)
UNION ALL
SELECT * FROM Y

关于sql - SQLite:使用ID和哈希值合并两个表,其中得到的ID来自所选表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23088121/

相关文章:

database - Drupal 中的 Web 应用程序?

sql - hive 中的 with (nolock) 相当于 sql (nolock)

c# - 我是否需要使用 Entity Framework 的 using 语句?

java - Android 适配器未读取 XML 文件

Python SQLite 如何使用 '?' 占位符进行部分搜索?

sql - 按组划分的同一字段中的日期之间的平均时间

java - 错误: ORA-01008: not all variables bound call SQL function

android - 从 sqlite 获取数据到回收站 View

sql - PostgreSQL:为什么引用表和属性时查询中需要引号?

sql - 返回一个表中的所有行,并与另一个表中的行的子集匹配?