如何解决如何在 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 举报,一经查实,本站将立刻删除。