Запрос Python / SQL для использования ROWID для выравнивания несинхронизированных данных в базе данных SQLite3

#sql #python-2.7 #sqlite

#sql #python-2.7 #sqlite

Вопрос:

У меня есть таблица SQLite3 с 4 столбцами: «дата», «цена», «цена2» и «объем».Существует около 200 тыс. строк данных, но последние 2 столбца не синхронизированы на 798 строк. То есть значения вторых двух столбцов в строке 1 фактически соответствуют значениям первых двух столбцов в строке 798.

Я использую Python 2.7.

Я думал, что должен быть способ использования столбца ROWID в качестве уникального идентификатора, где я могу извлечь первые два столбца, затем извлечь вторые два столбца и воссоединиться на основе «ROWID 798» или что-то в этом роде.

Возможно ли это, и если да, то кто-нибудь знает, как это сделать?

Комментарии:

1. Итак, ваша база данных полностью повреждена, но вы думаете, что все еще можете ее спасти? Я восхищаюсь вашей уверенностью.

2. Ха-ха, я буду честен с вами, я в значительной степени полный новичок в этом деле, поэтому я, скорее всего, подхожу к вещам под неправильным углом. Я знаю, что я на самом деле хочу сделать, это далеко за пределами моего понимания, поэтому мне приходится подтасовывать вещи влево вправо и по центру. На самом деле я ввел данные таким образом, зная, что мне придется переместить два столбца на такое количество строк. Я не могу удалить их в формате csv, поскольку файл был слишком большим для работы в Excel, а текстовый файл не позволяет выбирать только столбцы, он также выбирает строки — поэтому я не мог удалить их вручную.

3. Покажите несколько примеров записей и желаемый результат.

Ответ №1:

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

В любом случае, запрос, который вы описываете, должен быть таким, если я правильно понял.

В большинстве СУБД вы могли бы сделать это с помощью одного подзапроса, но синтаксис (col1,col2) = не разрешен в SQLite, поэтому вы должны сделать это следующим образом.

 UPDATE table1 t SET
        col1 =
        (SELECT col1 FROM table1
        WHERE t.rowid = rowid - 798),
        col2 =
        (SELECT col2 FROM table1
        WHERE t.rowid = rowid - 798)
  

Комментарии:

1. Большое спасибо — я поиграю с этим! Я ценю вашу помощь

2. Я поверю вам на слово.