如何在满足一系列条件的情况下合并两行表格
我正在做一个解析程序,这个程序会从两个文件中提取信息,并把这些信息放到一个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)
这个内容分为三个部分
- 第一部分是两个文件中所有值都匹配的地方。较小的文件名会显示在左边。
- 第二部分是那些无法在右边找到匹配值的地方。
min(filename)
只会筛选出左边文件中没有匹配的行。 - 第三部分是那些无法在左边找到匹配值的地方。
max(filename)
只会筛选出右边文件中没有匹配的行。
如果没有某个行号的列,就无法完全按照你想要的顺序输出结果,因为会有一些固有的排序方式,这个行号可以被加入到查询中。