背景:
有两个已定义的数据库-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/