如何在满足一系列条件的情况下合并两行表格

0 投票
1 回答
929 浏览
提问于 2025-04-16 13:46

我正在做一个解析程序,这个程序会从两个文件中提取信息,并把这些信息放到一个sqlite3的表里。

假设这个表里有以下几个值:文件名、值2、值3、值4。

这个表里最多只会有两个文件名的值,我想写一个SQL查询,让它把两行数据合并,当以下条件成立时:

  • 行X的文件名不等于行Y的文件名
  • 行X的值2等于行Y的值2
  • 行X的值3等于行Y的值3
  • 行X的值4等于行Y的值4

其实我正在做的程序要复杂一些,所以可能这样说会更清楚。

file1.txt 的内容是:

abcd, 1234, efgh
klmn, 5678, opqr
stuv, 9abc, wxyz

file2.txt 的内容是:

abcd, 1234, efgh
klmn, 9ffx, opqr
stuv, 9abc, wxyz

期望的输出结果:

  • file1.txt, abcd, 1234, efgh file2.txt, abcd, 1234, efgh
  • file1.txt, klmn, 5678, opqr, --, --, --, --
  • --,--,--,--, file2.txt klmn, fffx, opqr
  • file1.txt, stuv, 9abc, wxyz, file2.txt, stuv, 9abc, wxyz

1 个回答

2

下面的x是表的名字

select a.*, b.*
from x as a
inner join x as b
  on a.filename<b.filename
    and a.value2 = b.value2
        and a.value3 = b.value3
        and a.value4 = b.value4
union all
select a.*, b.*
from x as a
left join x as b
  on a.filename!=b.filename
        and a.value2 = b.value2
        and a.value3 = b.value3
        and a.value4 = b.value4
where b.filename is null
  and a.filename = (select min(filename) from x)
union all
select b.*, a.*
from x as a
left join x as b
  on a.filename!=b.filename
        and a.value2 = b.value2
        and a.value3 = b.value3
        and a.value4 = b.value4
where b.filename is null
  and a.filename = (select max(filename) from x)

这个内容分为三个部分

  1. 第一部分是两个文件中所有值都匹配的地方。较小的文件名会显示在左边。
  2. 第二部分是那些无法在右边找到匹配值的地方。min(filename) 只会筛选出左边文件中没有匹配的行。
  3. 第三部分是那些无法在左边找到匹配值的地方。max(filename) 只会筛选出右边文件中没有匹配的行。

如果没有某个行号的列,就无法完全按照你想要的顺序输出结果,因为会有一些固有的排序方式,这个行号可以被加入到查询中。

撰写回答