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

如何在SQLite中具有匹配列的两个现有表之间创建外键?,sql,sqlite,join,foreign-keys,Sql,Sqlite,Join,Foreign Keys,我正在处理一些excel文件,我需要找出它们之间的“差异”。我首先用它们以编程方式创建了两个SQLite表。有两个文件具有相同的列,并且具有匹配的行。问题是行不一定是有序的,并且没有一个键列可以匹配行。但是,我可以同时加入四列 我当前查找两个表之间差异的解决方案是以下查询: 从表1中选择“字段1”、“字段2”等 如果不存在,请从表2中选择1 其中,表2.`SID`=表1.`SID` 表2.`BID`=表1.`BID` 表2.`OID`=表1.`OID` 表2.`LID`=表1.`LID`; 我希

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

我当前查找两个表之间差异的解决方案是以下查询:

从表1中选择“字段1”、“字段2”等 如果不存在,请从表2中选择1 其中,表2.`SID`=表1.`SID` 表2.`BID`=表1.`BID` 表2.`OID`=表1.`OID` 表2.`LID`=表1.`LID`; 我希望每个记录的结果是表1中的字段和表2中的字段,因此我最终得到了两个列

字段1 字段2 字段3 abc def ghi jkl mno pqr
如果我理解正确,您需要表1中与表2不匹配的所有行加上表2中与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, t1.field2, ..., t2.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约束,将出现错误。

可能会在每个SELECT中添加一个计算字段,以指示源表:T1为Src,然后表2为T2。感谢您的帮助@June7!不幸的是,此查询只填充一个表的字段。我最终得到的行要么是表1中的选定列,要么是表2中的选定列。你认为我应该怎么解决这个问题?建议的答案不是我的。编辑您的问题,将示例数据和所需输出显示为文本表。您可以尝试使用4个字段进行复合联接,而不是联合。@June7我的错,不过还是要感谢您提供的提示。我确实编辑了我的问题,以了解我在寻找什么。您认为@marcos这里出了什么问题?示例数据仅显示两个字段,两个表的两个示例记录的数据都是相同的。若这两个字段可以提供唯一标识符,那个么只需在这两个字段上进行复合联接。关键是,必须有一个或多个字段可以用作所有记录的表之间的唯一链接。如果您希望在创建记录时在两个表中生成一个字段记录标识符,这将是一种方法,但正如已经指出的,同步此值并不简单。只是对您的数据和流程了解不够。期望的输出只返回一条记录,因为它在字段3中有不同的数据?您需要在多少字段上进行此比较?可能使用或运算符:从T1.F5T2.F5或T1.F6T2.F6等处的T1内部联接T2中选择T1.*、T2.*。????