Как объединить две строки таблицы, где выполняется ряд условий - PullRequest
0 голосов
/ 16 марта 2011

Я работаю над программой разбора, которая анализирует информацию из двух файлов в таблица sqlite3.

Допустим, таблица имеет следующие значения: имя файла, значение2, значение3, значение4

В таблице никогда не бывает более двух значений имени файла *1008*, Я хотел бы написать 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 голосов
/ 16 марта 2011

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) фильтрует только для несоответствующих строк правого файла.

Невозможно точно сформировать ваш выходной порядок (некоторый собственный порядок сортировки), если не существует некоторого столбца с номерами строк, который можно объединитьзапрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...