微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 SQLite 中具有匹配列的 2 个现有表之间创建外键?

如何解决如何在 SQLite 中具有匹配列的 2 个现有表之间创建外键?

我正在处理一些需要找出“差异”的 excel 文件。我首先以编程方式用它们创​​建 2 个 sqlite 表。有两个文件具有相同的列,并且具有匹配的行。问题是行不一定按顺序排列,并且没有一个键列可以匹配行。但是,我可以同时加入四列。

我目前找到两个表之间差异的解决方案是这个查询

SELECT `field1`,`field2`,etc FROM table1
WHERE NOT EXISTS (SELECT 1 FROM table2
    WHERE table2.`SID` = table1.`SID`
    AND table2.`BID` = table1.`BID`
    AND table2.`OID` = table1.`OID`
    AND table2.`LID` = table1.`LID`);

对于每条记录,我希望结果是 table1 中的字段和 table2 中的字段,所以我最终得到了两倍的列。

field1 field2 field3
ABC 定义 你好
jkl mno pqr
field1 field2 field3
ABC 定义 AAA
jkl mno pqr

一个所有列只显示不同行的表格:

t1_field1 t1_field2 t1_field3 t2_field1 t2_field2 t2_field3
ABC 定义 你好 ABC 定义 AAA

我认为比一些复杂的 sql 更好的方法是为两个表追溯创建一个外键,这样进行这样的查询会简单得多。

请记住,我以编程方式创建这些表并插入数据,因此如果解决方案在创建过程中,我仍然可以实施您的建议。

编辑: 正如@marcos 指出的那样,由于不能保证匹配的行存在,因此不可能使用外键。复合连接听起来不错。

我的目的是找出任何差异,包括删除一行,从table1到table2。我不需要从 2 到 1 的差异。

@marcos 推荐的这个查询(减去 t2 - t1 联合)几乎完美运行:

SELECT t1.field1,t1.field2,...,t2.field1,t2.field2
FROM table1 t1
  LEFT JOIN table2 t2
    ON  t1.SID = t2.SID
    AND t1.BID = t2.BID
    AND t1.OID = t2.OID
    AND t1.LID = t2.LID
WHERE t2.SID IS NULL

返回类似:

t1_field1 t1_field2 t1_field3 t2_field1 t2_field2 t2_field3
ABC 定义 你好 --- --- ---

但不幸的是 table2 中的列没有填充。我也不确定 WHERE t2.SID IS NULL 在这里是如何工作的,因为 SID 不是唯一键。

提前致谢! :)

解决方法

如果我理解正确,您希望 table1 中所有与 table2 不匹配的行加上 table2 中与 t1 不匹配的所有行。

SELECT t1.field1,t1.field2,...,t2.field1,t2.field2
FROM table1 t1
  LEFT JOIN table2 t2
    ON  t1.SID = t2.SID
    AND t1.BID = t2.BID
    AND t1.OID = t2.OID
    AND t1.LID = t2.LID
WHERE t2.SID IS NULL

UNION ALL

SELECT t1.field1,t2.field2
FROM table2 t2
  LEFT JOIN table1 t1
    ON  t1.SID = t2.SID
    AND t1.BID = t2.BID
    AND t1.OID = t2.OID
    AND t1.LID = t2.LID
WHERE t1.SID IS NULL

在这四列(SID、BID、OID 和 LID)上创建索引以提高性能。

外键是不可能的,因为它们强制一个表上的数据存在于另一个表中。如果你尝试创建一个,你会得到一个 fk 约束错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。