Вопрос:

Конкатенация столбца с двумя таблицами

sql oracle

136 просмотра

3 ответа

30 Репутация автора

Можно ли будет обновить данные одного столбца таблицы путем объединения данных столбца из другой таблицы? Позвольте мне объяснить на простом примере,

Таблица A: Studentaccess

╔════════╦══════════╗
║ UserID ║ AccCode  ║
╠════════╬══════════╣
║    12  ║ Tom      ║
║    13  ║ Ann      ║
╚════════╩══════════╝

Таблица B: студенческие детали

╔════════╦═══════════════════╗
║ ID     ║ UserName          ║
╠════════╬═══════════════════╣
║    1   ║ raj_12_kumar      ║
║    2   ║ test_13_test      ║
╚════════╩═══════════════════╝

Теперь я хочу разделить UserNameданные столбца и извлечь второй токен из этой studentaccessтаблицы и таблицы запросов , сопоставив UserIDи получить AccCodeиз него значение, и объединить его со вторым токеном данных UserNameстолбца. Наконец, мне нужны studentdetailsданные таблицы, как показано ниже,

╔════════╦═══════════════════╗
║ ID     ║ UserName          ║
╠════════╬═══════════════════╣
║    1   ║ 12_Tom            ║
║    2   ║ 13_Ann            ║
╚════════╩═══════════════════╝

Из приведенного ниже запроса подстроки я могу получить UserIdзначение из UserNameстолбца в studentdetailsтаблице,

select regexp_substr(UserName, '([^_]+)(_[^_]+){1}$', 1, 1, null, 1) as userId  from studentdetails

Любой поможет мне объединить то же самое Acccodeи обновить то же самое в UserNameстолбце?

Автор: SQL Learner Источник Размещён: 25.03.2017 09:27

Ответы (3)


0 плюса

3 Репутация автора

Вы почти рядом. Вы можете объединить другой столбец с userName.

regexp_substr(UserName, '([^_]+)(_[^_]+){1}$', 1, 1, null, 1) || '_' || acccode

Результат с вашими примерами данных будет таким:

    select userid, regexp_substr(UserName, '([^_]+)(_[^_]+){1}$', 1, 1, null, 1) || '_' || acccode as username  from 
(
select 1 UserID, 'Tom' AccCode from dual
union
select  1 userid , 'Ann' AccCode from dual) studentaccess,
( select 1 ID, 'raj_12_kumar' username from dual
 union
 select 2 id, 'test_13_test' username from dual) studentdetails
 where studentaccess.userid = studentdetails.ID
Автор: Jai Gehlawat Размещён: 25.03.2017 10:01

1 плюс

10551 Репутация автора

Решение

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

Вы можете проверить версию Oracle на этом sqlfiddle: http://sqlfiddle.com/#!4/cd66c/1

Версия Oracle

UPDATE studentdetails sd
SET sd.UserName =
  (SELECT  to_char(x.UserID) || '_' || sa.AccCode
   FROM 
     (SELECT  sd1.ID as ID, SUBSTR(sd1.UserName, INSTR( sd1.UserName,'_') + 1, INSTR( sd1.UserName,'_', INSTR( sd1.UserName,'_') + 1) - 1 - INSTR( sd1.UserName,'_')) AS UserID
      FROM studentdetails sd1 
     ) x  INNER JOIN studentaccess sa ON TO_NUMBER(x.UserID) = sa.UserID where sd.ID = x.ID   
  );

Версия SQL Server

UPDATE studentdetails
SET UserName =
  (SELECT x.UserID + '_' + sa.AccCode
   FROM
     (SELECT SUBSTRING(sd1.UserName, CHARINDEX('_', sd1.UserName) + 1, CHARINDEX('_', sd1.UserName, CHARINDEX('_', sd1.UserName) + 1) - 1 - CHARINDEX('_', sd1.UserName)) AS UserID
      FROM studentdetails sd1
      WHERE sd1.ID = studentdetails.ID) x
   INNER JOIN studentaccess sa ON x.UserID = sa.UserID);

ОБНОВЛЕНИЕ 1

Вы можете использовать приведенный ниже запрос, если вам нужна строка UNKNOWN в столбце UserName таблицы studentdetails, если таблица studentaccess не содержит идентификатор пользователя, полученный из таблицы studentdetails.

Я не мог попробовать это в sqlfiddle, так как sqlfiddle не загружается из-за некоторых проблем. Всякий раз, когда он возвращается в онлайн, я опробую его и дам вам знать. А пока вы можете попробовать это со своей стороны и сообщить мне о любых проблемах.

UPDATE studentdetails sd
SET sd.UserName =
  (SELECT  CASE when x.ID is null then 'UNKNOWN' else  to_char(x.UserID) || '_' || sa.AccCode END
   FROM 
     (SELECT  sd1.ID as ID, SUBSTR(sd1.UserName, INSTR( sd1.UserName,'_') + 1, INSTR( sd1.UserName,'_', INSTR( sd1.UserName,'_') + 1) - 1 - INSTR( sd1.UserName,'_')) AS UserID
      FROM studentdetails sd1 
     ) x  RRIGHT OUTER JOIN studentaccess sa ON TO_NUMBER(x.UserID) = sa.UserID where sd.ID = x.ID   
  );
Автор: Sunil Размещён: 25.03.2017 10:08

2 плюса

192 Репутация автора

UPDATE StudentDetails sd
SET UserName = 
( 
    SELECT userid||'_'||AccCode 
    FROM StudentAccess sa 
    WHERE regexp_substr(sd.UserName, '([^_]+)(_[^_]+){1}$', 1, 1, null, 1) = sa.userid
);
Автор: Ram Limbu Размещён: 25.03.2017 10:40
Вопросы из категории :
32x32