SQL: список различий между строками (показано в столбцах) - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть такая таблица

ID   |  FatherID     |   A   |  B    |   C   |     D        | ...
1234 |     -1        |  John | Doe   |   15  |   20181211   | ...
5678 |     -1        |  Mark | Bloch |   34  |   20170804   | ...
4554 |     1234      |  John | Dee   |   25  |   20181211   | ...
2457 |     5678      |  Chris| Bloch |   34  |   20180402   | ...

Если модификация выполняется для данного объекта (например, ID 1234), система сохраняет данные новой версии в новом идентификаторе (например, 4554) сссылка на исходный идентификатор (FatherID = 1234).Система сохраняет только начальную версию и ревизию заголовка (последняя модификация), например, если в конечном итоге 4554 будет снова изменено, новая запись не будет создана, но будут обновлены 4554 значения -> Макс. 2 записи на ID

Есть много столбцов (около 400) ...

Я хотел бы перечислить изменения, которые были сделаны в таком формате:

ID   | Field | Before       | After
4554 |  B    | Doe          | Dee
4554 |  C    | 15           | 25
2457 |  A    | Mark         | Chris
4554 |  D    | 20170804     | 20180402

, и я изо всех сил пытаюсьДелайте это, особенно учитывая количество столбцов.

Любая помощь будет принята с благодарностью!

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы можете отключить парные столбцы и фильтровать только разные.

select id, fatherid, field, o before, n after 
  from (
    select n.id, n.fatherid, n.a na, o.a oa, n.b nb, o.b ob, 
           to_char(n.c) nc, to_char(o.c) oc, 
           to_char(n.d) nd, to_char(o.d) od
      from t n join t o on n.fatherid = o.id)
  unpivot ((n, o) for field in ((na, oa) as 'A', (nb, ob) as 'B', 
                                (nc, oc) as 'C', (nd, od) as 'D'))
  where n <> o or (n is null and o is not null) or (n is not null and o is null)
  order by id, field

демо с данными образца

    ID   FATHERID  FIELD  BEFORE    AFTER
------  ---------  -----  --------  -----------
  2457       5678  A      Mark      Chris
  2457       5678  D      20170804  20180402
  4554       1234  B      Doe       Dee
  4554       1234  C      15        25

Вы должны перечислить все столбцы, преобразовать их в символы.Много работы, много места для ошибок, но это лучшее, что я придумал.

0 голосов
/ 11 декабря 2018

Есть много столбцов (около 400) ...

Просто чтобы дать вам представление о том, как обстоят дела с проверкой только 4 столбцов (это для Oracle):

WITH full AS (
  SELECT 
    o.ID, 
    o.A, o.B, o.C, o.D, 
    n.A AS newA, n.B AS newB, n.C AS newC, n.D AS newD 
  FROM tablename o 
  INNER JOIN tablename n ON n.FatherID = o.ID
  WHERE o.FatherID = -1
)

SELECT ID, Field, Before, After FROM(
  SELECT 
    ID,
    'A' As Field,
    CASE WHEN A <> newA THEN 1 ELSE 0 END AS changed,
    A AS Before,
    newA AS After
  FROM full
  UNION
  SELECT 
    ID,
    'B' As Field,
    CASE WHEN B <> newB THEN 1 ELSE 0 END AS changed,
    B AS Before,
    newB AS After
  FROM full
  UNION
  SELECT 
    ID,
    'C' As Field,
    CASE WHEN C <> newC THEN 1 ELSE 0 END AS changed,
    C AS Before,
    newC AS After
  FROM full
  UNION
  SELECT 
    ID,
    'D' As Field,
    CASE WHEN D <> newD THEN 1 ELSE 0 END AS changed,
    D AS Before,
    newD AS After
  FROM full
)  
WHERE changed = 1
...