SQLite - вставка значений из нескольких строк в одной таблице в одну строку в другой таблице - PullRequest
0 голосов
/ 03 октября 2018

У меня есть таблица телефонных номеров (tblPhoneNumbers): ID, UserID, PhoneNumber

, и мне нужно переместить их в таблицу Users (tblUsers), которая содержит: ID, PhoneNumber1, PhoneNumber2

*Предполагается, что 1004 * tblPhoneNumbers имеет 2 строки для каждого пользователя.Можно ли переместить значение PhoneNumber первой строки в PhoneNumber1, а значение PhoneNumber второй строки в PhoneNumber2?

По сути, это обратная нормализация, но с этой задачей мне нужна помощь.Спасибо!

Мне нужно использовать SQLite, поэтому я не могу использовать любой синтаксис, недоступный для SQLite.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Если вы используете sqlite 3.25 или выше, вы можете использовать оконные функции, чтобы сделать все это в одном выражении (здесь я предполагаю, что столбец UserID из tblPhoneNumbers является внешним ключом, который ссылается на идентификатор из tblUsers, и что данный идентификатор пользователяв этой таблице уже есть запись; при необходимости измените ее):

WITH allnumbers AS
  (SELECT UserID
        , PhoneNumber
        , row_number() OVER (PARTITION BY UserID) AS num
   FROM tblPhoneNumbers)
UPDATE tblUsers AS t
SET PhoneNumber1 = (SELECT a.PhoneNumber
                    FROM allnumbers AS a
                    WHERE a.UserID = t.ID AND num = 1)
  , PhoneNumber2 = (SELECT a.PhoneNumber
                    FROM allnumbers AS a
                    WHERE a.UserID = t.ID AND num = 2);

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

(правка: вам понадобится индекс на tblPhoneNumbers.UserID для лучшей производительности)

0 голосов
/ 04 октября 2018

Вы можете использовать следующее: -

-- Create a temporary swap table
CREATE TEMP TABLE IF NOT EXISTS swapPhoneNumbers (ID INTEGER PRIMARY KEY, UserID INTEGER, PhoneNumber TEXT, replacementPhoneNumber TEXT);
-- Clear the temporary swap table in case it's used more than once
DELETE FROM swapPhoneNumbers;
-- Populate the temporary swap table according to the original data
INSERT INTO swapPhoneNumbers (ID,UserID,PhoneNumber) SELECT * FROM tblPhoneNumbers;
-- Update the swap table to include the replacement phone numbers
UPDATE swapPhoneNumbers SET replacementPhoneNumber = (
    SELECT PhoneNumber FROM tblPhoneNumbers 
    WHERE swapPhoneNumbers.userID = tblPhoneNumbers.userID 
        AND swapPhoneNumbers.ID <> tblPhoneNumbers.ID
);
-- Update the original table with the new phone numbers
UPDATE tblPhoneNumbers SET PhoneNumber = (
    SELECT replacementPhoneNumber FROM swapPhoneNumbers 
    WHERE tblPhoneNumbers.ID = swapPhoneNumbers.ID
);

Ниже приведен SQL, используемый для проверки выше.

-- Create Testing Table with some data
DROP TABLE IF EXISTS tblphoneNumbers;
CREATE TABLE IF NOT EXISTS tblPhoneNumbers (ID INTEGER PRIMARY KEY, userID INTEGER, PhoneNumber TEXT);
INSERT INTO tblPhoneNumbers (userID, PhoneNumber) VALUES
    (1,'0111111111'),(1,'0222222222'),(2,'0333333333'),(2,'0444444444'),(3,'0555555555'),(3,'0666666666')
;

-- Show what is in the original table
SELECT * FROM tblPhoneNumbers;

-- Create a temporary swap table
CREATE TEMP TABLE IF NOT EXISTS swapPhoneNumbers (ID INTEGER PRIMARY KEY, UserID INTEGER, PhoneNumber TEXT, replacementPhoneNumber TEXT);
-- Clear the temporary swap table in case it's used more than once
DELETE FROM swapPhoneNumbers;
-- Populate the temporary swap table according to the original data
INSERT INTO swapPhoneNumbers (ID,UserID,PhoneNumber) SELECT * FROM tblPhoneNumbers;
-- Show what is in the swap table
SELECT * FROM swapPhoneNumbers;
-- Update the swap table to include the replacement phone numbers
UPDATE swapPhoneNumbers SET replacementPhoneNumber = (
    SELECT PhoneNumber FROM tblPhoneNumbers 
    WHERE swapPhoneNumbers.userID = tblPhoneNumbers.userID 
        AND swapPhoneNumbers.ID <> tblPhoneNumbers.ID
);
-- Show what is now in the swap table
SELECT * FROM swapPhoneNumbers;
-- Update the original table with the new phone numbers
UPDATE tblPhoneNumbers SET PhoneNumber = (
    SELECT replacementPhoneNumber FROM swapPhoneNumbers 
    WHERE tblPhoneNumbers.ID = swapPhoneNumbers.ID
);
-- Show what is in the original table
SELECT * FROM tblPhoneNumbers;

А это несколько снимков экрана, которые вы делаете

enter image description here

enter image description here

enter image description here

enter image description here

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